linux驱动程序开发-第七节:把自定义的设备驱动编译进内核

本节知识点:如何把自定义的设备驱动编译到内核中。

实际开发作用:以往测试驱动或者加载驱动通过insmod xxx.ko  我们一般会修改脚本使得上电自动加载驱动,但是我们一旦

不小心删除了指定路径下的驱动文件后就无法加载,存在漏洞。我们可以把它编译到内核,再把内核烧写到设备中。

资料链接(视频讲解及详细文档):链接:https://pan.baidu.com/s/1Hd5zGk0c5ib_fKOmbwjl2Q         提取码:xecu 
 


一、驱动程序存在的形式

1.  将驱动成编译成一个 ko,ko 是一个独立的 module

驱动程序安装:#insmod  led_drv.ko

卸载:#rmmod  led_drv.ko

2.  如何开机自动安装驱动,运行应用程序。

/test/led_drv.ko      /test/test

修改/etc/profile:

#vi  /etc/profile

cd  /test

insmod  led_drv.ko

./test  &

cd  /

3.  将驱动程序编译到 linux 内核中,使驱动程序和 linux 内核成为一个整体。当 linux 内核启动的过程中,会自

动的安装驱动。

内核的编译过程如下:

1)   Image(未压缩的内核映像)

2)   zImage(压缩)

3)   mkimage(uboot 生成工具)将 zImage 加个头

4)   uImage

5)   ext4 文件系统打包,生成 boot.img

 


二、如何将一个驱动程序编译进内核

 

1.  将驱动程序放入内核源码

 

/kernel/drivers/char/leds/led_drv.c

 

2.  创建一个 Kconfig 文件

/kernel/drivers/char/leds/Kconfig

 

menu  "GEC6818  LED  Driver"

 

config  GEC6818_LEDS

tristate  "led  drivers  for  gec6818"

depends  on  ARCH_S5P6818

default  y

help

this  is  a  driver  for  GEC6818,  D8---GPIOC17,D9--GPIOC8

,D10--GPIOC7,D11--GPIOC12

endmenu

 

Kconfig 作用:定义一个条件编译选项和配置菜单。当 make  menuconfig 弹出 Kconfig 定义的菜单,对条件编

译选项赋值。

分析 Kconfig 文件:

1

menu  "GEC6818  LED  Driver"

 

endmenu

 

menu:菜单的开始

"GEC6818  LED  Driver":菜单的名字

endmenu:菜单的结束

 

当执行 make  menuconfig 时会看到该菜单配置。

 

2)config  GEC6818_LEDS

定义一个条件编译选项,条件编译选项在使用时候会加一个前缀:CONFIG_。

make  menuconfig 是对条件编译选项进行赋值,在 Makefile 编译驱动的时候,会使用该条件编译选项。

 

3)tristate  "led  drivers  for  gec6818"

条件编译选项的值是 tristate

Y  --->  驱动程序编译进内核

M  --->  驱动程序不编译进内核,但是在驱动程序的源码目录下,会生成一个 ko

N  --->  驱动程序不编译

 

扩展:

 

tristate

Y--<*>,

M--,

N--<  >

 

bool

Y--[*]

N--[  ]

 

 

 

4)  depends  on  ARCH_S5P6818

条件编译选项 GEC6818_LEDS 是依赖于条件编译选项 ARCH_S5P6818 的,只用 ARCH_S5P6818 的值为 Y 的时候,

才有机会对 ARCH_S5P6818 条件编译选项进行赋值。

 

5)  default  y

条件编译选项的值默认是 Y

 

6)help

this  is  a  driver  for  GEC6818

D7(GPIOE13)  D8(GPIOC17)  D9(GPIOC8)  D10(GPIOC7)


 

3.  创建一个 Makefile 文件

/kernel/drivers/char/leds/Makefile

 

obj-$(CONFIG_GEC6818_LEDS)  +=  led_drv.o

 

gec@ubuntu:~/6818GEC/kernel/drivers/char/leds$  ls

Kconfig   led_drv.c   Makefile

 

4.  修改上一级目录下 Kconfig

/kernel/drivers/char/Kconfig

source  "drivers/char/leds/Kconfig"

 

5.  修改上一级目录下的 Makefile

/kernel/drivers/char/Makefile

obj-$(CONFIG_GEC6818_LEDS)  +=  leds/

 

6.  配置内核

gec@ubuntu:~/6818GEC/kernel$  cp  arch/arm/configs/GEC6818_defconfig       .config

gec@ubuntu:~/6818GEC/kernel$  make  menuconfig

补充说明:
如果使用 make  menuconfig 有以下出错信息,请安装 libncurses5-dev。
root@ubuntu:~/6818GEC/kernel#  make  menuconfig
***  Unable  to  find  the  ncurses  libraries  or  the
***  required  header  files.
***  'make  menuconfig'  requires  the  ncurses  libraries.
***
***  Install  ncurses  (ncurses-devel)  and  try  again.
***

解决方法:
apt-get  install  libncurses5-dev

7.  保存配置

#cp   .config      arch/arm/configs/GEC6818_defconfig

 

注:

为什么每次配置完内核之后,都需要拷贝.config 文件去覆盖 GEC6818_defconfig,原因在于 mk 脚本文件编译

内核的时候,会使用 GEC6818_defconfig 的配置文件。

 

8.  编译

#  ./mk  -k

9.生成:

/home/arm/6818GEC/out/target/product/GEC6818//boot/uImage

/home/gec/6818GEC/out/release/boot.img

三、测试内核镜像的方法

测试内核的方法有两种:第一种方法使用 uboot 下载 uImage 到内存启动内核;第二种方法使用 fastboot 或恢

复卡固化到 emmc


方法一:uboot 下载 uImage 并启动内核

(注意是进到uboot,即开机3秒回车进入uboot)

先设置serverip,可以输入print 查看ip地址

set  serverip   192.168.28.24(电脑的ip地址,把电脑作为服务器,开发板为客户端)

save (保存)

tftp  0x48000000   uImage  (下载)

bootm  0x48000000          (运行完后)

下载完后,就可以直接运行测试文件,就知道驱动编译进入内核是否成功。

 

 

 

 

 

 

 

你可能感兴趣的:(嵌入式驱动开发)