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

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

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

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

嵌入式USB開發(fā) ? 來源:嵌入式Lee ? 作者:嵌入式Lee ? 2023-08-08 09:43 ? 次閱讀

本文轉(zhuǎn)自公眾號歡迎關(guān)注

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

一.前言

對于驅(qū)動(dòng)的開發(fā),調(diào)試是一個(gè)很痛苦的過程,尤其對于不熟悉的領(lǐng)域,很小的一個(gè)問題可能就需要花費(fèi)大量的時(shí)間去調(diào)試,甚至以月時(shí)間計(jì),甚至可能就解決不了。所以經(jīng)驗(yàn)變得很重要,經(jīng)驗(yàn)即對相應(yīng)的IP的熟悉程度,這里的熟悉不是做過,而是分析過調(diào)試過。包括遇到過的各種坑,對各種細(xì)節(jié)的了解,對各種行為的了解,只有遇到足夠多的坑且是實(shí)在的去調(diào)試分析過的,才可能不斷積累經(jīng)驗(yàn),否則就算做一萬遍也算不上經(jīng)驗(yàn)(這也是在嵌入式開發(fā)尤其是驅(qū)動(dòng)開發(fā)中做過十年的不一定比做過三年的有經(jīng)驗(yàn),做過十年只是改個(gè)參數(shù),構(gòu)建下,跑一下,真算不上任何經(jīng)驗(yàn),而后者如果能從零開始或者真的進(jìn)行了底層的調(diào)試分析那么就是實(shí)在的經(jīng)驗(yàn))。DWC2的USB控制器也是一個(gè)比較復(fù)雜的IP,我們從零開始編寫驅(qū)動(dòng)必然會遇到各種問題,所以這里就會對遇到的各種問題及其分析過程進(jìn)行記錄,以作為經(jīng)驗(yàn)積累,為后續(xù)提供checklist。

本篇分析一個(gè)IN時(shí)數(shù)據(jù)無法發(fā)出的問題。

二.分析過程

問題背景是代碼原本是使用高速傳輸,現(xiàn)在需要支持全速傳輸,所以將DCFG寄存器中速度配置為了全速,但是枚舉失敗。

先確認(rèn)問題點(diǎn)大致對應(yīng)的代碼位置,

通過打印確認(rèn)復(fù)位后,全速速度枚舉正常。

f5b5f192-34ba-11ee-b9c7-dac502259ad0.png

所以我們繼續(xù)打印中斷信息,以確認(rèn)更詳細(xì)的位置,

可以看出軟件收到了設(shè)備描述符請求的8字節(jié)內(nèi)容并進(jìn)行了解析,

也準(zhǔn)備了DMA的描述符以發(fā)送18字節(jié)的內(nèi)容。

但是沒有預(yù)期的產(chǎn)生IN的XferComplete中斷

f5c14588-34ba-11ee-b9c7-dac502259ad0.png

于是我們使用分析儀確認(rèn)總線上的情況

可以看到SETUP之后。主機(jī)IN時(shí)設(shè)備一直是NAK,確實(shí)是沒有返回?cái)?shù)據(jù)

f5cca5ae-34ba-11ee-b9c7-dac502259ad0.png

此時(shí)我們已經(jīng)定位到了問題出現(xiàn)在了設(shè)備準(zhǔn)備了DMA的描述符以返回18字節(jié)數(shù)據(jù),但是DMA沒有執(zhí)行,因?yàn)闆]有產(chǎn)生XferComplete中斷。

以上自然而然我們就要去排查DMA的狀態(tài)了,這個(gè)時(shí)候就需要我們熟悉相關(guān)的寄存器了(所以前面專門講寄存器的的內(nèi)容就派上用場了)。

我們從手冊中看到DMA描述符的第一個(gè)WORD以下字段表示DMA狀態(tài)

f5e161a6-34ba-11ee-b9c7-dac502259ad0.pngf5eeb7a2-34ba-11ee-b9c7-dac502259ad0.png

于是我們查看該字段為01即DMA busy

f618a954-34ba-11ee-b9c7-dac502259ad0.png

既然DMA的作用是根據(jù)DMA描述符從用戶存儲搬運(yùn)數(shù)據(jù)到TxFIFO中去,DMA描述符已經(jīng)準(zhǔn)備好了,但是還是DMA busy那么就只能和TxFIFO有關(guān),

猜測就是TxFIFO里沒有足夠 的空間可以滿足本次DMA的搬運(yùn)。

那么為什么會導(dǎo)致TxFIFO中空間不夠呢,

