Linux驱动之Kconfig语法——学习笔记(11)

当在内核根目录执行 make menuconfig 时会出现内核配置界面,而配置界面中的选项、条目全都依赖于各个文件夹中的Kconfig配置文件。
可以说各个文件夹中的Kconfig配置文件是整个内核文件这张大网中的每一个节点。
这篇文章主要介绍Kconfig配置文件的语法。


一、关键字介绍

(1) config

配置项。可以定义一行配置选项。
用例:

config MENU_2_1_CONFIG_1                        #二级菜单(1)的选项1
	bool "MENU_2_1_CONFIG_1"                    #bool类型(y/n),跟着提示信息
	select MENU_2_1_CONFIG_2                    #本条件选中则选中条件 MENU_2_1_CONFIG_2
	select MENU_2_1_CONFIG_4                    #本条件选中则选中条件 MENU_2_1_CONFIG_4
	default y                                   #bool默认值为y
(2)menuconfig

菜单配置项。可以定义一行配置选项,并且子选项会显示在子页面。
用例:

menuconfig Level_2-5_menu                           #二级菜单(5)开始
	bool "Level 2-5 menuconfig"
	default n
	
	if Level_2-5_menu
		config MENU_2_5_CONFIG_1                    #选项1
		bool "MENU_2_5_CONFIG_1"                         
		default n                               #bool默认值为n
		
		config MENU_2_5_CONFIG_2                    #选项2
		bool "MENU_2_5_CONFIG_2"                         
		default y                               #bool默认值为n
	endif
(3)choice endchoice

单选配置单。选项会在子页面显示。要以 choice 开头, endchoice 结尾。
用例:

choice                                          选择配置项,类似单选功能
	prompt "choice name"                        #配置项的显示名称
	
	default OPTION_2                            #默认选择的配置
	
	config OPTION_1                             #选项1
		bool "OPTION_1"                         
	
	config OPTION_2                             #选项2
		bool "OPTION_2"           
	
	config OPTION_3                             #选项3
		bool "OPTION_3"           
	
	config OPTION_4                             #选项4
		bool                                    #没带提示信息的条件类型不会现实

endchoice                                       选择配置项结束
(4)comment

注释。会显示一行注释信息。
用例:

comment "you choose MENU_2_4_CONFIG_1 !!"   #打印注释信息
(5)menu endmenu

菜单。子内容会在子页面显示。要以 menu 开头, endmenu 结尾。菜单标题内容跟在 menu 后。
用例:

menu "Level 2-4 menu"                               #二级菜单(4)开始
	config MENU_2_4_CONFIG_1                        #二级菜单(4)的选项1
	bool "MENU_2_4_CONFIG_1"                        #bool类型(y/n),跟着提示信息
	default n                                       #bool默认值为n
	
	if MENU_2_4_CONFIG_1                            #如果 选项(MENU_2_4_CONFIG_1)被选中
		comment "you choose MENU_2_4_CONFIG_1 !!"   #打印注释信息
	endif
endmenu                                             #二级菜单(4)结束
(6)if endif

if 判断。if 后面跟着选项名,就是当该选项被选中时成立。
用例:

if MENU_2_4_CONFIG_1                            #如果 选项(MENU_2_4_CONFIG_1)被选中
	comment "you choose MENU_2_4_CONFIG_1 !!"   #打印注释信息
endif

(7)source

读取其他的配置文件。类似include。
用法:

source "drivers/test/Kconfig"
(8)select

选中指定选项。select 后面可以跟着已经定义了的配置选项,一般用作如果XXX选项被选中则选中YYY选项。
用法:

config MENU_2_1_CONFIG_1                        #二级菜单(1)的选项1
	bool "MENU_2_1_CONFIG_1"                    #bool类型(y/n),跟着提示信息
	select MENU_2_1_CONFIG_2                    #本条件选中则选中条件 MENU_2_1_CONFIG_2
	select MENU_2_1_CONFIG_4                    #本条件选中则选中条件 MENU_2_1_CONFIG_4
	default y                                   #bool默认值为y
(9)depends on

依赖于XXX选项。如果依赖的选项被选中了,则当前的选项才会显示,是连带关系。类似于子选项。
用法:

config MENU_2_1_CONFIG_2                        #二级菜单(1)的选项2
	bool "MENU_2_1_CONFIG_2"                    #bool类型(y/n),跟着提示信息
	default n                                   #bool默认值为n

config MENU_2_1_CONFIG_3                        #二级菜单(1)的选项3
	bool "MENU_2_1_CONFIG_3"                    #bool类型(y/n),跟着提示信息
	depends on MENU_2_1_CONFIG_2                #当条件 MENU_2_1_CONFIG_2 被选中时,本条件才显示
	default y                                   #bool默认值为y

如果 MENU_2_1_CONFIG_2 被选中,则 MENU_2_1_CONFIG_3 才会显示。

depand on 功能也可以使用 if 替代使用。

(10)选项类型

每个配置选项都有不同的选项类型。

  • bool:布尔类型,可选参数(y/n)
  • tristate三态:内建、模块、移除,可选参数(y/m/n)
  • string:字符串,可填任意字符串内容
  • hex:十六进制,可填任意16进制数值
  • int:整型,可填任意10进制数值

在选项类型后+空格+通过双引号括起来的字符串可以让该选项显示并且显示字符串的内容作为提示信息。
假如选项类型后面不跟任何字符串,那么选项仍然存在,但是不会显示出来。

