分享

关于cdev platform以及class的一点见解-steven

 射天狼星 2014-10-06
分类: LINUX
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(cdev, &globalmem_fops);
dev->cdev.owner = THIS_MODULE;
dev->cdev.ops = &globalmem_fops;
err = cdev_add(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这几个文件夹下面的文件,就会更好的理解了。
阅读(1098) | 评论(1) | 转发(1) |

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多