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

怎么把驱动编进内核?

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

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

  1. 打开Makefile
# 位于~/linux-3.4.2/drivers/char
vim Makefile
  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 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,进入图形化配置界面

  1. 一般进入图形化配置界面前,首先会执行某开发板特定的或者近似的默认配置文件,这些配置文件存放于内核的arch/arm/configs/文件夹下。

    image-20220906221407846

    • 假设我们的开发板配置与s3c2410_deconfig最为相似,则可以执行make s3c2410_deconfig。其作用就是将s3c2410_deconfig文件重新复制一份,并命名为.config后移动到内核顶层目录下。此后,进行内核编译时,就以此文件内容决定将哪些模块编译进内核,哪些模块编译为模块,哪些不需要编译。
  2. 进入图形化配置界面,查验是否存在MY_LED的配置菜单项:

    • 执行make menuconfig进入配置界面

    • 执行/MY_LED,查看我们添加的菜单项位置

      image-20220906222532394

    • 可以看到,我们添加的菜单项已经成功添加,此后可以像内核其它模块一样选择编译类型

      image-20220906222741352

      • 保存退出后,我们刚才的选择结果保存于顶层目录下的.config文件中。

        image-20220906223143427

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

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

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

6.1 完善自定义目录结构

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

  1. Makefile

    • 添加编译目标

      obj-$(CONFIG_MY_LED1)	+= my_led1.o
      obj-$(CONFIG_MY_LED2)	+= my_led2.o
      
  2. 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/)下的MakefileKconfig

  1. Makefile

    • 因为我们的驱动放在drivers/char/my_drv下,所以我的上级目录就是drivers/char,我需要修改的就是该目录下的文件.

    • 怎么修改?告诉它我的驱动放在哪一个目录下,即在Makefile文件开头添加如下一条语句::

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

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

      source "drivers/char/my_drv/Kconfig"
      
    
     
    
    
  3. Kconfig

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

      source "drivers/char/my_drv/Kconfig"
      
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leon_George

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值