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