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

标签 c linux linux-kernel kernel-module

我目前正在编写我的第一个尝试与 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/

相关文章:

linux - 是否可以专门为 NIC 运行命令 "route -n"

c - 如何在 GTK 应用程序中嵌入 Flash 播放器?

linux - 在启动辅助 cpu 时通过哪个指令触发辅助核心

linux - ioctls 如何知道在 linux 中调用哪个函数?

c - 为什么 perror 的参数是用 ISO C 属性 const 定义的?

c - 为什么这总是返回一个?

c - 如何将指针数组归零

c++ - 何时量化 C sscanf 函数中忽略的模式匹配

python - 如何在 Linux 中的键盘上获取箭头键和回车键,使其表现得像 Windows7

multithreading - 我有一个看起来像cpu缓存一致性的问题,我不知道该如何解决。两个cpus看到同一个内存的不同内容