Mik*_*ike 13 c linux device-driver linux-kernel
注意:我现在列出了这个问题,我不反对改变实现(例如将类的创建移动到公共区域),如果它让事情变得更容易......我只是不确定怎么做.:结束注释
我有两个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);
....
Run Code Online (Sandbox Code Playgroud)
我已经验证了我的第一个模块这个代码是否有效,并且它正确地创建了一个:
/sys/class/chardrv/<MODULE_NAME>
Run Code Online (Sandbox Code Playgroud)
条目.我想知道的是如何在现有类中创建设备.换句话说,我的一个模块创建了这个新的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, ...)
Run Code Online (Sandbox Code Playgroud)
因此,根据这个例子,如果我的类已经存在,并且我只想从第二个模块添加我的新设备,我假设我需要创建一个类结构,并以某种方式使用正确的"chardrv类"属性填充它然后调用device_create和以前一样,但我不知道该怎么做.
Vil*_*ray 10
要使用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");
....
}
Run Code Online (Sandbox Code Playgroud)
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");
....
}
Run Code Online (Sandbox Code Playgroud)
注意:您需要在module2之前插入module1,因为类指针是在module1中定义和导出的.
那应该创建你期望的目录:
/sys/class/chardrv/mod1_dev/sys/class/chardrv/mod2_dev顺便说一句,如果Invalid parameters在尝试加载第二个模块时遇到错误,则可能需要在Makefile中添加KBUILD_EXTRA_SYMBOLS一行.
dus*_*abo -2
Linux 内核不允许这样做。这是您将得到的错误。
**[ 865.687824] kobject_add_internal failed for net with -EEXIST, don't try to register things with the same name in the same directory.
[ 865.687835] Pid: 6382, comm: insmod Tainted: P W O 3.2.16.1JeshuLinux #1
[ 865.687840] Call Trace:
[ 865.687849] [<c1584382>] ? printk+0x2d/0x2f
[ 865.687859] [<c12a5438>] kobject_add_internal+0x138/0x1d0
[ 865.687869] [<c12a5a11>] kset_register+0x21/0x50
[ 865.687879] [<c137b63d>] __class_register+0xcd/0x1b0
[ 865.687888] [<f8d0a0aa>] hello_init+0x4a/0x80 [sysfs_Dev]
[ 865.687897] [<c1003035>] do_one_initcall+0x35/0x170
[ 865.687909] [<f8d0a060>] ? enable_show+0x40/0x40 [sysfs_Dev]
[ 865.687919] [<c10928d0>] sys_init_module+0x2c0/0x1b50
[ 865.687941] [<c159485f>] sysenter_do_call+0x12/0x28
[ 865.687947] Registering Class Failed**
If you want to understand sysfs read: [mochel.pdf](www.kernel.org/pub/linux/kernel/people/mochel/doc/papers/ols-2005/mochel.pdf)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21284 次 |
| 最近记录: |