当前位置: 首页 > news >正文

static DEVICE_ATTR(val, S_IRUGO | S_IWUSR, hello_val_show, hello_val_store); 的作用

在 老罗的android例程里面有

static DEVICE_ATTR(val, S_IRUGO | S_IWUSR, hello_val_show, hello_val_store);

/*读取设备属性val*/  

  • static ssize_t hello_val_show(struct device* dev, struct device_attribute* attr, char* buf) {  
  •     struct hello_android_dev* hdev = (struct hello_android_dev*)dev_get_drvdata(dev);          
  •   
  •     return __hello_get_val(hdev, buf);  
  • }  
  •   
  • /*写设备属性val*/  
  • static ssize_t hello_val_store(struct device* dev, struct device_attribute* attr, const char* buf, size_t count) {   
  •     struct hello_android_dev* hdev = (struct hello_android_dev*)dev_get_drvdata(dev);    
  •       
  •     return __hello_set_val(hdev, buf, count);  
  • }  

就这样就可以在串口 terminal 改变/显示val 变量的值

# cat hello
0
# echo '5' > hello
# # echo '5' > hello                  # cat hello
5

 

原来是static DEVICE_ATTR(val, S_IRUGO | S_IWUSR, hello_val_show, hello_val_store); 

的作用

原型是#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表示的是写方法。

当我们将数据 echo 到接口中时,在上层实际上完成了一次 write 操作,对应到 kernel ,调用了驱动中的 “store”。同理,当我们cat 一个 接口时则会调用 “show” 。到这里,只是简单的建立了 android 层到 kernel 的桥梁,真正实现对硬件操作的,还是在 "show" 和 "store" 中完成的

相关文章:

  • 几分钟内提升技能的8个 JavaScript 方法!
  • HTTP请求中的form data和request payload的区别
  • Linux内核-协议栈-从BSD Socket接口层到传输层1
  • centos7全离线安装MongoDB3.2.8集群
  • Java基础学习18(类的多态性以及子父类之间的转换机制)
  • Python的三种基本数据类型
  • 窗体数据Excle导入功能详解
  • Linux -LAMP架构介绍
  • 2018-2019-1 20165226 20165310 20165315 实验二 固件程序设计
  • html5本地存储
  • SQL Join 图示
  • P117、面试题18:树的子结构
  • [CF543A]/[CF544C]Writing Code
  • IOS 百度地图点聚合使用
  • PHP和MySQL Web开发从新手到高手,第2天-怎样用zend创建PHP项目
  • 分享一款快速APP功能测试工具
  • [Vue CLI 3] 配置解析之 css.extract
  • FastReport在线报表设计器工作原理
  • Idea+maven+scala构建包并在spark on yarn 运行
  • JavaScript的使用你知道几种?(上)
  • Shell编程
  • 分类模型——Logistics Regression
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端知识点整理(待续)
  • 一道面试题引发的“血案”
  • 以太坊客户端Geth命令参数详解
  • postgresql行列转换函数
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # .NET Framework中使用命名管道进行进程间通信
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #FPGA(基础知识)
  • #每天一道面试题# 什么是MySQL的回表查询
  • $.ajax()参数及用法
  • (ZT)薛涌:谈贫说富
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (六)软件测试分工
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net解析传过来的xml_DOM4J解析XML文件
  • /etc/sudoer文件配置简析
  • @Mapper作用
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ Linux ] Linux信号概述 信号的产生
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [4.9福建四校联考]
  • [acm算法学习] 后缀数组SA
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [C#小技巧]如何捕捉上升沿和下降沿
  • [C++]:for循环for(int num : nums)