转载,2440第一个驱动程序实现

在一个驱动程序中,首先要实现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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值