文章目录
- 分析一个例子
- 仿写一个例子(需要编译成.ko的)
- 写三个文件
- 编辑上一级目录的Makefile文件
- 编辑上一级目录的Kconfig文件
- make menuconfig进行配置
- 烧录到开发板上
分析一个例子
例子:
source "drivers/redled/Kconfig"
config LED__4412
tristate "Led Support for GPIO Led"
depends on LEDS_CLASS
help
This option enable support for led
分析:
-
source "drivers/redled/Kconfig"
它会包含/drivers/redled/这个路径下的驱动文件,方便我们对菜单进行管理
-
config LED__4412
配置选项的名称为CONFIG_LED_4412
-
tristate
表示的是当前驱动的状态,有三种状态(tri 前缀词根“三”):把驱动编译成模块,把驱动编译到内核,不编译。与之对应的还有bool
类型,分别是编译到内核,不编译。
-
"Led Support for GPIO Led"
就是make menuconfig显示的名字。
-
A depends on B
表示只有在选择B的时候才可以选择A。所以例子中的depends on LEDS_CLASS
就是在LEDS_CLASS
被选中的时候才可以被选中本选项。
-
- 比如我想直接去掉LED相关的东西,直接改.config文件可以吗?可以但是不推荐,如果有依赖的话,直接修改.config是不成功的。
-
select
就是反向依赖,该选项被选中的时候,后面的定义也会被选中。
-
help This option enable support for led
就是帮助信息。
仿写一个例子(需要编译成.ko的)
写三个文件
1、进入内核源码目录,然后进入drivers/char/
目录下,这里就是众多字符设备驱动的地方。在这个目录下新建一个目录mkdir hello
,然后进入hello目录,新建文件touch hello.c
和touch Kconfig
和touch Makefile
hello.c文件
/* 头文件 */
#include <linux/init.h> // 包含宏定义
#include <linux/module.h> // 包含初始化、加载模块的头文件
static int hello_init(void)
{
printk("hello world\n");
return 0;
}
static void hello_exit(void)
{
printk("Bye Bye\n");
}
/* 模块的入口 */
module_init(hello_init);
/* 模块的出口 */
module_exit(hello_exit);
/* 模块声明 */
MODULE_LICENSE("GPL");
Kconfig文件
config HELLO
tristate "hello world"
help
Hello Liefyuan
Makefile文件
obj-$(CONFIG_HELLO)+=hello.o
OK,上面的三个文件搞好后就像这样:
liefyuan@ubuntu:~/Liefyuan/bingpi-v3s/linux-zero-5.2.y/drivers/char/hello$ ls
hello.c Kconfig Makefile
接下来就要在上一级的目录(/drivers/char
路径下)里面把我们写的包含进入。
编辑上一级目录的Makefile文件
在上一级目录的Makefile文件里面进行编辑:
将下面这一行添加进去。
obj-y +=hello/
编辑上一级目录的Kconfig文件
在上一级目录的Kconfig文件里面进行编辑:
将下面这一行添加进去:
source "drivers/char/hello/Kconfig"
make menuconfig进行配置
如下,就出现了。
Device Drivers --->
Character devices --->
<*> hello world (NEW)
配置编译进内核,在源码的根目录看看.config里面:
烧录到开发板上
...
[ 0.177909] sun8i-v3s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pb not found, using dummy regulator
[ 0.179041] printk: console [ttyS0] disabled
[ 0.199358] 1c28000.serial: ttyS0 at MMIO 0x1c28000 (irq = 34, base_baud = 1500000) is a U6_16550A
[ 0.706217] printk: console [ttyS0] enabled
[ 0.711217] hello world
[ 0.737881] MACsec IEEE 802.1AE
[ 0.741315] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 0.747844] ehci-platform: EHCI generic platform driver
[ 0.753409] ehci-platform 1c1a000.usb: EHCI Host Controller
...
上电信息有打印hello world说明驱动加载进去了。