
转载,2440第一个驱动程序实现
发布日期:2021-05-15 01:18:29
浏览次数:19
分类:精选文章
本文共 1734 字,大约阅读时间需要 5 分钟。
在一个驱动程序中,首先要实现open和write,因此有:
first_drv_open()和first_drv_write () 那如何告诉内核我有这两个函数呢,那就需要一个file_operations结构体 static struct file_operations first_drv_fops = { .owner = THIS_MODULE, .open = first_drv_open, .write = first_drv_write, }; 应用程序里有什么接口,file_operations里就应该有什么成员。 那如何告诉内核我有这个结构呢?register_chrdev(major,”first_drv”,&first_drv_fops);这样就可以注册了。然后又是谁来调用这个函数呢,是驱动的入口函数first_drv_init(); 那内核又如何知道first_drv_init()是入口函数的呢?需要用到一个宏module_init(first_drv_init),当这个宏被调用时,里面的函数指针就指向入口函数。 major是主设备号,VFS可以通过设备类型和主设备号找到file_operations。可以很直观的想到,register_chrdev最简单的实现方法就是在内核里有一个chrdev[]数组,以主设备号为索引找到一项,在这一项 把一个file_operations填充进去。
同样,在出口函数first_drv_exit()里也应该有unregister_chrdev(),也同样要用module_exit(first_drv_exit)来修饰。
总结一下,驱动一共做了以下几件事情:
①实现led_read,led_write ②定义一个file_operations结构,其中的.read对应led_read, .write对应led_write。 ③在入口函数中用register_chrdev(major,name,&first_drv_fops)告诉内核关于major,若是想让系统自动分配的话,要在注册的时候这样写major = register_chrdev(0,”first_drv”,&first_drv_fops)。
如何创建设备节点呢?可以手动创建,也可以使用udev机制,简化版本为mdev,mdev可以根据系统的信息自动创建设备节点,那驱动如何给mdev提供系统的信息呢?这就需要先定义结构体: static struct class *firstdrv_class; static struct class_device *firstdrv_class_dev; 并且在入口函数first_drv_init()中,先创建一个类,firstdrv_class = class_create(THIS_MODULE, “firstdrv”);再创建一个设备,firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, “xyz”);这样就可以自动生成一个/dev/xyz。同时,在驱动程序中还要加上MODULE_LICENSE(“GPL”); 同样在出口函数first_drv_exit()中要进行删除:class_device_unregister(firstdrv_class_dev); class_destroy(firstdrv_class);那为什么我们一旦更改驱动,mdev会自动生成呢?因为我们在构建根文件系统的时候,脚本/etc/init/rcS 里有这样一句:echo /sbin/mdev > /proc/sys/kernel/hotplug。
———————————————— 版权声明:本文为CSDN博主「guoguoguilai」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/guoguoguilai/article/details/54846929发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月07日 18时40分01秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
3、条件查询
2021-05-14
5、分组函数 / 聚合函数
2021-05-14
8、子查询
2021-05-14
cordova打包apk更改图标
2021-05-14
开启与配置SMTP服务器
2021-05-14
APP卡片式设计
2021-05-14
GitHub上传时,项目在已有文档时直接push出现错误解决方案
2021-05-14
云数据库
2021-05-14
大数据在不同领域的应用
2021-05-14
页面置换算法
2021-05-14
文件系统的层次结构
2021-05-14
减少磁盘延迟时间的方法
2021-05-14
vue(渐进式前端框架)
2021-05-14
权值初始化和与损失函数
2021-05-14
案例讨论
2021-05-14
算法的伪码表示
2021-05-14
递推方程与算法分析
2021-05-14
主定理的应用
2021-05-14
最优装载问题
2021-05-14
最大团问题
2021-05-14