1. usb设备驱动注册流程图
......
2. usb设备驱动注册
usb_register_device_driver(&usb_generic_driver, THIS_MODULE);
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,
};
在usb主机控制器ehci、ohci检测到设备接入时都会调用这个通用的usb设备驱动,它的目的纯粹是作为设备接入时的一个接口,真正操作时usb_choose_configuration()、usb_set_configuration(),关于generic_probe()通用设备探测函数等会在分析,先来看下usb通用设备驱动时如何注册的。
int usb_register_device_driver(struct usb_device_driver *new_udriver,
struct module *owner)
{
int retval = 0;
if (usb_disabled())
return -ENODEV;
//初始化一个usb驱动包
new_udriver->drvwrap.for_devices = 1; //表示是设备,非驱动
new_udriver->drvwrap.driver.name = (char *) new_udriver->name; //初始化驱动名为“usb”
new_udriver->drvwrap.driver.bus = &usb_bus_type; //绑定驱动的总线为“usb”
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);
else
printk(KERN_ERR "%s: error %d registering device "
" driver %s\n",
usbcore_name, retval, new_udriver->name);
return retval;
}
driver_register(&new_udriver->drvwrap.driver)注册一个设备驱动在hub驱动注册时分析过,这里不再赘述,主要目地是完成usb设备驱动到usb总线上的注册,同时创建相应的设备模型kobject,详见:点击打开链接 3.hub驱动注册小节。
由于这里时内核刚起来时创建的设备驱动,这个时候在usb总线上还没有设备,所以在分析generic_probe()前,必须要了解usb主机控制器ehci、ohci是如何完成注册的、如何创建根root-hub,所以这里我们假设usb主机控制器驱动完成注册(关于usb主机控制器注册,详见:点击打开链接),并且这个时候有设备接入到usb主机控制器()上
3. generic_probe()
备注,在分析该generic_probe()探测函数前,先要看下usb主机控制器驱动的注册流程,否则无法分析generic_probe()内部的工作原理,原因是只有usb主机控制器注册了,然后有usb设备接入到主机控制器上时,主机控制器检测到设备接入,通知hub_thread完成枚举、创建挂接在usb总线上的设备,然后该设备通过usb总线寻找到名称相同的驱动,调用usb_probe_device()-->generic_probe()完成接入usb设备接口的初始化....