怎么把驱动编进内核?
- 本文详细介绍了如何将自己编写的驱动代码放入内核整体框架下。
1. 将自己的驱动源码拷贝进内核相应的文件夹
-
为便于说明,此处以字符设备驱动
my_led.c
为例,需要复制到~/linux-3.4.2/drivers/char
(此处假设内核源码目录linux-3.4.2位于用户家目录)。cp my_led.c ~/linux-3.4.2/drivers/char
2. 修改char目录下的Makefile
- 打开Makefile
# 位于~/linux-3.4.2/drivers/char
vim Makefile
-
在文件顶端或尾端添加如下语句,添加自己编写的目标文件my_led.o:
obj-$(CONFIG_MY_LED) += my_led.o //需要通过用户自定义配置时 或者采用 obj-y += my_led.o //不需要通过用户配置,必须编译进内核
3. 修改char目录下的Kconfig文件
-
打开Kconfig
# 位于~/linux-3.4.2/drivers/char vim Kconfig
-
在文件顶端或尾端添加如下语句,以后在执行
menuconfig
时可以在相应菜单中找到"My led driver support"选项,其作用就是确定(配置)CONFIG_MY_LED的值(y、m、n):config MY_LED tristate "My led driver support" default n help If you want to add LED function say Y or M here, otherwise say N
-
当然你也可以选择bool类型(y或n),更加详细的语法可以参考内核文档,内核文档位置位于内核根目录下的
/Documentation/kbuild/kconfig_language.txt
:
4. 设置交叉编译环境
export ARCH=arm //设置目标板架构为ARM,否则生成的目标文件将不被目标板识别
export CROSS_COMPILE=arm-linux- //设置交叉编译工具链前缀
export PATH=$PATH:/usr/local/arm/4.3.2/bin //添加交叉编译工具链所在bin目录
5. 内核顶层目录下执行make menuconfig
,进入图形化配置界面
-
一般进入图形化配置界面前,首先会执行某开发板特定的或者近似的默认配置文件,这些配置文件存放于内核的
arch/arm/configs/
文件夹下。- 假设我们的开发板配置与
s3c2410_deconfig
最为相似,则可以执行make s3c2410_deconfig
。其作用就是将s3c2410_deconfig
文件重新复制一份,并命名为.config
后移动到内核顶层目录下。此后,进行内核编译时,就以此文件内容决定将哪些模块编译进内核,哪些模块编译为模块,哪些不需要编译。
- 假设我们的开发板配置与
-
进入图形化配置界面,查验是否存在MY_LED的配置菜单项:
-
执行
make menuconfig
进入配置界面 -
执行
/MY_LED
,查看我们添加的菜单项位置 -
可以看到,我们添加的菜单项已经成功添加,此后可以像内核其它模块一样选择编译类型
-
保存退出后,我们刚才的选择结果保存于顶层目录下的
.config
文件中。
-
-
6. 如何集中管理自编驱动
前文讲述的是如何将一个自定义驱动模块添加进内核原有的驱动层次框架,但为了方便集中管理自己添加的驱动,我们最好是将自己所有自定义的驱动以类型作为区分(字符设备驱动、块设备驱动、网络设备驱动…)分别建立文件夹(目录),并添加进内核相对应的目录中去。
例如,我有两个字符设备驱动,分别为my_led1.c
和my_led2.c
,我可以在内核新建/drivers/char/my_drv/
目录,并将前面两个驱动模块移至该目录。后面还需要做2个工作,下面一一讲述:
6.1 完善自定义目录结构
内核驱动框架下一个完整的目录需要包括Makefile
、Kconfig
和xxx.c
(各个驱动模块源码)。
-
Makefile
-
添加编译目标
obj-$(CONFIG_MY_LED1) += my_led1.o obj-$(CONFIG_MY_LED2) += my_led2.o
-
-
Kconfig
-
添加配置菜单
config MY_LED1 tristate "My LED1 for leon" default y help Just for test! config MY_LED2 tristate "My LED1 for leon" default y help Just for test!
-
6.2 修改上级目录结构
既然你在上级目录的地盘添加了新的东西,那出于礼貌肯定是要和别人说一下的,所以你需要修改(告诉人家)上级目录(此处为drivers/char/)下的Makefile
、Kconfig
。
-
Makefile
-
因为我们的驱动放在
drivers/char/my_drv
下,所以我的上级目录就是drivers/char
,我需要修改的就是该目录下的文件. -
怎么修改?告诉它我的驱动放在哪一个目录下,即在Makefile文件开头添加如下一条语句::
obj-y += my_drv/ #此处直接设置为y(没有依赖关系),你可视情调整
-
-
Kconfig
-
告诉上级,我的配置菜单文件在哪里,即在Kconfig文件开头添加如下一条语句:
source "drivers/char/my_drv/Kconfig"
-
-
Kconfig
-
告诉上级,我的配置菜单文件在哪里,即在Kconfig文件开头添加如下一条语句:
source "drivers/char/my_drv/Kconfig"
-