Estou tentando portar o gadget composto de webcam do kernel 2.6.37 para 2.6.32. Não tenho escolha, pois dependo de outros drivers e de um SDK que só compila para esta versão.
Minha linha de pensamento era imitar a funcionalidade do gadget Ethernet com algumas pequenas alterações e fazê-lo funcionar rapidamente, pelo menos carregando corretamente, e então gastar tempo trabalhando nos recursos de streaming de vídeo.
Encontrei uma parede de tijolos muito rápido, porque meu novo driver não pode ser insmod, porque -1 Dispositivo de recurso ocupado.
Tentei me aprofundar no printk e descobrir o que estava acontecendo.
A inicialização principal parece ser a seguinte
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);
}
A página do manual usb_gadget_register_driver mostra isso
Chame isso na função de inicialização do módulo do driver do gadget, para informar o driver do controlador USB subjacente sobre o seu driver. A função bind do driver será chamada para vinculá-lo a um gadget antes que essa chamada de registro retorne. Espera-se que as funções de ligação estejam nas seções init. Esta função deve ser chamada em um contexto que possa dormir.
Eu esperaria que usb_gadget_register_driver fosse mapeado para composite_bind de webcam_bind, ambos definidos. Infelizmente, os printks em qualquer uma das funções nunca aparecem no dmesg, então presumo que estou faltando alguma coisa aqui.
usb_gadget_register_driver
aparece em g_webcam.mod.c, o que me diz que está mapeado em algum lugar, simplesmente não consigo chegar onde fica esse lugar!