USB设备被识别流程【转】
轉(zhuǎn)自:http://blog.csdn.net/myarrow/article/details/8286876
USB模塊包括usb core,host,hub,device驅(qū)動,其中hub會啟動一個內(nèi)核線程名曰:khubd(hub_events一直在查詢(hub使用的是中斷傳輸), 當(dāng)usb 設(shè)備連接在 hub 的某個端口上,hub檢測到有設(shè)備連接了進(jìn)來,hub會去調(diào)用hub_port_status函數(shù)去獲取hub端口狀態(tài),要是真有設(shè)備了,會調(diào)用hub_port_connect_change函數(shù)會調(diào)用usb_alloc_dev函數(shù)為設(shè)備分配一個struct usb_device?結(jié)構(gòu)的對象并初始化,這個初始化將usb設(shè)備的狀態(tài)設(shè)置為?Attached,調(diào)用usb_set_device_state函數(shù)將設(shè)備的狀態(tài)設(shè)置成USB_STATE_POWERED上電狀態(tài),然后復(fù)位設(shè)備,復(fù)位成功后,設(shè)備就會進(jìn)入Default狀態(tài)(這個狀態(tài)可以接收hcd的回應(yīng)了);
??????? 然后設(shè)備又該進(jìn)入 Address狀態(tài),首先調(diào)用 hub_set_address設(shè)置address狀態(tài)需要發(fā)送usb_control_msg函數(shù)去設(shè)置,在usb_control_msg里面調(diào)用了usb_internal_control_msg函數(shù),這個函數(shù)主要的功能就是創(chuàng)建一個控制?urb,并把它發(fā)送給?usb?設(shè)備,然后等待它完成,這個過程包括了(usb_alloc_urb、usb_fill_control_urb、usb_start_wait_urb)這三個函數(shù)調(diào)用,完了以后,調(diào)用usb_hcd_submit_urb將urb發(fā)送到HCD,HCD 每收到urb,就會將它添加到這個 urb指定的urb_list中,形成鏈表,現(xiàn)在進(jìn)入了HCD模塊(略),處理完以后,會返回一個狀態(tài),最后usb_api_blocking_completion會去處理這次urb的收尾工作,如果成功的話設(shè)備就是正式進(jìn)入了address狀態(tài);
?????? 接下來設(shè)備要進(jìn)入configer狀態(tài),這個過程需要先獲取配置usb_get_device_descriptor->usb_get_descriptor先得到配置描述符中的wTotalLength字段,然后通過wTotalLength長度,獲取所以配置信息,然后將獲取的配置解析出來處理(此過程較為繁瑣),配置好以后調(diào)用usb_new_device說明發(fā)現(xiàn)了設(shè)備驅(qū)動;
??????? 然后tell the world(announce_device)說明設(shè)備已經(jīng)找到了,最后調(diào)用設(shè)備模型提供的接口device_add將設(shè)備添加到 usb 總線的設(shè)備列表里,然后 usb總線會遍歷驅(qū)動列表里的每個驅(qū)動,調(diào)用自己的 match(usb_device_match) 函數(shù)看它們和你的設(shè)備或接口是否匹配,匹配的話調(diào)用device_bind_driver函數(shù),現(xiàn)在就將控制權(quán)交到設(shè)備驅(qū)動了。
?? 函數(shù)調(diào)用流程如下所示:
usb_hub_init(kthread_run(hub_thread, NULL, "khubd"))->
? hub_thread->
??? hub_events->
?????? hub_port_connect_change->
???????? usb_new_device->
????????????? usb_enumerate_device(udev);?/* Read descriptors */
????????????? announce_device(udev); /* Tell the world! */
????????????? device_add
????????????? usb_create_ep_devs
本文轉(zhuǎn)自張昺華-sky博客園博客,原文鏈接:http://www.cnblogs.com/sky-heaven/p/5066503.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的USB设备被识别流程【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Rust 编程语言极简教程 --- 实例
- 下一篇: WCF后传系列(3):深入WCF寻址Pa