menu "Linux Kernel Extensions"

#-------------------------------------------------------------------------------
# Xenomai
config BR2_LINUX_KERNEL_EXT_XENOMAI
	bool "Adeos/Xenomai Real-time patch"
	depends on BR2_PACKAGE_XENOMAI_COBALT_ARCH_SUPPORTS
	depends on BR2_USE_MMU # xenomai
	depends on BR2_TOOLCHAIN_HAS_SYNC_4 # xenomai
	depends on BR2_TOOLCHAIN_HAS_THREADS # xenomai
	depends on !BR2_TOOLCHAIN_USES_MUSL # xenomai
	select BR2_PACKAGE_XENOMAI
	help
	  Xenomai is split in two parts: a kernel part and a userspace
	  part. Enabling this option automatically selects the Xenomai
	  package and helps in patching the Linux kernel built by
	  Buildroot with the Xenomai kernel part (ie Adeos/Ipipe).

	  You can find the currently supported kernel versions by
	  looking at the available patches in the Xenomai sources
	  tree: ksrc/arch/$(ARCH)/patches

	  However, it is recommended to use the latest version of the
	  Adeos/Ipipe patch available at
	  https://xenomai.org/downloads/ipipe/

	  Xenomai is know to support Blackfin, SH4, x86, ARM, NIOS2
	  and PowerPC architectures.

config BR2_LINUX_KERNEL_EXT_XENOMAI_ADEOS_PATCH
	string "Path/URL for Adeos patch file"
	depends on BR2_LINUX_KERNEL_EXT_XENOMAI
	help
	  Optionally, explicitly specify where to find the Adeos
	  patch to use.
	  Examples:
	  https://xenomai.org/downloads/ipipe/v4.x/arm/ipipe-core-4.19.33-arm-2.patch
	  or /home/foo/ipipe-core-4.19.33-arm-2.patch
	  Please verify that your kernel version in Buildroot matches.

comment "xenomai needs a uClibc or glibc toolchain w/ threads"
	depends on BR2_PACKAGE_XENOMAI_COBALT_ARCH_SUPPORTS
	depends on BR2_USE_MMU
	depends on BR2_TOOLCHAIN_HAS_SYNC_4
	depends on !BR2_TOOLCHAIN_HAS_THREADS || BR2_TOOLCHAIN_USES_MUSL

#-------------------------------------------------------------------------------
# RTAI
config BR2_LINUX_KERNEL_EXT_RTAI
	bool "RTAI Real-time patch"
	select BR2_PACKAGE_RTAI
	help
	  RTAI Kernel part.

#-------------------------------------------------------------------------------
# ev3dev Linux drivers
config BR2_LINUX_KERNEL_EXT_EV3DEV_LINUX_DRIVERS
	bool "ev3dev Linux drivers"
	select BR2_PACKAGE_EV3DEV_LINUX_DRIVERS
	help
	  Linux drivers for LEGO MINDSTORMS EV3 from the ev3dev project.

	  https://github.com/ev3dev/lego-linux-drivers

#-------------------------------------------------------------------------------
# fbtft
config BR2_LINUX_KERNEL_EXT_FBTFT
	bool "FB TFT drivers"
	select BR2_PACKAGE_FBTFT
	help
	  Linux Framebuffer drivers for small TFT LCD display modules,
	  e.g. Adafruit PiTFT displays for Raspberry Pi (this extra
	  package is only needed for linux kernels until v3.19, since
	  v4.0 the drivers are included in the staging area).

	  To enable fbtft, e.g. for Adafruit 2.8 PiTFT, enable the
	  following kernel configurations:
	  - CONFIG_SPI
	  - CONFIG_GPIOLIB
	  - CONFIG_FB
	  - CONFIG_FB_TFT
	  - CONFIG_FB_TFT_ILI9341

	  https://github.com/notro/fbtft

# aufs-standalone
config BR2_LINUX_KERNEL_EXT_AUFS
	bool "Aufs Filesystem Module patch"
	select BR2_PACKAGE_AUFS
	help
	  Aufs is split in two parts: a kernel part and a userspace
	  part. Enabling this option automatically selects the aufs
	  standalone (module) package and patches the Linux kernel
	  built by Buildroot with the aufs kernel part (ie fs/aufs).

	  It is important to use the correct branch of aufs-standalone.

if BR2_LINUX_KERNEL_EXT_AUFS

choice
	bool "aufs-standalone series"
	help
	  Select the major series of this version. This must match the
	  major version of your kernel (e.g. for kernels 3.x, select
	  aufs3.x; for kernels 4.x, select aufs4.x; for kernels 5.x,
	  select aufs5.x ).

	  Note: neither aufs1.x nor aufs2.x (both for kernels older than
	  3.x) are supported.

config BR2_LINUX_KERNEL_EXT_AUFS_SERIES_3
	bool "aufs3.x"

config BR2_LINUX_KERNEL_EXT_AUFS_SERIES_4
	bool "aufs4.x"

config BR2_LINUX_KERNEL_EXT_AUFS_SERIES_5
	bool "aufs5.x"

endchoice

config BR2_LINUX_KERNEL_EXT_AUFS_SERIES
	int
	default 3 if BR2_LINUX_KERNEL_EXT_AUFS_SERIES_3
	default 4 if BR2_LINUX_KERNEL_EXT_AUFS_SERIES_4
	default 5 if BR2_LINUX_KERNEL_EXT_AUFS_SERIES_5

config BR2_LINUX_KERNEL_EXT_AUFS_VERSION
	string "aufs-standalone version"
	default ""
	help
	  The version you choose must match that of your kernel.
	  Usually, the sha1 of the cset you want to use; avoid using a
	  branch name as this yields non-reproducible builds.

	  See the following resources to see what versions are
	  available:

	  For aufs3.x:
	  https://sourceforge.net/p/aufs/aufs3-standalone/ref/master/branches/
	  For aufs4.x:
	  https://github.com/sfjro/aufs4-standalone/branches/all
	  For aufs5.x:
	  https://github.com/sfjro/aufs5-standalone/branches/all

endif # aufs

endmenu
