標(biāo)題: USB開(kāi)發(fā)中的幾個(gè)問(wèn)題學(xué)習(xí)與總結(jié) [打印本頁(yè)]

作者: 15546636181    時(shí)間: 2018-9-10 11:40
標(biāo)題: USB開(kāi)發(fā)中的幾個(gè)問(wèn)題學(xué)習(xí)與總結(jié)
最初買(mǎi)了北通25塊錢(qián)的小手柄,然后通過(guò)USBVIEW軟件觀察到了如下信息:

這些信息是當(dāng)手柄插入電腦USB時(shí),主機(jī)請(qǐng)求手柄發(fā)送它的各方面信息,手柄回傳給電腦的。
對(duì)于一個(gè)可編程的USB設(shè)備,我們將這些信息封裝到一個(gè)數(shù)據(jù)機(jī)構(gòu)中,當(dāng)電腦詢問(wèn)時(shí),我們回傳給電腦,電腦有了這些信息之后我們就可以和電腦進(jìn)行通信了。(參見(jiàn)本文件下的《USB的八個(gè)問(wèn)題和答案》中第八個(gè)問(wèn)題)


USB基礎(chǔ)到完整驅(qū)動(dòng)開(kāi)發(fā)...
1 USB標(biāo)準(zhǔn)
在新的USB2.0標(biāo)準(zhǔn)中,USB1.1的說(shuō)法已經(jīng)不復(fù)存在了,都被統(tǒng)稱為USB2.0,在它下面又細(xì)分三種規(guī)格:Low-speedFull-speed,High-speed 。乍一看這三種接口都是USB2.0但他們的傳輸速率相差甚遠(yuǎn),USB2.0 Low-speed主要用于鍵盤(pán),鼠標(biāo)等設(shè)備,它的傳輸速率只有1.5Mbps;USB2.0 Full-speed就是曾經(jīng)的 USB1.0,他的傳輸速率理論上可以達(dá)到12Mbps,適用于一些對(duì)數(shù)據(jù)傳輸要求不高的設(shè)備的接口; USB2.0 High-speed 才是真正意義上的USB2.0,他的傳輸速率理論上可達(dá)到480Mbps。
2. USB中斷傳輸?shù)木视懻?/font>
Escape
呵呵。大家好! ;)
我想請(qǐng)教一個(gè)問(wèn)題:

usb中斷傳輸,調(diào)用函數(shù)UsbBuildGetInterrupt orBulkTransferRequest

后,數(shù)據(jù)是怎樣通過(guò)底層軟件的輪詢,被傳輸?shù)骄彌_區(qū)的。
是不是上層驅(qū)動(dòng)程序完全不需要關(guān)心這個(gè)輪詢的過(guò)程?
輪詢過(guò)程已經(jīng)被完全封裝了?
Jinghuiren
  對(duì)的,當(dāng)你調(diào)用了IoCallDriver()后,底層驅(qū)動(dòng)會(huì)按照你設(shè)置的輪詢間隔(比如1ms),向設(shè)備發(fā)送in或者out令牌,直到本次調(diào)用的數(shù)據(jù)全部完成(比如64k)后返回操作方式和批量傳輸完全一樣。
  
Pengenwen
在中斷傳輸中,驅(qū)動(dòng)一般需要維持一個(gè)永不完成的URB,以便驅(qū)動(dòng)不斷地從固件查詢數(shù)據(jù),然后通過(guò)事件方式通知應(yīng)用程序。
Windrv
pengenwen 說(shuō)的不對(duì)。
USB是共享總線,如果在USB HUB上有多個(gè)設(shè)備同時(shí)進(jìn)行大數(shù)據(jù)量傳輸。例如設(shè)備A在傳輸4MB的數(shù)據(jù),那么設(shè)備B在設(shè)備A數(shù)據(jù)傳輸期間有可能得不到響應(yīng)。如何保證設(shè)備B在其它設(shè)備傳輸數(shù)據(jù)時(shí)也能及時(shí)得到響應(yīng)?設(shè)備B可以設(shè)立中斷傳輸端口,這樣Host Controller會(huì)每隔一定的時(shí)間間隔(例如1ms),保證向設(shè)備B發(fā)出IN令牌,使得B有機(jī)會(huì)發(fā)出數(shù)據(jù)。

所以中斷傳輸?shù)臄?shù)據(jù)量不能太大,在USB1.1中最多只能16bytes.

