转载,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

上一篇:查询方式的按键驱动
下一篇:程序的编译\链接\下载,及Makefile\bootloader相关

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月07日 18时40分01秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章