我正在嘗試將網路攝影機複合小工具從核心 2.6.37 移植到 2.6.32。我對此沒有選擇,因為我依賴其他驅動程式和僅針對此版本進行編譯的 SDK。
我的想法是模仿乙太網路小工具的功能,進行一些細微的更改,並使其快速工作,至少正確加載,然後花時間研究視訊串流功能。
我很快就遇到了磚牆,因為我的新驅動程式無法 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 中,它告訴我它被映射到某個地方,我只是無法到達那個地方!