注意:我现在列出这个问题,我不反对更改实现(例如,将类的创建移动到公共区域)如果它使事情变得更容易......我只是不确定怎么做。:尾注
我有两个 linux 内核模块,我正在尝试为它们更新 /sys 条目。在谷歌和其他资源上搜索,我看到了很多代码:
static dev_t MyDev;
static struct class *c1;
static int __init start_func(void)
{
...
MyDev = MKDEV(nMajor, MINOR_VERSION);
register_chrdev_region(MyDev, 1, MODULE_NAME);
c1 = class_create(THIS_MODULE, "chardrv");
device_create(c1, NULL, MyDev, NULL, MODULE_NAME);
....
我已经为我的第一个模块验证了这段代码是否有效,并且它正确地创建了一个:
/sys/class/chardrv/<MODULE_NAME>
入口。我想知道的是如何在现有课程中创建设备。换句话说,我的一个模块创建了这个新的 chardrv 类,现在我希望我的另一个模块也能够在同一类下注册它的设备。
我不能再次调用 class_create() (在第二个模块中),因为“chardrv”类已经存在......
所以我可以检查 /sys/class/chardrv 是否存在,这可以帮助我决定是否需要调用 class_create(),这不是问题。让我们在这里放一些伪代码来澄清一下:
if ( path "/sys/class/chardrv" does not exist)
new_class = class_create("chardrv")
else
new_class = some how get class "chardrv" handle, or properties, or whatever
device_create(new_class, ...)
因此,按照这个例子,如果我的类已经存在,并且我只想从第二个模块将我的新设备添加到其中,我假设我需要创建一个类结构并以某种方式使用正确的“chardrv 类”属性填充它然后调用device_create 和以前一样,但我不知道该怎么做。