概述
文章目录
- Kconfig
- Kconfig结构
- 层次结构
- 菜单选项属性
- 文件名
- 菜单属性
- 输入提示"prompt" ["if" ]
- 默认值"default" ["if" ]
- 帮助说明
- 数据范围"range" ["if" ]
- 依赖关系if depends on
- 反向依赖关系 select
- 综合:自定义添加菜单
- 添加自定义目录
- 编写Kconfig
- 建立子目录
Kconfig编译菜单说明文档
gedit Documentation/kbuild/Kconfig-language.txt
内核配置的目的是裁剪C代码,C代码编译一般由Makefile管理
一个菜单有三个相关内容:
1、 菜单;-----------Kconfig文件
2、 Makefile;------根据 .config抽取文件
3、 C代码。--------通过Makefile文件进行关联
源码目录下一般都有两个文件Kconfig和Makefile
Kconfig
Kconfig结构
一般一个Kconfig文件表示的就是一个菜单,一个菜单由多个菜单项组成,其格式如下
memu “菜单名”
菜单顶或菜单链接1
菜单顶或菜单链接2
菜单顶或菜单链接3
…………………………………
菜单顶或菜单链接n
endmenu
具体代码
menu "Device Drivers"
source "drivers/aamenutest/Kconfig"
source "drivers/base/Kconfig"
……..
source "drivers/memory/Kconfig"
source "drivers/iio/Kconfig"
source "drivers/vme/Kconfig"
endmenu
以drivers为例:
改变菜单名
配置菜单改变
层次结构
源(放在drivers目录下,关联到具体的Kconfig中)
在base文件夹下的Kconfig中
子项菜单命名
在配置菜单中的选项
菜单选项属性
菜单的结构为
config MODVERSIONS
bool "Set version information on all module symbols"
depends on MODULES
help
Usually, modules have to be recompiled whenever you switch to a new
kernel. ...
大多数的选项都定义了一个配置选项,语法如下
config <symbol>
<config options>
为一符号,就好像代码中的局部变量x一样,可用于后边的表达式中. 每行都是以关键字开始。“config” 为定义了一新的配置选项。下面的几行定义了该配置选项的属性。属性可以是该配置选项的类型,输入提示(input prompt),依赖关系,帮助信息和默认值。
文件名
config UEVENT_HELPER_PATH
config开头配置后的宏名,会在配置后加前缀“CONFIG_”
如果同名会导致冲突,会有警告单不报错,执行内容以第一项定义为准,后面的项无效。
每个config菜单项都会产生一个配置选项CONFIG_XXX, XXX即为. 如上,则会产生一个配置项:CONFIG_ MODVERSIONS,此配置项的值记录在内核根目录下的隐藏文件.config内。
菜单属性
1、string:字符串,选择后会出现一个选项框,要求输入字符串
2、bool:两态选项,只能选中和不选中,选中为有,不选中为n。
3、tristate:三态选项(n、m、y)
4、hex:用户需要输入一个16进制数
5、int:用户需要输入一个整形(只能0~9数字组合其他非法);
6、注释comment:在菜单中加入适当的注释提示信息
代码
comment “Kconfig_test”
config STRING_TEST
string "string test"
default "hello linux"
help
string test default is "hello linux"
config BOOL_TEST
bool "bool test"
default "y"
help
bool test default is y
config SRISTATE_TEST
tristate "tristate test"
default m
help
tristate test default is M
config INT_TEST
int "int_test"
default 10
help
int_test default is 10
config HEX_TEST
hex "hex test"
default 0x3a
help
hex test default is 0x3a
在内核配置菜单中的效果
输入提示"prompt" [“if” ]
每个菜单选项最多只能有一个显示给用户的输入提示。可以用 “if” 来表示该提示的依赖关系,这是可选的。
例如:TPO3依赖TPO2
代码
config OPT2
bool
prompt "prompt test"
default n
help
prompt test
config OPT3
bool
prompt "prompt depends on OPT2 test" if OPT2
default n
help
prompt test
在内核配置菜单中效果
默认值"default" [“if” ]
一个配置选项可以有任意多个默认值。如果有多个默认值,那么只有第一个被定义的值是可用的。默认值显示给用户,并可以让用户进行修改。默认值的依赖关系可以用 “if” 添加。(可选项)。
default 20
帮助说明
help
Path to uevent………………
数据范围"range" [“if” ]
为int和hex类型的选项设置可以接受输入值范围。用户只能输入大于等于第一个symbol,小于等于第二个symbol的值。
range 1 10 //数值在1~10有效,其他无效
代码
config RANGE_TEST
int "range test 2~32"
default 4
range 2 32
help
range test 2~32
菜单效果
输入超出范围的值会提示出错
输入范围以内的值才有效
依赖关系if depends on
为一菜单选项定义依赖关系。如果定义了多个依赖关系,它们之间用 ‘&&’ 间隔。依赖关系也可以应用到该菜单中所有的其它选项(同样接受if表达式)。
1、依赖关系depends on XXX
出现这个选项的前提是选中XXX
2、depends on if XXX=3
出现选项的前提是XXX的值是3
下面的两个例子是等价的
代码
config DEPENDS_ON_CHOICE
bool "depends on choice"
default n
help
depends on choice default is n
config DEPENDS_ON_TEST
bool "depend on test if depends on choice"
depends on DEPENDS_ON_CHOICE
default n
help
depends on test
config IF_INT_TEST
int "if int test"
default 10
help
if int test default is 10
config IF_HEX_TEST
hex "if hex test"
default 0xca
help
if hex test default is 0xca
config NAME_IF_TEST
int "name if test if int=5 && hex=0x3a" if IF_INT_TEST=5
depends on IF_HEX_TEST=0x3a
default 3
help
name if test if int=5 && hex=0x3a
在菜单配置的效果
反向依赖关系 select
这个关键字表示了当本配置项选中后,其他的配置项也需要选中。
反向依赖只能用在 boolean 或 tristate 选项上。
代码
config SELECT_DEP
bool "select select depands"
default n
help
select test
config SELECT_ORG1
bool "select org1 to select test1"
default n
select SELECT_TEST1
help
select SELECT_TEST1 test
config SELECT_ORG2
tristate "select org2 to select test2"
default n
select SELECT_TEST2 if SELECT_DEP
help
select SELECT_TEST2 test
config SELECT_TEST1
bool
prompt "select test by select org1"
default n
help
select test 1
config SELECT_TEST2
bool
prompt "select test by select org2 and delect depends"
default n
help
select test 2
在菜单中的效果
综合:自定义添加菜单
可以在Linux源码目录下的任意地方添加自定义菜单,只要是该目录下有内核关联的Kconfig文件就可以。本次添加菜单是以在drivers目录下添加自定义菜单为例。
添加自定义目录
在drivers目录中编辑Kconfig,加入自定义的文件夹
menu "Device Drivers"
source "drivers/aamenutest/Kconfig"
source "drivers/base/Kconfig"
………………………………………………..
source "drivers/iio/Kconfig"
source "drivers/vme/Kconfig"
endmenu
文件夹在drivers目录下,新建aamenutest文件夹
编写Kconfig
进入aamenutest中,建立Kconfig文件
编写Kconfig里的内容
自定义目录名为"Kconfig menu test"。
注意:编写代码的顺序决定了在make menuconfig中显示的顺序。
代码
menu "Kconfig menu test"
comment ”Kconfig_test“
config STRING_TEST
string "string test"
default "hello linux"
help
string test
config BOOL_TEST
bool "bool test"
default y
help
bool test default is y
config SRISTATE_TEST
tristate "tristate test"
default m
help
tristate test default is M
config INT_TEST
int "int_test"
default 10
help
int_test default is 10
config HEX_TEST
hex "hex test"
default 0x3a
help
hex test default is 0x3a
comment ”Keywords_test“
config DEPENDS_ON_CHOICE
bool "depends on choice"
default n
help
depends on choice default is n
config DEPENDS_ON_TEST
bool "depend on test if depends on choice"
depends on DEPENDS_ON_CHOICE
default n
help
depends on test
config IF_INT_TEST
int "if int test"
default 10
help
if int test default is 10
config IF_HEX_TEST
hex "if hex test"
default 0xca
help
if hex test default is 0xca
config NAME_IF_TEST
int "name if test if int=5 && hex=0x3a" if IF_INT_TEST=5
depends on IF_HEX_TEST=0x3a
default 3
help
name if test if int=5 && hex=0x3a
config RANGE_TEST
int "range test 2~32"
default 4
range 2 32
help
range test 2~32
config PROMPR_TEST
bool
prompt "prompt test"
default n
help
prompt test
config RANGE_IF_TEST
bool
prompt "fange if test depends on prompt test" if PROMPR_TEST
default n
help
fange if test
config RANG
int "range test if fange if rest the manber 1~10" if PROMPR_TEST
range 1 10 if RANGE_IF_TEST
default 2
help
range test:range 1 10 if fange if test
config OPT2
bool
prompt "prompt test"
default n
help
prompt test
config OPT3
bool
prompt "prompt depends on OPT2 test" if OPT2
default n
help
prompt test
source "drivers/aamenutest/selecttest/Kconfig"
config ZXLED
bool "zxled test"
default n
help
led.c test
endmenu
在配置菜单中就会看到以下效果
在根目录的.config中看到加载的选项
#
# Kconfig menu test
#
#
# Kconfig_test
#
CONFIG_STRING_TEST="hello linux"
CONFIG_BOOL_TEST=y
CONFIG_SRISTATE_TEST=m
CONFIG_INT_TEST=10
CONFIG_HEX_TEST=0x3a
#
# Keywords_test
#
# CONFIG_DEPENDS_ON_CHOICE is not set
CONFIG_IF_INT_TEST=10
CONFIG_IF_HEX_TEST=0xca
CONFIG_RANGE_TEST=4
# CONFIG_PROMPR_TEST is not set
# CONFIG_RANGE_IF_TEST is not set
CONFIG_RANG=2
# CONFIG_OPT2 is not set
# CONFIG_OPT3 is not set
#
# select test
#
# CONFIG_SELECT_DEP is not set
# CONFIG_SELECT_ORG1 is not set
# CONFIG_SELECT_ORG2 is not set
# CONFIG_ZXLED is not set
建立子目录
在刚才的代码可以看到,有一项包含的代码:
source “drivers/aamenutest/selecttest/Kconfig”
这就是aamenutest中包含的子目录。
进入aamenutest文件夹中,再建立子文件夹selecttest
在Kconfig中添加selecttest的Kconfig,要考虑位置顺序,也就是前面提到的包含子文件夹的代码
source “drivers/aamenutest/selecttest/Kconfig”
进入selecttest中,同样建立Kconfig文件,并编辑Kconfig文件
代码
menu "select test"
config SELECT_DEP
bool "select select depands"
default n
help
select test
config SELECT_ORG1
bool "select org1 to select test1"
default n
select SELECT_TEST1
help
select SELECT_TEST1 test
config SELECT_ORG2
tristate "select org2 to select test2"
default n
select SELECT_TEST2 if SELECT_DEP
help
select SELECT_TEST2 test
config SELECT_TEST1
bool
prompt "select test 1 by select org1"
default n
help
select test 1
config SELECT_TEST2
bool
prompt "select test 2 by select org2 and select depends"
default n
help
select test 2
endmenu
在配置菜单中看到以下效果
最后
以上就是结实百褶裙为你收集整理的Linux内核驱动菜单(Kconfig)编写方法Kconfig菜单选项属性综合:自定义添加菜单的全部内容,希望文章能够帮你解决Linux内核驱动菜单(Kconfig)编写方法Kconfig菜单选项属性综合:自定义添加菜单所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复