谈论attribute驱动实现方式(及device_create与设备节点的关系)

标签: 设备节点 attribute fops
511人阅读 评论(0) 收藏 举报
分类:

谈论attribute驱动实现方式(及device_create与设备节点的关系)

目前接触过的两种驱动实现方式是attribute路线和file_operations路线(自己取的)。

attribute的实现方式是学习驱动框架的时候接触到的,如文《驱动框架基础》所示,file_operations方式则比较常见,如文《字符设备驱动基础》中的led驱动实现测试代码。两者都是以led这种简单设备为例子。

blog15-1

blog15-2

分析使用attribute方式的LED驱动框架源码的时候,我们知道了led的一种驱动实现方式–attribute路线。源码中没有register_chrdev,只有class_create和device_create。通过对register_chrdev代码实现的分析,我们知道有register_chrdev一定走的是file_operations路线。详情点击这里:__register_chrdev_region分析

所以猜测attribute路线是一条不依赖于内核维护的255字符设备数组的驱动实现方式。让我困惑的是走attribute方式的LED驱动框架中的device_create的参数设备号0代表什么。我们都知道使用device_create的最大目的是提供相应信息给udev,让udev在用户空间下去创建设备节点以便我们能在用户空间下去访问内核驱动(当然,device_create的作用不仅仅是这个)。

比较之前的file_operations路线实现驱动方式:先使用register_chrdev注册一个设备号,然后使用class_create和device_create来自动创建设备文件节点。那我们现在谈论的attribute方式实现驱动是否也会创建相应的设备文件节点,是否一样能通过设备文件节点来访问到内核空间的驱动?

实际测试发现使用attribute方式的驱动模块leds-s5pv210模块安装后,lsmod控制台会打印出相应的模块安装信息,但是/dev下并没有产生相应的设备节点

所以我的猜测是:虽然给了它一个设备号,但是这个设备号是没有意义的(而且这个设备号是写死在内核源码中,并且当我们用attribute方式去实现一个驱动的时候你不需要像用file_operations方式时那样去指定设备号)。

;真正能解释的就是去看驱动源码,时间有限,没有具体分析源码。留个空再补充

总结:
(1)device_create要能实现自动创建设备节点这一部分作用需要真正的主设备号的存在,并不是使用了device_create就一定有设备节点产生
(2)使用attribute的驱动实现方式不能通过设备节点来访问内核的对应驱动,只能通过/sys/class/xxx下的属性文件来访问

查看评论

class_create(),device_create(),device_create_file()

开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点(包括ldd3中不少例子也是这样),实际上现在Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/de...
  • hustyangju
  • hustyangju
  • 2014-03-11 16:01:05
  • 2451

四、 class_create(),device_create(),device_create_file()

转载来自:http://blog.csdn.net/hustyangju/article/details/21019967?utm_source=tuicool&utm_medium=referral...
  • qq_20678703
  • qq_20678703
  • 2016-08-18 15:10:41
  • 334

3.x版本内核中platform_device的生成

内核版本:Linux-3.18.2 在3.x版本内核中platform_device不再静态定义,而是通过device tree来动态生成,例如(arch/arm/mach-s3c24xx/mach...
  • mcgrady_tracy
  • mcgrady_tracy
  • 2015-01-16 15:40:07
  • 6639

Linux 字符设备驱动结构(二)—— 自动创建设备节点

上一篇我们介绍到创建设备文件的方法,利用cat /proc/devices查看申请到的设备名,设备号。 第一种是使用mknod手工创建:mknod filename type major minor ...
  • zqixiao_09
  • zqixiao_09
  • 2016-03-10 20:46:35
  • 5267

cdev_init和cdev_add之后在/dev目录下没有长出设备节点原因

因为在linux里面有两种设备文件系统,devfs和sysfs devfs 1) 需要手动创建设备节点mknod fasync_dev c 250 0 2) 或者在fasync_dev_init...
  • luckywang1103
  • luckywang1103
  • 2015-08-22 16:49:59
  • 2842

DEVICE_ATTR的使用

DEVICE_ATTR的使用 使用DEVICE_ATTR,可以在sys fs中添加“文件”,通过修改该文件内容,可以实现在运行过程中动态控制device的目的。 类似的还有DRIVER_ATTR,...
  • njuitjf
  • njuitjf
  • 2013-11-20 20:10:53
  • 40279

(DT系列五)Linux kernel 是怎么将 devicetree中的内容生成plateform_device

Linux kernel 是怎么将 devicetree中的内容生成plateform_device 1,实现场景(以Versatile Express V2M为例说明其过程) 以arch...
  • lichengtongxiazai
  • lichengtongxiazai
  • 2014-08-30 09:55:26
  • 11078

linux中sysfs 创建设备节点的方法sysfs_create_group DEVICE_ATTR

说道sysfs接口,就不得不提到函数宏 DEVICE_ATTR原型是#define DEVICE_ATTR(_name, _mode, _show, _store) struct device_a...
  • jhzgk
  • jhzgk
  • 2014-12-18 14:45:23
  • 1594

Linux下的device_create创建字符设备节点流程

对于字符设备驱动,当file_operations注册好了之后,这只是实现了该驱动的内部功能,我们还要向用户提供操作接口,也就是在/dev/目录下创建字符设备节点,其中device_create函数就...
  • chen_chuang_
  • chen_chuang_
  • 2015-09-15 08:38:18
  • 203

Linux Kernel 学习笔记4:自动创建设备节点

Linux内核模块具有自动创建设备模块的功能(需要应用层支持udev) 使用class_create()创建一个类,这个类可在/sys/class下找到对应目录,再用device_create(...
  • stone8761
  • stone8761
  • 2017-04-18 21:28:24
  • 911
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 551
    排名: 9万+
    最新评论