在Linux PCI驱动程序中为设备添加多个属性

时间:2014-08-14 13:15:51

标签: c linux linux-kernel kernel-module

我目前正在编写第一个尝试与PCI卡通信的Linux驱动程序。在Linux Device Driver, 3rd editiongreat 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,
};

1 个答案:

答案 0 :(得分:1)

“struct pci_driver”包含“struct device_driver”(选项1)。 “struct pci_dev”包含“struct device”(选项2)

查看include / linux / pci.h中的结构定义

GregKH的建议不是在结构中添加字段,而是填写现有字段。