本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注
基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-PING協(xié)議詳解 (qq.com)
一. 前言
這里先介紹下PING協(xié)議的背景和原理,我們不一上來(lái)就介紹PING包格式和協(xié)議,因?yàn)橹挥兄淙恢渌匀徊拍芗由罾斫?,任何事?wù)都是有其出現(xiàn)的歷史背景的,不會(huì)憑空而生,所以理解背后產(chǎn)生的背景和原理很重要。
全/低速的批量/控制傳輸OUT事務(wù),如果設(shè)備沒(méi)有就緒,則可以NAK表示端點(diǎn)不接受數(shù)據(jù),主機(jī)可以稍后重發(fā)。以上過(guò)程存在一個(gè)問(wèn)題,就是OUT數(shù)據(jù)之后設(shè)備NAK,OUT數(shù)據(jù)這部分時(shí)間會(huì)占用總線,如果設(shè)備一直未就緒一直NAK,主機(jī)一直重發(fā)將會(huì)大量占用總線。
高速設(shè)備旨在提高傳輸帶寬,所以對(duì)這種帶寬的浪費(fèi)是不能容忍的,必須優(yōu)化。
優(yōu)化的思想其實(shí)很樸素,既然重發(fā)浪費(fèi)帶寬,那么就先“問(wèn)一下”,先“問(wèn)一下”設(shè)備準(zhǔn)備好了沒(méi),只有收到設(shè)備回復(fù)準(zhǔn)備好了再發(fā)數(shù)據(jù),這樣“問(wèn)一下”這句話很短占用帶寬不多,浪費(fèi)較少。這個(gè)問(wèn)一下就對(duì)應(yīng)的PING包。
只在高速設(shè)備才支持PING,且只有控制傳輸和批量傳輸支持,且都是針對(duì)OUT。
控制傳輸OUT(數(shù)據(jù)和狀態(tài)階段,SETUP階段不支持PING)
批量傳輸OUT的數(shù)據(jù)階段。
二.PING包格式
Ping包的ID為0100B,和令牌包格式一樣
如下是一個(gè)實(shí)例
三.PING協(xié)議過(guò)程和實(shí)例
Ping的響應(yīng)是硬件做的,因?yàn)樵O(shè)備需要接收主機(jī)連續(xù)的PING,如果軟件處理會(huì)來(lái)不及。
那么硬件怎么知道回主機(jī)的PING包回ACK還是NAK呢,這就是看軟件有沒(méi)有配置好DMA并設(shè)置CTL寄存器的EPena置位,如果軟件已經(jīng)配置好了則硬件回ACK,并自動(dòng)接收后面的OUT數(shù)據(jù),并通過(guò)DMA搬運(yùn)到用戶空間,反之則NAK。
過(guò)程如下:
1.主機(jī)OUT數(shù)據(jù),設(shè)備返回了NAK
2.主機(jī)收到NAK,知道設(shè)備沒(méi)就緒,于是發(fā)PING
3.設(shè)備收到PING之后如果還未就緒則NAK,否則則ACK
4.主機(jī)按照描述符中的bInterval時(shí)間間隔重新發(fā)PING,直到設(shè)備ACK,設(shè)備ACK后發(fā)數(shù)據(jù)。
5.設(shè)備收到主機(jī)OUT的數(shù)據(jù)如果還可以繼續(xù)接收后面的數(shù)據(jù)則ACK,否則則發(fā)NYET。注意雖然前面PING設(shè)備ACK了,這里設(shè)備還是有可能NAK。
- 主機(jī)如果收到設(shè)備的ACK則繼續(xù)發(fā)后面的數(shù)據(jù),如果收到NYET則表示本次OUT數(shù)據(jù)成功,但是設(shè)備不能接收后續(xù)數(shù)據(jù),發(fā)后面的數(shù)據(jù)前重復(fù)上面的PING過(guò)程,如果主機(jī)收到NAK則說(shuō)明本次數(shù)據(jù)設(shè)備沒(méi)有接收,需要重新PING然后重發(fā)本次數(shù)據(jù)。
總結(jié)一下就是對(duì)于OUT數(shù)據(jù)設(shè)備可能有三種響應(yīng)
ACK:本次接收了,還可以繼續(xù)接收后面的。
NYET:本次接收了,不能繼續(xù)接收。
NAK:本次未接收。
上述說(shuō)明的設(shè)備對(duì)PING ACK了,但是對(duì)后面的數(shù)據(jù)OUT又NAK了的情況,是不正常的現(xiàn)象,設(shè)備都告訴主機(jī)準(zhǔn)備好了,后面又沒(méi)有接收數(shù)據(jù)。
高速的批量/控制端點(diǎn)在其端點(diǎn)描述符中需要指定其最大NAK速率。每個(gè)bInterval 時(shí)間間隔內(nèi),端點(diǎn)最多允許NAK一次。如果端點(diǎn)的描述符bInterval為0則表示端點(diǎn)從不會(huì)NAK。
如果在數(shù)據(jù)階段之后發(fā)生超時(shí),主機(jī)必須返回到PING階段。轉(zhuǎn)回PING狀態(tài)不會(huì)影響事務(wù)數(shù)據(jù)階段的data toggle 狀態(tài)。
以下是一個(gè)實(shí)例過(guò)程
(1)主機(jī)OUT數(shù)據(jù),設(shè)備NAK了,表示設(shè)備不能接收
(2)主機(jī)看到設(shè)備NAK,不能接收,于是進(jìn)入PING狀態(tài)。注意上面主機(jī)不會(huì)一上來(lái)就PING,因?yàn)檫@個(gè)時(shí)候還不知道設(shè)備能不能接收,所以先不管三七二十一發(fā)一把再說(shuō),萬(wàn)一設(shè)備能接受呢。只有主機(jī)確認(rèn)設(shè)備不能接收,即設(shè)備NAK之后才會(huì)進(jìn)入PING狀態(tài)。
(3)設(shè)備一直NAK則主機(jī)一直P(pán)ING
(4)設(shè)備終于ACK了主機(jī)的PING,表示可以接收數(shù)據(jù)了。
這里的ACK是設(shè)備的硬件做的,所以在此之前設(shè)備的軟件配置好了DMA并置位了DOEP的CTL寄存器的EPena位。
(5)主機(jī)OUT數(shù)據(jù),設(shè)備也接受了,回了ACK,至此數(shù)據(jù)的OUT階段總算成功了。
第(5)步設(shè)備實(shí)際還有可能回NAK,表示未接收,回NYET表示本包接收但是不能接收下一包。
四. 總結(jié)
以上介紹了高速數(shù)據(jù)階段的PING協(xié)議,了解了過(guò)程和背景,對(duì)于驅(qū)動(dòng)開(kāi)發(fā)人員尤其要了解哪些是硬件做的,哪些是軟件做的,分別在什么階段什么時(shí)機(jī)做。
審核編輯:湯梓紅
-
usb
+關(guān)注
關(guān)注
60文章
8172瀏覽量
272267 -
編程
+關(guān)注
關(guān)注
88文章
3688瀏覽量
95124 -
Ping
+關(guān)注
關(guān)注
0文章
69瀏覽量
16413 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5650瀏覽量
104076 -
代碼
+關(guān)注
關(guān)注
30文章
4896瀏覽量
70565 -
單板計(jì)算機(jī)
+關(guān)注
關(guān)注
0文章
84瀏覽量
15965 -
編譯
+關(guān)注
關(guān)注
0文章
677瀏覽量
33928 -
驅(qū)動(dòng)開(kāi)發(fā)
+關(guān)注
關(guān)注
0文章
133瀏覽量
12300 -
DWC2
+關(guān)注
關(guān)注
0文章
35瀏覽量
250
發(fā)布評(píng)論請(qǐng)先 登錄
基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-0x01開(kāi)篇介紹與新思DWC2 USB2.0控制器簡(jiǎn)介

基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-0x02 DWC2 USB2.0 IP功能特征介紹

基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-IAD描述符詳解

基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-USB復(fù)位詳解

基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-USB連接詳解

基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-高速設(shè)備枚舉為全速設(shè)備問(wèn)題案例分析

基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-UVC的處理單元詳解

基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-設(shè)備類驅(qū)動(dòng)框架

基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-發(fā)送相關(guān)的寄存器DMA寄存器詳解

基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-USB包詳解

基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-數(shù)據(jù)不能發(fā)送問(wèn)題分析案例

新思 DWC2 的參考手冊(cè)從哪里可以下載
RK3399平臺(tái)上USB控制器和PHY的連接方式和配置說(shuō)明
如何對(duì)基于hal庫(kù)的DWC2 USB IP進(jìn)行調(diào)試呢
基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-抽絲剝繭再論切換到狀態(tài)階段標(biāo)志DOEPINTn.StsPhseRcvd

評(píng)論