要不是分配的不夠,要不就是之前里面有數(shù)據(jù)沒有發(fā)送出去,

前者和初始化配置有關(guān),后者和端點(diǎn)狀態(tài)是否工作狀態(tài)有關(guān)。于是分別確認(rèn)。

先查看端點(diǎn)寄存器狀態(tài)

f623e2a6-34ba-11ee-b9c7-dac502259ad0.png

f63db32a-34ba-11ee-b9c7-dac502259ad0.png

可以看到EPEna為1,USBACtEp為1,

EPEna為1是軟件設(shè)置的,硬件的DMA搬運(yùn)完后自動(dòng)清零(見前面專門的寄存器講解的文章),這里沒有搬運(yùn)完所以一直是1,

USBACtEp為1說明該端點(diǎn)是使能的。

那么排除了端點(diǎn)狀態(tài)不對的問題,端點(diǎn)確實(shí)是工作的。

那么繼續(xù)排查是否TxFIFO緩沖區(qū)不夠的問題,

看到TxFIFO的大小配置為了4個(gè)WORD即16字節(jié),不足18字節(jié),所以DMA無法一次搬進(jìn)去。

f6587dfe-34ba-11ee-b9c7-dac502259ad0.png

f678cf28-34ba-11ee-b9c7-dac502259ad0.png

那么我們是否可以驗(yàn)證下呢,可以手動(dòng)改下只發(fā)16個(gè)字節(jié)試一下

此時(shí)可以看到,發(fā)送了出去,那么確認(rèn)就是這個(gè)原因了。

f68f9b72-34ba-11ee-b9c7-dac502259ad0.png

此時(shí)問題就好查了,那么對照下代碼確認(rèn)應(yīng)該就是初始化配置時(shí)配置的了

代碼如下全速時(shí)配置為了包大小為8,且計(jì)算TxFIFO時(shí)根據(jù)雙緩沖,2x8/2=4個(gè)WORD和寄存器值一樣。

pep0_in->maxpacket= ((usb_handle -> setspeed& 0x0F) == USB_SPEED_HIGH) ? 64: 8;

f69cedae-34ba-11ee-b9c7-dac502259ad0.png

那么問題就定位了,但是到此就完了嗎?我們再來回顧下,全速的控制端點(diǎn)也是可以配置最大包大小為8個(gè)字節(jié)大小的,理論上也應(yīng)該可以呀?

我們再來看上面的端點(diǎn)0的IN控制寄存器里配置的值

Bit[1:0]為00確是64字節(jié),

f623e2a6-34ba-11ee-b9c7-dac502259ad0.png

f6cd09e4-34ba-11ee-b9c7-dac502259ad0.png

再來看代碼

原來是寫死了

f6f0fc00-34ba-11ee-b9c7-dac502259ad0.png

所以這個(gè)驅(qū)動(dòng)寫的就有問題,應(yīng)該根據(jù)配置參數(shù)自動(dòng)調(diào)整而不是寫死。

所以根本原因其實(shí)是在這里。

MPS改為8,也是可行的,發(fā)送18字節(jié)就會拆分為多包發(fā)送,這里不再記錄了,可以自行驗(yàn)證。

以上問題根本點(diǎn)即端點(diǎn)的MPS配置的不對,當(dāng)然更上一層的根本原因是,TxFIFO的大小不能太小,至于是小于多少呢,小于MPS和發(fā)送數(shù)據(jù)的最小值,因?yàn)榘l(fā)送數(shù)據(jù)可以小于MPS的。于是這里我們又總結(jié)出了一個(gè)checklist,即FIFO大小不能小于MPS和最小一次發(fā)送數(shù)據(jù)大小的最小值。

三.總結(jié)

以上以一個(gè)實(shí)例進(jìn)行分析,雖然問題不是復(fù)雜的問題,總結(jié)一下就是TxFIFO緩沖區(qū)不足,使得DMA無法從用戶指定的描述符中指定的存儲區(qū)域搬運(yùn)指定大小數(shù)據(jù)到TxFIFO,使得DMA一直處于Busy狀態(tài)。

但是如果對此不熟則很可能也會耽誤很多時(shí)間去分析,以上問題可以總結(jié)出checklist以后遇到類似問題可以直接查看,確認(rèn)排查,這也是經(jīng)驗(yàn)積累的過程。對于公司技術(shù)的積累也是依賴于此,而不是依賴于人。

