Linux内核配置Kconfig

目录

一. Kconfig 是什么?

二. Kconfig 基本配置方法

Step 1:配置Kconfig

Step 2:配置Makefile

Step 3:配置上层目录的Makefile与Kconfig

在上一层目录的Kconfig中

在上一层目录的Makefile中

三. Kconfig 基本语法

1. config语句

2. 变量类型

bool 类型

string 类型

int 类型

hex 类型

tristate 类型

3. if/endif 语句 

5. menuconfig 语句

6. choice/endchoice 语句

7. comment 语句 

8. source 语句


转载

https://blog.csdn.net/jianwen_hi/article/details/53398141

https://blog.csdn.net/c_hnie/article/details/109393488

一. Kconfig 是什么?

在讨论Kconfig之前,我们需要知道内核源码的编译过程:

  1. 遍历每个源码目录(或指定的源码目录)的 Makefile
  2. 每个目录的 Makefile 会根据 Kconfig 来定制要编译的对象
  3. 回到顶层目录的 Makeifle 执行编译

在遍历完各级子目录的Makefile和Kconfig文件后,会在内核源码的顶层目录下生成一个.config文件,该文件用来保存所有的配置项,然后回到顶层Makefile开始编译。

由上述步骤可知,Kconfig文件用来控制内核的编译动作。简单理解,就是Kconfig配置了哪些文件需要参与编译,哪些文件不用编译。

那么我们就得出各个文件的作用:

Kconfig  ---> (每个源码目录下)提供编译选项
.config   ---> (源码顶层目录下)保存选择结果
Makefile ---> (每个源码目录下)根据.config中的内容来告知编译系统如何编译

二. Kconfig 基本配置方法

假比,我们做好了一个驱动,需要将选项加入到内核的编译选项中,可以按以下步骤操作:

Step 1:配置Kconfig

在driver目录下新建一个子目录test:

mkdir driver/test 

进入test目录,创建Kconfig文件:

这里写图片描述

这里定义了一个 TEST 的句柄,Kconfig可以通过这个句柄来控制在Makefile中是否编译,”Test driver”是显示在终端的名称。具体的语法在Kconfig语法简介中介绍。

Step 2:配置Makefile

在Kconfig的同级目录中,新建一个Makefile:

Makfile

  1. Obj - $(CONFIG_选项名) += xxx.o 
  2. /*当CONFIG_选项名=n时,表示对应目录下的xxx.c不参与编译
  3. 当CONFIG_选项名=y时,表示对应目录下的xxx.c将被编译进内核
  4. 当CONFIG_选项名=m时,表示对应目录下的xxx.c将被编译成一个.ko模块*/

Step 3:配置上层目录的Makefile与Kconfig

在上一层目录的Kconfig中

 这里写图片描述

表示将test目录下的Kconfig加入搜寻目录。

在上一层目录的Makefile中

这里写图片描述
表示将test目录下的Makefile加入编译队列中。

运行根目录的.config查看结果:

这里写图片描述

三. Kconfig 基本语法

1. config语句

总体原则:每一个 config 就表示一个配置选项的开始,后面紧跟着的 ARCH_AIROHA 是配置选项的名称,config 下面几行定义了该配置选项的属性:如选项名是什么,依赖什么,选中这个后同时会选择什么等等。

1. config ARCH_AIROHA 
2.     bool "选项名" 
3.     depends on ARCH_MULTI_V7 
4.     select ARM_AMBA 
5.     default n 
6.     help 
7.       Support for Airoha EN7523 SoCs

config —> 选项。
ARCH_AIROHA —> 句柄,可用于控制Makefile,选择编译方式。
bool —> 选择可能:TRUE选中、FALSE不选;选中则编译,不选中则不编译。如果后面选项名字串为空,则表示其不会出现在选择软件列表中。 

depends —> 依赖,后面的选择被选择后,这个选项才能被选。
select —> 当前选项选中后,则select后指定的选项自动被选择。

default—> 缺省配置项。

help—> 帮助信息。

bool: 表示配置选项的类型,每个 config 菜单项都要有类型定义,变量有5种类型:

  • bool 布尔类型
  • tristate 三态类型
  • string 字符串
  • hex 十六进制
  • int 整型

depends:意思是本配置项依赖于另一个配置项。如果那个依赖的配置项为Y或者M,则本配置项才有意义;如果依赖的那个配置项本身被设置为N,则本配置项根本没有意义。depends依赖的配置项可以是多个,还可以有逻辑运算。这种时候只要依赖项目运算式子的结果为真则依赖就成立。

select: 表示depends on的值有效时,且当前配置选项被选中,则下面的select也会成立,将相应的内容选上。

default: 表示depends on的值有效时,当前配置选项的缺省值。有三种选项,分别对应y,n,m。

help: 帮助信息,解释这个配置项的含义,以及如何去配置它。

2. 变量类型

bool 类型

布尔类型变量的取值范围是 y/n ,其使用示例如下:

1. config BSP_USING_WDT
2.     bool "Enable Watchdog Timer"
3.     select RT_USING_WDT
4.     default n

上述语句对应的配置界面如下所示:

bool

 以上配置项生成的宏如下所示:

1. #define BSP_USING_WDT
2. #define RT_USING_WDT

string 类型

字符串变量的默认值是一个字符串,其使用示例如下:

1. config RT_CONSOLE_DEVICE_NAME
2.     string "the device name for console"
3.     default "uart1"

上述语句对应的配置界面如下所示:

string

以上配置项生成的宏如下所示:

#define RT_CONSOLE_DEVICE_NAME "uart1"