USB 2.0的協(xié)議作了一些修改,中斷傳輸與Bulk傳輸?shù)膮^(qū)別不大,數(shù)據(jù)量的限制也沒(méi)有了。不過(guò),中斷傳輸?shù)纳鲜鰴C(jī)制還是在的。
如果USBhost controller總是被一個(gè)設(shè)備獨(dú)占,那也就沒(méi)有中斷傳輸與Bulk傳輸?shù)膮^(qū)別了。
至于pengenwen說(shuō)的是USB設(shè)備驅(qū)動(dòng)程序上的實(shí)現(xiàn)技術(shù),與中斷傳輸?shù)奶攸c(diǎn)無(wú)關(guān)。事實(shí)上,這個(gè)永不完成的URB”也可以用來(lái)讀Bulk傳輸。
Lejianz
請(qǐng)教windrv一個(gè)問(wèn)題,在固件編程時(shí),USB通信一般通過(guò)外部中斷來(lái)實(shí)現(xiàn),如果我在做某些工作時(shí),不能及時(shí)響應(yīng)此中斷,那么不響應(yīng)這個(gè)中斷的時(shí)間有多長(zhǎng)?我知道總線如果在3ms里沒(méi)響應(yīng),將會(huì)掛起,這段時(shí)間是否跟中斷傳輸有關(guān)?
Jinghuiren
對(duì)于控制傳輸,通常沒(méi)有數(shù)據(jù)階段傳輸?shù)囊?/font>50ms內(nèi)完成,如果有數(shù)據(jù)階段則第一個(gè)數(shù)據(jù)包要在500ms內(nèi)發(fā)送給主機(jī),之后的一次增加500ms
對(duì)于批量傳輸,如果驅(qū)動(dòng)程序沒(méi)有超時(shí)控制,則什么時(shí)候響應(yīng)都行
如果有則要在超時(shí)控制的時(shí)間范圍內(nèi)完成
對(duì)于中斷傳輸,和批量傳輸基本一樣
對(duì)于ISO傳輸,應(yīng)該是立即響應(yīng)吧,要不然怎么能保證同步數(shù)據(jù)流呢?
Escape
對(duì)于控制傳輸,通常沒(méi)有數(shù)據(jù)階段傳輸?shù)囊?/font>50ms內(nèi)完成,如果有數(shù)據(jù)階段則第一個(gè)數(shù)據(jù)包要在500ms內(nèi)發(fā)送給主機(jī),之后的一次增加500ms
對(duì)于批量傳輸,如果驅(qū)動(dòng)程序沒(méi)有超時(shí)控制,則什么時(shí)候響應(yīng)都行
如果有則要在超時(shí)控制的時(shí)間范圍內(nèi)完成
對(duì)于中斷傳輸,和批量傳輸基本一樣
對(duì)于ISO傳輸,應(yīng)該是立即響應(yīng)吧,要不然怎么能保證同步數(shù)據(jù)流呢?
有道理。
iso傳輸在競(jìng)爭(zhēng)帶寬的時(shí)候,容易獲得成功。iso傳輸
最大可獲取90%的可用帶寬。在這種情況下,需要iso傳輸
的另外一個(gè)設(shè)備的傳輸請(qǐng)求有可能會(huì)失敗。
Windrv
USB是主從通訊模式,由Host controller控制何時(shí)與哪個(gè)設(shè)備的哪個(gè)端口通訊。當(dāng)它需要從某個(gè)EP讀入數(shù)據(jù)時(shí),它會(huì)發(fā)一個(gè)IN令牌給此端口。端口收到令牌后,必須在某一時(shí)間間隔內(nèi)把數(shù)據(jù)發(fā)給Host Controller然后返回一個(gè)"OK"令牌;如果端口在此時(shí)間內(nèi)無(wú)法返回?cái)?shù)據(jù),也必須返回一個(gè)NAK令牌,那么Host Controller下次會(huì)繼續(xù)發(fā)IN令牌給此端口。如果端口在此時(shí)間間隔內(nèi)沒(méi)有任何令牌返回,Host Controller會(huì)把這端口標(biāo)為STALL,下次不再查詢此端口。
對(duì)于lejianz所說(shuō)的問(wèn)題,我覺(jué)得firmware在做某些工作時(shí),在3ms內(nèi)沒(méi)有返回NAK token以響應(yīng)總線的IN token,所以被總線掛起,即STALL。 不過(guò),掛起了也還可以用ResetPipe()恢復(fù)此端口。
EZUSB做的比較好,它的USB core在數(shù)據(jù)沒(méi)有Ready的時(shí)候會(huì)自動(dòng)返回NAK令牌,不占CPU的資源。所以,在批量/中斷傳輸時(shí),什么時(shí)候響應(yīng)都行。
不過(guò),對(duì)于這類總線掛起的問(wèn)題,最好用總線分析儀去監(jiān)測(cè)一下。Host Controller的生產(chǎn)廠商不一樣,有時(shí)候是USB卡的問(wèn)題。
Lejianz
謝謝windrv大俠的精彩答復(fù),按大俠所說(shuō),如果EZUSB設(shè)備的一個(gè)IN令牌包傳輸過(guò)程中,SIE能自動(dòng)發(fā)也NAK,而不是STALL,那么我可以在很長(zhǎng)一段時(shí)間里不響應(yīng)此IN中斷,因?yàn)橛?/font>NAK說(shuō)明設(shè)備在忙。這也印證我在ICE仿真時(shí),當(dāng)在中斷里下斷點(diǎn)時(shí),設(shè)備管理器里的設(shè)備不會(huì)消失。但我想這段時(shí)間并不是jinghuiren大俠所說(shuō)的500ms時(shí)間,我一直沒(méi)有找到相關(guān)的敘述。windrv大俠能否再看一下。
Windrv
只要設(shè)備能回應(yīng)NAK, 讀數(shù)的URB等多長(zhǎng)時(shí)間都沒(méi)有問(wèn)題,通訊不會(huì)斷掉。在我們的應(yīng)用中,讀數(shù)的URB經(jīng)常會(huì)等好幾個(gè)小時(shí)。
不過(guò),你說(shuō)的設(shè)備在設(shè)備管理器里消失是另外一個(gè)問(wèn)題。即使EPSTALLUSB 的設(shè)備對(duì)象還是在Windows系統(tǒng)里的,不會(huì)消失。
Mboma
windrv,我覺(jué)得pengenwen說(shuō)的"在中斷傳輸中,驅(qū)動(dòng)一般需要維持一個(gè)永不完成的URB,以便驅(qū)動(dòng)不斷地從固件查詢數(shù)據(jù),然后通過(guò)事件方式通知應(yīng)用程序"沒(méi)有什么不對(duì)的啊,通常在usb驅(qū)動(dòng)中處理中斷傳輸都可以用這種實(shí)現(xiàn)方式的啊。我覺(jué)得他說(shuō)的東西跟你說(shuō)的不是一個(gè)側(cè)重點(diǎn)。在Oney的書(shū)中也是用的這種方式。
想請(qǐng)教您一個(gè)問(wèn)題,中斷傳輸只能獲取in的數(shù)據(jù)么?如果我有hostusb設(shè)備發(fā)出的用戶數(shù)據(jù),但是usb設(shè)備只有一個(gè)控制端點(diǎn)和2個(gè)interrupt端點(diǎn),能否實(shí)現(xiàn)out數(shù)據(jù)?謝謝!
Metalwing
WINDRV又見(jiàn)你了,想問(wèn)你個(gè)問(wèn)題.
我的板子在20MHZ(DMA讀寫(xiě))頻率下很正常,可是我把頻率提到40MHZ就不行了,無(wú)法接到總線上DMA數(shù)據(jù)傳輸?shù)降闹袛?/font>,也無(wú)法接到DMA傳輸完成的中斷(DMA一直在傳輸),我用的是ISP 1581芯片.是否是51的處理頻率(12MHZ,一個(gè)工作周期是1微秒)跟不上?



全部資料51hei下載地址:
USB開(kāi)發(fā)中的幾個(gè)問(wèn)題.rar (1.07 MB, 下載次數(shù): 14)



作者: xikree    時(shí)間: 2020-5-26 19:59
資料很不錯(cuò)!正在搞USB,使用的是ST的芯片,但是發(fā)現(xiàn)device->host 控制傳輸大于32字節(jié)的數(shù)據(jù)就收不到了,或者說(shuō)發(fā)不出去了。不知道什么原因,bushound抓包什么都抓不到。
作者: ioriysu    時(shí)間: 2020-5-27 07:24
這個(gè)資料很不錯(cuò),學(xué)習(xí)了。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1