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

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

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

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

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

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字符设备下增加一个菜单
Linux驱动开发一、RK3568把hello编译到Linux内核中运行。‘rk_vendor_read’未定义的引用_第2张图片
Makefile增加obj-y += hello/ 这里hello是目录所以需要增加/。就是默认编译hello文件下的文件
Linux驱动开发一、RK3568把hello编译到Linux内核中运行。‘rk_vendor_read’未定义的引用_第3张图片

6、编写hello.c文件

#include 
#include 

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打开配置界面

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

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

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

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

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

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

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

Linux驱动开发一、RK3568把hello编译到Linux内核中运行。‘rk_vendor_read’未定义的引用_第7张图片
所以我们最终需要修改的还是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不对,导致编译内核时候出现好多未定义的引用
小记一下以免忘记。

你可能感兴趣的:(Ubuntu,Linux,linux,驱动开发,运维)