RM新时代网站-首页

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)開發(fā)-高速設(shè)備枚舉為全速設(shè)備問題案例分析

嵌入式USB開發(fā) ? 來(lái)源: 嵌入式Lee ? 作者: 嵌入式Lee ? 2023-07-10 17:12 ? 次閱讀

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

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

一.前言

本文分享一個(gè)高速設(shè)備被枚舉為全速的問題。

高速設(shè)備速度握手參見本系列的文章。

二.問題

我們?cè)O(shè)計(jì)的UVC攝像頭工作在高速模式,接一個(gè)第三方的主機(jī)用于顯示和無(wú)線上傳,主機(jī)也支持高速模式。

我們的UVC攝像頭接PC測(cè)試都能正常枚舉為高速,從來(lái)沒有失敗過。接第三方的主機(jī)時(shí)總是被枚舉為全速,偶爾能成功一兩次枚舉為高速,幾乎都是枚舉為全速。

三.分析過程

既然接電腦沒問題,接第三方主機(jī)有問題,那么就懷疑第三方主機(jī)的兼容性問題。先前軟件做了一些分析,調(diào)試沒法確認(rèn)問題,進(jìn)行了一些打印信息的調(diào)試,在中斷中關(guān)鍵事件進(jìn)行打印,發(fā)現(xiàn)接入第三方設(shè)備時(shí)進(jìn)行了兩次復(fù)位和速度握手。這是一個(gè)異常信號(hào),正常一次復(fù)位和速度握手就能完成。于是使用示波器監(jiān)控,對(duì)比接PC正常的和接第三方設(shè)備不正常的復(fù)位,速度握手過程。

接PC正常的波形,由于要抓長(zhǎng)時(shí)間所以圖中高速握手的細(xì)節(jié)顯示不了了,但是整體依舊可以知道各個(gè)階段

a2c0773a-1df1-11ee-9c1d-dac502259ad0.png

接第三方主機(jī)不正常的

a2dcd060-1df1-11ee-9c1d-dac502259ad0.png

對(duì)比可以看到接PC一次完成高速握手

a31ef3dc-1df1-11ee-9c1d-dac502259ad0.png

而接第三方復(fù)位了兩次第一次嘗試高速握手主機(jī)無(wú)響應(yīng),第二次沒有嘗試高速握手了,注意這里沒有抓前面初始化過程了。

a3521384-1df1-11ee-9c1d-dac502259ad0.png

這里主機(jī)第一次沒有響應(yīng)設(shè)備的Chirp K是不對(duì)的,這里因?yàn)橹鳈C(jī)是按鍵喚醒的,懷疑是剛上電未就緒,但是主機(jī)為什么未就緒就要發(fā)送復(fù)位呢,應(yīng)該是USB初始化完后就緒才發(fā)復(fù)位的,所以這里主機(jī)肯定是不對(duì)的,而且為什么主機(jī)要發(fā)兩次復(fù)位也不得而知,但是肯定是不正常的,有些第三方的東西做的不健壯也沒辦法,我們現(xiàn)在也沒辦法知道主機(jī)的處理邏輯。

既然主機(jī)不對(duì),這個(gè)先不管,但是為什么設(shè)備在第2次復(fù)位時(shí)沒有發(fā)Chirp K進(jìn)行高速握手了呢。

這要從上一篇說的設(shè)備驅(qū)動(dòng)說起。

設(shè)備驅(qū)動(dòng)的流程如下

1.初始化配置DevSpd設(shè)置期望的工作速度,按照該速度去握手

2.配置EnumDoneMsk使能中斷,清除中斷標(biāo)志EnumDone

3.等待中斷,中斷中查詢實(shí)際握手的速度EnumSpd,根據(jù)該速度再次重新配置DevSpd設(shè)置實(shí)際工作速度。并清除中斷標(biāo)志EnumDone。

上述的邏輯是用戶可以設(shè)置最高期望的工作速度,但是實(shí)際主機(jī)支持多少就工作在多少,這樣不管主機(jī)是什么速度,代碼都不需要修改,初始化指定為高速即可,最終按照實(shí)際握手結(jié)果而定。

