DEVICE_ATTR 简单说明

【官方文档】
    官方描述文档路径为 /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》

你可能感兴趣的:(c,linux,嵌入式,驱动,DEVICE_ATTR)