sysf接口的函数【转】_anfeng3664的博客-程序员宝宝

技术标签: shell  移动开发  

本文转载自:http://blog.csdn.net/manshq163com/article/details/7848714

说道sysfs接口,就不得不提到函数宏 DEVICE_ATTR,原型是

#define DEVICE_ATTR(_name, _mode, _show, _store) \

struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)

函数宏DEVICE_ATTR内封装的是__ATTR(_name,_mode,_show,_stroe)方法

_show:表示的是读方法,

_stroe表示的是写方法。

 

当然_ATTR不是独生子女,他还有一系列的姊妹__ATTR_RO宏只有读方法,__ATTR_NULL等等

如对设备的使用        DEVICE_ATTR   

对驱动使用               DRIVER_ATTR

对总线使用               BUS_ATTR 

对类别 (class) 使用  CLASS_ATTR

这四个高级的宏来自于<include/Linux/device.h> 

DEVICE_ATTR  宏声明有四个参数,分别是名称、权限位、读函数、写函数。其中读函数和写函数是读写功能函数的函数名。

如果你完成了DEVICE_ATTR函数宏的填充,下面就需要创建接口了

例如:

    static DEVICE_ATTR(polling, S_IRUGO | S_IWUSR, show_polling, set_polling);
    static struct attribute *dev_attrs[] = {
            &dev_attr_polling.attr,
            NULL,
    };

当你想要实现的接口名字是polling的时候,需要实现结构体struct attribute *dev_attrs[]

其中成员变量的名字必须是&dev_attr_polling.attr

然后再封装

    static struct attribute_group dev_attr_grp = {
            .attrs = dev_attrs,
    };

在利用sysfs_create_group(&pdev->dev.kobj, &dev_attr_grp);创建接口

       通过以上简单的三个步骤,就可以在adb shell 终端查看到接口了。当我们将数据 echo 到接口中时,在上层实际上完成了一次 write 操作,对应到 kernel ,调用了驱动中的 “store”。同理,当我们cat 一个 接口时则会调用 “show” 。到这里,只是简单的建立了 Android 层到 kernel 的桥梁,真正实现对硬件操作的,还是在 "show" 和 "store" 中完成的。

 

       其实呢?!用个proc文件系统的就知道,这个就和proc中的write和read一样的,以我的理解:proc有点老了,以后肯定会大量使用attribute,proc好比是Windows XP,attribute就像是Windows Seven

转载于:https://www.cnblogs.com/zzb-Dream-90Time/p/6497861.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/anfeng3664/article/details/101183129

智能推荐

HashMap_linuxcjh的博客-程序员宝宝

Map是一个映射,里面的数据是无序的,这一点HashSet是一样的,另外Map最独特的地方是,它是成对出现的。由于Map是一个接口,所以我们来研究一下实现它的类HashMap;    HashMap hashMap = new HashMap();    hashMap.put("a","zhang");    hashMap.put("a","zhang");    hashMa

Servlet 3.0 Tutorial: @WebListener, @WebServlet, @WebFilter and @WebInitParam_webfilter webinitparam_zhifeng687的博客-程序员宝宝

Resin 4.0 introduced Early Access Servlet 3.0 support and, in version 4.0.2, we’ve solidified the implementation. Among many interesting features, Servlet 3.0 introduces annotations that make deployin...

Python 实现DESede / 3DES / DES3 / Triple DES加密_des3 desede_liang-guijing的博客-程序员宝宝

pip install pycryptodomeimport base64from Crypto.Cipher import DES3text = "this is a plain text."key =b"key" * 8 # key是16位或者24位iv = b"\x00" * 8 # 这里一定要写16进制aes = DES3.new(key=key, mode=DES3.MODE_CBC, iv=iv)data = text.encode()# 数据不足8位, 后面补足 0 同

C语言总结_weixin_30664051的博客-程序员宝宝

编译:接受源代码,转换为中间文件目标代码(扩展名为.o);通过链接形成二进制文件--运行编译hello文件gcc -o hello.c第一部分 基本结构1)所有C程序包含一个主要的结构,格式:&lt;返回值类型&gt;main(&lt;可选参数&gt;){&lt;执行语句或函数调用&gt;;}对main()使用命令行参数,格式:&lt;返回值类型...

