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不对,导致编译内核时候出现好多未定义的引用
小记一下以免忘记。