一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-抽絲剝繭再論SETUP完成標(biāo)志DOEPINTn.SetUp

嵌入式USB開(kāi)發(fā) ? 來(lái)源:嵌入式USB開(kāi)發(fā) ? 作者:嵌入式USB開(kāi)發(fā) ? 2023-07-24 15:57 ? 次閱讀

本文轉(zhuǎn)自公眾號(hào)系列文章,歡迎關(guān)注
基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-USB包詳解 (qq.com)

前言

http://www.www27dydycom.cn/outside?redirect=https://mp.weixin.qq.com/s/gm5OAutfnYv6H_5Ce8GEqA一文中我們介紹了控制傳輸,中斷相關(guān)寄存器,尤其是DOEPINTn.XferCompl,DOEPINTn.SetUp,DOEPINTn.StsPhseRcvd幾個(gè)狀態(tài)的組合非常重要,因?yàn)橛伤麄兛梢源_定當(dāng)前控制傳輸處于什么階段。前文我們對(duì)此進(jìn)行了介紹,但是個(gè)人覺(jué)得講的還不夠透徹,原理還沒(méi)有講清楚,知其然知其所以然是我們一開(kāi)始就強(qiáng)調(diào)的,所以針對(duì)這個(gè)幾個(gè)標(biāo)志位我們?cè)俅胃敿?xì)的介紹,先來(lái)介紹最關(guān)鍵的DOEPINTn.SetUp。

DOEPINTn.SetUp

Setup是DOEPINTn寄存器中的一個(gè)標(biāo)志,用于表示Setup階段是否完成。

我們這里可能要問(wèn)DIEPINTn為什么沒(méi)有SetUp標(biāo)志,因?yàn)镾etup總是HOST->DEV的,所以總是OUT傳輸,所以總是對(duì)應(yīng)OUT端點(diǎn)的,IN端點(diǎn)的寄存器不可能有。這里強(qiáng)調(diào)一下我們一定要多問(wèn)為什么,先思考猜測(cè),然后再?gòu)氖謨?cè)規(guī)格書中查找答案,只有這樣才能加深理解,USB開(kāi)發(fā)中這是很重要的,當(dāng)然任何技術(shù)性的工作這一點(diǎn)都重要。

我們從寄存器的描述中也可以看到,該位表示SetUP階段完成,并且只有控制OUT端點(diǎn)有。

還有個(gè)信息是本次控制傳輸沒(méi)有連續(xù)的SETUP,意味著軟件可以開(kāi)始解析SETUP的8字節(jié)的內(nèi)容以決定下一步要干嘛了。如果有連續(xù)的SETUP則是最后一個(gè)SETUP完成才能進(jìn)行。

那么究竟SETUP完成對(duì)應(yīng)的一個(gè)什么狀態(tài)呢? 硬件是怎么知道SETUP階段完成的呢? 主機(jī)和設(shè)備判斷SETUP完成有什么區(qū)別嗎? 我們會(huì)拋出一連串問(wèn)題,如果能拋出這些問(wèn)題說(shuō)明你很適合做底層和驅(qū)動(dòng)開(kāi)發(fā)!

后面我們會(huì)抽絲剝繭,從原理到實(shí)踐,從猜測(cè)到手冊(cè)中求證,一層層剖析。

這里我們要回顧下控制傳輸,

我們從規(guī)格書中的拓?fù)鋱D可以看到,控制傳輸?shù)腟ETUP階段過(guò)程如下

或者換個(gè)表達(dá)方式如下

或者從USB分析儀抓包數(shù)據(jù)來(lái)看,更形象。

SETUP階段對(duì)應(yīng)3個(gè)包:SETUP令牌包;DATA0的數(shù)據(jù)包,始終是HOST->DEV;設(shè)備的響應(yīng)ACK。

這里順便提一下,SETUP的數(shù)據(jù)始終使用DATA0;而設(shè)備要么正常接收并接受ACK,要么接收錯(cuò)誤或者沒(méi)接收到不響應(yīng),只有這兩種情況,不能接收了不接受而NAK或者STALL等。

這里還順便提一下接收和接受的概念區(qū)別。接收通常指的物理層數(shù)據(jù)正確接收到了,而接受則指的軟件能夠處理,或者說(shuō)愿意處理。 接收了也可能不接受。

這里協(xié)議層面我們可以看到SETUP階段完成的標(biāo)志是,設(shè)備ACK響應(yīng)了。

