Linux 内核驱动编译:Kconfig 与 Makefile 核心玩法,触摸驱动如何编译进内核?
查看驱动目录下的makefile可以看到很多配置项linux\drivers\char\Makefile:obj-$(CONFIG_DTLK)dtlk.o obj-$(CONFIG_APPLICOM)applicom.o obj-$(CONFIG_SONYPI)sonypi.o obj-$(CONFIG_RTC)rtc.o obj-$(CONFIG_HPET)hpet.o obj-$(CONFIG_EFI_RTC)efirtc.o obj-$(CONFIG_XILINX_HWICAP)xilinx_hwicap/ifeq($(CONFIG_GENERIC_NVRAM),y)obj-$(CONFIG_NVRAM)generic_nvram.oelseobj-$(CONFIG_NVRAM)nvram.o endif obj-$(CONFIG_TOSHIBA)toshiba.o obj-$(CONFIG_DS1620)ds1620.o obj-$(CONFIG_HW_RANDOM)hw_random/obj-$(CONFIG_PPDEV)ppdev.o obj-$(CONFIG_NWBUTTON)nwbutton.o obj-$(CONFIG_NWFLASH)nwflash.o obj-$(CONFIG_SCx200_GPIO)scx200_gpio.o obj-$(CONFIG_PC8736x_GPIO)pc8736x_gpio.o obj-$(CONFIG_NSC_GPIO)nsc_gpio.o obj-$(CONFIG_GPIO_TB0219)tb0219.o obj-$(CONFIG_TELCLOCK)tlclk.o比如obj-$(CONFIG_DS1620) ds1620.o当CONFIG_DS1620为y obj-y ds1620.o表示把该驱动编译进内核当CONFIG_DS1620为m obj-m ds1620.o表示把该驱动编译成模块当CONFIG_DS1620为m obj-n ds1620.o不编译该驱动1、CONFIG_DS1620配置选项怎么来内核根目录.config2、内核根目录.config如何生成?通过默认配置文件配置内核得到.configmake imx_v7_defconfigarch\arm\configs\imx_v7_defconfig配置内核会将imx_v7_defconfig的内容复制为**.config**3、修改.configmake menuconfig//图形界面方式修改内核配置选项4、如何增加menuconfig配置选项驱动目录下的kconfig文件drivers\char\KconfigmenuCharacter devicessourcedrivers/tty/Kconfigconfig DEVMEM bool/dev/mem virtual device supportdefaulty help Say Y hereifyou want to support the/dev/mem device.The/dev/mem device is used to access areas of physical memory.When in doubt,sayY....endmenumenu “Character devices”生成子菜单Character devicessource “drivers/tty/Kconfig”类似C语言的包含头文件包含更底层的目录的Kconfig配置文件config DEVMEM菜单栏下的配置选项在图形中该该选项会显示为CONFIG_DEVMEMbool 表明该选项是布尔选项只能yes 或 no后面的**“/dev/mem virtual device support”**为提示信息default y默认配置编译进内核可以将改为nhelp后面的是选项的帮助信息endmenu表示菜单结束config SGI_MBCS tristateSGI FPGA Core Services driver supportdepends on SGI_TIOCX help If you have an SGI Altix with an attached SABrick say Y or M here,otherwise say N.tristate 中文意思为三态即表示改配置选项可以为y、n以及m配置进内核、不编译以及编译成模块Kconifg语法参考内核文件Documentation\kbuild\kconfig-language.txt内核源码根目录Kconfig内容#SPDX-License-Identifier:GPL-2.0##For a description of the syntax of this configuration file,#seeDocumentation/kbuild/kconfig-language.txt.#mainmenuLinux/$(ARCH) $(KERNELVERSION) Kernel ConfigurationcommentCompiler: $(CC_VERSION_TEXT)sourcescripts/Kconfig.includesourceinit/Kconfigsourcekernel/Kconfig.freezersourcefs/Kconfig.binfmtsourcemm/Kconfigsourcenet/Kconfigsourcedrivers/Kconfigsourcefs/Kconfigsourcesecurity/Kconfigsourcecrypto/Kconfigsourcelib/Kconfigsourcelib/Kconfig.debugmainmenu 生成主菜单名字为Linux/$(ARCH) $(KERNELVERSION) Kernel Configurationsource “mm/Kconfig”包含底层目录的Kconfig配置文件类似C语言包含头文件通过分析Kconfig可以得出在内核中编译驱动的方法将驱动文件添加到对应分类的驱动目录下。比如添加hy46xx_ts_drv.c 触摸驱动到内核编译将驱动添加到该目录下drivers\input\touchscreen\hy46xx_ts_drv.c最快添加进内核编译的方法修改drivers\input\touchscreen\MakefileMakefile的内容obj-$(CONFIG_TOUCHSCREEN_PROPERTIES)of_touchscreen.o obj-$(CONFIG_TOUCHSCREEN_88PM860X)88pm860x-ts.o obj-$(CONFIG_TOUCHSCREEN_AD7877)ad7877.o obj-$(CONFIG_TOUCHSCREEN_AD7879)ad7879.o obj-$(CONFIG_TOUCHSCREEN_AD7879_I2C)ad7879-i2c.o obj-$(CONFIG_TOUCHSCREEN_AD7879_SPI)ad7879-spi.o obj-$(CONFIG_TOUCHSCREEN_ADC)resistive-adc-touch.o obj-$(CONFIG_TOUCHSCREEN_ADS7846)ads7846.o obj-$(CONFIG_TOUCHSCREEN_AR1021_I2C)ar1021_i2c.o...添加一个编译项直接将后面编译配置字段写为y表示编译进内核obj-yhy46xx_ts_drv.o另一种方法先修改Kconfig文件添加hy46xx触摸的配置选项drivers\input\touchscreen\Kconfig参考已有的配置项添加自己的hy46xx的配置项config TOUCHSCREEN_HY46XX tristateHYCON hy46xx I2C Touchscreendepends on I2C help Say Y hereifyou have HYCON hy46xx series I2C touchscreen,connected to your system.If unsure,say N.To compile this driver as a module,choose M here:the module will be called hy46xx_ts_drv最后通过make menuconfig进行配置将TOUCHSCREEN_HY46XX配置选为y