
树莓派驱动的简单框架编译和测试
发布日期:2021-05-07 07:21:41
浏览次数:21
分类:精选文章
本文共 2277 字,大约阅读时间需要 7 分钟。
1. 驱动触发流程
驱动触发流程涉及系统调用和文件操作。在Linux系统中,用户空间的应用程序通过系统调用(sys_call)触发文件操作,这些系统调用由虚拟文件系统(vfs)处理。具体流程为:- 系统调用(sys_call)调用vfs的sys_open、sys_read、sys_write函数。
- 这些函数将控制权转交至驱动层,驱动程序实现对应的open、read、write功能。
- 驱动程序通过软中断或其他机制将请求传递至硬件层,完成实际的读写操作。
2. Linux内核驱动基础框架
编写Linux内核驱动需要使用一系列标准的框架和头文件。以下是驱动开发的关键部分:#include#include #include #include #include #include #include static struct class *pin4_class; static struct device *pin4_class_dev; static dev_t devno; static int major = 231; static int minor = 0; static char *module_name = "pin4"; static ssize_t pin4_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { printk("pin4_read\n"); return 0; } static int pin4_open(struct inode *inode, struct file *file) { printk("pin4_open\n"); return 0; } static ssize_t pin4_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { printk("pin4_write\n"); return 0; } static struct file_operations pin4_fops = { .owner = THIS_MODULE, .open = pin4_open, .write = pin4_write, .read = pin4_read, }; static int __init pin4_drv_init(void) { int ret; devno = MKDEV(major, minor); ret = register_chrdev(major, module_name, &pin4_fops); pin4_class = class_create(THIS_MODULE, "myfirstdemo"); pin4_class_dev = device_create(pin4_class, NULL, devno, NULL, module_name); return 0; } void __exit pin4_drv_exit(void) { device_destroy(pin4_class, devno); class_destroy(pin4_class); unregister_chrdev(major, module_name); } module_init(pin4_drv_init); MODULE_LICENSE("GPL v2");
3. 驱动代码的编译步骤
(1)在Linux内核源码树中,进入drivers/char/
目录,找到适合的位置添加驱动代码。
(2)编辑Makefile
文件,在编译选项中添加驱动文件,确保驱动能够被编译进内核模块。
(3)编译驱动:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules
编译完成后,驱动文件pin4driveIO1.ko
将生成在drivers/char/
目录下。
(4)传输驱动文件至树莓派设备,并验证文件完整性:
md5sum pin4driveIO1.ko
4. 驱动测试
(1)加载驱动:
sudo insmod pin4driveIO1.ko
查看驱动状态:
lsmod
(2)卸载驱动:
sudo rmmod pin4driveIO1
(3)设置设备权限:
sudo chmod 666 /dev/pin4
(4)运行测试程序:
#include#include #include #include int main() { int fd; char cmd[12]; fd = open("/dev/pin4", O_RDWR); write(fd, "1", 1); read(fd, cmd, 12); return 0; }
运行后,查看内核日志:
dmesg | grep pin4
发表评论
最新留言
很好
[***.229.124.182]2025年04月15日 12时42分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
CMake自学记录,看完保证你知道CMake怎么玩!!!
2019-03-05
Eigen库中vector.transpose()函数什么意思
2019-03-05
ORB-SLAM2:LocalMapping线程学习随笔【李哈哈:看看总有收获篇】
2019-03-05
ORB-SLAM2:LoopClosing线程学习随笔【李哈哈:看看总有收获篇】
2019-03-05
牛客练习赛56 D 小翔和泰拉瑞亚(线段树)
2019-03-05
hdu6434 Problem I. Count(数论)(好题)
2019-03-05
NC15553 数学考试(线性DP)
2019-03-05
MySQL两阶段提交、崩溃恢复与组提交
2019-03-05
MySQL隐藏文件.mysql_history风险
2019-03-05
如何通过文件解析MySQL的表结构
2019-03-05
ClickHouse 适用场景调研文档
2019-03-05
C++的编译过程及原理
2019-03-05
Vue——父组件将方法传递给子组件
2019-03-05
文件加密软件对于企业发展而言有何优势?局域网数据防泄密工作应该如何入手?
2019-03-05
Beautiful Soup基础入门
2019-03-05
点击控制盒子移动
2019-03-05