积木游戏 纪中 1440 类dp 预处理_A_loud_name的博客-程序员宝宝

Description  在一个N*N的区域玩积木游戏,每个单元格正好跟积木的底面相等,每个单元格里放有若干个积木,Alice想重新摆放积木,使得每个单元格最多只能放一个积木,并且所有积木正好形成一个矩形。   把一个积木从一个位置移到另一个位置称为一次操作。   给出初始状态,编程计算最少需要多少次操作才能达到上述要求。Input  第一行包含两个整数N和M(1<=N<=100,1<=M<=N

Java8实战笔记( Lambda表达式学习)_nutcore的博客-程序员宝宝

Java Lambda表达式学习什么是Lambda?比较有用的方法比较器复合1.逆序2.比较器链谓词复合函数复合数学中的类似思想积分什么是流?流是什么?这样写的好处流简介集合与流内部迭代与外部迭代流操作中间操作与终端操作使用流:什么是Lambda?Lambda表达式可以理解为一种匿名函数:它没有名称,但有参数列表,函数主体,返回类型,可能还有一个可以抛出的异常的列表。Lambda表达式可以让你写出更简洁的代码函数式接口就是仅仅声明了一个抽象方法的接口。只有在接受函数式接口的地方才可以使用Lambd

随便推点

eth_mac_address没找到_软柿子捏捏的博客-程序员宝宝

目前我不清楚问题的来源。我把我处理的方法发出来。执行waf run dce-quagga程序发现报告elf-load liblinux.so,找不到eth_mac_address1 查找到liblinux.so,是由net-next-sim生成的2 在net-next-sim中找到了eth_mac_address的定义,在net/ethernet/eth.c3 nm -D libl

2021-08-03以CSU18MB86芯片做主控开发打气泵方案_西城微科方案开发的博客-程序员宝宝

  汽车轮胎打气泵方案功能介绍:    显示方式:LED显示,测量和设置同屏显示。    单位:4个,循环切换顺序PSI、KPA、 Bar、 Kg/cm2    测量范围:    3.0 ~ 150.0PSI; 20 ~ 1030KPA    0.2 ~ 10.30Bar; 0.2 ~ 10.50Kg/cm2    设置范围:    3 ~ 120PSI; 20 ~ 825KPA    0.2 ~ 8.25Bar; 0.2 ~ 10.50 Kg/cm2    测量精度:+

关于spring问题报错_狗头军师.的博客-程序员宝宝

[INFO] [2022-12-12 22:28:39][org.springframework.web.context.ContextLoader]Root WebApplicationContext: initialization started org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:270)[DEBUG] [2022-12-12 22:28:39][org

burp插件--爆破前端加密(jsEncrypter、BurpCrypto)_xiao__caicai的博客-程序员宝宝

目录简介靶场搭建JS加密还原BurpCryptojsEncrypter简介背景:有时候用户名密码都是加密的,如果只是md5加密或者hash,burp的Intruder模块自带加密爆破功能,但是如果是自定义的加密方式,或者多层md5此时就没法直接爆破了,就需要寻找加密算法然后用到插件爆破插件介绍:jsEncrypter:此插件使用phantomjs启动前端加密函数对数据进行加密,phantomjs会返回加密结果传给burp。因此此插件需要启动phantomjs开启服务,burp去读取结果。Bur

@POST和GET的区别?_LANG-ITTECHNOGY的博客-程序员宝宝

@POST和GET的区别?1.GET提交的数据放在URL中,POST则不会。这是最显而易见的差别。这点意味着GET更不安全(POST也不安全,因为HTTP是明文传输抓包就能获取数据内容,要想安全还得加密)2.GET回退浏览器无害,POST会再次提交请求(GET方法回退后浏览器再缓存中拿结果,POST每次都会创建新资源)3.GET提交的数据大小有限制(是因为浏览器对URL的长度有限制,GET本...

推荐文章

热门文章

相关标签