0
点赞
收藏
分享

微信扫一扫

如何把自己写的驱动编进内核


怎么把驱动编进内核?

  • 本文详细介绍了如何将自己编写的驱动代码放入内核整体框架下。

1. 将自己的驱动源码拷贝进内核相应的文件夹

  • 为便于说明,此处以字符设备驱动​​my_led.c​​为例,需要复制到​​~/linux-3.4.2/drivers/char​​(此处假设内核源码目录linux-3.4.2位于用户家目录)。

cp

2. 修改char目录下的Makefile

  1. 打开Makefile

# 位于~/linux-3.4.2/drivers/char
vim

  1. 在文件顶端或尾端添加如下语句,添加自己编写的目标文件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

  • 在文件顶端或尾端添加如下语句,以后在执行​​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

  • 当然你也可以选择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​​,进入图形化配置界面

  1. 一般进入图形化配置界面前,首先会执行某开发板特定的或者近似的默认配置文件,这些配置文件存放于内核的​​arch/arm/configs/​​文件夹下。
  • 假设我们的开发板配置与​​s3c2410_deconfig​​​最为相似,则可以执行​​make s3c2410_deconfig​​​。其作用就是将​​s3c2410_deconfig​​​文件重新复制一份,并命名为​​.config​​后移动到内核顶层目录下。此后,进行内核编译时,就以此文件内容决定将哪些模块编译进内核,哪些模块编译为模块,哪些不需要编译。
  1. 进入图形化配置界面,查验是否存在MY_LED的配置菜单项:
  • 执行​​make menuconfig​​进入配置界面
  • 执行​​/MY_LED​​,查看我们添加的菜单项位置
  • 如何把自己写的驱动编进内核_内核

  • 可以看到,我们添加的菜单项已经成功添加,此后可以像内核其它模块一样选择编译类型
  • 保存退出后,我们刚才的选择结果保存于顶层目录下的​​.config​​文件中。
  • 如何把自己写的驱动编进内核_内核_02

6. 如何集中管理自编驱动

前文讲述的是如何将一个自定义驱动模块添加进内核原有的驱动层次框架,但为了方便集中管理自己添加的驱动,我们最好是将自己所有自定义的驱动以类型作为区分(字符设备驱动、块设备驱动、网络设备驱动…)分别建立文件夹(目录),并添加进内核相对应的目录中去。

例如,我有两个字符设备驱动,分别为​​my_led1.c​​​和​​my_led2.c​​​,我可以在内核新建​​/drivers/char/my_drv/​​目录,并将前面两个驱动模块移至该目录。后面还需要做2个工作,下面一一讲述:

6.1 完善自定义目录结构

内核驱动框架下一个完整的目录需要包括​​Makefile​​​、​​Kconfig​​​和​​xxx.c​​(各个驱动模块源码)。

  1. Makefile
  • 添加编译目标

obj-$(CONFIG_MY_LED1)  += my_led1.o
obj-$(CONFIG_MY_LED2) += my_led2.o

  1. 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​​。

  1. Makefile
  • 因为我们的驱动放在​​drivers/char/my_drv​​下,所以我的上级目录就是​​drivers/char​​,我需要修改的就是该目录下的文件.
  • 怎么修改?告诉它我的驱动放在哪一个目录下,即在Makefile文件开头添加如下一条语句::

obj-y  += my_drv/    #此处直接设置为y(没有依赖关系),你可视情调整

  1. Kconfig
  • 告诉上级,我的配置菜单文件在哪里,即在Kconfig文件开头添加如下一条语句:

source "drivers/char/my_drv/Kconfig"

  1. Kconfig
  • 告诉上级,我的配置菜单文件在哪里,即在Kconfig文件开头添加如下一条语句:

source "drivers/char/my_drv/Kconfig"


举报

相关推荐

0 条评论