将一个驱动编译进内核
驱动和内核成为一个整体,即驱动程序在zImage
(或uImage
),在内核启动过程中,会自动安装驱动。
1、将驱动源码放在linux内核的源码包中
drivers/char/leds/gec210_led.c
在drivers/char/
下创建了一个目录leds
,将gec210_led.c
放到该目录下。
注意:linux
内核如何编译源程序?
Makefile
—>管理源码
Kconfig
—>生成配置菜单
2、在drivers/char/leds/创建一个Kconfig文件
并添加如下内容:
menu "GEC210 LEDS"
config GEC210_LED
tristate "the driver of leds for GEC210"
default Y
depends on MACH_GEC210
help
this is a driver for leds.led1=GPJ2_0,led2=GPJ2_1
endmenu
分析:
config GEC210_LED
GEC210_LED
—>条件编译选项(菜的ID)。在菜单中可以将条件编译选项设置成:
Y
—> 将该驱动编译进内核 (在饭店吃)
M
—> 将驱动编译成一个ko (不在饭店吃,打包带走)
N
—> 不编译该驱动(不点该菜)
make menuconfig
—>选择哪些程序编译(点菜过程)
.config
—>各个条件编译选项和它的值(点菜后下的单)
tristate "the driver of leds for GEC210"
tristate
—>条件编译选项有三个值:Y、M、N
如:bool
有两个值:Y、N
“the driver of leds for GEC210” —>make menuconfig
看到的内容(菜名)
depends on MACH_GEC210
`GEC210_LED`是依赖于`MACH_GEC210`,只有设置了`MACH_GEC210=y`,才可以设置`GEC210_LED`的值
help
this is a driver for leds.led1=GPJ2_0,led2=GPJ2_1.
帮助
3、在drivers/char/leds/创建一个Makefle文件添加内容:
obj-$(CONFIG_GEC210_LED) += gec210_led.o
分析:
在Makefile
中,根据条件编译选项的值,来确定驱动源编如何编译。
Makefile
—>管理源码的编译(厨师)
4、修改drivers/char/Kconfig
是我们新增的Kconfig
和内核的Kconfig
树连接在一起
加入:
source "drivers/char/leds/Kconfig"
5、修改drivers/char/Makefile
是我们新增的Makefile和内核的Makefile树连接在一起
加入:
obj-$(CONFIG_GEC210_LED) += leds/
6、配置
make menuconfig
Device Drivers --->
Character devices --->
GEC210 LEDS --->
<*> the driver of leds for GEC210
7、编译
make输出:
CC drivers/char/leds/gec210_led.o
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
8、调试
将zImage下载到板子上,启动zImage
查看内核的输出信息:
static int __init led_init(void)
{
............
printk("led driver init ok !\n");
}
输出:
[ 1.042435] s3cfb s3cfb: registered successfully
[ 1.246398] led driver init ok !
[ 1.247157] PA FB = 0x45FAF000, bits per pixel = 32
说明:zImage启动的过程中,自动安装了驱动
总结:
Kconfig + Makefile = Kbuild
9、Kernel 的配置文件:
/kernel/arch/arm/configs/rkpx3_hzhq_vehicle_defconfig