在调试驱动,可能需要对驱动里的某些变量进行读写,或函数调用。可通过sysfs接口创建驱动对应的属性,使得可以在用户空间通过sysfs接口的show和store函数与硬件交互;

Syss接口可通过sysfs_create_group()来创建,如果设备驱动要创建,需要用到函数宏DEVICE_ATTR;

另外总线对应BUS_ATTR、设备驱动对应DRIVER_ATTR、类(class)对应CLASS_ATTR,均在kernel/include/linux/device.h下定义:

  1. //下面的show和store只是简单举例
  2. static ssize_t gpio_show(struct device *d, struct device_attribute*attr, char *buf)
  3. {
  4. printk("gpio_show()\n");
  5. returnpr_info("store\n");
  6. }
  7.  
  8. static ssize_t gpio_store(struct device *d, struct device_attribute *attr,const char *buf,size_t count)
  9. {
  10. printk("gpio_store()\n");
  11. returnpr_info("store\n");
  12. }
  13.  
  14. //用DEVICE_ATTR宏创建属性gpio文件,如果show()或是store()没有功能,就以NULL代替
  15. static DEVICE_ATTR(gpio, S_IWUSR |S_IRUGO, gpio_show, gpio_store);
  16.  
  17. //属性结构体数组最后一项必须以NULL结尾。
  18. static struct attribute *gpio_attrs[] = {
  19. &dev_attr_gpio.attr,
  20. NULL
  21. };

DEVICE_ATTR:

DEVICE_ATTR 的定义DEVICE_ATTR(_name,_mode, _show, _store);可知这里gpio是name,mode是S_IWUSR |S_IRUGO,读操作_show是gpio_show函数,写操作_store 是gpio_store函数;

因为:

  1. #define DEVICE_ATTR(_name, _mode, _show, _store) \
  2. struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)

device_attribute:

  1. /* interface for exporting device attributes */
  2. struct device_attribute {
  3. struct attribute attr;
  4. ssize_t (*show)(struct device *dev, struct device_attribute *attr,
  5. char *buf);
  6. ssize_t (*store)(struct device *dev, struct device_attribute *attr,
  7. const char *buf, size_t count);
  8. };

Mode是权限位,在kernel/include/uapi/linux/stat.h;

  1. #define S_IRWXU 00700 //用户可读写和执行
  2. #define S_IRUSR 00400//用户可读
  3. #define S_IWUSR 00200//用户可写
  4. #define S_IXUSR 00100//用户可执行
  5.  
  6. #define S_IRWXG 00070//用户组可读写和执行
  7. #define S_IRGRP 00040//用户组可读
  8. #define S_IWGRP 00020//用户组可写
  9. #define S_IXGRP 00010//用户组可执行
  10.  
  11. #define S_IRWXO 00007//其他可读写和执行
  12. #define S_IROTH 00004//其他可读
  13. #define S_IWOTH 00002//其他可写
  14. #define S_IXOTH 00001//其他可执行

device_attribute结构体

为了使对属性的读写变得有意义,一般将attribute结构嵌入到其他数据结构中。子系统通常都会定义自己的属性结构,并且提供添加和删除属性文件的包装函数,比如设备属性结构体定义:

  1. /* interface for exporting device attributes */
  2. struct device_attribute {
  3. struct attribute attr;
  4. ssize_t (*show)(structdevice *dev, struct device_attribute *attr,
  5. char*buf);
  6. ssize_t (*store)(structdevice *dev, struct device_attribute *attr,
  7. const char *buf, size_t count);
  8. };

2.     定义attribute属性结构体数组到属性组中:

  1. static const struct attribute_group gpio_attr_grp = {
  2. .attrs = gpio_attrs,
  3. }
  4. 我们这里只有一个属性结构体数组只有一个成员,可以有多个,比如:
  5. static struct attribute *gpio_keys_attrs[] = {
  6. &dev_attr_keys.attr,
  7. &dev_attr_switches.attr,
  8. &dev_attr_disabled_keys.attr,
  9. &dev_attr_disabled_switches.attr,
  10. &dev_attr_test.attr,
  11. NULL,
  12. };

属性attribute结构体定义:

  1. struct attribute {
  2. const char *name;
  3. umode_t mode;
  4. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  5. bool ignore_lockdep:;
  6. struct lock_class_key *key;
  7. struct lock_class_key skey;
  8. #endif
  9. };

创建sysfs接口后,就可以在adb shell 终端查看到和操作接口了。当我们将数据 echo 到接口中时,在用户空间完成了一次 write 操作,对应到 kernel ,调用了驱动中的”store”。当我们cat一个接口时则会调用”show” 。这样就建立了 android 层到 kernel 的桥梁,操作的细节在”show”和”store” 中完成的。

3.     创建属性文件的sysfs接口:

  1. ret = sysfs_create_group(&pdev->dev.kobj,&gpio_attr_grp);
  2. sysfs_create_group()在kobj目录下创建一个属性集合,并显示集合中的属性文件。如果文件已存在,会报错。
  3.  
  4. //删除接口
  5. sysfs_remove_group(&pdev->dev.kobj,&gpio_keys_attr_group);
  6. sysfs_remove_group()在kobj目录下删除一个属性集合,并删除集合中的属性文件
 