如下所示

仔細(xì)思考下,這里只是協(xié)議上的定義,也就是對(duì)應(yīng)的總線上的數(shù)據(jù),至于SETUP完不完成是要由參與者HOST和DEV去確定的,換句話說(shuō)總線上的狀態(tài)并不意味參與者就是這個(gè)狀態(tài)了,因?yàn)閰⑴c者還要正確接收到總線上的數(shù)據(jù)才算。

對(duì)于主機(jī)接收到了設(shè)備發(fā)送的ACK那么主機(jī)認(rèn)為SETUP階段完成,如果設(shè)備發(fā)了ACK但是主機(jī)沒(méi)收到呢?那么主機(jī)認(rèn)為SETUP沒(méi)完成,會(huì)認(rèn)為本次失敗,從頭發(fā)SETUP包重來(lái)。

同樣的對(duì)于設(shè)備來(lái)說(shuō)將ACK發(fā)送到總線上去后,設(shè)備并不知道HOST接收沒(méi)接收到,設(shè)備并不知道主機(jī)的狀態(tài)。所以主機(jī)和設(shè)備對(duì)SETUP完成的狀態(tài)確認(rèn)存在不同步。

那怎么辦呢? 設(shè)備并不知道主機(jī)認(rèn)為SETUP完成了沒(méi)有,因?yàn)樵O(shè)備并不知道主機(jī)收沒(méi)收到ACK。就好比子非魚安知魚之樂(lè),有點(diǎn)繞了。

其實(shí)也沒(méi)什么辦法,設(shè)備確實(shí)現(xiàn)在不知道主機(jī)是不是認(rèn)為SETUP完成了,但是設(shè)備可以根據(jù)主機(jī)下一步的行動(dòng)來(lái)確定。因?yàn)橹鳈C(jī)如果接收到了ACK,認(rèn)為SETUP完成了那么主機(jī)下一步就會(huì)發(fā)IN或者OUT令牌進(jìn)入數(shù)據(jù)階段(或者狀態(tài)階段),否則則會(huì)重發(fā)SETUP重新進(jìn)入SETUP階段。

設(shè)備可以據(jù)此來(lái)進(jìn)行判斷,如果收到了主機(jī)的IN或者OUT令牌,則確認(rèn)主機(jī)認(rèn)為SETUP已經(jīng)完成了,于是設(shè)備也知道SETUP完成了,這里設(shè)備和主機(jī)判斷SETUP完成的時(shí)間點(diǎn)是不一樣的,這就是協(xié)議定義和實(shí)際判定存在的區(qū)別。所以對(duì)于協(xié)議設(shè)計(jì)一定要考慮這種區(qū)別,協(xié)議設(shè)計(jì)了要考慮如何實(shí)現(xiàn),也就一直強(qiáng)調(diào)的理論要結(jié)合實(shí)踐,對(duì)于驅(qū)動(dòng)編寫更需要考慮從這些細(xì)節(jié)。

以上恭喜你從頭開(kāi)始推導(dǎo)出了設(shè)備判斷SETUP完成的原理,那么回到上面的標(biāo)志位DOEPINTn.SetUp即表示SETUP階段完成,DWC2控制也是這么判斷的嗎?所謂英雄所見(jiàn)略同,DWC2控制器還真是這么判斷的。

上面寄存器的描述中只提了該標(biāo)志的含義,并沒(méi)提其具體置位的原理和時(shí)機(jī),實(shí)際編程指導(dǎo)手冊(cè)中是有說(shuō)明的。

如下位置,手冊(cè)就進(jìn)行了說(shuō)明當(dāng),SETUP令牌之后,接收到了IN或OUT令牌則置位DOEPINTn.SetU,和我們推導(dǎo)的完全一致。

為什么是IN或OUT呢,因?yàn)榭刂苽鬏斂赡苁强刂茖?,控制讀,還可能無(wú)數(shù)據(jù)階段的控制傳輸,所以后面要不就是IN數(shù)據(jù)或者OUT數(shù)據(jù)或者IN狀態(tài),如下所示

控制寫

控制讀

無(wú)數(shù)據(jù)階段的控制傳輸

驅(qū)動(dòng)編寫注意事項(xiàng)

從上面可以看到設(shè)備是延遲才能確認(rèn)SETUP完成的,也就是在SETUP后設(shè)備收到了主機(jī)發(fā)的IN和OUT之后才確認(rèn),中斷也是在此時(shí)產(chǎn)生。

