目录
简介:
在Linux驱动调试时,常常需要添加属性文件,sysfs属性节点可以实现用户空间与硬件交互,如:设置GPIO管脚电平、控制驱动等功能。下面介绍如何创建sysfs属性节点。
一、DEVICE_ATTR介绍
1、DEVICE_ATTR宏
DEVICE_ATTR 宏在linux/device.h中有如下定义:
/* 路径:linux/device.h */
#define DEVICE_ATTR(_name, _mode, _show, _store) \
struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
struct device_attribute {
struct attribute attr;
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count);
};
/* 路径:include/linux/sysfs.h */
#define __ATTR(_name, _mode, _show, _store) { \
.attr = {.name = __stringify(_name), \
.mode = VERIFY_OCTAL_PERMISSIONS(_mode) }, \
.show = _show, \
.store = _store, \
}
DEVICE_ATTR 宏用来定义一个 struct device_attribute 结构体,并对各成员初始化。
1.1 参数说明
DEVICE_ATTR(_name, _mode, _show, _store)
- _name:名称,也就是将在sysfs中生成的文件名称;
- _mode:属性文件的权限mode,与普通文件相同,UGO的格式。只读0444,只写0222,或者读写都行的0666;
- _show:显示函数,cat该文件时,此函数被调用;
- _store:写函数,echo内容到该文件时,此函数被调用;
1.2 调用方法
static DEVICE_ATTR(demo, 0664, demo_show, demo_store);
demo_show、demo_store函数由我们自己定义,展开后
struct device_attribute dev_attr_demo = {
.attr = {.name = __stringify(demo),
.mode = VERIFY_OCTAL_PERMISSIONS(0664) },
.show = demo_show,
.store = demo_store,
}
调用 DEVICE_ATTR 后,就将 device_attribute 结构体初始化完成了。还需要使用 device_create_file() 或 sysfs_create_group() 将属性文件加入sysfs文件系统中。
二、sysfs创建属性文件
1、创建一个sysfs属性文件
1.1 device_create_file()函数
DEVICE_ATTR 宏创建 device_attribute 结构体后,调用 device_create_file() 将属性文件加入sysfs文件系统中,会在 /sys/class/xxx 子目录下生成一个属性文件。
/* 路径:drivers/base/core.c */
int device_create_file(struct device *dev,
const struct device_attribute *attr)
{
int error = 0;
if (dev) {


4277

被折叠的 条评论
为什么被折叠?



