前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >sysfs_create_group创建sysfs接口

sysfs_create_group创建sysfs接口

作者头像
233333
发布于 2018-03-07 08:06:18
发布于 2018-03-07 08:06:18
3.1K00
代码可运行
举报
运行总次数:0
代码可运行

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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函数;

因为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 #define DEVICE_ATTR(_name, _mode, _show, _store) \
2     struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)

device_attribute:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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结构嵌入到其他数据结构中。子系统通常都会定义自己的属性结构,并且提供添加和删除属性文件的包装函数,比如设备属性结构体定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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属性结构体数组到属性组中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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结构体定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 struct attribute {  
2        const char           *name;  
3        umode_t                     mode;  
4 #ifdef CONFIG_DEBUG_LOCK_ALLOC  
5        bool                     ignore_lockdep:1;  
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接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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目录下删除一个属性集合,并删除集合中的属性文件
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
构造函数和原型
实例成员就是构造函数内部通过this添加的成员 如下列代码中uname age sing 就是实例成员,实例成员只能通过实例化的对象来访问
梨涡浅笑
2020/10/27
4010
构造函数和原型
「JS高级」构造函数和原型
请注意,本文编写于 2063 天前,最后修改于 173 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
1.6K0
「JS高级」构造函数和原型
JS高级——构造函数和原型
在典型的OOP的语言中(如Java),都存在类的概念,类就是对象的模板,对象就是类的实例,但在ES6之前,JS中并没有引入类的概念。
岳泽以
2022/10/26
1.6K0
JS高级——构造函数和原型
前端成神之路-JavaScript高级第02天
实例成员就是构造函数内部通过this添加的成员 如下列代码中uname age sing 就是实例成员,实例成员只能通过实例化的对象来访问
海仔
2021/01/21
3080
【说站】Javascript中对象原型 __proto__的介绍
1、所有对象都会有一个属性__proto__指向构造函数的prototype原型对象.
很酷的站长
2022/11/23
5100
【说站】Javascript中对象原型 __proto__的介绍
原型和原型链 prototype和proto的区别
原型是function对象下的属性,它定义了构造函数的共同祖先,也就是一个父子级的关系,子对象会继承父对象的方法和属性
小丞同学
2021/08/16
4360
【说站】JavaScript成员查找机制是什么
以上就是JavaScript成员查找机制的介绍,希望对大家有所帮助。更多Javascript学习指路:Javascript
很酷的站长
2022/11/23
2730
【说站】JavaScript成员查找机制是什么
JS学习笔记
内部函数被返回到外部,函数本身保留了父函数的AO,即使父元素执行完了,取消对AO的引用,但依旧被子函数保留下来了,就形成了闭包。
小丞同学
2021/08/16
4250
【说站】javascript中原型对象this的原则
以上就是javascript中原型对象this的原则,希望对大家有所帮助。更多Javascript学习指路:Javascript
很酷的站长
2022/11/23
2210
【说站】javascript中原型对象this的原则
JavaScript笔记(2) 构造函数和原型
昨天又独自把案例做了一遍,还是有点小错误出现的,但是大体上比较顺利,感觉还是逻辑比较重要,先把思路整理好再开始做会比较好.
y191024
2022/09/20
4150
JavaScript笔记(2) 构造函数和原型
js面向对象编程_JavaScript高级编程
面向过程即分析出解决问题所需要的步骤,然后用函数将这些步骤一步步实现,使用的时候再一个个的一次调用就可以了;
全栈程序员站长
2022/09/24
1.2K0
js面向对象编程_JavaScript高级编程
这些js原型及原型链面试题你能做对几道
在面试过程中,频频被原型相关知识问住,每次回答都支支吾吾。后来有家非常心仪的公司,在二面时,果不其然,又问原型了!
loveX001
2022/10/02
5230
JS中怎么构成原型链的???Function Object构造函数.这通通告诉您
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> function Person(myName, myAge) { this.name = myName; this.age = myAge; } let obj1 = new Per
贵哥的编程之路
2020/10/28
8280
JS中怎么构成原型链的???Function Object构造函数.这通通告诉您
【说站】JavaScript对象原型__ proto__的介绍
2、意义在于为对象的查找机制提供一个方向。但是作为非标准属性,因此实际开发中,不可以使用这个属性,它只是内部指向原型对象prototype。
很酷的站长
2022/11/24
2840
【说站】JavaScript对象原型__ proto__的介绍
JS中对象+构造函数+原型对象谈恋爱了嘛。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script> function Person(myName,myAge) { this.name=myName; this.age=myAge; this.currentType="构造函数中的属性"; this.say=function() { console.log("构造函数里面的方法");
贵哥的编程之路
2020/10/28
1.3K0
JS中对象+构造函数+原型对象谈恋爱了嘛。
第186天:js深入理解构造函数和原型对象
1.在典型的oop的语言中,如java,都存在类的概念,类就是对象的模板,对象就是类的实例。但在js中不存在类的概念,js不是基于类,而是通过构造函数(constructor)和原型链(propotype chains)实现的。但在ES6中引入了类(class)这个概念,作为对象的模板,新的class写法知识让原型对象的写法更加清晰,这里不重点谈这个
半指温柔乐
2018/09/11
7240
第186天:js深入理解构造函数和原型对象
再谈构造函数、原型、原型链之间的关系
构造函数、原型、原型链作为ES5的内容,已经是老生常谈的问题了。首先说说为什么要再次拿起这个话题去说呢?这几天有空我会看一些源码,这些源码的底层实现考虑到兼容性还是来源于ES5,很多方法的封装以及实现(不管是按照模块封装还是统一实现)都是面向对象的思想,而且webpack以及rollup打包之后解析出来的代码利用@babel/core和@babel/preset-env转化之后也都是ES5的代码,所以有想再次谈起这个话题,回顾回顾旧知识,温故而知新。
小丑同学
2020/09/21
7460
Javascript 原型链之原型对象、实例和构造函数三者之间的关系
首先来说一下名词解释,首先说一下prototype,每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和方法。
OECOM
2020/07/01
6860
javascript构造函数
我们昨天前几天讨论过构造函数constructor,得出了结论 constructor是原型对象上的一个属性,默认指向这个原型的构造函数 这个结论貌似对我们平时的工作中似乎并没有什么用处,那构造函数,就真的没什么用处吗?
陌上寒
2019/04/02
1.1K0
javascript构造函数
一篇JavaScript技术栈带你了解继承和原型链
在学习JavaScript中,我们知道它是一种灵活的语言,具有面向对象,函数式风格的编程模式,面向对象具有两点要记住,三大特性,六大原则。
达达前端
2019/11/19
4680
推荐阅读
相关推荐
构造函数和原型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验