2015-11-24 32 views
0

我知道驱动程序和设备必须具有相同的名称,并且我确信我已经完成了该操作。但是,当modprobeing我的驱动程序时,即使我已经在init函数中完成了一些printk的操作,也没有任何反应。在modprobe期间未调用init

modprobing时,我得到:

[email protected]:~# dmesg --clear 
[email protected]:~# modprobe mcp3202 
[email protected]:~# 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' 

[email protected]:~# 

没有的printk的出现。

我的设备和驱动结构是:

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); 

......终于,我的初始化函数(部分)...

static int __init mcp3202_init(void) 
{ 
    int init_result; 
    struct device *dev; 

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

我的理解是只要名称匹配( dev/drv),mcp3202_init将被调用,无论此设备的.dts中定义了什么。

任何人有任何线索我失踪?

谢谢!

+0

所以情节变厚。事实证明,代码是正确的 - 问题出在我能说的Linux Makefile系统上。 –

回答

0

@Bryan,内核使系统不是越野车。您正在使用的Makefile中存在错误,请在Makefile下面尝试编译mcp3202驱动程序和反馈。

有解决这个问题两个选项,

1)更改模块名称如下mcp3202_mod.o,Makefile文件会,

obj-$(CONFIG_MCP3202) += mcp3202_mod.o 
mcp3202_mod-objs := mcp3202.o mcp3202_pru.o 

        (or) 

2)更改源文件mcp3202.c到mcp3202_<meaningful-name>.c ,生成文件将是,

obj-$(CONFIG_MCP3202) += mcp3202.o 
mcp3202-objs := mcp3202_<name_provided>.o mcp3202_pru.o 

模块名称和源文件名不应该是相同的,如果在一个<module_name.mod.c>所以然后初始化信息将不存在nd不会被调用。也通过下面的链接,

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

相关问题