- 驱动路径
- 通常,linux kernel的驱动文件都放在 drivers/ 里面,根据不同驱动类型放置在不同文件里, 如字符设备驱动 放置在 drivers/char/ 文件夹下。
这里,自己创建一个文件夹 para_drv,用来放自己的驱动文件, 具体文件构成如:
drivers/para_drv/Makefile
drivers/para_drv/Kconfig
drivers/para_drv/dtsled/para_dtsled.c
drivers/para_drv/dtsled/Makefile
drivers/para_drv/dtsled/Kconfig
drivers/para_drv/irq_key/para_irq_key.c
drivers/para_drv/irq_key/Makefile
drivers/para_drv/irq_key/Kconfig
以上, Kconfig用于图形化配置,执行 make menuconfig时会被调用,最终会体现在内核的 .config里。
- Kconfig文件
- 在 drivers/Kconfig 里包含 drivers/para_drv/Kconfig 文件
在 drivers/Kconfig 倒数第2行添加以下:
source "drivers/para_drv/Kconfig"
- 在 drivers/para_drv/Kconfig 里包含drivers/para_drv/dtsled/Kconfig 和 drivers/para_drv/irq_key/Kconfig 文件
在 drivers/para_drv/Kconfig添加以下:
menu "para devices"
source "drivers/para_drv/dtsled/Kconfig"
source "drivers/para_drv/irq_key/Kconfig"
endmenu
- 编写 drivers/para_drv/dtsled/Kconfig
#
# para_dtsled
#
config PARA_DTSLED
tristate "PARA_DTSLED driver"
default y
help
Support for PARA_DTSLED driver.
- 编写 drivers/para_drv/irq_key/Kconfig 文件
#
# para_irq_key
#
config PARA_IRQ_KEY
tristate "PARA_IRQ_KEY driver"
default y
help
Support for PARA_DTSLED driver.
- Makefile文件
- 在 drivers/Makefile 里包含 drivers/para_drv/Makefile 文件
在 drivers/Makefile 最后添加以下:
obj-y += para_drv/
- 编写 drivers/para_drv/Makefile
#
# Makefile for the kernel para's device drivers.
#
obj-y += dtsled/
obj-y += irq_key/
- 编写 drivers/para_drv/dtsled/Makefile 和 drivers/para_drv/irq_key/Makefile
drivers/para_drv/dtsled/Makefile:
CONFIG_PARA_DTSLED 在 kernel的 .config 文件里, 从 Kconfig 文件里产生
obj-$(CONFIG_PARA_DTSLED) += para_dtsled.o
drivers/para_drv/irq_key/Makefile:
CONFIG_PARA_IRQ_KEY 在 kernel的 .config 文件里, 从 Kconfig 文件里产生
obj-$(CONFIG_PARA_IRQ_KEY) := para_irq_key.o
- 配置内核
-
在 kernel 根目录下执行 make menuconfig, 如下图
-
选择 Device Drivers->para device, 其中 para device 在drivers/para_drv/Kconfig 里
-
Device Drivers->para device 菜单里 出现两个条目 PARA_DTSLED driver 和 PARA_IRQ_KEY driver 分别定义在对应的 Kconfig文件里。这两个条目前的 <> 有三个选项:
-
空: 不选,–> .config 里:CONFIG_PARA_DTSLED is not set,make 内核时不会编译对应的文件
M:编译成模块–> .config 里: CONFIG_PARA_DTSLED=m
make 内核时会调用模块对应的 Makefile文件(如/drivers/para_drv/irq_key/Makefile),并在/drivers/ 下 各Makefile 同级目录下生成在modules.order 和 modules.builtin文件, 同时在各级modules.order里自动生成 kernel/drivers/para_drv/dtsled/para_dtsled.ko, 表示编译成了模块 。
*: 编译进内核 –> .config 里: CONFIG_PARA_IRQ_KEY=y, make 内核时会调用模块对应的 Makefile文件(如/drivers/para_drv/irq_key/Makefile),并在/drivers/ 下各Makefile 同级目录下生成在modules.order 和 modules.builtin文件, 同时在modules. builtin里自动生成 kernel/drivers/para_drv/irq_key/para_irq_key.ko, 表示编译进了内核 。
.config 文件截图
- 编译内核并验证
- 在内核根目录下执行 :
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
ARCH=arm: 目标处理器的架构
CROSS_COMPILE=arm-linux-gnueabihf-: 指定交叉编译链
- 最终编译出的内核文件为: arch/arm/boot/zImage
- 将zImage 烧录到目标板, ls /dev, 会发现已经编译进内核的驱动(或者在内核启动log里查找驱动文件里的log)。
内核启动log里对应的驱动打印及驱动源码:
驱动名及执行 ls /dev: