繁体   English   中英

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

[英]Adding multiple attributes to a device in a Linux PCI driver

我目前正在编写我的第一个Linux驱动程序,尝试与PCI卡通信。 借助Linux设备驱动程序第三版和这个出色的示例,我能够对我的第一个模块进行编码,并了解并实现了基础知识(设备检测,内存映射,DMA,MSI)。 在下一步中,我想通过sysfs和设备属性的帮助在PCI卡的内存和用户空间之间建立连接。 不幸的是,当前我的模块并没有产生多大的作用,这就是为什么我想问你。

为了向设备添加多个属性,我按如下方式创建它们:

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在他的博客上解释说,应该仅向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的建议不是在结构中添加字段,而是填充现有字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM