Linux驱动开发一、RK3568把hello编译到Linux内核中运行。‘rk_vendor_read’未定义的引用

本文指导在rk356x平台通过Kconfig配置和Makefile实现hello模块,展示了从设备目录创建、配置到内核编译的完整过程。

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

1、在字符设备目录下建立hello目录

~/Linux/rk356x_linux/kernel/drivers/char/hello

2、进入hello目录,新建hello.c、Makefile、Kconfig三个文件

在这里插入图片描述

3、Kconfig是打开make menuconfig配置界面是后的选项,这Kconfig是在字符设备下的。

config HELLO
	tristate "hello"
	help
		hello test

config后面的HELLO就是对应配置后在kernel目录下的**.config中的CONFIG_HELLO配置项**
tristate是三态:编译进内核(y)、不编译(n)、编译成模块(m)。hello是配置界面的显示字符串
可以是bool是二值。编译进内核、不编译
可以是string int
help是帮助信息,可以使用comment “xxxx”这xxx就会显示在hello字符串下面

4、Makefile是编译hello.c的方式。这里编译到内核就是会生成hello.o。如果编译成模块就是生成hello.ko。

obj-$(CONFIG_HELLO) := hello.o

CONFIG_HELLO这个就是Kconfig中的config后面字符串
$(CONFIG_HELLO)这个值根据menuconfig配置是n、y、m

5、hello是在char字符设备下一级目录,所以需要修改char目录下的Makefile、Kconfig

Kconfig增加source “drivers/char/hello/Kconfig”,就是打开菜单界面后char字符设备下增加一个菜单
在这里插入图片描述
Makefile增加obj-y += hello/ 这里hello是目录所以需要增加/。就是默认编译hello文件下的文件
在这里插入图片描述

6、编写hello.c文件

#include <linux/module.h>
#include <linux/kernel.h>

static int __init helloworld_init(void) {
	printk(KERN_EMERG"hello world init\n");
	return 0;
}
static void __exit helloworld_exit(void) {
	printk(KERN_EMERG"hello world exit\n");
}

module_init(helloworld_init);
module_exit(helloworld_exit);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Ching");

7、以上准备好后进入kernel目录

7.1 设置芯片架构(必须要),我使用的是rk3568芯片
export ARCH=arm64
7.2 ,输入make menuconfig打开配置界面

在这里插入图片描述

7.3 进入drivers->char看新增的hello是否正常添加,*表示编译进内核。

在这里插入图片描述

8、编译之前还需要注意一个细节

8.1、编译内核使用的./build.sh。打开看到make了RK_KERNEL_DEFCONFIG(make xxx_defconfig就会把默认的配置生成一个.config文件,这.config文件又是编译内核的配置项。所以实际上我们需要修改的是这RK_KERNEL_DEFCONFIG文件)

在这里插入图片描述

8.1.1、build.sh文件的定义在BoardConfig.mk文件中

在这里插入图片描述
所以我们最终需要修改的还是rockchip_linux_defconfig文件,默认的配置文件路径
在这里插入图片描述

8.2、修改make menuconfig后保存的配置文件是kernel/.config。所以使用.config覆盖rockchip_linux_defconfig,这样编译内核时候就是还是使用菜单配置生成的配置文件来编译。
cp .config arch/arm64/configs/rockchip_linux_defconfig

9、开始编译

9.1、进入kernel上级目录,开始编译
rk356x_linux$ ./build.sh kernel
9.2、编译成功后,hello目录下生成一个hello.o的文件说明已经编译成功。
9.3、生成的内核镜像在kernel/boot.img。下载到板子运行。
9.4、运行后使用查询是否真正运行了hello。就看是否有hello.c中写的hello world init字符串打印

dmsg | grep “hello”

10、小结

1、开始时候没有设置ARCH就打开menuconfig就配置生成的.config不对,导致编译内核时候出现好多未定义的引用
小记一下以免忘记。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ching·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值