Usb設備被識別流程

Usb模塊包括usb core,host,hub,device驅動,其中hub會啓動一個內核線程名曰:khubd(hub_events一直在查詢(hub使用的是中斷傳輸)), 當usb 設備連接在 hub 的某個端口上,hub檢測到有設備連接了進來,hub會去調用hub_port_status函數去獲取hub端口狀態,要是真有設備了,會調用hub_port_connect_change函數會調用usb_alloc_dev函數爲設備分配一個 struct usb_device 結構的對象並初始化,這個初始化將usb 設備的狀態設置爲 Attached,調用usb_set_device_state函數將設備的狀態設置成USB_STATE_POWERED上電狀態,然後復位設備,復位成功後,設備就會進入 Default狀態(這個狀態可以接收hcd的迴應了),然後設備又該進入 Address狀態,首先調用 hub_set_address設置address狀態需要發送usb_control_msg函數去設置,在usb_control_msg裏面調用了usb_internal_control_msg函數,這個函數主要的功能就是創建一個控制 urb,並把它發送給 usb 設備,然後等待它完成,這個過程包括了(usb_alloc_urb、usb_fill_control_urb、usb_start_wait_urb)這三個函數調用,完了以後,調用usb_hcd_submit_urb將urb發送到HCD,HCD 每收到urb,就會將它添加到這個 urb指定的urb_list中,形成鏈表,現在進入了HCD模塊(略),處理完以後,會返回一個狀態,最後數usb_api_blocking_completion會去處理這次urb的收尾工作,如果成功的話設備就是正式進入了address狀態,接下來設備要進入configer狀態,這個過程需要先獲取配置usb_get_device_descriptor->usb_get_descriptor先得到配置描述符中的wTotalLength字段,然後通過wTotalLength長度,獲取所以配置信息,然後將獲取的配置解析出來處理(此過程較爲繁瑣),配置好以後調用usb_new_device說明發現了設備驅動,然後tell the world(announce_device)說明設備已經找到了,最後調用設備模型提供的接口device_add將設備添加到 usb 總線的設備列表裏,然後 usb總線會遍歷驅動列表裏的每個驅動,調用自己的 match(usb_device_match) 函數看它們和你的設備或接口是否匹配,匹配的話調用device_bind_driver函數,現在就將控制權交到設備驅動了。
發佈了8 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章