我目前正在编写我的第一个尝试与 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()
函数中尝试了以下操作,但由于 pci_dev
中缺少元素 group
而导致编译失败。
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,
};
最佳答案
“struct pci_driver”包含一个“struct device_driver”(选项 1)。 “struct pci_dev”包含一个“struct device”(选项 2)
查看include/linux/pci.h中的结构体定义
GregKH 的建议是不要在结构中添加字段,而是填写现有字段。
关于c - 在 Linux PCI 驱动程序中向设备添加多个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25308965/