本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注
基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-USB連接詳解 (qq.com)
一.前言
之前一直在閱讀手冊(cè),規(guī)格書(shū),練習(xí)招式,學(xué)習(xí)心法,從這一篇開(kāi)始我們就要真刀實(shí)槍的干了,當(dāng)然不是一味蠻干。驅(qū)動(dòng)編寫(xiě),調(diào)試,實(shí)踐的過(guò)程會(huì)結(jié)合閱讀規(guī)格書(shū),手冊(cè),理論結(jié)合實(shí)踐,招式和心法要同步進(jìn)行。
二.USB連接需要幾步?
進(jìn)行USB連接需要幾步?我們參考把大象裝進(jìn)冰箱需要幾步:第一步打開(kāi)冰箱門(mén),第二步把大象裝入冰箱,第三步關(guān)閉冰箱門(mén),完成。USB連接同樣的簡(jiǎn)單,第一步插上開(kāi)發(fā)板USB接口到電腦,第二步電腦識(shí)別到USB設(shè)備,第三步恭喜你獲得一個(gè)黃色告警對(duì)話框!完美完成!也許很不幸,你沒(méi)有獲得黃色告警對(duì)話框,那么就是失敗了,后面我們會(huì)詳細(xì)介紹怎么去分析調(diào)試。
三.USB連接原理
前面我們已經(jīng)完成了USB連接的操作,實(shí)踐了師傅教的第一招黑虎掏心,but what?我干了什么?前面我們說(shuō)過(guò)需要理論結(jié)合實(shí)踐,招式結(jié)合心法,招式已經(jīng)嘗試了,但是到底是什么原理呢?到底是怎么做到的呢?那么就要從心法去探究,USB江湖的最基礎(chǔ)的心法,就是USB2.0的規(guī)格書(shū)。當(dāng)然招式也有招式的拳譜劍譜,我們這里就對(duì)應(yīng)的使用的USB控制器IP的規(guī)格書(shū)(這里是新思的DDC2)和PHY的規(guī)格書(shū)(microChip的USB334x)。
我們打開(kāi)USB2.0規(guī)格書(shū),翻到141頁(yè)看到如下圖,主機(jī)(或HUB)端D+和D-均由Rpd=15KΩ的電阻下拉,未接入設(shè)備時(shí)此時(shí)D+和D-都是0V。設(shè)備(或者下級(jí)HUB)端通過(guò)D+或D-上拉Rpu=1.5KΩ來(lái)區(qū)分是全速還是低速設(shè)備,全速設(shè)備D+上拉,低速設(shè)備D-上拉。設(shè)備端的上拉電阻和主機(jī)端下拉電阻分壓得到和未接設(shè)備時(shí)不一樣的電平,主機(jī)檢測(cè)該電平即可知道有設(shè)備插入,原理就是這么簡(jiǎn)單,牛逼的武功也往往是很簡(jiǎn)單,比如六脈神劍也就那么一彈手指。
為什么是上拉1.5K呢,因?yàn)樯侠娮枰WC分壓值不小于VIH(min),因?yàn)橹挥袧M足該條件才能被識(shí)別為高,為什么這個(gè)電壓能識(shí)別為高呢,那就是硬件電氣特性決定的了,我喜歡死纏爛打的追問(wèn)的伙伴,可以繼續(xù)深挖到收發(fā)器,晶體管,半導(dǎo)體.... ,如果能追到這一層的那么肯定是孤獨(dú)求敗級(jí)別的高手了,膜拜之。VIH在規(guī)格書(shū)中的要求如下至少要為2V(可以規(guī)格書(shū)中搜索找到)
除了上述要求,上拉電阻還要保證能夠在2.5μs的最小復(fù)位時(shí)間內(nèi)將D+或D-從0V上拉至VIH(min),因?yàn)樵趶?fù)位結(jié)束時(shí)要進(jìn)行總線狀態(tài)評(píng)估。
2.5uS的要求在如下表格中說(shuō)明,即復(fù)位最短時(shí)間是2.5uS.
綜上要求,具有可拆卸電纜的設(shè)備使用1.5 k? ±5%電阻器連接到3.0 V和3.6 V之間的電壓源(VTERM),以滿足這些要求。帶有固定電纜的設(shè)備可以使用替代端接方式。但是,任何終端的Thevenin(戴維寧)電阻必須不小于900?.注:終端的Thevenin(戴維寧)電阻不包括主機(jī)/集線器上的15 k±5%的電阻。
上拉電阻器上的電壓源必須來(lái)源于USB電纜上提供的電源或由USB電纜上的電源控制,以便在移除VBUS時(shí),上拉電阻器不會(huì)在其連接的數(shù)據(jù)線上提供電流。即VBUS斷開(kāi)時(shí)上拉也應(yīng)該斷開(kāi)。
上述表中描述的是針對(duì)低速和高速設(shè)備連接檢測(cè),高速呢,高速設(shè)備的連接檢測(cè)和全速一樣,只是后面速度枚舉有不同,這個(gè)先按下不表,后面再講解。
四.USB連接驅(qū)動(dòng)
驅(qū)動(dòng)編寫(xiě)我們參考控制器IP的手冊(cè),找到如下寄存器
手冊(cè)P529的5.4.48 DCTL,Offset: 0x804,bit1
可以看到默認(rèn)值是1,即默認(rèn)是斷開(kāi)上拉電阻的,注意這里的邏輯,這個(gè)bit表示斷開(kāi)連接。
軟件寫(xiě)0上拉電阻,這樣在DP或者DM上上拉電阻(根據(jù)速度而定,如何設(shè)置速度枚舉速度后面再講),這樣主機(jī)就可以檢測(cè)到了。
注意軟件操作這個(gè)bit時(shí)不要過(guò)于頻繁,一般留個(gè)10mS以上充足的間隔時(shí)間,大于上述手冊(cè)中的描述時(shí)間。
注意該位不受控制器軟件復(fù)位影響。
我們的驅(qū)動(dòng)代碼如下,寄存器的操作封裝,參考之前的文章,為什么用宏不用結(jié)構(gòu)體,也有專門(mén)的文章講解,可以去瞅瞅。
static void usb_dev_crtl_sft_discon(uint8_t dis)
{
if (dis) {
REG_OTG_DCTL |= DCTL_SOFT_DISCONN;
} else {
REG_OTG_DCTL &= ~(DCTL_SOFT_DISCONN);
}
}
我們之前一直強(qiáng)調(diào),要了解根本原理,不管學(xué)習(xí)招式還是學(xué)習(xí)心法,一定要追其核心根本原理。那么這個(gè)bit寫(xiě)0就能上拉,到底是怎么實(shí)現(xiàn)的呢,
我們這里操作的是控制器即LINK,但是實(shí)際工作是由PHY去完成的,所以寫(xiě)了這個(gè)bit之后,
LINK會(huì)通過(guò)PHY和LINK之間的UTMI或者ULPI接口告訴PHY,最終由PHY去完成這個(gè)上拉工作。于是乎我們?nèi)シ哖HY的手冊(cè)這里是USB334x,看到如下圖,正是PHY將如下上拉電阻拉高來(lái)實(shí)現(xiàn)連接,至此我們已經(jīng)了解了整個(gè)過(guò)程。
從ULPI的規(guī)格書(shū)中還可以看到實(shí)際是通過(guò)PHY對(duì)應(yīng)的寄存器相關(guān)位配置為不同的模式來(lái)控制的
而UTMI接口中直接對(duì)應(yīng)的是信號(hào)線
這里順便提一下,ULPI對(duì)UTMI引腳的縮減,實(shí)際就是通過(guò)將一些信號(hào)線直接控制轉(zhuǎn)為寄存器控制來(lái)達(dá)到的。
但是有好問(wèn)者,會(huì)問(wèn)那么LINK是怎么告訴PHY要去上拉電阻的呢,問(wèn)得很好,高手總是從刨根問(wèn)底開(kāi)始的。這個(gè)就要了解UTMI和ULPI協(xié)議了,可以參考本系列文章,講解了ULPI協(xié)議,甚至講解了如何使用邏輯分析儀抓包ULPI,那么你就可以抓到ULPI接口上具體的數(shù)據(jù),來(lái)調(diào)試分析了,比如最終沒(méi)能上拉,通過(guò)ULPI抓包可以確定是沒(méi)有發(fā)送到PHY還是PHY沒(méi)有執(zhí)行,進(jìn)一步縮小范圍。
https://mp.weixin.qq.com/s/e4MCpASUXW4oKzfYOdMRwg
https://mp.weixin.qq.com/s/7oTIgxvrui_ZdjCktFo87g
還有更細(xì)致的會(huì)問(wèn),那么這個(gè)上拉電阻是所有芯片都會(huì)有嗎,答案是否,有些芯片是沒(méi)有的,比如一些STM32的MCU,這個(gè)時(shí)候需要外部提供上拉電路,使用IO控制。如下(網(wǎng)上隨便找的一張圖),USB_E來(lái)控制上拉。
五.調(diào)試
上面我們?nèi)绻芸吹诫娔X彈出黃色告警的對(duì)話框,恭喜你,你已經(jīng)練就了第一招黑虎掏心。如果不幸沒(méi)有彈出呢,那么我們就需要進(jìn)行調(diào)試。那么就要派出示波器出來(lái)一展身手了。
我們直接使用示波器監(jiān)控DP和DM的電平,查看初始是否都為0,然后connect后DP,DM是否對(duì)應(yīng)的拉高,拉高的值是否符合要求達(dá)到了VIH(min)。如果沒(méi)有拉高則從以下方面去分析:
1.硬件檢查,使用萬(wàn)用表測(cè)量DP DM到芯片的相應(yīng)引腳是否聯(lián)通,測(cè)試DP,DM是否和地或者VCC短路。如果外置PHY則檢查PHY是否工作,通過(guò)時(shí)鐘等關(guān)鍵引腳判斷。
2.將DP DM配置為普通IO,翻轉(zhuǎn)IO使用示波器查看硬件連通性。強(qiáng)調(diào)下該方式是嵌入式一種常用的測(cè)試方法,用于確認(rèn)IO到硬件上是否正常聯(lián)通,有時(shí)還可以使用IO做時(shí)序分析測(cè)試,即在一定的事件發(fā)生時(shí)翻轉(zhuǎn)IO,用示波器測(cè)量,這比使用軟件定時(shí)器和串口打印更精確。多個(gè)通道還可以可視化展現(xiàn)相位關(guān)系,簡(jiǎn)單的一招確是調(diào)試的大招。
3.檢查DP DM是否按照芯片手冊(cè)配置為了對(duì)應(yīng)的功能,包括輸入輸出模式,功能選擇等,有些芯片可能需要重映射。
4.檢查USB相關(guān)的初始化是否正確,包括時(shí)鐘使能,IO模塊使能,外設(shè)模塊使能,時(shí)鐘配置(比如48M時(shí)鐘源等),檢查模塊復(fù)位,模塊寄存器保護(hù)等?;刈x寄存器確認(rèn)相應(yīng)的寄存器是否確實(shí)配置成功,回讀總是必要的,可靠性編程中需要考慮,寫(xiě)入不一定成功的,芯片也是有出錯(cuò)概率的。
我這里針對(duì)DWC的IP,測(cè)試代碼如下,10mS進(jìn)行一次斷開(kāi)和連接使用示波器查看
while(1)
{
usb_dev_crtl_sft_discon(0);
iot_timer_delay_ms(10);
usb_dev_crtl_sft_discon(1);
iot_timer_delay_ms(10);
}
我這里是高速模式,示波器測(cè)試DP波形(黃色)如下:
六.總結(jié)
以上可以看出USB連接原理很簡(jiǎn)單,就是一個(gè)上拉電阻,就好比將大象裝進(jìn)冰箱一樣簡(jiǎn)單。招式雖簡(jiǎn)單,但是其背后的心法,原理確很重要,細(xì)節(jié)也很重要。這就是為什么喬峰使出黑虎掏心如此威力巨大,而一些綠林大漢使出來(lái)確平平無(wú)奇,這是心法和招式理解是否達(dá)到了爐火純晴的地步的區(qū)別。USB連接也是如此,只是知道上拉,還是知道LINK的寄存器如何配置,還是知道LINK和PHY如何通訊告訴PHY去上拉,甚至知道如何去抓包確認(rèn),還是知道上拉電阻為什么是1.5K有什么要滿足的條件,還是知道芯片不帶上拉如何去外置上拉等等,都是對(duì)應(yīng)不同的級(jí)別??磥?lái)一招USB連接,一招黑虎掏心也可以分為18級(jí),只有練到最高級(jí)爐火純青才能所向披靡,遇BUG解BUG,遇fault殺fault。
審核編輯 黃宇
-
usb
+關(guān)注
關(guān)注
60文章
7936瀏覽量
264456 -
USB驅(qū)動(dòng)
+關(guān)注
關(guān)注
1文章
136瀏覽量
20191 -
驅(qū)動(dòng)開(kāi)發(fā)
+關(guān)注
關(guān)注
0文章
130瀏覽量
12072 -
DWC2
+關(guān)注
關(guān)注
0文章
35瀏覽量
125
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論