2015-11-24 5 views
0

Я знаю, что драйвер и устройство должны иметь одинаковое имя, и я убедился, что сделал это. Однако, когда modprobe'ing моего драйвера, ничего не происходит, хотя я сделал несколько printk в функции init.Инициировать не вызываемый во время modprobe

Когда 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

Так сюжет утолщается. Как оказалось, код правильный: проблема заключается в системе Makefile Linux из того, что я могу сказать. –

ответ

0

@Bryan, Kernel make system не багги. Ошибка в 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 , Makefile будет,

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

модуль имя и имя исходного файла не должен быть таким же, если да, то INIT информация не будет присутствовать в <module_name.mod.c> в nd не будет вызываться. Также пройти через ссылку ниже,

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

 Смежные вопросы

  • Нет связанных вопросов^_^