[RK3288][Android6.0] USB 枚举过程小结

Platform: ROCKCHIP
OS: Android 6.0
Kernel: 3.10.92

前面小结了U盘枚举成功后驱动加载流程,这里对U盘插入后枚举过程做小结.

先看hub初始化:
usb_hub_init ->    hub.c
    usb_register    //注册到usb core中.
    kthread_run(hub_thread, NULL, "khubd");    //创建"khubd"线程
        hub_thread ->
            hub_events    //while循环,第一次进来后hub event list是空,马上退出然后进入休眠.
            wait_event_freezable(khubd_wait, ....)    //休眠等待hub事件(检测到有usb插入)

另一方面,host controller里有个定时器,会定期检查有没有设备插入:
rh_timer_func ->    hcd.c
    usb_hcd_poll_rh_status ->
        usb_hcd_giveback_urb ->
            urb->complete(urb)    //complete在hub初始化的时候usb_fill_int_urb()被赋值,对应的是hub_irq().
                hub_irq ->
                    kick_khubd ->
                        wake_up(&khubd_wait)
                        
这时khubd线程被唤醒:
hub_thread ->    hub.c
    hub_events ->
        hub_port_status    //获取状态,这时是USB_PORT_STAT_C_CONNECTION.
        hub_port_connect_change ->
            set_port_led    //设置led显示方式
            hub_port_debounce_be_stable    //debounce确认
            usb_alloc_dev    
            usb_set_device_state
            choose_devnum
            hub_port_init ->
                hub_port_reset    
                hub_set_address
                usb_get_device_descriptor
            usb_new_device ->
                usb_enumerate_device    //读取描述符
                device_add    //添加设备,匹配对应的驱动

假设这里是U盘插入的话对应的driver就是mass storage驱动了,也就是会调用storage_probe().
后面的流程之前有分析过了,可参考:
http://blog.csdn.net/kris_fei/article/details/52933309


参考:
http://blog.csdn.net/MyArrow/article/category/1320589

你可能感兴趣的:(子类__USB)