Kconfig本质是内核配置菜单的 “描述语言”,语法简洁但有明确的规则。
一、Kconfig 核心语法规则(基础必懂)
1. 注释
- 单行注释:用
#开头(和 Shell/Makefile 一致); - 无多行注释,多行需每行加
#。
config
# 这是注释:定义字符设备驱动配置项 config HELLO_DRV tristate "Hello World Driver"2. 大小写敏感
- 配置项名称(如
CONFIG_HELLO_DRV)严格区分大小写,建议全大写 + 下划线(行业惯例); - 关键字(如
config、tristate、menu)小写,是固定语法。
3. 缩进规则
- 子项(如
tristate、help、depends on)需缩进(通常 4 个空格,不要用 Tab); - 同一层级的选项缩进一致,保证可读性。
二、Kconfig 核心关键字(按使用频率排序)
1.config- 定义单个配置项(最核心)
作用:声明一个配置项(对应
.config中的CONFIG_XXX),是所有驱动 / 功能配置的基础;格式:
config 配置项名称+ 缩进的属性(类型、描述、依赖等);类型(必选):
类型 含义 对应.config 值 适用场景 tristate三态(内置 / 模块 / 不编译) y/m/n 驱动(支持编译为模块) bool布尔(启用 / 禁用) y/n 内核功能(不支持模块) string字符串值 自定义字符串 如设备树路径、版本号 int整数值 数字 如缓冲区大小、超时时间 hex十六进制值 十六进制数 如寄存器地址、掩码 示例(三态驱动配置项):
config
config HELLO_DRV tristate "Hello World Character Driver" # 界面显示的名称 help # 帮助说明(可选但推荐) This is a simple char driver for RK356X platform. Say Y/M to compile it into kernel/module, N to disable.2.menu/endmenu- 定义菜单分组
- 作用:将相关配置项归类到一个可视化菜单中(
menuconfig界面中可展开 / 折叠); - 格式:
menu "菜单名称"+ 缩进的配置项 +endmenu; - 示例(字符设备菜单):
config
menu "Character devices" # menuconfig中显示的菜单名 config HELLO_DRV tristate "Hello World Driver" help Simple char driver test. config TTY bool "Enable TTY support" default y endmenu # 结束菜单分组3.depends on- 配置项依赖(条件限制)
- 作用:限制配置项的显示 / 可选性,只有依赖条件满足时,该配置项才会出现在
menuconfig中; - 格式:
depends on 条件(条件可多个,用&&/||连接); - 示例(仅 ARM64 架构可见):
config
config HELLO_DRV tristate "Hello World Driver" depends on ARCH_ROCKCHIP && ARM64 # 仅RK356X(ROCKCHIP)+ ARM64架构可见 help Driver for RK356X ARM64 platform.4.default- 设置默认值
- 作用:指定配置项的默认值(无需手动选择时的默认状态);
- 格式:
default 值 [if 条件](条件可选); - 示例:
config
config HELLO_DRV tristate "Hello World Driver" depends on ARM64 default m if ARCH_ROCKCHIP # RK架构默认编译为模块 default n # 其他架构默认不编译5.select- 强制选中依赖项
- 作用:当当前配置项被选中(y/m)时,强制将另一个配置项设为
y(单向依赖); - 格式:
select 被依赖的配置项; - 示例(选驱动时强制启用字符设备核心):
config
config HELLO_DRV tristate "Hello World Driver" depends on ARM64 select CHR_DEV # 选中HELLO_DRV时,CHR_DEV自动设为y6.prompt- 自定义界面显示名称
- 作用:替代
tristate/bool后的字符串,单独定义菜单中显示的名称(等价写法,可选); - 示例:
config
config HELLO_DRV tristate prompt "Hello World Driver" # 和直接写tristate "xxx"效果一致 default m7.source- 引入其他 Kconfig 文件
- 作用:在当前 Kconfig 中引入子目录的 Kconfig,实现配置项的分层管理(内核核心机制);
- 格式:
source "路径/文件名"; - 示例(内核根目录 Kconfig 引入字符设备配置):
config
# 内核根目录 Kconfig source "drivers/char/Kconfig" # 加载字符设备目录的Kconfig source "drivers/spi/Kconfig" # 加载SPI驱动目录的Kconfig8.choice/endchoice- 单选菜单
- 作用:创建互斥的单选选项(只能选其中一个);
- 格式:
choice+ 缩进的config(仅bool/tristate) +endchoice; - 示例(驱动模式选择):
config
choice prompt "Hello Driver Mode" default HELLO_DRV_NORMAL config HELLO_DRV_NORMAL bool "Normal Mode" config HELLO_DRV_DEBUG bool "Debug Mode" endchoice三、实战示例(RK356X 驱动的 Kconfig 完整写法)
以下是适配你场景的完整Kconfig片段(放在drivers/char/Kconfig中):
config
# 字符设备菜单下添加自定义驱动 menu "Character devices" # 自定义驱动配置项 config HELLO_DRV tristate "Hello World Driver for RK356X" depends on ARCH_ROCKCHIP && ARM64 # 仅RK356X ARM64可见 default m # 默认编译为模块 select CHR_DEV # 依赖字符设备核心 help This is a simple character driver for Rockchip RK356X platform. If you want to compile it as a module, choose M (recommended), compile into kernel choose Y, or N to disable. endmenu四、语法校验与常见坑
- 校验方法:修改 Kconfig 后执行
make menuconfig,若界面能正常打开且配置项显示,说明语法无错;若报错syntax error,检查缩进 / 关键字拼写。 - 常见错误:
- 缩进用 Tab 而非空格(内核要求空格);
depends on后条件写错(如ARCH_RK356X写成RK356X);- 三态配置项用
bool类型(导致无法编译为模块)。
总结
Kconfig核心是通过config定义配置项,用menu分组,depends on做条件限制,default设默认值;- 驱动开发中最常用的是
tristate类型(支持模块编译)+depends on(匹配开发板架构); - 关键语法:配置项名称大写、子项缩进 4 空格、依赖条件匹配开发板(如
ARCH_ROCKCHIP)。