對(duì)于控制寫,上面設(shè)備確認(rèn)SETUP完成產(chǎn)生中斷,中斷服務(wù)函數(shù)開(kāi)始去解析8字節(jié)的SETUP內(nèi)容,來(lái)確定數(shù)據(jù)階段要干嘛,后面數(shù)據(jù)階段是IN還是OUT或者還是沒(méi)有數(shù)據(jù)階段直接狀態(tài)階段,其實(shí)是數(shù)據(jù)階段(狀態(tài)階段)已經(jīng)啟動(dòng),設(shè)備延遲了。

此時(shí)中斷服務(wù)函數(shù)還未執(zhí)行,軟件還沒(méi)根據(jù)解析準(zhǔn)備IN或者OUT描述符,所以此時(shí)對(duì)于這個(gè)IN或者OUT,硬件只能自動(dòng)NAK,如下所描述:

所以這種情況下,中斷服務(wù)函數(shù)中進(jìn)行了解析,并知道要準(zhǔn)備OUT描述進(jìn)行接收時(shí),設(shè)置EPEna=1時(shí)還要同時(shí)設(shè)置CNAK=1,清除硬件的自動(dòng)NAK狀態(tài),讓硬件根據(jù)OUT描述符去接收數(shù)據(jù)。

對(duì)于控制讀后面是IN數(shù)據(jù)階段,或者無(wú)數(shù)據(jù)階段的控制傳輸后面是IN狀態(tài),也是類似的。

總結(jié)

