我目前正在编写第一个尝试与PCI卡通信的Linux驱动程序。在Linux Device Driver, 3rd edition和great example的帮助下,我能够编写我的第一个模块并理解和实现基础知识(设备检测,内存映射,DMA,MSI)。在下一步中,我想通过sysfs和设备属性的帮助在PCI卡的内存和用户空间之间建立连接。不幸的是,目前我的模块不会比生产oops更进一步,这就是我想问你的原因。
为了向设备添加多个属性,我按如下方式创建它们:
static DEVICE_ATTR(foo, S_IWUGO | S_IRUGO, show_foo, set_foo);
static DEVICE_ATTR(bar, S_IWUGO | S_IRUGO, show_bar, set_bar);
static struct device_attribute *pci_device_attrs[] = {
__ATTR(foo, S_IWUGO | S_IRUGO, show_foo, set_foo),
__ATTR(bar, S_IWUGO | S_IRUGO, show_bar, set_bar),
__ATTR_NULL,
};
static struct attribute_group pci_device_attr_group = {
.attrs = pci_device_attrs,
};
但与struct device
相反,PCI设备的设备类(struct pci_dev
)不包含struct attribute_group
属性。那么如何将attribute_group
变量添加到我的pci_dev
变量中?到目前为止,我在probe()
函数中尝试了以下内容,由于group
中缺少元素pci_dev
,因此编译失败。
pci_device->groups = pci_device_attr_group;
pci_device->dev->groups = pci_device_attr_group;
GregKH explains on his blog我应该在pci_dev
结构中添加一个我不知道如何实现的附加字段。
非常感谢任何帮助和/或示例。谢谢!
修改
实际上在仔细查看Documentation/driver-model/device.txt后,我将我的代码示例略微修改为以下
static DEVICE_ATTR(foo, S_IWUGO | S_IRUGO, show_foo, set_foo);
static DEVICE_ATTR(bar, S_IWUGO | S_IRUGO, show_bar, set_bar);
static struct device_attribute *pci_device_attrs[] = {
&dev_attr_foo.attr,
&dev_attr_bar.attr,
NULL,
};
static struct attribute_group pci_device_attr_group = {
.attrs = pci_device_attrs,
};
static const struct attribute_group *pci_device_attr_groups[] = {
&pci_device_attr_group,
NULL,
};
答案 0 :(得分:1)
“struct pci_driver”包含“struct device_driver”(选项1)。 “struct pci_dev”包含“struct device”(选项2)
查看include / linux / pci.h中的结构定义
GregKH的建议不是在结构中添加字段,而是填写现有字段。