加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

在树莓派上写一个最简单的驱动程序

(2022-11-04 14:54:44)

看了书和网上教程,感觉要么没讲到,要么有错误,实践起来总有这样那样的问题,今天拿的我树莓派实践了一下,并完整记录下来。

先说环境,我树莓派3B+,网上下载了官方raspbian,看了一下内核是5.15.61-v8+

第一步,码字。源码贴一下,一共hello.cMakefile两个文件可以放在任意目录:

 

 

 #include

#include

#include

MODULE_LICENSE("GPL");

MODULE_AUTHOR("luping");

MODULE_VERSION("1.0");

MODULE_DESCRIPTION("Hello"); 

static int hello_init(void){

        printk(KERN_ALERT "Hello,luping!");

        return 0;

}

static void hello_exit(void){

        printk(KERN_ALERT "Goodbye!");

} 

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:

        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:

        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c

 

第二步,编译。先碰到的问题就是头文件,如果需要编译内核模块,需要正确的头文件,正常情况/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 #用于分析可载入模块的相依性

 好了,已经向编写驱动程序迈出了第一步。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有