资料链接(视频讲解及详细文档):链接: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 (运行完后)
下载完后,就可以直接运行测试文件,就知道驱动编译进入内核是否成功。