本文目录
- 一、Linux 内核驱动目录
- 二、自定义驱动的Kconfig编写
- ●示例:在 drivers 菜单添加一个自己驱动的子菜单。
- 三、自写驱动的Makefile编写
- 四、总结
一个Linux内核源码,其中包含了很多驱动程序,对应不同的功能。我们在编译内核时。如果将所有的驱动程序都编译进镜像文件中时,该镜像文件会占的内存很大。然而在公司企业中通常会使内核镜像占用内存空间尽可能的小,如裁剪掉不常用的功能,保留使用的功能即可。这时就需要菜单文件来进行选择裁剪。在linux中我们常用make menuconfig
来进行图形化的方式来选择功能裁剪。完成裁剪后会生成.config文件来保存选择的配置信息。对于64位的arm架构,可以使用make menuconfig ARCH=arm64
,32位的arm使用make menuconfig ARCH=arm
。
源码树目录下一般都会有两个文件:Kconfig 和 Makefile。分布在各目录下的 Kconfig 构成了一个分布式的内核配置数据库,每个 Kconfig 分别描述了所属目录源文件相关的内核配置菜单。在内核配置 make menuconfig(或 xconfig 等)时,从 Kconfig 中读出配置菜单,用户配置完后保存到 .config (在顶层目录下生成) 中。 在内核编译时,主 Makefile 调用这个 .config ,就知道了用户对内核的配置情况。
一、Linux 内核驱动目录
对于一个内核驱动程序,通常我们使用文件目录的形式在区分各个驱动程序。即不同的驱动程序对应不同的文件目录。定义目录位置:在内核源码的dirvers
目录下。
在dirvers目录下,包含Kconfig、Makefile、各类驱动程序目录。Kconfig 分别描述了所属目录源文件相关的内核配置菜单。 Makefile 为管理工程代码文件,决定哪些文件被编译,如何被编译,如何链接。每个驱动程序目录又包含其c文件、Kconfig、以及Makefile文件。
drivers目录下的Kconfig
内容如下,这里包含了其目录下的各个驱动程序目录里的Kconfig文件。用于配置菜单。
二、自定义驱动的Kconfig编写
Kconfig 就是对应着内核的配置菜单。假如要想添加新的驱动到内核的源码中,可以通过修改 Kconfig 来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的 Makefile。因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个):Kconfig、Makefile。要想知道怎么修改这两种文件,就要知道两种文档的语法结构。
一般一个 Kconfig 文件表示的就是一个菜单,一个菜单由多个菜单项组成,其格式如下:
menu "Device Drivers"//具体的子项菜单
config 自定义宏名1类型 "选项描述(菜单里显示的内容,提示字符串,用给人看的)"default n //默认状态help帮助信息..........config 自定义宏名2类型 "选项描述(菜单里显示的内容,提示字符串,用给人看的)"default y //默认状态help帮助信息..........endmenu
●示例:在 drivers 菜单添加一个自己驱动的子菜单。
(1)在drivers目录下新建自己驱动的文件夹:mkdir qjl
。
(2)进入自己驱动的文件夹,创建Kconfig文件。
(3)编写Kconfig文件。
menu "QJL_dirver"config QJL_KEYbool "qjl_key_driver"default y //默认值helpthis is a key_dirver, user is qjl.config QJL_LEDbool "qjl_led_dirver"default n //默认值helpthis is a led_dirver, user is qjl.config QJL_LED1tristate "led1_driver" //添加了编译为模块的形式。depends on QJL_LED //如果QJL_LED被选上,该选项才会出现。(依赖于QJL_LED )helpthis is a led1_dirver, user is qjl.endmenu
(4)在dirver目录下的Kconfig添加自定义子菜单的Kconfig路径。
(5)在源码主Makefile下配置菜单。使用:make meunconfig
配置,配置完成后保存退出,生成.config
配置文件。
(6)查看.config配置文件内容。
注意:y为编译进内核、n为不编译进内核、m为编译为模块。
三、自写驱动的Makefile编写
章节二中我们已经配置好哪些驱动编译进内核,哪些驱动编译为模块。本章的Makefile 使用 .config 文件的宏来裁剪 C 代码,决定哪些 C 代码被编译。我们使用.config
文件中的宏定义来编写Makefile
文件,这里obj-y
表示编译进内核,obj-m
表示编译为模块。
目录如下:
该目录的Makefile内容如下:
obj-$(CONFIG_QJL_KEY) +=key_dirver.o
obj-$(CONFIG_QJL_LED1) +=led1_dirver.o
●重要:编写完成子目录下的Makefile
后,需要在dirver
目录下的Makefile
中添加子目录路径。这样做的目的是为了在编译时会找到子目录中的Makefile文件,从而使用顶层Makefile进行编译。
四、总结
本文学习了如何添加自定义驱动菜单,步骤如下:
- 在dirver目录下新建自己的驱动文件夹,该文件夹包含Kconfig、Makefile以及自己的驱动程序文件。
- 编写Kconfig和Makefile文件。按如上内容编写。
- 将自己目录下的Kconfig文件路径添加至上层目录的Kconfig下。
- 将自己目录路径添加至上层目录的Makefile下。
- 在源码顶层Makefile目录下,使用
make menuconfig ARCH=arm64
进行配置的选择,最后保存并生成.config
文件。 - 使用
make
进行源码编译。如果编译64位的arm芯片,则使用make ARCH=arm64
,32位使用make ARCH=arm
。