2015-11-24 105 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

相關問題