c - 在 Linux 中,如何在现有类中使用 device_create?

标签 c linux linux-kernel device-driver

注意:我现在列出这个问题,我反对更改实现(将类的创建移动到公共(public)区域例如)如果它让事情变得更容易......我只是不知道该怎么做。 :尾注

我有两个 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>

条目。我想知道的是如何在现有类中创 build 备。换句话说,我的一个模块创建了这个新的 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,但我不确定该怎么做。

最佳答案

要对同一类使用 device_create 函数,只需将指向同一类的指针传递给它即可。

由于您想在与创建类所在的模块不同的模块中调用 device_create,因此您需要导出指向该类的指针的符号。您可以使用 EXPORT_SYMBOL 宏来执行此操作。


例如:

module1.c:

extern struct class *c1;    /* declare as extern */
EXPORT_SYMBOL(c1);          /* use EXPORT_SYMBOL to export c1 */

static dev_t mod1_dev;
static int __init start_func(void)
{
        ...
        /* define class here */
        c1 = class_create(THIS_MODULE, "chardrv");

        /* create first device */
        device_create(c1, NULL, mod1_dev, NULL, "mod1_dev");
        ....
}

module2.c

extern struct class *c1;    /* declare as extern */

static dev_t mod2_dev;
static int __init start_func(void)
{
        ...
        /* c1 is defined in module 1 */

        /* create second device */
        device_create(c1, NULL, mod2_dev, NULL, "mod2_dev");
        ....
}

注意:您需要在 module2 之前插入 module1,因为类指针是在 module1 中定义和导出的。

这应该创建您期望的目录:

  • /sys/class/chardrv/mod1_dev
  • /sys/class/chardrv/mod2_dev

顺便说一下,如果您在尝试加载第二个模块时收到无效参数 错误,您可能必须add a KBUILD_EXTRA_SYMBOLS line to your Makefile .

关于c - 在 Linux 中,如何在现有类中使用 device_create?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11993467/

相关文章:

C-int8_t 不会工作

c# - 大O分析。非负数组中的最大整数

c - 如何从VC8中的2个静态库中获取所有符号冲突

linux - Bash/Sh 等 Shell 脚本的 IDE/Emacs 模式

linux - 如何使用 "find"命令限制目录搜索?

c - 比较C中的两个2​​D数组

php - 通过绝对路径在 PHP 中包含文件的问题

c - kfree 函数调用时发生了什么

linux - 检查我的操作系统版本是否为 CentOS

c - 访问特定 UID 的 user_struct