天天看點

[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

繼續閱讀