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

  • LED灯
  • LINUX
  • TOUCH
  • 东方
  • 源代码
  • 东方青
  • LV4工程师
  • |      2017-03-15 12:48:13
  • 浏览量 11663
  • 回复:2
Linux字符设备驱动模型之在Linux内核源码中编写驱动-----东方青首先,从题而言,实际上就是如何将我们自己写的驱动程序直接写在Linux内核中,可以通过make menuconfig这样的方式在内核中进行选择编译,然后编译进内核镜像ZImage或者uImage中,或者编译为模块也可以。前者可以随着Linux系统一起启动。一、目标创建在这里使用上一篇文章《Linux字符设备驱动模型之点亮LED灯》的驱动源代码,使其编译进内核空间中。源代码中包括连个文件,分别是led_driver.cled_driver.h1.linux-3.0.8/drivers/char目录下创建目录led(因为此驱动为字符设备驱动),命令:mkdir led2.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下的Makefile6.修改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的关系》 ,地址为:https://bbs.icxbk.com/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)当选择为 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,同样在内核空间中有消息打印输出。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:2
yoyojacky 2018-10-16
这个非常赞!必须点个赞!!
0   回复
举报
发布
wspytu 2017-04-11
顶一个!!!
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子