5

Почему этот модуль ядра ничего не делает, когда я его загружаю?Код драйвера в модуле ядра не выполняется?

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/platform_device.h> 

#define DEVICE_NAME "hello-1.00.a" 
#define DRIVER_NAME "hello" 
MODULE_LICENSE("Dual BSD/GPL"); 

static int hello_init(struct platform_device *pdev){ 
    printk(KERN_ALERT "Hello, world\n"); 
    return 0; 
} 
static int hello_exit(struct platform_device *pdev){ 
    printk(KERN_ALERT "Goodbye, cruel world\n"); 
    return 0; 
} 

static const struct of_device_id myled_of_match[] = 
{ 
    {.compatible = DEVICE_NAME}, 
    {}, 
}; 

MODULE_DEVICE_TABLE(of, myled_of_match); 

static struct platform_driver hello_driver = 
    { 
     .driver = { 
     .name = DRIVER_NAME, 
     .owner = THIS_MODULE, 
     .of_match_table = myled_of_match 
    }, 
    .probe = hello_init, 
    .remove = hello_exit 
}; 

module_platform_driver(hello_driver); 

Она сусло печати Hello, world\n, если я делать lsmod модуль по всей видимости, будет загружен:

lsmod 
hello_world 1538 0 - Live 0xbf000000 (O) 

, но ничего не печатается ни в консоли, ни в dmesg.

Если я использую module_init и module_exit, все работает, но мне нужно указать указатель platform_device *pdev на устройство, что я могу сделать?

EDIT:

оригинальный модуль выглядит следующим образом:

#include <linux/init.h> 
#include <linux/module.h> 

static int hello_init(void){ 
    printk(KERN_ALERT "Hello, world\n"); 
    return 0; 
} 

static void hello_exit(void){ 
    printk(KERN_ALERT "Goodbye, cruel world\n"); 
} 


module_init(hello_init); 
module_exit(hello_exit); 

В моем дереве устройство сгустка присутствует такая запись:

hello { 
    compatible = "dglnt,hello-1.00.a"; 
    reg = <0x41220000 0x10000>; 
}; 
+0

* «Если я использую module_init и module_exit все работает» * - Как выглядит этот код? Является ли это ядро ​​блоком дерева устройств? – sawdust

+0

Да, он использовал dtb, моя проблема в том, что ничего не печатается, когда я делаю insmod – Luca

+0

Я добавил исходный код – Luca

ответ

5

Если я использую module_init и module_exit все работы

Этот короткий «оригинальный» код состоит только из модульной структуры. Процедура init будет вызвана, когда модуль загружен, и процедура выхода вызывается перед разгрузкой. Этот «оригинальный» код не является драйвером.

Чем больше модуль ядра драйвер и получать загружен, но так как он имеет инициализации по умолчанию и выходной код, который ничего не делает (как порожденное расширением module_platform_driver() макро), нет никаких сообщений. Код драйвера в загружаемом модуле не может быть вызван, когда ядро ​​использует дерево устройств.

Почему этот модуль ядра ничего не делает, когда я его загружаю?

Функция пробника драйвера (которая выводит сообщения), вероятно, не будет вызвана, потому что в вашем дереве устройств ничего нет, что указывает на необходимость использования этого драйвера устройства.

Фрагмент устройства платы Дерево имеет

compatible = "dglnt,hello-1.00.a"; 

но водитель заявляет, что он должен определен как

#define DEVICE_NAME "hello-1.00.a" 
... 
    {.compatible = DEVICE_NAME}, 

Эти строки должны совпадать с тем, что водитель может связываться с этим указанного устройства в узел дерева устройств.

Кроме того, узел устройства должны быть объявлены как

status = "okay"; 

переопределить статус любого по умолчанию, который может отключить устройство.

Правильно сконфигурированный узел в дереве устройств должен получить функцию зондирования драйвера, как ожидается.

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