Я пытаюсь перенести составной гаджет веб-камеры с ядра 2.6.37 на 2.6.32. У меня нет выбора, так как я завишу от других драйверов и SDK, которые компилируются только для этой версии.
Моя идея была в том, чтобы имитировать функциональность гаджета Ethernet с некоторыми небольшими изменениями и заставить его работать быстро, по крайней мере, правильно загружаться, а затем потратить время на работу над возможностями потоковой передачи видео.
Я довольно быстро упёрся в стену, потому что мой новый драйвер не может быть insmod, потому что -1 Устройство ресурса занято.
Я попытался глубже разобраться с printk и выяснить, что происходит.
Основная инициализация выглядит следующим образом:
module_init(webcam_init)
webcam_init()
usb_composite_register(&webcam_driver)
usb_gadget_register_driver(&composite_driver)
Эти функции определяются следующим образом:
static struct usb_composite_driver webcam_driver = {
.name = "g_webcam",
.dev = &webcam_device_descriptor,
.strings = webcam_device_strings,
.bind = webcam_bind,
.unbind = webcam_unbind,
};
static int __init
webcam_init(void)
{
return usb_composite_register(&webcam_driver);
}
int __init usb_composite_register(struct usb_composite_driver *driver)
{
if (!driver || !driver->dev || !driver->bind || composite)
return -EINVAL;
if (!driver->name)
driver->name = "composite";
composite_driver.function = (char *) driver->name;
composite_driver.driver.name = driver->name;
composite = driver;
return usb_gadget_register_driver(&composite_driver);
}
Страница руководства usb_gadget_register_driver показывает это
Вызовите это в функции инициализации модуля драйвера гаджета, чтобы сообщить базовому драйверу контроллера USB о вашем драйвере. Функция привязки драйвера будет вызвана для привязки его к гаджету до возврата этого вызова регистрации. Ожидается, что функции привязки будут находиться в разделах init. Эта функция должна вызываться в контексте, который может спать.
Я бы ожидал, что usb_gadget_register_driver будет сопоставлен либо с composite_bind, либо с webcam_bind, оба из которых определены. К сожалению, printks в любой из функций никогда не отображаются в dmesg, поэтому я предполагаю, что я что-то упускаю.
usb_gadget_register_driver
отображается в g_webcam.mod.c, который сообщает мне, что он где-то отображен, но я просто не могу понять, где это место!