【官方文档】
官方描述文档路径为 /linux-4.3/Documentation/driver-model/device.txt
源码路径为 /linux-4.3/include/linux/device.h
【DEVICE_ATTR 说明】
原文描述:
ˉˉˉˉˉˉˉˉˉˉˉˉˉ
Attributes are declared using a macro called DEVICE_ATTR:
#define DEVICE_ATTR(name, mode, show, store)
意思是说,宏 DEVICE_ATTR 用来声明 设备属性文件的 属性(听起来像绕口令)。宏的各参数含义如下:
name 属性文件的名称
mode 属性文件的权限。这个权限值为类似于 0644 这样的 4 位数,分别表示 SUID/GUID+User+Group+Others
show 从该属性文件读数据时调用的函数
store 向该属性文件写数据时调用的函数
源码描述:
ˉˉˉˉˉˉˉˉˉˉˉˉˉ
宏 DEVICE_ATTR 的定义:
#define DEVICE_ATTR(_name, _mode, _show, _store) \
struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
宏 __ATTR(_name, _mode, _show, _store) 的定义:
#define __ATTR(_name, _mode, _show, _store) { \
.attr = {.name = __stringify(_name), .mode = _mode }, \
.show = _show, \
.store = _store, \
}
结构体 device_attribute 的定义:
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);
};
由此可见,
宏 DEVICE_ATTR的作用实际上是在声明并初始化一个 device_attribute结构体。
该结构体名称为 dev_attr_##_name (这里使用了预处理命令中 粘贴操作符 的概念)。
【用处】
使用 DEVICE_ATTR 初始化 device_attribute结构体后,
调用 device_create_file() 函数为设备在 device 下创建一个属性文件。
device_create_file() 函数体如下:
/**
* device_create_file - create sysfs attribute file for device.
* @dev: device.
* @attr: device attribute descriptor.
*/
int device_create_file(struct device *dev, const struct device_attribute *attr)
{
int error = 0;
if (dev)
error = sysfs_create_file(&dev->kobj, &attr->attr);
return error;
}
要想在 shell控制台看到文件的接口,还需要进行几步后续操作。我现在没深入到那里,就不在这儿献丑了。
感兴趣的话可以看看本文末尾 参考文献 里的描述。
【举一反三】
类似的宏还有 DRIVER_ATTR、BUS_ATTR、CLASS_ATTR。
【参考文献】
[1] 《sysfs接口函数的建立_DEVICE_ATTR》