嵌入式Linux(2):将Helloworld驱动编译到内核

文章介绍了Linux内核驱动开发的过程,包括创建驱动目录,编写hello.c源代码,设置Kconfig配置文件,编辑Makefile以编译成ko模块。在上一级目录的Makefile和Kconfig添加新驱动的引用,并通过makemenuconfig配置内核。最后,烧录到开发板并验证驱动是否成功加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分析一个例子

例子:

source "drivers/redled/Kconfig"
config LED__4412
		tristate "Led Support for GPIO Led"
		depends on LEDS_CLASS
		help
		This option enable support for led

分析:

    1. source "drivers/redled/Kconfig" 它会包含/drivers/redled/这个路径下的驱动文件,方便我们对菜单进行管理
    1. config LED__4412 配置选项的名称为 CONFIG_LED_4412
    1. tristate 表示的是当前驱动的状态,有三种状态(tri 前缀词根“三”):把驱动编译成模块,把驱动编译到内核,不编译。与之对应的还有bool类型,分别是编译到内核,不编译。
    1. "Led Support for GPIO Led" 就是make menuconfig显示的名字。
    1. A depends on B 表示只有在选择B的时候才可以选择A。所以例子中的depends on LEDS_CLASS就是在LEDS_CLASS被选中的时候才可以被选中本选项。
    1. 比如我想直接去掉LED相关的东西,直接改.config文件可以吗?可以但是不推荐,如果有依赖的话,直接修改.config是不成功的。
    1. select 就是反向依赖,该选项被选中的时候,后面的定义也会被选中。
    1. help This option enable support for led就是帮助信息。

仿写一个例子(需要编译成.ko的)

写三个文件

1、进入内核源码目录,然后进入drivers/char/目录下,这里就是众多字符设备驱动的地方。在这个目录下新建一个目录mkdir hello,然后进入hello目录,新建文件touch hello.ctouch Kconfigtouch 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说明驱动加载进去了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值