以上對(duì)DOEPINTn.SetUp進(jìn)行了詳細(xì)的解析,因?yàn)樗匾?,SETUP階段是控制傳輸?shù)暮诵?,因?yàn)橹挥蠸ETUP完成才能去解析8字節(jié)的內(nèi)容,才能決定后續(xù)干嘛,對(duì)于驅(qū)動(dòng)編寫接收到8字節(jié)的SETUP數(shù)據(jù)是第一個(gè)關(guān)鍵步。以上也可以看出一定要從原理上去理解,這也是驅(qū)動(dòng)編寫的重要原則,必須知其然知其所以然,精確的知道各個(gè)時(shí)間點(diǎn)的各個(gè)時(shí)間,以及其條件等,注意精確兩個(gè)字。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5401

    瀏覽量

    122775
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    8066

    瀏覽量

    269644
  • 驅(qū)動(dòng)開(kāi)發(fā)

    關(guān)注

    0

    文章

    133

    瀏覽量

    12220
  • DWC2
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    210
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于DWC2USB驅(qū)動(dòng)開(kāi)發(fā)-0x01開(kāi)篇介紹與新思DWC2 USB2.0控制器簡(jiǎn)介

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開(kāi)發(fā)-0x01開(kāi)篇介紹與新思DWC2 USB2
    的頭像 發(fā)表于 05-08 18:10 ?5250次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-0x01開(kāi)篇介紹與新思<b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0控制器簡(jiǎn)介

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

    DWC2即新思(Synopsys )的DesignWare? Cores USB 2.0 HiSpeed On-The-Go (OTG)控制器IP,被大量使用。從linux的內(nèi)核源碼驅(qū)動(dòng)中就帶
    的頭像 發(fā)表于 05-09 10:09 ?1.1w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-0x02 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP功能特征介紹

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

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開(kāi)發(fā)-IAD描述符詳解 (qq.com) 一.? 前言 IAD描述符用于一個(gè)設(shè)備功能關(guān)聯(lián)多個(gè)接口,可以用于實(shí)現(xiàn)組合設(shè)備。 二.參考文檔
    的頭像 發(fā)表于 06-27 08:45 ?41w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-IAD描述符詳解

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

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開(kāi)發(fā)-USB復(fù)位詳解 (qq.com) 一.前言 ? ? ? ? ?上一篇我們?cè)敿?xì)介紹了
    的頭像 發(fā)表于 07-07 11:18 ?9.7w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-<b class='flag-5'>USB</b>復(fù)位詳解

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

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開(kāi)發(fā)-USB連接詳解 (qq.com) 一.前言 ? 之前一直在閱讀手冊(cè),規(guī)格書,練習(xí)招式
    的頭像 發(fā)表于 07-07 08:46 ?4228次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-<b class='flag-5'>USB</b>連接詳解

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

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開(kāi)發(fā)-高速設(shè)備枚舉為全速設(shè)備問(wèn)題案例分析 (qq.com) 一.前言 ? 本文分享一個(gè)高速設(shè)備被枚舉為全速的問(wèn)題。 ? ? 高速設(shè)備速
    的頭像 發(fā)表于 07-10 17:12 ?1723次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-高速設(shè)備枚舉為全速設(shè)備問(wèn)題案例分析

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

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開(kāi)發(fā)-設(shè)備類驅(qū)動(dòng)框架 (qq.com) 一.前言 從軟件頂層,從數(shù)據(jù)流的角度來(lái)看
    的頭像 發(fā)表于 07-16 15:56 ?1598次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-設(shè)備類<b class='flag-5'>驅(qū)動(dòng)</b>框架

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

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開(kāi)發(fā)-發(fā)送相關(guān)的寄存器DMA寄存器詳解 (qq.com) 前言 如下寄存器DIEPxxx,對(duì)應(yīng)IN端點(diǎn),和發(fā)送數(shù)據(jù)相關(guān),這一篇先介紹和
    的頭像 發(fā)表于 07-16 16:42 ?2025次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-發(fā)送相關(guān)的寄存器DMA寄存器詳解

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

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開(kāi)發(fā)-數(shù)據(jù)不能發(fā)送問(wèn)題分析案例 (qq.com) ? 一.前言 ? ? ? ?對(duì)于驅(qū)動(dòng)
    的頭像 發(fā)表于 08-08 09:43 ?2823次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-數(shù)據(jù)不能發(fā)送問(wèn)題分析案例

    新思 DWC2 的參考手冊(cè)從哪里可以下載

    最近在學(xué)習(xí)STM32F4 USB驅(qū)動(dòng),有看到 dwc2驅(qū)動(dòng)的代碼,但是沒(méi)有手冊(cè)用來(lái)參考,ST手冊(cè)上寄存器不全,從網(wǎng)上看到有下面兩個(gè)手冊(cè),但是一直找不到下載的資源 《DesignWar
    發(fā)表于 01-22 11:32

    如何對(duì)基于hal庫(kù)的DWC2 USB IP進(jìn)行調(diào)試呢

    背景之前適配 DWC2 USB IP 的時(shí)候,主要是基于 st 的 hal 庫(kù)來(lái)走的,當(dāng)時(shí)我就對(duì)他們的 hal 庫(kù)代碼不滿,只是無(wú)奈,迫于時(shí)間就沒(méi)重構(gòu),果不其然,usb bug 一堆,隨意舉例,這還
    發(fā)表于 06-14 15:23

    使用USB OTG端口作為以太網(wǎng)小工具無(wú)法工作是為什么?

    重新啟動(dòng)板的情況下恢復(fù):[46.766872] dwc2 49000000.usb-otg: new device is high-speed[46.771014] dwc2
    發(fā)表于 12-09 07:01

    Setup_JlinkARM_V402d驅(qū)動(dòng)

    Setup_JlinkARM_V402d v8 驅(qū)動(dòng) 比較兼容 我自己用這個(gè)
    發(fā)表于 02-29 17:09 ?20次下載

    抽絲剝繭系列——一個(gè)T拓?fù)?/a>

    槽要吐,文章還是要寫的。大家知道,做一些layout guide是信號(hào)完整性工程師的基本工作之一,layout guide可以說(shuō)是一些SI規(guī)則的物理體現(xiàn)。 抽絲剝繭系列一次解謎經(jīng)歷 抽絲剝繭系列
    發(fā)表于 12-26 20:59 ?927次閱讀
    <b class='flag-5'>抽絲剝繭</b>系列——一個(gè)T拓?fù)? />    </a>
</div>                            <div   id=

    基于DWC2USB驅(qū)動(dòng)開(kāi)發(fā)-抽絲剝繭切換到狀態(tài)階段標(biāo)志DOEPINTn.StsPhseRcvd

    本文轉(zhuǎn)自公眾號(hào)系列文章,歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開(kāi)發(fā)-USB包詳解 (qq.com) 一.前言 前面我們對(duì)
    的頭像 發(fā)表于 07-24 18:04 ?2012次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>-<b class='flag-5'>抽絲剝繭</b><b class='flag-5'>再</b><b class='flag-5'>論</b>切換到狀態(tài)階段<b class='flag-5'>標(biāo)志</b><b class='flag-5'>DOEPINTn</b>.StsPhseRcvd