我首先提出这个问题:How do I initialize the attribute group correctly for a platform driver?
得出结论,函数调用device_show_int()
正在使用错误的函数原型。
代码问题始于使用struct dev_ext_attribute
宏定义DEVICE_INT_ATTR()
结构。 [struct device_attribute][1]
结构将show
字段定义为指向带有三(3)个参数的函数的指针:
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);
};
然而在我的调用堆栈中(请参考上面提到的问题),只使用drv_attr_show()中的两(2)个参数调用解除引用的函数:
if (drv_attr->show)
ret = drv_attr->show(drv_priv->driver, buf);
这看起来非常令人震惊,它是一个错误还是我以某种方式搞砸了内核构建?(ARM,Kernel 3.12)
答案 0 :(得分:5)
你让device_attribute
和driver_attribute
感到困惑。函数drv_attr_show()
适用于struct driver_attribute
,其定义为:
struct driver_attribute {
struct attribute attr;
ssize_t (*show)(struct device_driver *driver, char *buf);
ssize_t (*store)(struct device_driver *driver, const char *buf,
size_t count);
};
所以这里没有错误。