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 - 如何在 tcl/tk 中开发对话仪表,通过移动它来获取循环值并更新刻度小部件

c - Linux 驱动程序 try & catch

c - 告诉我编译器在这里做什么?

c - 利用缓冲区溢出

c - 为什么在以下情况下分配后结构地址不等于

java - 理解java平台独立性

linux - 使用 cut 或 awk 操作目录?

c - 如何从 Linux 内核空间中的字符串中提取整数?

linux-kernel - Linux 内核 mutex_lock_interruptible

c - 强制 C 编译器产生整数缩小警告