关于cdev platform以及class的一点见解
2014-11-02 07:58
162 查看
cdev bus and class
谨以此文纪念过往的岁月
一.前言
相信很多刚开始学习驱动的人的都会对cdev platform以及class这三者之间的关系不是很理解。本文记录本人对于此的一点见解,不对之处请指教。
二.三角关系
cdev其实是说明设备的真正所属类型,在linux中分为字符类型,块类型和网络类型,几乎所有的设备都可以分配到这三种类型之中。
bus其实是指设备的总线,说白了就是设备和驱动根据什么样的匹配方式来进行匹配。形象一点就是bus就是一条大道,而所有的driver在一边,而所有的device在大路的另一边,而bus就是将device和driver连接起来,如driver A可以驱动device A和device B,而bus就把driver和device连接起来。其实用这样的比喻并不是很确切,不过这样对于理解bus的功能会形象不少。常见的bus有usb pci i2c platform等等总线。总线只会在设备注册卸载和驱动注册卸载时才会有用。
而class则是一类设备的总和。怎么来说呢,就好像是男人和女人都属于人类一样,device A和device B 都属于class A,则创建设备节点时就可以在传入class参数是用
class A作为参数传入。
三.具体实现
以platform总线为例:
申请和注册和注销一个platform设备
globalmem_devp->dev = platform_device_alloc("globalmem",-1);
platform_device_register(globalmem_devp->dev);
platform_device_unregister(globalmem_devp->dev);
注册和卸载一个platform驱动
platform_driver_register(globalmem_devp->drv);
platform_driver_unregister(globalmem_devp->drv);
不过globalmem_devp->drv->name 应该为"globalmem",这个跟总线的匹配规则有关,platform总线采用name匹配。这里的platform设备和驱动与cdev没有半点关系。无论我的设备类型是cdev还是block的,这里是不管的,你可以把它看成独立的一部分。
以cdev为例:
比如说我想注册一个主设备和多个从设备,都是globalmem以类的,有很多人在刚开始学习例程时,以为platform设备名和我注册的cdev的设备号名是一样的,总以为这两者有什么不可告人的秘密,其实不然,这两个并没有半点关系。
注册设备号以及注册一个cdev设备。
register_chrdev_region(devno, 2, "globalmem");
int err, devno = MKDEV(globalmem_major, index);
cdev_init(&dev->cdev, &globalmem_fops);
dev->cdev.owner = THIS_MODULE;
dev->cdev.ops = &globalmem_fops;
err = cdev_add(&dev->cdev, devno, 2);
创建在/dev下的设备节点:
在这里面就涉及到设备类以及设备节点名。
device_create(globalmem_devp->cls,NULL,devno,NULL,"globalmem%d",index);
这里如何将设备节点与设备操作联系起来的就是通过devno。
创建一个设备类:
globalmem_devp->cls = class_create(THIS_MODULE,"globalT");
到此应该对上面三者关系有了比较清晰的理解,不过在注册这三者时,同时去参考/sys/下的/bus总线,/class 和/devices以及/dev这几个文件夹下面的文件,就会更好的理解了。
谨以此文纪念过往的岁月
一.前言
相信很多刚开始学习驱动的人的都会对cdev platform以及class这三者之间的关系不是很理解。本文记录本人对于此的一点见解,不对之处请指教。
二.三角关系
cdev其实是说明设备的真正所属类型,在linux中分为字符类型,块类型和网络类型,几乎所有的设备都可以分配到这三种类型之中。
bus其实是指设备的总线,说白了就是设备和驱动根据什么样的匹配方式来进行匹配。形象一点就是bus就是一条大道,而所有的driver在一边,而所有的device在大路的另一边,而bus就是将device和driver连接起来,如driver A可以驱动device A和device B,而bus就把driver和device连接起来。其实用这样的比喻并不是很确切,不过这样对于理解bus的功能会形象不少。常见的bus有usb pci i2c platform等等总线。总线只会在设备注册卸载和驱动注册卸载时才会有用。
而class则是一类设备的总和。怎么来说呢,就好像是男人和女人都属于人类一样,device A和device B 都属于class A,则创建设备节点时就可以在传入class参数是用
class A作为参数传入。
三.具体实现
以platform总线为例:
申请和注册和注销一个platform设备
globalmem_devp->dev = platform_device_alloc("globalmem",-1);
platform_device_register(globalmem_devp->dev);
platform_device_unregister(globalmem_devp->dev);
注册和卸载一个platform驱动
platform_driver_register(globalmem_devp->drv);
platform_driver_unregister(globalmem_devp->drv);
不过globalmem_devp->drv->name 应该为"globalmem",这个跟总线的匹配规则有关,platform总线采用name匹配。这里的platform设备和驱动与cdev没有半点关系。无论我的设备类型是cdev还是block的,这里是不管的,你可以把它看成独立的一部分。
以cdev为例:
比如说我想注册一个主设备和多个从设备,都是globalmem以类的,有很多人在刚开始学习例程时,以为platform设备名和我注册的cdev的设备号名是一样的,总以为这两者有什么不可告人的秘密,其实不然,这两个并没有半点关系。
注册设备号以及注册一个cdev设备。
register_chrdev_region(devno, 2, "globalmem");
int err, devno = MKDEV(globalmem_major, index);
cdev_init(&dev->cdev, &globalmem_fops);
dev->cdev.owner = THIS_MODULE;
dev->cdev.ops = &globalmem_fops;
err = cdev_add(&dev->cdev, devno, 2);
创建在/dev下的设备节点:
在这里面就涉及到设备类以及设备节点名。
device_create(globalmem_devp->cls,NULL,devno,NULL,"globalmem%d",index);
这里如何将设备节点与设备操作联系起来的就是通过devno。
创建一个设备类:
globalmem_devp->cls = class_create(THIS_MODULE,"globalT");
到此应该对上面三者关系有了比较清晰的理解,不过在注册这三者时,同时去参考/sys/下的/bus总线,/class 和/devices以及/dev这几个文件夹下面的文件,就会更好的理解了。
相关文章推荐
- 关于文档写作、幻灯片制作以及资料整理的一点见解
- 关于Class和Assembly的变化率以及变化原因的一点思考
- 关于风险分析(Risk Analysis)的一点见解
- 关于网络游戏的一点见解
- Oracle 10G中关于表操作常用语句详解以及一点随想
- 关于网站表现层和后台的一点思考--以及转载的三大WEB服务器(Apache ,Lighttpd,Nginx)对比分析
- 关于修改frameworks的源码遇到的一点问题以及解决方法
- 关于编写程序的一点见解
- MD5文件加密以及关于NIO中的FileChannel.map的一点看法
- 关于对网络学习方法的一点见解
- 关于hibernate的一点见解
- 关于通过聚集索引以及堆来对比数据表组织结构-SQLServer最优实践 的一点看法
- 关于对网络学习方法的一点见解
- 第四章 控制执行流程的一些笔记以及关于char的一点东西
- 关于自己对IMediaControl::Run()返回S_FALSE的一点见解
- Oracle 10G中关于表操作常用语句详解以及一点随想
- 关于一点显示全部数据的小技巧 以及实现模糊查询的小技巧
- 关于对网络学习方法的一点见解
- 关于自己博客数量的检查及对博客的一点见解
- 关于通过聚集索引以及堆来对比数据表组织结构-SQLServer最优实践 的一点看法