首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >modprobe过程中未调用Init

modprobe过程中未调用Init
EN

Stack Overflow用户
提问于 2015-11-25 03:41:52
回答 1查看 1.2K关注 0票数 0

我知道驱动程序和设备必须具有相同的名称,并且我已经确保我这样做了。然而,在修改我的驱动程序时,即使我在init函数中执行了一些printk操作,也没有任何反应。

当modprobing时,我得到:

代码语言:javascript
运行
复制
root@localhost:~# dmesg --clear
root@localhost:~# modprobe mcp3202
root@localhost:~# dmesg

[   41.828678] kobject: 'mcp3202' (bf03968c): kobject_add_internal: parent: 'module', set: 'module'
[   41.828747] kobject: 'holders' (ded9d980): kobject_add_internal: parent: 'mcp3202', set: '<NULL>'
[   41.828890] kobject: 'notes' (dd1947c0): kobject_add_internal: parent: 'mcp3202', set: '<NULL>'
[   41.829028] kobject: 'mcp3202' (bf03968c): kobject_uevent_env
[   41.829053] kobject: 'mcp3202' (bf03968c): fill_kobj_path: path = '/module/mcp3202'

root@localhost:~# 

未显示printk。

我的设备和驱动程序结构是:

代码语言:javascript
运行
复制
static struct platform_device mcp3202_device = {
    .name = "mcp3202",
    .id = 0,
    .num_resources = 0,
};

static strict of_device_id mcp3202_id[] = {
    { .compatible = "microchip,mcp3202", },
    { }
};

MODULE_DEVICE_TABLE(of,mcp3202_id);

static struct platform_driver mcp3202_driver = {
   .driver = {
            .name = "mcp3202",
            .owner = THIS_MODULE,
            .of_match_table = mcp3202_id,
    },
    .probe = mcp3202_probe,
    .remove = mcp3202_remove,
};

module_init(mcp3202_init);
module_exit(mcp3202_exit);

..。最后,我的init函数(partial) ...

代码语言:javascript
运行
复制
static int __init mcp3202_init(void)
{
    int init_result;
    struct device *dev;

    printk(KERN_WARNING "mcp3202: reg driver\n");
    .
    .
    .
}

我的理解是,只要名称匹配(dev/drv),就会调用mcp3202_init,而不管.dts中为该设备定义了什么。

有人知道我遗漏了什么吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-11-30 11:57:04

@Bryan,Kernel make系统没有buggy。你正在使用的Makefile中的Bug,尝试在Makefile下面编译mcp3202驱动程序和反馈。

有两个选项可以解决该问题,

1)将模块名称更改为mcp3202_mod.o,如下所示,Makefile将为:

代码语言:javascript
运行
复制
obj-$(CONFIG_MCP3202) += mcp3202_mod.o
mcp3202_mod-objs := mcp3202.o mcp3202_pru.o

                   (or)

2)将源文件mcp3202.c改为mcp3202_<meaningful-name>.c,Makefile为

代码语言:javascript
运行
复制
obj-$(CONFIG_MCP3202) += mcp3202.o
mcp3202-objs := mcp3202_<name_provided>.o mcp3202_pru.o

模块名和源文件名不应该相同,如果是这样的话,初始化信息将不会出现在<module_name.mod.c>中,也不会被调用。也可以通过下面的链接,

Building a kernel module from several source files which one of them has the same name as the module

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33902405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档