二、示例Kconfig代码

写了一个测试的Kconfig文件。可以加载出来看看,方便理解。

#
# Kconfig test file
#

menu "Level 1 menu"                                     #一级菜单开始

    menu "Level 2-1 menu"                               #二级菜单(1)开始

        config MENU_2_1_CONFIG_1                        #二级菜单(1)的选项1
            bool "MENU_2_1_CONFIG_1"                    #bool类型(y/n),跟着提示信息
            select MENU_2_1_CONFIG_2                    #本条件选中则选中条件 MENU_2_1_CONFIG_2
            select MENU_2_1_CONFIG_4                    #本条件选中则选中条件 MENU_2_1_CONFIG_4
            default y                                   #bool默认值为y

        config MENU_2_1_CONFIG_2                        #二级菜单(1)的选项2
            bool "MENU_2_1_CONFIG_2"                    #bool类型(y/n),跟着提示信息
            default n                                   #bool默认值为n

        config MENU_2_1_CONFIG_3                        #二级菜单(1)的选项3
            bool "MENU_2_1_CONFIG_3"                    #bool类型(y/n),跟着提示信息
            depends on MENU_2_1_CONFIG_2                #当条件 MENU_2_1_CONFIG_2 被选中时,本条件才显示
            default y                                   #bool默认值为y

        config MENU_2_1_CONFIG_4                        #二级菜单(1)的选项4
            bool                                        #bool类型(y/n),没带提示信息,本选项不会显示,但是存在
            default n                                   #bool默认值为y
    endmenu                                             #二级菜单(1)结束

    menu "Level 2-2 menu"                               #二级菜单(2)开始
        config MENU_2_2_CONFIG_1                        #二级菜单(2)的选项1
            bool "MENU_2_2_CONFIG_1"                    #bool类型(y/n),跟着提示信息
            default n                                   #bool默认值为n

        config MENU_2_2_CONFIG_2                        #二级菜单(2)的选项2
            tristate "MENU_2_2_CONFIG_2"                #tristate类型(y/n/m),跟着提示信息
            default m                                   #tristate默认值为m

        config MENU_2_2_CONFIG_3                        #二级菜单(2)的选项3
            string "MENU_2_2_CONFIG_3"                  #string类型(任意字符串),跟着提示信息
            default "this is MENU_2_2_CONFIG_3"         #string默认值为 this is MENU_2_2_CONFIG_3

        config MENU_2_2_CONFIG_4                        #二级菜单(2)的选项4
            hex "MENU_2_2_CONFIG_4"                     #hex类型(十六进制的值),跟着提示信息
            default 0x456789                            #hex默认值为 0x456789

        config MENU_2_2_CONFIG_5                        #二级菜单(2)的选项5
            int "MENU_2_2_CONFIG_5"                     #int类型(十进制的值),跟着提示信息
            default 666                                 #int默认值为 666
    endmenu                                             #二级菜单(2)结束

    menu "Level 2-3 menu"                               #二级菜单(3)开始
        choice                                          选择配置项,类似单选功能
            prompt "choice name"                        #配置项的显示名称

            default OPTION_2                            #默认选择的配置

            config OPTION_1                             #选项1
                bool "OPTION_1"                         

            config OPTION_2                             #选项2
                bool "OPTION_2"           

            config OPTION_3                             #选项3
                bool "OPTION_3"           

            config OPTION_4                             #选项4
                bool                                    #没带提示信息的条件类型不会现实
          
        endchoice                                       选择配置项结束
    endmenu                                             #二级菜单(3)结束

    menu "Level 2-4 menu"                               #二级菜单(4)开始
        config MENU_2_4_CONFIG_1                        #二级菜单(4)的选项1
        bool "MENU_2_4_CONFIG_1"                        #bool类型(y/n),跟着提示信息
        default n                                       #bool默认值为n

        if MENU_2_4_CONFIG_1                            #如果 选项(MENU_2_4_CONFIG_1)被选中
            comment "you choose MENU_2_4_CONFIG_1 !!"   #打印注释信息
        endif
    endmenu                                             #二级菜单(4)结束

    menuconfig Level_2-5_menu                           #二级菜单(5)开始
        bool "Level 2-5 menuconfig"
        default n
        
        if Level_2-5_menu
            config MENU_2_5_CONFIG_1                    #选项1
                bool "MENU_2_5_CONFIG_1"                         
                default n                               #bool默认值为n

            config MENU_2_5_CONFIG_2                    #选项2
                bool "MENU_2_5_CONFIG_2"                         
                default y                               #bool默认值为n
        endif

endmenu                                                 #一级菜单结束

三、测试

我把这个 Kconfig 文件加在了 Device Drivers 菜单下,假装这是一个设备驱动。

(1)添加 Kconfig 文件

kernel/drivers 目录下创建 teset 文件夹,然后添加文件 Kconfig 并把上面的示例代码拷贝进去。

(2)修改上级Kconfig 文件

上级的 Kconfig 文件在目录 kernel/drivers 下。
打开 Kconfig 文件,在最后一行添加下面一行代码,表示加载 test 文件夹下的 Kconfig 文件。

source "drivers/test/Kconfig"
(3)make menuconfig

kernal 目录下执行 make menuconfig 进行测试。

  • 进入Device Drivers —>
  • 在最下面的菜单就是了。
    在这里插入图片描述
    在这里插入图片描述

参考1:https://www.jianshu.com/p/aba588d380c2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hrx-@@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值