Linux设备驱动模型之总线
宏BUS_ATTR
在创建属于总线的设备属性的函数bus_creat_file。其形式如下:
int bus_create_file(struct bus_type *bus, struct bus_attribute *attr)
{
int error;
if (bus_get(bus)) {
error = sysfs_create_file(&bus->p->subsys.kobj, &attr->attr);
bus_put(bus);
} else
error = -EINVAL;
return error;
}
EXPORT_SYMBOL_GPL(bus_create_file);
实际使用该函数时,经典用法:
static BUS_ATTR(version, S_IRUGO, show_bus_version,NULL)
if (bus_create_file(&ldd_bus_type, &bus_attr_version))
printk(KERN_NOTICE "Unable to create version attribute\n");
该函数失败时返回错误号。一旦调用该函数,会就在指定bus总线的目录下新建一个名叫_name的文件,权限为_mode,当访问和修改该文件是会分别调用show和store函数调用。上面的&bus_attr_version就是在上一句中static BUS_ATTR(version, S_IRUGO, show_bus_version,NULL)定义的。
具体为:宏BUS_ATTR
这个宏BUS_ATTR类似于Uboot里面的定义命令的宏U_BOOT_CMD。
在设备中也有类似的宏DEVICE_ATTR,分析也类似。
#define BUS_ATTR(_name, _mode, _show, _store) \
struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)
#define __ATTR(_name,_mode,_show,_store) { \
.attr = {.name = __stringify(_name), .mode = _mode }, \
.show = _show, \
.store = _store, \
}#define __stringify_1(x) #x
#define __stringify(x) __stringify_1(x)