sysfs_create_group创建sysfs接口的更多相关文章

  1. sysfs接口函数的建立_DEVICE_ATTR(转)

    sysfs接口函数到建立_DEVICE_ATTR 最近在弄Sensor驱动,看过一个某厂家的成品驱动,里面实现的全都是sysfs接口,hal层利用sysfs生成的接口,对Sensor进行操作. 说道s ...

  2. sysfs接口整理

    SYS节点 目录结构: 1:sysfs相关知识点介绍(介绍sysfs的体系结构) 2:sys节点核心知识(使用sys节点核心的知识) 3:代码实例(创建sys节点的代码实例) 1:sysfs相关知识点 ...

  3. sysfs接口函数到建立_DEVICE_ATTR

    sysfs接口函数到建立_DEVICE_ATTR 最近在弄Sensor驱动,看过一个某厂家的成品驱动,里面实现的全都是sysfs接口,hal层利用sysfs生成的接口,对Sensor进行操作. 说道s ...

  4. 创建DirectInput接口对象说明---(void **)&m_pDI

    读别人代码时遇到的,起初没明白过来这是怎么回事,后来忽然想明白了. if (FAILED(DirectInput8Create(appInstance, DIRECTINPUT_VERSION, II ...

  5. 【转】SoapUI5.0创建WebService接口模拟服务端

    原文:http://blog.csdn.net/a19881029/article/details/26348627 使用SoapUI创建WebService接口模拟服务端需要接口描述文件 MathU ...

  6. SoapUI5.0创建WebService接口模拟服务端(转)

    转载自:https://blog.csdn.net/a19881029/article/details/26348627 使用SoapUI创建WebService接口模拟服务端需要接口描述文件 Mat ...

  7. 创建一个接口Shape,其中有抽象方法area,类Circle 、Rectangle实现area方法计算其面积并返回。又有Star实现Shape的area方法,其返回值是0,Star类另有一返回值boolean型方法isStar;在main方法里创建一个Vector,根据随机数的不同向其中加入Shape的不同子类对象(如是1,生成Circle对象;如是2,生成Rectangle对象;如是3,生成S

    题目补充: 创建一个接口Shape,其中有抽象方法area,类Circle .Rectangle实现area方法计算其面积并返回. 又有Star实现Shape的area方法,其返回值是0,Star类另 ...

  8. linux gpio控制之sysfs接口

    在3.14及之后的linux中对gpio提供了sysfs接口,说明文档:Documents/gpio/sysfs.txt. Platforms which use the "gpiolib& ...

  9. Eclipse 创建 Java 接口

    打开新建 Java 接口向导 新建 Java 接口向导可以创建新的 Java 接口.打开向导的方式有: 点击 File 菜单并选择 New > Interface 在 Package Explo ...

随机推荐

  1. 前端进击的巨人(六):知否知否,须知this

    常见this的误解 指向函数自身(源于this英文意思的误解) 指向函数的词法作用域(部分情况) this的应用环境 1. 全局环境 无论是否在严格模式下,全局执行环境中(任何函数体外部)this都指 ...

  2. Android并发编程 多线程与锁

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,如果能给各位看官带来一丝启发或者帮助,那真是极好的. 前言 前一篇Android并发编程开篇呢,主要是简单介绍一下线程以及 ...

  3. Android并发编程 开篇

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  4. 从零开始学 Web 之 移动Web(一)屏幕相关基本知识,调试,视口,屏幕适配

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  5. JCE cannot authenticate the provider BC

    报错原因: 在使用oracle的JDK时,JAR包必须签署特殊的证书才能使用.(具体是什么协议没查出来,惭愧) 方案一: 使用openJDK或者非oracle的JDK,这样就可以绕开证书的限制.该方案 ...

  6. C语言第六讲,数组

    C语言第六讲,数组 一丶什么是数组 数组,就是一整块的连续内存空间. 且类型都是一样的.大小一样 比如: 1.1数组元素的访问 我们要访问数组,例如上面,我们访问元算2,元素3等等怎么访问.. 比如有 ...

  7. S5PV210 时钟体系分析

    S5PV210 时钟体系 如下面时钟结构图所示,S5PV210 中包含 3 大类时钟域, 分别是主系统时钟域(简称 MSYS).显示相关的时钟域(简称 DSYS). 外围设备的时钟域(简称 PSYS) ...

  8. [转]来扯点ionic3[7] LocalStorage的使用—以登录和注销为例

    本文转自:https://segmentfault.com/a/1190000012146400 一般意义上,一个互联网 APP 中的数据主自与服务器的交互,但是对于有些数据,我们希望获取到它们以后能 ...

  9. IOS中input键盘事件支持的解决方法

    欢迎大家去我的网站详细查看http://genghongshuo.com.cn/ IOS中input键盘事件keyup.keydown.等支持不是很好, 用input监听键盘keyup事件,在安卓手机 ...

  10. Linux常用基本命令:三剑客命令之-awk模式用法(2)

    1,正则模式,在/etc/passwd中 过滤出使用/bin/bash的用户 ghostwu@dev:~/linux/awk$ awk -v FS=":" 'BEGIN{print ...