1

我正在为几个自定义硬件编写驱动程序。所有设备都通过 PCIe 连接到主机。为方便起见,我想将所有这些自定义设备组合到一个 sysfs 类中(我认为这是可以接受的事情吗?)。不幸的是,LDD3 中的信息已经过时了,我无法找到讨论我正在尝试做什么的当前文档。

创建我的自定义类很容易:

struct class MY_CLASS = class_create(THIS_MODULE, "myclass")

在我的探测调用中,我可以访问struct dev

static int probe(struct pci_dev *pcidev, const struct pci_device_id *id)
{
    ...

    struct dev *my_dev = &pcidev->dev;

    ...
}

我的问题是:现在我已经有了课程和开发人员,我如何在两者之间建立联系?

基本上可以满足我的device_create()要求,但是由于我已经struct dev了解我不应该device_create再次调用(即创建新设备)。

我做了更多的跟踪,发现device_add()device_create(), 调用device_add_class_symlinks()(不幸的是没有导出)调用的是这样的:

...
sysfs_create_link(&dev->class->p->subsys.kobj,&dev->kobj, dev_name(dev));
...

我直接在我的驱动程序中尝试了类似的方法来创建我想要的链接,但我无法编译它,因为struct subsys_private(类结构中的“p”成员)没有暴露在任何地方?

任何帮助是极大的赞赏!

4

2 回答 2

0

Are your drivers sitting on the specific bus? If no, what purpose of the specific class?

Anyway, for starter

struct class devclass = {…}

probe()
{
  struct device *dev = …

  dev->class = &devclass;
}

init()
{
  class_register(&devclass);
}
于 2015-01-27T20:06:41.923 回答
0

我遇到了同样的问题。

如果我调用 device_register 并将我的类指针分配给设备类成员。它将在我的设备目录中创建一个子系统,这就是 device_add_class_symlinks 所做的。但是在我的设备目录中已经有子系统目录,它是我的设备所连接的总线的链接。

不知道你有没有方法

于 2021-10-21T21:19:01.833 回答