EsDA工控单板
EPC6450-AWI/EPC1107-LI/EPC3568系列工控板
MPC-ZC1迷你工控主板
Cortex®-A5,拖拽式开发,40pin扩展引脚
2.5寸工控单板
EPC-6Y2C-L网络控制器
Cortex®-A7,800MHz,8路串口,数字音频
IoT-6Y2C-L物联网关控制器
Cortex®-A7,800MHz,8路串口,支持蓝牙
EPC-6G2C-L网络控制器
Cortex®-A7,528MHz,8路串口,数字音频
IoT-6G2C-L物联网关控制器
Cortex®-A7,528MHz,8路串口,支持蓝牙
3.5寸工控单板
IoT7000A-LI物联网网关控制器
Cortex®-A7,双MiniPCIe接口支持无线模块扩展
IoT-9608I-L网络控制器
Cortex®-A8,800MHz,6种无线通讯方式
EPC-9600I-L工控主板
Cortex®-A8,800Mhz
IoT9000A-LI工控主板
Cortex®-A9,强劲编解码,专注多媒体
IoT9100A-LI工业IoT网络控制器Cortex®-A9,1GHz
SX-3568系列主板Cortex®-A55,双核心GPU
MD-3568LI工控板Cortex®-A55,双网口

【Linux学习小技巧】Linux内核开发工具介绍2

通过make menuconfig(make xconfig或者make gconfig)命令配置内核的时候,从Kconfig文件读取菜单,配置完毕保存到文件名为.config的内核配置文件中,供Makefile文件在编译内核时使用。

1.1.1 Kconfig基本语法

如程序清单.1所示代码摘自文件,是一个比较典型的Kconfig文件片段,包含了Kconfig的基本语法。

程序清单1drivers/char/Kconfig片段

menu "Character devices"

source "drivers/tty/Kconfig"

config DEVKMEM

bool "/dev/kmem virtual device support"

default y

help

Say Y here if you want to suppor

1. 子菜单

通过menu和endmenu来定义一个子菜单,程序清单1所示代码定义了一个“Character devices”子菜单,子菜单在界面中用“--->”表示,如图1所示。
图1menu定义的子菜单

子菜单的菜单项则由config来定义,随后的“bool”、“default”、“help”等都是该菜单项的属性:
config DEVKMEM

bool "/dev/kmem virtual device support"

这两行语句定义了一个bool选项,在.config中的配置变量名称为CONFIG_DEVKMEM,选项提示信息为“/dev/kmem virtual device support”,在内核配置界面的实际表现为:

[*] /dev/kmem virtual device support

由于设置其默认属性default为y,所以该选项默认选中。

help引出帮助信息,在内核配置界面,选择选项后,通过可以查看帮助信息。

2. 属性

类型定义:每个菜单项都必须定义类型,可选类型有:bool、tristate、string、hex和int,各类型描述如表1所列。

表1菜单项类型和说明

定义选项的类型后面可以加菜单信息,用引号(“”)给出,留空则不加提示信息。

对于布尔型选项,在配置界面用[]表示:

[*] /dev/kmem virtual device support

[*]表示选中,对应CONFIG_XXX=y,[ ]则表示未选中。

对于三态选项,在配置界面用<>表示:

<*> Kernel .config support

<*>表示选中,对应CONFIG_XXXx=y,表示编译为模块,对应CONFIG_XXX=m,<>表示未选中。

子菜单也可同时设置类型,如下列代码在定义PWM菜单的同时定义了菜单属性为三态:

menuconfig GENERIC_PWM
tristate "PWM Support"
default n
help
Enables PWM device support implemented via a generic
framework.If unsure, say N.

在配置界面表现为:

<> PWM Support--->

说明:子菜单的配置值会影响其子选项的可能值。例如三态子菜单配置为,则其三态子选项依旧可有3种可能值,即可配置为或者不选中;而三态子菜单配置为,则其子选项只有和不选中两种状态可用。

默认值:有写选项可以设置默认值,无论是哪种类型,都可以通过default设置其默认值,例如:

config ARM
bool
default y
select HAVE_AOUT

选中:前面这个示例的select,表示了一种选中关系,即选中某个选项后,会自动选中某个或者某些选项。前面这个示例表明,选中Arm®后,会自动选中HAVE_AOUT。

依赖关系:如果一个选项能否生效与否与其它选项的设置有关,则必须通过depends on来声明这种依赖关系。例如,只有使能了SMP才能设置CPU个数变量NR_CPUS,在Kconfig中则写成:

config NR_CPUS
int "Maximum number of CPUs (2-32)"
range 2 32
depends on SMP
default "4"

帮助:通过help关键字引入帮助,帮助的正文必须另起一行。

菜单选项属性的每个关键字,必须用TAB键与行首隔开,不能用等数的空格替代。

3. 目录层次迭代

通过source可以直接引用下级目录的Kconfig文件,形成新的菜单项或者子菜单,这样方便每个目录独立管理各自的配置内容。“source "drivers/tty/Kconfig"”就是直接引用文件,形成更多菜单(项)。

1.1.2 配置项和配置开关

通过config定义的菜单配置项,在内核配置后会产生一个以“CONFIG_”开头的配置开关变量,该开关变量可在Makefile中或者源代码中使用。

例如:“config BAR”将会产生一个开关变量CONFIG_BAR,在Makefile中可以这么使用:

obj-$(CONFIG_BAR)+= file_bar.o

在源代码中可用这个开关变量在源代码中可用这个开关变量来进行一些条件处理,例如:

#if defined (CONFIG_BAR)

实际处理代码

#endif

如果定义的BAR是三态变量,则还可以根据需要这样使用:

#if defined (CONFIG_BAR)|| defined (CONFIG_BAR_MODULE)

实际处理代码

#endif