如何将一个驱动编译进内核

将一个驱动编译进内核
驱动和内核成为一个整体,即驱动程序在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
如何将一个驱动编译进内核_第1张图片

make menuconfig
如何将一个驱动编译进内核_第2张图片

生成include/config/auto.conf
如何将一个驱动编译进内核_第3张图片

include/config/auto.conf.cmd
如何将一个驱动编译进内核_第4张图片

生成的内核信息
include/config/kernel.release
这里写图片描述

autoconf.h
如何将一个驱动编译进内核_第5张图片

compile.h
如何将一个驱动编译进内核_第6张图片

/etc/profile
如何将一个驱动编译进内核_第7张图片

你可能感兴趣的:(linux驱动)