找回密码
 立即注册
首页 业界区 业界 编写一个Buildroot 驱动

编写一个Buildroot 驱动

向梦桐 2026-1-16 23:15:00
编写一个Buildroot 驱动模块

由于Buildroot 不支持ssh
故采用adb调试
adb连接

列出设备
  1. adb devices
复制代码
1.png

连接设备
  1. adb shell
复制代码
2.png

驱动模块编译(交叉编译)

驱动模块源码
  1. #include <linux/module.h>     /* 模块相关宏和函数 */
  2. #include <linux/kernel.h>     /* printk日志函数 */
  3. /* 加载函数(驱动入口),当驱动被 insmod 加载时自动执行 */
  4. static int __init helloworld_init(void)
  5. {
  6.     printk("helloworld_init\r\n"); // 内核日志打印
  7.     return 0; // 返回0代表加载成功
  8. }
  9. /* 卸载函数(驱动出口),当驱动被 rmmod 卸载时自动执行 */
  10. static void __exit helloworld_exit(void)
  11. {
  12.     printk("helloworld_exit\r\n");
  13. }
  14. /* 下面这两行,告诉内核入口和出口分别是哪两个函数 */
  15. module_init(helloworld_init);
  16. module_exit(helloworld_exit);
  17. /* 这3个是模块信息声明 */
  18. MODULE_LICENSE("GPL v2");               /* 模块许可证 */
  19. MODULE_VERSION("1.0");                  /* 模块版本,可选 */
  20. MODULE_DESCRIPTION("helloworld Driver");/* 模块描述,可选,一般用于 lsmod 时显示 */
复制代码
功能简单解释就是
加载驱动:打印helloworld_init
卸载驱动:打印helloworld_exit
找到交叉编译工具路径
  1. find prebuilts -name "*gcc" -type f
复制代码
3.png

一般在SDK路径下找
配置Makefile
  1. # 目标架构
  2. # RK3566 是 ARM64 架构
  3. ARCH ?= arm64
  4. # 交叉编译工具链前缀
  5. # 最终会使用:aarch64-linux-gnu-gcc / ld / objcopy 等
  6. CROSS_COMPILE ?= aarch64-linux-gnu-
  7. # Linux 内核源码目录
  8. # 必须是已经配置并且执行过 prepare/modules_prepare 的内核
  9. #作用:告诉 Makefile 用哪个内核版本的源码和头文件进行编译链接。
  10. KDIR := $(HOME)/Desktop/SDK/kernel
  11. # 当前外部模块源码所在目录
  12. # 内核会在这个目录下查找 obj-m 指定的模块源码
  13. PWD  := $(shell pwd)
  14. # 要编译的外部内核模块
  15. # hello_world.c  →  hello_world.ko
  16. obj-m += hello_world.o
  17. # 默认目标:编译内核模块
  18. all:
  19.         # 调用内核源码目录下的 Makefile
  20.         # M=$(PWD) 表示这是一个“外部模块”
  21.         # ARCH / CROSS_COMPILE 指定目标架构和交叉编译器
  22.         $(MAKE) -C $(KDIR) M=$(PWD) \
  23.                 ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
  24. # 清理编译生成的中间文件
  25. clean:
  26.         $(MAKE) -C $(KDIR) M=$(PWD) clean
复制代码
PS:主要寻找配置
交叉编译工具链前缀:aarch64-linux-gnu-
Linux 内核源码目录路径:$(HOME)/Desktop/SDK/kernel
编译
  1. make
复制代码
模块输出路径
4.png

驱动测试

将驱动复制进rk3566板卡

使用ADB

如果ADB已经连上板卡,则先断开连接
  1. exit
复制代码
寻找板卡设备
  1. adb devices
复制代码
5.png

将本地的驱动模块文件发送到板卡
  1. adb -s 6c392aca38ad7c4b push F:\Desktop\SSH_Ubuntu18\hello_world.ko /data/local/tmp/hello_world.ko
复制代码
6.png

加载驱动模块:
  1. insmod hello_world.ko       
复制代码
查看 驱动 相关日志
  1. dmesg | grep -E 'hello'       
复制代码
7.png

卸载模块驱动
  1. rmmod hello_world.ko
复制代码
查看 驱动 相关日志
  1. dmesg | grep -E 'hello'       
复制代码
8.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册