本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记
usb_init代表整个usb模块的初始化,在usb_init中:
static int __init usb_init(void)
{
……
//注册USB device driver,device driver对应的是整个设备,而不是某个接口
retval = usb_register_device_driver(&usb_generic_driver, THIS_MODULE);
}
usb_register_device_driver注册usb设备对应的driver,对应的函数如下:
int usb_register_device_driver(struct usb_device_driver *new_udriver, struct module *owner)
{
int retval = 0;
if (usb_disabled())
return -ENODEV;
new_udriver->drvwrap.for_devices = 1;
new_udriver->drvwrap.driver.name = (char *) new_udriver->name;
new_udriver->drvwrap.driver.bus = &usb_bus_type;
new_udriver->drvwrap.driver.probe = usb_probe_device;
new_udriver->drvwrap.driver.remove = usb_unbind_device;
new_udriver->drvwrap.driver.owner = owner;
retval = driver_register(&new_udriver->drvwrap.driver);
if (!retval) {
pr_info("%s: registered new device driver %s\n",
usbcore_name, new_udriver->name);
usbfs_update_special();
} else {
printk(KERN_ERR "%s: error %d registering device "
" driver %s\n",
usbcore_name, retval, new_udriver->name);
}
return retval;
}
new_udriver->drvwrap.for_devices = 1表示注册的driver是给usb设备用的。跟它比较容易混淆的是下面这个函数:
int usb_register_driver(struct usb_driver *new_driver, struct module *owner, const char *mod_name)
{
int retval = 0;
if (usb_disabled())
return -ENODEV;
new_driver->drvwrap.for_devices = 0;
new_driver->drvwrap.driver.name = (char *) new_driver->name;
new_driver->drvwrap.driver.bus = &usb_bus_type;
new_driver->drvwrap.driver.probe = usb_probe_interface;
new_driver->drvwrap.driver.remove = usb_unbind_interface;
new_driver->drvwrap.driver.owner = owner;
new_driver->drvwrap.driver.mod_name = mod_name;
spin_lock_init(&new_driver->dynids.lock);
INIT_LIST_HEAD(&new_driver->dynids.list);
retval = driver_register(&new_driver->drvwrap.driver);
if (!retval) {
pr_info("%s: registered new interface driver %s\n",
usbcore_name, new_driver->name);
usbfs_update_special();
usb_create_newid_file(new_driver);
} else {
printk(KERN_ERR "%s: error %d registering interface "
" driver %s\n",
usbcore_name, retval, new_driver->name);
}
return retval;
}
new_driver->drvwrap.for_devices = 0,这个driver是给usb接口设备使用的。
我们知道,一个usb设备可以有多个配置,一个配置有可以有多个接口,一个接口又包含多种设置,一个设置又有多个端点。所以这里既有usb设备,也有usb接口设备。
注册的usb_generic_driver定义如下:
struct usb_device_driver usb_generic_driver = {
.name = "usb",
.probe = generic_probe,
.disconnect = generic_disconnect,
#ifdef CONFIG_PM
.suspend = generic_suspend,
.resume = generic_resume,
#endif
.supports_autosuspend = 1,
};
文章参考:https://blog.csdn.net/fudan_abc/article/category/325189