发新帖

[原创] Linux字符设备驱动模型之在Linux内核源码中编写驱动

[复制链接]
发表于 2017-3-15 12:48:13
| 10481 查看 | 2 回复
Linux字符设备驱动模型之在Linux内核源码中编写驱动
-----东方青
首先,从题而言,实际上就是如何将我们自己写的驱动程序直接写在Linux内核中,可以通过make menuconfig这样的方式在内核中进行选择编译,然后编译进内核镜像ZImage或者uImage中,或者编译为模块也可以。前者可以随着Linux系统一起启动。
一、目标创建
在这里使用上一篇文章《Linux字符设备驱动模型之点亮LED灯》的驱动源代码,使其编译进内核空间中。源代码中包括连个文件,分别是led_driver.cled_driver.h
1.linux-3.0.8/drivers/char目录下创建目录led(因为此驱动为字符设备驱动),命令:mkdir led
2.led_driver.cled_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"
到此,关于MakefileKconfig的配置结束。实际上Kconfig的作用就是建立菜单和在make menuconfig下选择配置的作用。具体的关于LinuxMakefileKconfig的管理,可以参看我的文章《Linux内核中MakefileKconfig.config的关系》        ,地址为:http://www.ickey.cc/community/forum.php?mod=viewthread&tid=42948
二、修改驱动程序源码
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驱动编译进内核ZImageuImage镜像。
(2)当选择为 <M> select led driver to S5PV210 时,将led_driver驱动编译为模块,即生成led_driver.ko模块驱动文件。如下图:
在这里选择<*> select led driver to S5PV210将其编译进内核。最后保存退出,然后执行make命令编译即可。当编译成功后,会在生成文件arch/arm/boot/zImageZImage即为所需的内核镜像。
四、功能验证
1.内核启动过程的驱动加载
如上图可见,当通过驱动入口函数led_init()加载led驱动时,有对应的三行打印。
2.查找设备节点
在根文件目录/dev下生成了led设备节点,如图:
3.通过上一篇文章《Linux字符设备驱动模型之点亮LED灯》所使用的应用程序进行测试。
如上图,当在应用空间进行点灯时,通过操作内核空间的控制函数led_ioctl,同样在内核空间中有消息打印输出。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 10 +1024 收起 理由
lygo + 1
chen0000009 + 1
Sourcelink + 1
黄莨元 + 1 很给力!
秦时茗月 + 1000 东方大哥,多来社区逛,88
LiuYang + 2
SingleYork + 10 很给力!
xukejing + 1 赞一个!
汉云 + 1
静水竹林 + 6 很给力!

查看全部评分

我要点赞 3

举报

发表于 2017-4-11 17:36:35
顶一个!!!
我要点赞 0

举报

发表于 2018-10-16 17:45:07
这个非常赞!必须点个赞!!
我要点赞 0

举报

您需要登录后才可以回帖 登录 | 立即注册