日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

USB设备被识别流程【转】

發(fā)布時間:2024/4/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 USB设备被识别流程【转】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。