¿Cómo encontrar dónde se vincula driver.mod.c?

¿Cómo encontrar dónde se vincula driver.mod.c?

Estoy intentando portar el dispositivo compuesto de cámara web del kernel 2.6.37 al 2.6.32. No tengo opción al respecto ya que dependo de otros controladores y de un SDK que solo compila para esta versión.

Mi idea era imitar la funcionalidad del dispositivo Ethernet con algunos cambios menores y hacer que funcionara rápido, al menos cargarse correctamente, y luego dedicar tiempo a trabajar en las capacidades de transmisión de video.

Me encontré con una pared de ladrillos bastante rápido, porque mi nuevo controlador no puede ser insmod, porque -1 Dispositivo de recurso ocupado.

Intenté profundizar más con printk y descubrir qué estaba pasando.

La inicialización principal parece ser la siguiente

module_init(webcam_init)
webcam_init()
usb_composite_register(&webcam_driver)
usb_gadget_register_driver(&composite_driver)

Esas funciones se definen de la siguiente manera:

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);
}

La página de manual de usb_gadget_register_driver muestra esto

Llame a esto en la función de inicialización del módulo del controlador de su dispositivo para informarle al controlador del controlador USB subyacente sobre su controlador. Se llamará a la función de vinculación del controlador para vincularlo a un dispositivo antes de que regrese esta llamada de registro. Se espera que las funciones de vinculación estén en las secciones de inicio. Esta función debe llamarse en un contexto que pueda dormir.

Esperaría que usb_gadget_register_driver se asigne a composite_bind o webcam_bind, los cuales están definidos. Lamentablemente, los printks en cualquiera de las funciones nunca aparecen en dmesg, por lo que supongo que me falta algo aquí.

usb_gadget_register_driveraparece en g_webcam.mod.c, lo que me dice que está mapeado en algún lugar, ¡simplemente no puedo llegar a dónde está ese lugar!

información relacionada