在树莓派上写一个最简单的驱动程序
(2022-11-04 14:54:44)看了书和网上教程,感觉要么没讲到,要么有错误,实践起来总有这样那样的问题,今天拿的我树莓派实践了一下,并完整记录下来。
先说环境,我树莓派3B+,网上下载了官方raspbian,看了一下内核是5.15.61-v8+。
第一步,码字。源码贴一下,一共hello.c、Makefile两个文件可以放在任意目录:
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("luping");
MODULE_VERSION("1.0");
MODULE_DESCRIPTION("Hello");
static int hello_init(void){
}
static void hello_exit(void){
}
module_init(hello_init);
module_exit(hello_exit);
PWD := $(shell pwd)
#KERNELDIR = /lib/modules/$(shell uname -r)/build
KERNELDIR = /lib/modules/5.15.74-v8+/build
obj-m := hello.o
all:
clean:
第二步,编译。先碰到的问题就是头文件,如果需要编译内核模块,需要正确的头文件,正常情况在/lib/modules/xxx/build下,但默认安装的linux没有这个目录,可以apt-get install linux-headers-$(uname -r)安装,但发现找不到相应的包,使用apt-cache search linux-headers搜索最接近的包也无果。查百度,最后使用apt install raspberrypi-kernel-headers安装头文件,但版本是5.15.74-v8+/,所以前面的Makefile指定了目录,而不是使用uname -r,至于有什么影响,我也不知道,反正能正常编译。
经过一系列编译之后生产了文件hello.ko,恭喜,这就是我们想要的内核模块文件。
第三步,测试。
加载模块 sudo inmod ./hello.ko 卸载模块:rmmod hello 显示模块:lsmod 实际是显示/proc/modules,同时也在/sys/modules目录下。
要注意,printk函数不输出在屏幕,输出在log文件使用,必须使用dmesg查看,但会有一会儿延迟。
常用模块命令:
sudo insmod hello.ko #加载
sudo rmmod hello #卸载
sudo lsmod #模块列表
sudo modinfo #模块信息
sudo modprobe
suido depmod