配置Kconfig 让内核支持mach-xxx开发板
前言
补充之前写的向 Linux 内核添加硬件平台向 Linux 内核添加硬件平台
Linux内核支持的芯片可以通过内核配置直接对SOC进行配置,这些芯片的硬件平台对应的实现文件也都集成在内核中(arch/arm/mach-xxx),每一个mach-xxx都表示一个SOC硬件平台。
向内核添加soc平台主要完成两个工作:
- Makefile:mach-xxx 各层 Makefile 对文件的编译(所有的编译文件可变翼的前提下)。
- Kconfig:将添加的soc平台中的驱动进行配置(开/关、关联、依赖)。
配置目标结果如下图:
注:本文主要对 Kconfig 配置方法说明。
1. 了解Linux内核编译过程
对内核配置进行操作前,我们需要先了解下Linux内核的编译过程:
-
遍历每个源码目录的 Makefile文件
-
每个 Makefile 会根据 Kconfig 来定制需要编译的对象
-
最后回到顶层目录的 Makefile 执行编译
总的来说,Kconfig 文件就是各种配置界面的源文件。当遍历完了 Makefile 和 Kconfig 以后,会在顶层目录生成一个 .config 文件(.config文件保存着所有的内核配置选项),然后回到顶层 Makefile 编译。
(通过配置 Kconfig 将驱动选项添加到内核的编译选项中,我们主要配置的是自己硬件平台mach-asu的Kconfig)
2. Kconfig 基本配置方法
2.1. 添加驱动编译选项
例如,完成了一个 ASU_TEST 驱动,需要将选项加入到内核的编译选项中,可以按照以下步骤进行:
2.1.1. 配置 Kconfig
在 ASU-imx6ull-test/drivers 目录下建立 asu_test 子目录,进入该目录下创建 Kconfig 文件,内容如下:
// ASU-imx6ull-test/drivers/asu_test/Kconfig
config TEST
bool "ASU_TEST"
help
Support for ASU TEST!!
这里定义了一个 TEST 句柄,Kconfig 可以通过这个句柄来控制在 Makefile 中是否编译,ASU_TEST 是显示在中端的名称。具体的语法在Kconfig语法中介绍。
2.1.2. 配置 Makefile
同样在 ASU-imx6ull-test/drivers/asu_test 下新建一个 Makefile 文件,内容如下:
# ASU-imx6ull-test/drivers/asu_test/Makefile
obj-y$(CONFIG_TEST) += asu_test.o
Obj - $(CONFIG_选项名) += xxx.o
# 当CONFIG_选项名=n时,表示对应目录下的xxx.c不参与编译
# 当CONFIG_选项名=y时,表示对应目录下的xxx.c将被编译进内核
# 当CONFIG_选项名=m时,表示对应目录下的xxx.c将被编译成一个.ko模块
2.1.3. 配置上层 Makefile 和 Kconfig
在 ASU-imx6ull-test/drivers/Kconfig 中添加内容如下:
// ASU-imx6ull-test/drivers/Kconfig
menu "Device Drivers"
source "drivers/asu_test/Kconfig" // 前面添加的内容地址
在 ASU-imx6ull-test/drivers/Makefile 中添加内容如下:
obj-y += asu_test/ # 加入编译队列
检验结果,如下图:
2.2. 添加 mach-xxx 平台配置选项
配置过程和 2.1 节大同小异,基本都是对Makefile和Kconfig进行修改
2.2.1. 配置SOC Kconfig
- 添加配置菜单
// ASU-imx6ull-test/arch/armmach-asu/Kconfig
menuconfig ARCH_MXC
bool "ASU i.MX TEST" if ARCH_MULTI_V6_V7 // 菜单名,if 判断芯片架构
select ...... // 默认自动选择
....
help // 帮助信息
ASU i.MX TEST!!
添加SOC平台驱动,因为修改后只支持 imx6ull 开发板,所以代码只保留支持该开发板的驱动,所以全部不显示
// ASU-imx6ull-test/arch/armmach-asu/Kconfig
config MXC_TZIC
bool // 为空表示在终端中不显示选项
config HAVE_IMX_ANATOP
bool
......
- 添加具体 SOC
// ASU-imx6ull-test/arch/armmach-asu/Kconfig
config SOC_IMX6 // 同系列通用驱动,下面需要直接 select SOC_IMX6
bool
select ARM_GIC
select HAVE_IMX_ANATOP
select HAVE_IMX_GPC
select HAVE_IMX_MMDC
select HAVE_IMX_SRC
select MFD_SYSCON
config SOC_IMX6UL
bool
help
This enables support for ASU TEST i.MX6 UltraLite processor.
config SOC_IMX6ULL // 目标配置SOC
bool "i.MX6ULL support"
select SOC_IMX6UL
select SOC_IMX6
select KEYBOARD_SNVS_PWRKEY
select PINCTRL_IMX6UL
select ARM_ERRATA_814220
help
This enables support for ASU TEST i.MX6 ULL processor.
-
包含 devices 目录
source "arch/arm/mach-asu/device/Kconfig" // device用于存放设备驱动
2.2.2. 配置SOC Makefile
根据驱动添加依赖关系,在 “Linux内核移植mach-asu” 中第 4 节有详细描述。
2.2.3.添加驱动设备
在 mach-asu 目录下还有一个 devices 子目录,devices目录下用于存放设备,添加方式与前面添加驱动编译选项相同,这里就不展开说明了。
3. Kconfig 基本语法
3.1. menuconfig 语句
menuconfig 表示菜单(本身属于一个菜单中的项目,但是他又有子菜单项目)、config表示菜单中的一个配置项(本身并没有子菜单下的项目)。一个menuconfig后面跟着的所有config项就是这个menuconfig的子菜单。这就是Kconfig中表示的目录关系。
menuconfig ARCH_MXC
bool "ASU Kconfig test" if ARCH_MULTI_V4_V5 || ARCH_MULTI_V6_V7
select ARCH_REQUIRE_GPIOLIB
select ARM_CPU_SUSPEND if PM
select CLKSRC_MMIO
select GENERIC_IRQ_CHIP
select PINCTRL
select PM_OPP if PM
select SOC_BUS
select SRAM
helpc
Support for Freescale MXC/iMX-based family of processors
上述代码对应终端界面如下:
3.2. config 语句
每一个 config 就表示一个配置选项的开始,后面紧跟着的 ARCH_AIROHA 是配置选项的名称,config 下面几行定义了该配置选项的属性:如选项名是什么,依赖什么,选中这个后同时会选择什么等等。
config ARCH_AIROHA
bool "选项名"
depends on ARCH_MULTI_V7
select ARM_AMBA
default n
help
Support for ASU i.MX6 SoCs
config | 选项 |
---|---|
ARCH_AIROHA | 句柄,可用于控制Makefile,选择编译方式 |
bool | 选择可能:TRUE选中、FALSE不选;选中则编译,不选中则不编译。如果后面选项名字串为空,则表示其不会出现在选择软件列表中 |
depends | 依赖,后面的选择被选择后,这个选项才能被选 |
select | 当前选项选中后,则select后指定的选项自动被选择 |
default | 缺省配置项 |
help | 帮助信息 |
补充:bool,表示配置选项的类型,每个config菜单项都有类型定义(共5种)
bool 布尔类型、 tristate 三态类型、 string 字符串、hex 十六进制 、int 整型
3.3. 变量类型
3.3.1 bool 类型
取值范围是 [y/n],使用示例如下:
config SOC_IMX6ULL
bool "i.MX6 ULL support"
select SOC_IMX6UL
上述代码对应终端界面如下:
3.3.2 int 类型
取值为整型数,使用示例如下:
config HZ
int "Timer Frequency"c
default 100
3.3.3. string 类型
字符串变量的默认值是一个字符串,其使用示例如下:
config RT_CONSOLE_DEVICE_NAME
string "the device name for console"
default "uart1"
3.3.4. hex 类型
十六进制类型变量的取值范围是一个十六进制的数,其使用方法和整型变量用法一致,整型变量生成的是十进制的数,而十六进制生成的是十六进制的数。
3.3.5. tristate 类型
三态类型变量的取值范围是 y、n 和 m。tristate 代表在内核中有三种状态,一种是不选中,一种是选中直接编译进内核,还有一种是 m 手动添加驱动,而布尔类型变量只有两种状态,即选中和不选中。其使用方法和布尔类型变量类似。
3.4. choice/endchoice 语句
choice条目将多个类似的配置选项组合在一起,供用户选择一组配置项
config MACH_EUKREA_CPUIMX35SD
bool "Support Eukrea CPUIMX35 Platform"
select IMX_HAVE_PLATFORM_FLEXCAN
select IMX_HAVE_PLATFORM_FSL_USB2_UDC
select IMX_HAVE_PLATFORM_IMX2_WDT
select IMX_HAVE_PLATFORM_IMX_I2C
select IMX_HAVE_PLATFORM_IMX_UART
select IMX_HAVE_PLATFORM_MXC_EHCI
select IMX_HAVE_PLATFORM_MXC_NAND
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
select USB_ULPI_VIEWPORT if USB_ULPI
select SOC_IMX35
help
Include support for Eukrea CPUIMX35 platform. This includes
specific configurations for the board and its peripherals.
choice
prompt "Baseboard"
depends on MACH_EUKREA_CPUIMX35SD
default MACH_EUKREA_MBIMXSD35_BASEBOARD
config MACH_EUKREA_MBIMXSD35_BASEBOARD
bool "Eukrea MBIMXSD development board"
select IMX_HAVE_PLATFORM_GPIO_KEYS
select IMX_HAVE_PLATFORM_IMX_SSI
select IMX_HAVE_PLATFORM_IPU_CORE
select IMX_HAVE_PLATFORM_SPI_IMX
select LEDS_GPIO_REGISTER
help
This adds board specific devices that can be found on Eukrea's
MBIMXSD evaluation board.
endchoice
当 choice 的父级选择 [y] 时,才可以进入到 choice 选项**(choice/endchoice之间的config语句)**,如下图所示:
choice语句中定义的变量只有bool和tristate。
choice 选项是多选一。
3.5. comment 语句
comment 语句用来在内核配置界面显示提示信息,代码示例如下:
comment "MX35 platforms:"
config MACH_IMX35_DT
bool "Support i.MX35 platforms from device tree"
......
config MACH_PCM043
bool "Support Phytec pcm043 (i.MX35) platforms"
......
config MACH_MX35_3DS
bool "Support MX35PDK platform"
......
config MACH_EUKREA_CPUIMX35SD
bool "Support Eukrea CPUIMX35 Platform"
......
config MACH_VPR200
bool "Support VPR200 platform"
......
if ARCH_MULTI_V7
comment "Device tree only"
config SOC_IMX5
bool
......
config SOC_IMX50
bool "i.MX50 support"
......
config SOC_IMX51
bool "i.MX51 support"
......
........
以上代码对应的终端界面如下:
3.6. source 语句
source 语句用于读取另一个文件中的 Kconfig 文件,如:
source "arch/arm/mach-asu/devices/Kconfig"