首先,从题而言,实际上就是如何将我们自己写的驱动程序直接写在Linux内核中,可以通过make
menuconfig这样的方式在内核中进行选择编译,然后编译进内核镜像ZImage或者uImage中,或者编译为模块也可以。前者可以随着Linux系统一起启动。
一、目标创建
在这里使用上一篇文章《Linux字符设备驱动模型之点亮LED灯》的驱动源代码,使其编译进内核空间中。源代码中包括连个文件,分别是led_driver.c和led_driver.h。
1.在 linux-3.0.8/drivers/char 目录下创建目录led(因为此驱动为字符设备驱动),命令:mkdir led
2.将led_driver.c和led_driver.h文件拷贝到led目录下。
3.创建Makefile文件( touch Makefile ),并添加编译信息,如下图:
以上语句的意思是如果宏USER_LED被定义,那么将led_driver.c编译为 led_driver.o
文件。而宏充电可通过在Kconfig文件中进行选择配置。
4.创建Kconfig文件(touch Kconfig),并添加配置信息,如下图:
Tristate表示三态,即可以不选择编译、选择编译进内核(为*号表示选择)和选择编译生成内核驱动模块(为M字符表示选择)生成ko文件。
Depends表示依赖,表示只有当平台相关的宏ARCH_S5PV210被定义时,这个驱动选择才有效。
5.修改 linux-3.0.8/drivers/char/led
目录上一层目录的Makefile,即为linux-3.0.8/drivers/char/目录下的Makefile。在这个Makefile文件中添加一行:obj-$(CONFIG_USER_LED)
+= led/
其中CONFIG_USER_LED的定义和 linux-3.0.8/drivers/char/led 目录下的Makefile里的定义相同,如下图:
这里表示的意思是查找当前目录(linux-3.0.8/drivers/char)下的子目录led下的Makefile。
6.修改 linux-3.0.8/drivers/char/led 目录上一层目录的Kconfig文件,即为
linux-3.0.8/drivers/char/
目录下的Kconfig文件,在其中的任意位置添加一行source"drivers/char/led/Kconfig",意思是查找linux-3.0.8/drivers/char/led目录下的Kconfig文件。如下图:
如上图还可以看到一个信息:menu "Character devices"表示的是字符设备的菜单名称为"Character devices"。
到此,关于Makefile和Kconfig的配置结束。实际上Kconfig的作用就是建立菜单和在make
menuconfig下选择配置的作用。具体的关于Linux中Makefile和Kconfig的管理,可以参看我的文章《Linux内核中Makefile、Kconfig和.config的关系》。
二、修改驱动程序源码
1.在驱动装载函数led_init()和文件打开函数led_open()中添加打印信息。如下图:
目的是当内核启动并加载驱动时,可以打印出加载函数名。
2.Led操作函数led_ioctl如下:
每一次操作led等,都会从内核有相应的消息打印输出。
三、menuconfig配置
在内核顶层目录linux-3.0.8/下执行命令: make menuconfig 进入图像菜单配置界面,如下图所示:
配置路径如下:
_Device Drivers — > _
_Character devices — > _
_ < > select led driver to S5PV210 _
可以在这里进行选择配置。有以下两种形式:
(1)当选择为 <> select led driver to S5PV210
时,将led_driver驱动编译进内核ZImage或uImage镜像。
(2)当选择为 < M> select led driver to S5PV210
时,将led_driver驱动编译为模块,即生成led_driver.ko模块驱动文件。如下图:
在这里选择 <> select led driver to S5PV210
将其编译进内核。最后保存退出,然后执行make命令编译即可。当编译成功后,会在生成文件 arch/arm/boot/zImage
。ZImage即为所需的内核镜像。
四、功能验证
1.内核启动过程的驱动加载
如上图可见,当通过驱动入口函数led_init()加载led驱动时,有对应的三行打印。
2.查找设备节点
在根文件目录/dev下生成了led设备节点,如图:
3.通过上一篇文章《Linux字符设备驱动模型之点亮LED灯》所使用的应用程序进行测试。
如上图,当在应用空间进行点灯时,通过操作内核空间的控制函数led_ioctl,同样在内核空间中有消息打印输出。
更多Linux教程请查看菜单
- Linux字符设备驱动模型之操作函数集
- Linux字符设备驱动模型之设备号
- Linux字符设备驱动模型之框架解说
- Linux字符设备驱动模型之字符设备驱动代码模板
- Linux字符设备驱动模型之Linux内核模块参数
- Linux字符设备驱动模型之字符设备初始化
- Linux字符设备驱动模型之Linux内核驱动访问揭秘
- Linux字符设备驱动模型之点亮LED灯