int 类型

整型变量的取值范围是一个整型的数,其使用示例如下:

1. config BSP_I2C1_SCL_PIN
2.     int "I2C1 scl pin number"
3.     range 1 176
4.     default 116

上述语句对应的配置界面如下所示:

int

 以上配置项在 rtconfig.h 文件中生成的宏如下所示:

#define BSP_I2C1_SCL_PIN 116

hex 类型

十六进制类型变量的取值范围是一个十六进制的数,其使用方法和整型变量用法一致,整型变量生成的是十进制的数,而十六进制生成的是十六进制的数。

tristate 类型

三态类型变量的取值范围是 y、n 和 m。tristate 代表在内核中有三种状态,一种是不选中,一种是选中直接编译进内核,还有一种是 m 手动添加驱动,而布尔类型变量只有两种状态,即选中和不选中。其使用方法和布尔类型变量类似。

3. if/endif 语句 

if/endif 语句是一个条件判断,定义了一个 if 结构,示例代码如下

1. if ARCH_S5PC100 --->如果ARCH_S5PC100选项选中了,则在endif范围内的选项才会被选
2. 
3. config CPU_S5PC100
4.     bool "选项名"
5.     select S5P_EXT_INT
6.     select SAMSUNG_DMADEV
7.     help
8.       Enable S5PC100 CPU support
9. 
10. endif

举个例子,如果CPU没有选择使用多核CPU,则不会出现CPU个数的选项。

menu 语句用于生成菜单,其格式如下:

1.    menu "Floating poing emulation" ----> menu表示该选项是不可选的菜单,即固定选中
2.
3.    config FPE_NWFPE
4.
5.        ..............
6.
7.    config FPE_NWFPE_XP
8.
9.        .............
10.
11.   endmenu                 ----> menu菜单结束

menu 之后的字符串是菜单名。menu 和 endmenu 间有很多 config 语句,以上代码对应的配置界面如下所示:

1.     Floating poing emulation--->
2.
3.                   [] FPE_NWFPE
4.
5.                   [] FPE_NWFPE_XP

5. menuconfig 语句

menuconfig: 表示菜单(本身属于一个菜单中的项目,但是他又有子菜单项目)、config表示菜单中的一个配置项(本身并没有子菜单下的项目)。一个menuconfig后面跟着的所有config项就是这个menuconfig的子菜单。这就是Kconfig中表示的目录关系。

1. menu "Hardware Drivers Config"
2.     menuconfig BSP_USING_UART
3.         bool "Enable UART"
4.         default y
5.         select RT_USING_SERIAL
6.         if BSP_USING_UART
7.             config BSP_USING_UART1
8.                 bool "Enable UART1"
9.                 default y
10. 
11.            config BSP_UART1_RX_USING_DMA
12.                bool "Enable UART1 RX DMA"
13.                depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
14.                default n
15.        endif
16. endmenu

当没有打开串口 DMA 配置时,以上代码对应的界面为

menuconfig1

当打开串口 DMA 配置时,以上代码对应的界面为

menuconfig2

语句分析: - menuconfig 这个语句和 config 语句很相似,但它在 config 的基础上要求所有的子选项作为独立的行显示。 - depends on 表示依赖某个配置选项,depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA 表示只有当 BSP_USING_UART1 和 RT_SERIAL_USING_DMA 配置选项同时被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项。

通过 env 选中以上配置界面的所有选项后,最终可生成如下五个宏:

1. #define RT_USING_SERIAL
2. #define BSP_USING_UART
3. #define BSP_USING_UART1
4. #define RT_SERIAL_USING_DMA
5. #define BSP_UART1_RX_USING_DMA

6. choice/endchoice 语句

choice条目将多个类似的配置选项组合在一起,供用户选择一组配置项

1.  menu "Hardware Drivers Config"
2.      menuconfig BSP_USING_ONCHIP_RTC
3.          bool "Enable RTC"
4.          select RT_USING_RTC
5.          select RT_USING_LIBC
6.          default n
7.          if BSP_USING_ONCHIP_RTC
8.              choice
9.                  prompt "Select clock source"
10.                 default BSP_RTC_USING_LSE
11. 
12.                 config BSP_RTC_USING_LSE
13.                     bool "RTC USING LSE"
14. 
15.                 config BSP_RTC_USING_LSI
16.                     bool "RTC USING LSI"
17.             endchoice
18.         endif
19. endmenu

以上代码对应的配置界面为

choice

语句解析: - prompt 给出提示信息,光标选中后回车进入就可以看到多个 config 定义的配置选项; - choice/endchoice 给出选择项,中间可以定义多个配置项供选择,但是在配置界面只能选择一个配置项。 

choice语句中定义的变量只有booltristate。

menu和choice的区别:menu 可以多选,choice 是多选一。

7. comment 语句 

comment 语句出现在界面的第一行,用于定义一些提示信息。

comment 代码示例如下:

1. menu "Hardware Drivers Config"
2.     comment "uart2 pin conflict with Ethernet and PWM"
3.     config BSP_USING_COM2
4.         bool "Enable COM2"
5.         select BSP_USING_UART
6.         select BSP_USING_UART2
7.         default n
8. endmenu

以上代码对应的配置界面为:

 

8. source 语句

source 语句用于读取另一个文件中的 Kconfig 文件,如:

source "../libraries/HAL_Drivers/Kconfig"

上述语句用于读取当前 Kconfig 文件所在路径的上一级文件夹 libraries/HAL_Drivers 下的 Kconfig 文件。

  • 10
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值