Не удается получить сообщение ядра из модуля

Я пробую драйвер для пользовательского аппаратного компонента, исходный код можно найти здесь:

https://github.com/godspeed1989/zedboard/blob/master/led_drv/driver/myled.c

проблема в том, что когда я делаю:

insmod myled.ko

ничего не отображается в консоли или в журнале dmesg. Я читаю Linux Device Driver 3, и на нем написано, что вы всегда должны делать:

module_init(init_function);
module_exit(exit_function);

в исходнике их нет, вместо них есть:

module_platform_driver(myled_driver);

Но когда я загружаю модуль с помощью этой функции, ничего не печатается, вместо этого, если я использую сообщения module_init и module_exit, в чем разница между этими двумя типами инструкций?


person Luca    schedule 07.11.2014    source источник
comment
Взгляните на kernel.org/doc/Documentation/driver-model/ platform.txt и stackoverflow.com/questions/22722520/ Также может быть файл платы, в котором ресурсы перечислены по имени. В этом случае параметр .name важен, так как он будет использоваться для привязки ресурсов.   -  person Peter L.    schedule 07.11.2014
comment
Последний оператор (или макрос) может заменить первые два: см. lxr.free-electrons.com/source/include/linux/platform_device.h#L214.   -  person sawdust    schedule 07.11.2014
comment
хорошо, но почему последнее утверждение не работает, а первое - нормально?   -  person Luca    schedule 07.11.2014
comment
Попробуйте удалить атрибуты __devinit и __devexit_p (раздел). Или используйте их согласованным образом как в объявлениях процедур, так и в структуре platform_driver. Игнорируете ли вы какие-либо ошибки компоновщика несоответствия разделов?   -  person sawdust    schedule 07.11.2014


Ответы (1)


"но почему последний оператор не работает, а первый - нормально?" Первый метод зарегистрирует драйвер в системе и на шине с помощью макроса module_platform_driver. Последний оператор не зарегистрирует ваш драйвер в системе и на шине. Для этого вам необходимо зарегистрировать драйвер в подпрограмме init_function(), вызвав platform_device_register().

person Hunter    schedule 09.11.2014
comment
Как вы можете утверждать, что делает первый метод, если вы не знаете, какие аргументы используются для module_init() и module_exit()? по ОП? - person sawdust; 10.11.2014
comment
Обратитесь к ссылке, которую вы представили: lxr.free- electronics.com/source/include/linux/. Макрос module_platform_driver() вызовет platform_driver_register(). - person Hunter; 13.11.2014
comment
Вы, кажется, не понимаете, что такое первый метод, на который ссылаемся OP и я, а именно module_init(init_function); module_exit(exit_function);. module_platform_driver() назывался вторым методом. В любом случае, ваше предположение неверно, и ОП решил проблему. - person sawdust; 13.11.2014
comment
Я неправильно понял комментарий ОП, но почему последнее утверждение не работает, а первое - нормально? так как после того, как ОП изменил способ регистрации модуля, его новый драйвер больше не работал. Кажется, он все же задал исходный вопрос, почему в его старом виде нет отладочного сообщения. - person Hunter; 14.11.2014