原因就在于上述紅色字體部分,第一次由于主機(jī)沒有響應(yīng)Chirp K所以設(shè)備握手結(jié)果是全速,所以中斷服務(wù)函數(shù)中設(shè)置為了工作模式為全速,下一次復(fù)位時(shí)依然會(huì)按照全速握手此時(shí)就不會(huì)發(fā)Chirp K了。

即如圖所示

a385a3ca-1df1-11ee-9c1d-dac502259ad0.png

那么是不是可以在復(fù)位中斷中重新再配置為高速來(lái)達(dá)到下一次復(fù)位進(jìn)行高速握手呢,因?yàn)閺?fù)位中斷是在握手完成中斷之前的,這樣是不行的,因?yàn)樵O(shè)備檢測(cè)到復(fù)位進(jìn)入復(fù)位中斷時(shí)硬件已經(jīng)開始進(jìn)行后續(xù)的握手處理了,軟件的修改已經(jīng)來(lái)不及了。此時(shí)設(shè)備已經(jīng)是正常的全速工作了,并不知道在何時(shí)需要重新設(shè)置為高速以等待下一次的復(fù)位握手,畢竟這個(gè)兩次復(fù)位握手不是標(biāo)準(zhǔn)流程,是主機(jī)的異常導(dǎo)致的。以上導(dǎo)致了第一次握手為全速之后后面就只能是全速了。

既然如此我們還可以修改中斷服務(wù)函數(shù)中的處理,不在中斷服務(wù)函數(shù)中根據(jù)前一次握手速度設(shè)置實(shí)際工作速度,這樣第二次就可以握手為高速了,如下所示

這樣看似解決了問題,但是實(shí)際導(dǎo)致了用戶API邏輯問題,原來(lái)用戶API初始化設(shè)置期望的速度為高速,如果主機(jī)不支持高速則握手為全速工作,沒有問題,

現(xiàn)在這種情況如果主機(jī)不支持高速,則設(shè)備一直工作在高速將沒辦法工作,所以這個(gè)修改會(huì)導(dǎo)致和其他主機(jī)通訊異常,不可取。即改變了原來(lái)API的邏輯。

a3d6ba94-1df1-11ee-9c1d-dac502259ad0.png

四.解決方法

雖然問題在于主機(jī),但是出于兼容性考慮還是要想解決辦法的,畢竟第三方設(shè)備健壯性沒法保證,寫驅(qū)動(dòng)考慮兼容性,甚至兼容非標(biāo),非健壯設(shè)備也是要考慮的。

所以這里對(duì)API接口再增加參數(shù)區(qū)分,原來(lái)的參數(shù)還是表示期望速度,但是實(shí)際工作速度按照握手結(jié)果決定,原來(lái)的邏輯不變。再增加一個(gè)參數(shù)即強(qiáng)制固定速度,也就是如果設(shè)置為固定速度則握手完成中斷中不根據(jù)握手結(jié)果更新速度,設(shè)置多少就多少不再改。這樣通過參數(shù)來(lái)應(yīng)對(duì)原來(lái)的用戶邏輯和兼容這個(gè)有問題的主機(jī)。需要修改的地方是API增加一組強(qiáng)制固定速度和原來(lái)的期望速度對(duì)應(yīng),中斷服務(wù)函數(shù)中根據(jù)是強(qiáng)制速度還是期望速度處理,期望速度就根據(jù)握手值更新速度,固定值則不更改。

五.總結(jié)

