#define DEVICE_ATTR(_name, _mode, _show, _store) \
struct device_attribute dev_attr_##_name = _ATTR(_name, _mode, _show, _stroe);
宏DEVICE_ATTR内封装的是_ATTR(_name, _mode, _show, _store)方法。
_name :名字
_mode :权限
_show :读方法
_store :写方法
当然,DEVICE_ATTR不是独生子女,它还有一系列的姊妹:
对设备使用 DEVICE_ATTR
对驱动使用 DRIVER_ATTR
对总线使用 BUS_ATTR
对类别(class)使用 CLASS_ATTR
这四个宏来自于#include <linux/device.h>.
假设有如下声明;
static DEVICE_ATTR(foo, S_IWUSR | S_IRUGO, show_foo, store_foo);
等同于这样的代码:
static struct device_attribute dev_attr_foo = {
.attr = {
.name = "foo",
.mode = S_IWUSR | S_IRUGO,
},
.show = show_foo,
.store = store_foo,
};
我们来看看怎样使用DEVICE_ATTR:
static ssize_t show_name(struct device *dev, struct device_attribute *atttr, char *buf)
{
return snprintf(buf, PAGE_SIZE, "%s\n", dev->name);
}
static ssize_t store_name(struct device *dev, const char *buf)
{
sscanf(buf, "%20s", dev->name);
}
static DEVICE_ATTR(name, S_IRUGO, show_name, store_name);
(注意:真实的程序不允许用户空间设置设备名。)