主要的是要熟悉整個(gè)分析過程,分析思路,對驅(qū)動(dòng)開發(fā)這是常態(tài),你將會發(fā)現(xiàn)經(jīng)常改了一點(diǎn)內(nèi)容可能就有問題,我們一定要找到根本原因,而不是通過修改代碼去回避,這在驅(qū)動(dòng)開發(fā)中也是很重要的思想。

以下做一個(gè)簡單的方法總結(jié):

1.縮小范圍,定位代碼對應(yīng)位置,確認(rèn)問題點(diǎn),比如上面的定位到問題出現(xiàn)在,準(zhǔn)備了IN描述符,但是沒有產(chǎn)生IN的XferComplete中斷之間。一般使用打印,斷點(diǎn),逐步增刪代碼,二分法增刪代碼邏輯等技術(shù)手段進(jìn)行。

2.定位數(shù)據(jù)交互在哪里出現(xiàn)問題,比如上面定位到發(fā)了請求設(shè)備沒有返回?cái)?shù)據(jù)。一般使用邏輯分析儀,USB分析儀,協(xié)議分析軟件等技術(shù)手段,配合上述軟件的定位。

3.確認(rèn)位置后通過狀態(tài)寄存器等確認(rèn)具體的問題,比如上面通過描述符DMA的狀態(tài)去判斷。一般需要熟悉IP對應(yīng)的寄存器,尤其是一些狀態(tài)寄存器。

審核編輯 黃宇

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

    關(guān)注

    60

    文章

    7845

    瀏覽量

    263286
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1812

    瀏覽量

    85044
  • DWC2
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    116
收藏 人收藏

    評論

    相關(guān)推薦

    基于DWC2USB驅(qū)動(dòng)開發(fā)-IN端點(diǎn)發(fā)送相關(guān)的寄存器詳解

    上一篇我們介紹了IN端點(diǎn),發(fā)送,DMA相關(guān)的兩個(gè)寄存器,這一篇繼續(xù)講另外的幾個(gè)寄存器。
    的頭像 發(fā)表于 07-17 07:41 ?1597次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-IN端點(diǎn)<b class='flag-5'>發(fā)送</b>相關(guān)的寄存器詳解

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

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

    基于DWC2USB驅(qū)動(dòng)開發(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 ?8728次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-0x02 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP功能特征介紹

    基于DWC2USB驅(qū)動(dòng)開發(fā)-0x07 DWC2 USB2.0 IP 配置參數(shù)

    混淆,IP的配置參數(shù)固定之后就不能改了,就決定了IP所具有的能力。對于軟件開發(fā)者來說也要了解其具體的配置,因?yàn)橹挥兄喇?dāng)前IP的配置,知道支持哪些功能,哪些是軟件可以配置的哪些是硬件固定了無法配置的,等等這些,后面寫驅(qū)動(dòng)才心中有
    的頭像 發(fā)表于 05-17 09:49 ?2031次閱讀

    基于DWC2USB驅(qū)動(dòng)開發(fā)-0x0E 使用邏輯分析分析ULPI數(shù)據(jù)

    工欲善其事必先利其器,所以在USB開發(fā)中工具很重要,示波器,邏輯分析儀,USB協(xié)議分析儀等都不可少。在底層問題
    的頭像 發(fā)表于 06-07 16:56 ?1540次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-0x0E 使用邏輯<b class='flag-5'>分析</b>儀<b class='flag-5'>分析</b>ULPI<b class='flag-5'>數(shù)據(jù)</b>

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

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

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

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

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

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

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

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

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

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

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

    本文轉(zhuǎn)自公眾號,歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-發(fā)送相關(guān)的寄存器DMA寄存器詳解 (qq.com) 前言 如下寄存器DIEPxxx,
    的頭像 發(fā)表于 07-16 16:42 ?1506次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>發(fā)送</b>相關(guān)的寄存器DMA寄存器詳解

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

    不管什么通訊協(xié)議,比如UART,SPI,USB等等,不管是并口還是串口,不管是同步還是異步,我們從抽象的角度去看,其本質(zhì)都是一樣的。都是先定義物理信號,物理信號可能是差分,單端,電流驅(qū)動(dòng)電壓驅(qū)動(dòng)等等
    的頭像 發(fā)表于 07-23 17:11 ?2317次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>USB</b>包詳解

    RK3399平臺上USB控制器和PHY的連接方式和配置說明

    。USB2.0 OTG對應(yīng)的控制器是DWC2USB2.0 OTG使用的是Synopsys 方案,即使用DWC2控制器同時(shí)實(shí)現(xiàn)Host和Device功能,
    發(fā)表于 05-12 17:46

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

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

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

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