Linux驱动程序具有多个设备属性链接到相同的function

我正在写一个简单的Linux驱动程序,具有多个设备属性。 现在独立于您读取或写入的属性,最后您将读取或写入设备内存中的某处。 只有定义确切位置的偏移从一个属性改变到另一个属性。 用几行代码就可以解释这个问题:

/* General read function evoked by attributes */ static const ssize_t foo_show(struct device *dev, struct device_attribute *attr, char *buf) { u32 offset; if (attr->attr.name == "control") offset = OFFSET_CTRL; else if (attr->attr.name == "status") offset = OFFSET_STATUS; u32 data = ioread32(dev_mem + offset); ... } ... /* declaring attributes, all linking to the same function */ static DEVICE_ATTR(control, S_IWUGO | S_IRUGO, foo_show, foo_set); static DEVICE_ATTR(status, S_IRUGO, foo_show, NULL); 

现在,你可能会猜测使用attr->attr.name == foo不是一个很好的方法,特别是因为我得到警告“比较string文字结果在未指定的行为” 告诉我使用strcmp 。 你知道有什么更好的方法来确定哪个属性负责电话?

现有的驱动程序似乎是这样做的,直接比较全局属性。

 static DEVICE_ATTR(control, S_IWUGO | S_IRUGO, foo_show, foo_set); static DEVICE_ATTR(status, S_IRUGO, foo_show, NULL); static const ssize_t foo_show(struct device *dev, struct device_attribute *attr, char *buf) { u32 offset; if (attr == &dev_attr_control) offset = OFFSET_CTRL; else if (attr == &dev_attr_status) offset = OFFSET_STATUS; 

属性只能根据名称来识别。 由于默认情况下属性中只有两个字段可用。 http://lxr.free-electrons.com/source/include/linux/sysfs.h#L29

strcmp()的内核空间实现可用。 所以使用它将起作用。 http://lxr.free-electrons.com/source/lib/string.c#L245