说道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,对总线使用BUS_ATTR,对驱动使用DRIVER_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);创建接口
通过以上简单的三个步骤,就可以在adbshell终端查看到接口了。当我们将数据echo到接口中时,在上层实际上完成了一次write操作,对应到kernel,调用了驱动中的“store”。同理,当我们cat一个接口时则会调用“show”。到这里,只是简单的建立了android层到kernel的桥梁,真正实现对硬件操作的,还是在"show"和"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表示的是写方法。
当然_ATTR不是独生子女,他还有一系列的姊妹__ATTR_RO宏只有读方法,__ATTR_NULL等等
如对设备的使用DEVICE_ATTR,对总线使用BUS_ATTR,对驱动使用DRIVER_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);创建接口
通过以上简单的三个步骤,就可以在adbshell终端查看到接口了。当我们将数据echo到接口中时,在上层实际上完成了一次write操作,对应到kernel,调用了驱动中的“store”。同理,当我们cat一个接口时则会调用“show”。到这里,只是简单的建立了android层到kernel的桥梁,真正实现对硬件操作的,还是在"show"和"store"中完成的。
分享到:
相关推荐
这个例了同时也展示了sysfs文件系统在驱动程序中的用法,以及通过Linux设各模型来创建设备节点及其他一些特性(这个看起来很简单的内核模块其实体现了设备驱动程序中一些比较重要且典型的特征)。 首先是设备驱动程序...
用于HC-SR04传感器Linux内核和Sysfs接口平台设备驱动程序:•为HC-SR04传感器实现了平台驱动程序平台设备基础结构,并使这些平台设备Linux sysfs接口能够为用户提供操作设备的便捷界面,使用户能够:-设置测量模式...
linux sysfs详细分析 对学习LINXU驱动原理很有帮助
sysfs 文件系统详解,IBM官方网站学习,
sysfs文件系统
rust-sysfs-gpio:Linux sysfs GPIO接口的Rust接口(https:www.kernel.orgdocDocumentationgpiosysfs.txt)
sysfs子系统: 1.qsysfs是什么 2.使用sysfs 3.创建目录 4.属性(Attributes) 5.子系统特定的回调(Subsystem-Specific Callbacks) 6.读/写属性数据 7.顶级目录布局(Top Level ...8.当前的接口(Current Interfaces)
sysfs方式实现马达驱动 - .mht sysfs方式实现马达驱动 - .mht
Patrick Mochel的这篇文档介绍了sysfs文件系统的结构及编程接口,可作为linux驱动开发的参考
linux 设备模型的衍生产物sysfs的描述和用法,包括举例,初学者原创
Linux那些事儿之我是Sysfs简单,诙谐的介绍sysfs
linux sysfs 原理及其编程实例, 包含 class, device , bus 等各种类型的范例.
皮条客我的Z1 Pimp My Z1是一个流畅,完整的,完全开源的(GPL v2许可证)应用程序,它可以控制Z1某些内核上存在的各种sysfs接口。 大多数功能都需要(针对基于CM的 )或(针对基于Stock的rom),但是CPU和GPU控件...
Linux那些事儿之我是sysfs
网上搜集整理的介绍 Sysfs 的文章,讲得非常全面。推荐给大家。
"sysfs is a ram-based filesystem initially based on ramfs. It provides a means to export kernel data structures, their attributes, and the linkages between them to userspace.” --- documentation/file...
libgpio libgpio可用于通过Linux / sysfs简化GPIO的访问。 build ^^^^^ ./autogen.sh ./configure && make &&进行安装 也可以构建debian软件包:./autogen.sh dpkg-buildpackage
文章主要介绍了一些设备驱动相关的sys文件系统,结合ldd3(linux device driver 3)中的示例代码(主要是lddbus 和sculld 文件夹),详细分析虚拟文件系统sysfs,以及如何编写基于sysfs的模块化的驱动程序。使用的内核是...
很好的嵌入式驱动入门资料,适合初学者,集合了udev与dbus与hal以及sysfs之间的关系,系统的讲解了udev的用法