本篇以一個(gè)實(shí)際的案例進(jìn)行分析,體現(xiàn)了對(duì)USB高速握手過程理解的重要性,所以前一篇高速握手詳解的文章非常重要,在此基礎(chǔ)上才能很快的定位問題。之前一直強(qiáng)調(diào)知其然知其所以然很重要,只有深入理解才能快速解決問題。同時(shí)也體現(xiàn)了驅(qū)動(dòng)開發(fā)比一般嵌入式開發(fā)更深入的要求,不僅要考慮正常設(shè)備能工作,還要兼容不正常的,不標(biāo)準(zhǔn)的,不健壯的設(shè)備,這也需要更深的理解和功力。

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

    關(guān)注

    33

    文章

    8556

    瀏覽量

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

    關(guān)注

    60

    文章

    7927

    瀏覽量

    264368
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1492

    瀏覽量

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

    關(guān)注

    1

    文章

    136

    瀏覽量

    20188
  • DWC2
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    121
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-0x01開篇介紹與新思DWC2 USB2
    的頭像 發(fā)表于 05-08 18:10 ?4565次閱讀
    基于<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控制器簡(jiǎn)介

    基于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 ?9290次閱讀
    基于<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ā)-IAD描述符詳解

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-IAD描述符詳解 (qq.com) 一.? 前言 IAD描述符用于一個(gè)設(shè)備功能關(guān)聯(lián)多
    的頭像 發(fā)表于 06-27 08:45 ?9.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>-IAD描述符詳解

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

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-USB復(fù)位詳解 (qq.com) 一.前言 ? ? ? ? ?上一篇我們?cè)敿?xì)介紹了
    的頭像 發(fā)表于 07-07 11:18 ?6.3w次閱讀
    基于<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)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-USB連接詳解 (qq.com) 一.前言 ? 之前一直在閱讀手冊(cè),規(guī)格書,練習(xí)招式
    的頭像 發(fā)表于 07-07 08:46 ?3653次閱讀
    基于<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è)備驅(qū)動(dòng)框架

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-設(shè)備驅(qū)動(dòng)框架 (qq.com) 一.前
    的頭像 發(fā)表于 07-16 15:56 ?1300次閱讀
    基于<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'>設(shè)備</b>類<b class='flag-5'>驅(qū)動(dòng)</b>框架

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

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

    STM32 USB 枚舉和移除問題

    我們的設(shè)備使用的是STM32芯片,將設(shè)備枚舉為3個(gè)CCID+2HID的復(fù)合設(shè)備,但在使用過程中,出現(xiàn)以下兩個(gè)問題1、
    發(fā)表于 08-16 13:56

    全速USB高速USB的識(shí)別過程分析

    Device)。因此,如果高速設(shè)備掛到USB1.x的hub上,那該設(shè)備只能工作在全速模式下。不管是hub還是
    發(fā)表于 08-16 15:08

    請(qǐng)問如何將USB設(shè)備設(shè)置為全速設(shè)備高速設(shè)備?

    如何將USB設(shè)備設(shè)置為全速設(shè)備高速設(shè)備?
    發(fā)表于 12-14 07:10

    如何對(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í)間就沒重構(gòu),果不其然,usb bug 一堆,隨意舉例,這還
    發(fā)表于 06-14 15:23

    虛擬com端口設(shè)備運(yùn)行全速工作但高速無(wú)效罪魁禍?zhǔn)资鞘裁矗?/a>

    `hpcd_USB_OTG_HS.Init.speed = PCD_SPEED_HIGH;`枚舉后,Windows 顯示“未知 USB 設(shè)備”。U
    發(fā)表于 12-01 07:28

    zImage如何在mfg下載期間將USB重新枚舉為UMS設(shè)備?

    USB,然后它會(huì)找到設(shè)備并繼續(xù)下一步。我覺得 zImage 無(wú)法將 USB 重新枚舉為大容量存儲(chǔ)設(shè)備,或者至少它無(wú)法向我的 PC 發(fā)出正確
    發(fā)表于 03-14 12:56

    基于DWC2USB驅(qū)動(dòng)開發(fā)-高速設(shè)備速度握手詳解

    前面我們分析USB連接和復(fù)位的過程, 也知道低速和全速/高速USB設(shè)備分別是上拉DM和DP,
    的頭像 發(fā)表于 07-08 08:40 ?2745次閱讀
    基于<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'>高速</b><b class='flag-5'>設(shè)備</b>速度握手詳解

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

    本文轉(zhuǎn)自公眾號(hào)系列文章,歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-USB包詳解 (qq.com) 一.前言 前面我們對(duì)SETUP完成標(biāo)志DOE
    的頭像 發(fā)表于 07-24 18:04 ?1543次閱讀
    基于<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
    RM新时代网站-首页