我正在尝试将网络摄像头复合小工具从内核 2.6.37 移植到 2.6.32。我对此没有选择,因为我依赖于其他驱动程序和仅针对此版本进行编译的 SDK。
我的思路是模仿以太网小工具的功能,进行一些细微的更改,并使其快速工作,至少正确加载,然后花时间研究视频流功能。
我很快就遇到了麻烦,因为我的新驱动程序无法被修改,因为 -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 中,它告诉我它被映射到某个地方,我只是无法到达那个地方!