news 2026/9/15 18:36:57

4.kconfig语法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
4.kconfig语法

Kconfig本质是内核配置菜单的 “描述语言”,语法简洁但有明确的规则。

一、Kconfig 核心语法规则(基础必懂)

1. 注释
  • 单行注释:用#开头(和 Shell/Makefile 一致);
  • 无多行注释,多行需每行加#

config

# 这是注释:定义字符设备驱动配置项 config HELLO_DRV tristate "Hello World Driver"
2. 大小写敏感
  • 配置项名称(如CONFIG_HELLO_DRV严格区分大小写,建议全大写 + 下划线(行业惯例);
  • 关键字(如configtristatemenu小写,是固定语法。
3. 缩进规则
  • 子项(如tristatehelpdepends 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自动设为y
6.prompt- 自定义界面显示名称
  • 作用:替代tristate/bool后的字符串,单独定义菜单中显示的名称(等价写法,可选);
  • 示例:

config

config HELLO_DRV tristate prompt "Hello World Driver" # 和直接写tristate "xxx"效果一致 default m
7.source- 引入其他 Kconfig 文件
  • 作用:在当前 Kconfig 中引入子目录的 Kconfig,实现配置项的分层管理(内核核心机制);
  • 格式:source "路径/文件名"
  • 示例(内核根目录 Kconfig 引入字符设备配置):

config

# 内核根目录 Kconfig source "drivers/char/Kconfig" # 加载字符设备目录的Kconfig source "drivers/spi/Kconfig" # 加载SPI驱动目录的Kconfig
8.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

四、语法校验与常见坑

  1. 校验方法:修改 Kconfig 后执行make menuconfig,若界面能正常打开且配置项显示,说明语法无错;若报错syntax error,检查缩进 / 关键字拼写。
  2. 常见错误
    • 缩进用 Tab 而非空格(内核要求空格);
    • depends on后条件写错(如ARCH_RK356X写成RK356X);
    • 三态配置项用bool类型(导致无法编译为模块)。

总结

  1. Kconfig核心是通过config定义配置项,用menu分组,depends on做条件限制,default设默认值;
  2. 驱动开发中最常用的是tristate类型(支持模块编译)+depends on(匹配开发板架构);
  3. 关键语法:配置项名称大写、子项缩进 4 空格、依赖条件匹配开发板(如ARCH_ROCKCHIP)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 14:32:37

Conda+TensorFlow-v2.9:科学计算环境的最佳搭配

Conda TensorFlow-v2.9:构建高效、稳定的科学计算环境 在人工智能项目日益复杂的今天,一个常见但令人头疼的问题是:“为什么这段代码在我本地能跑,在服务器上却报错?”更典型的情况是,团队成员因为 NumPy …

作者头像 李华
网站建设 2026/9/10 8:10:38

HTML5 Audio API结合TensorFlow语音识别应用

HTML5 Audio API结合TensorFlow语音识别应用 在智能交互日益普及的今天,用户对“动口不动手”的操作体验提出了更高要求。从语音助手到在线教育中的口语测评,语音识别技术正快速渗透进各类Web应用场景。然而,传统方案往往依赖客户端插件或原生…

作者头像 李华
网站建设 2026/8/31 22:20:01

【Rust + Qt开发新范式】:掌握cxx-qt实现双向绑定的7个核心步骤

第一章:Rust Qt融合开发的新范式在现代桌面应用开发中,性能与安全成为关键诉求。Rust 以其内存安全和零成本抽象的特性,逐渐被引入传统 GUI 框架生态。结合 Qt 强大的跨平台 UI 能力,Rust Qt 的融合为高性能桌面应用开辟了新路径…

作者头像 李华
网站建设 2026/9/14 16:19:35

从回调地狱到优雅链式调用:C++26 std::future的进化之路

第一章:从回调地狱到优雅链式调用:C26 std::future的进化之路在异步编程的发展历程中,C 的 std::future 一直扮演着关键角色。早期版本虽支持基本的异步获取,但面对复杂依赖链时,开发者不得不嵌套多层回调,…

作者头像 李华
网站建设 2026/9/12 5:48:37

DiskInfo下载官网不可用时的五大替代方案(适用于GPU服务器)

DiskInfo下载官网不可用时的五大替代方案(适用于GPU服务器) 在AI研发一线摸爬滚打过的工程师都清楚,一个稳定的深度学习环境有多重要。想象一下:你刚申请到一台新的GPU服务器,满心期待地准备跑模型,结果发现…

作者头像 李华