Linux内核驱动菜单(Kconfig)编写方法

文章目录

  • 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 

为一符号,就好像代码中的局部变量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

在内核配置菜单中的效果
Linux内核驱动菜单(Kconfig)编写方法_第1张图片

输入提示"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

菜单效果
在这里插入图片描述
输入超出范围的值会提示出错
Linux内核驱动菜单(Kconfig)编写方法_第2张图片
在这里插入图片描述
输入范围以内的值才有效
在这里插入图片描述

依赖关系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

在菜单配置的效果
在这里插入图片描述
Linux内核驱动菜单(Kconfig)编写方法_第3张图片

反向依赖关系 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)编写方法_第4张图片

综合:自定义添加菜单

可以在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文件夹
Linux内核驱动菜单(Kconfig)编写方法_第5张图片

编写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

在配置菜单中就会看到以下效果
Linux内核驱动菜单(Kconfig)编写方法_第6张图片
Linux内核驱动菜单(Kconfig)编写方法_第7张图片
在这里插入图片描述

在根目录的.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)编写方法_第8张图片

你可能感兴趣的:(Linux)