Estou tentando portar o dispositivo composto de webcam do kernel 2.6.37 para 2.6.32. Eu não tenho escolha sobre isso, pois dependo de outros drivers e um SDK que só compila para esta versão.
Minha linha de pensamento foi imitar a funcionalidade da miniaplicação ethernet com algumas pequenas alterações e fazê-la funcionar rapidamente, pelo menos carregando de forma adequada, e depois gastar tempo trabalhando nas capacidades de transmissão de vídeo.
Eu corri em uma parede de tijolos muito rápido, porque o meu novo driver não pode ser insmod, porque -1 Device of resource busy.
Eu tentei me aprofundar mais com o printk e descobrir o que estava acontecendo.
Inicialização principal parece ir como segue
module_init(webcam_init)
webcam_init()
usb_composite_register(&webcam_driver)
usb_gadget_register_driver(&composite_driver)
Essas funções são definidas da seguinte forma:
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);
}
página man usb_gadget_register_driver mostra isso
Call this in your gadget driver's module initialization function, to tell the underlying usb controller driver about your driver. The driver's bind function will be called to bind it to a gadget before this registration call returns. It's expected that the bind functions will be in init sections. This function must be called in a context that can sleep.
Eu esperaria que usb_gadget_register_driver fosse mapeado para composite_bind de webcam_bind, ambos definidos. Infelizmente printks em qualquer função nunca aparecem no dmesg, então eu diria que estou perdendo alguma coisa aqui.
usb_gadget_register_driver
aparece em g_webcam.mod.c, o que me diz que está mapeado em algum lugar, não consigo chegar aonde o lugar está!