• 正文
    • 1.淺析CDC ACM
    • 2.通過(guò)一個(gè)宏定義來(lái)控制CDC的實(shí)例數(shù)
    • 3.測(cè)試
    • 4.獲取源代碼
    • 5.特別感謝
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

如何在i.MX RT上同時(shí)支持七路虛擬USB串口

02/06 10:00
859
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

本文基于MCUXpresso SDK的USB協(xié)議棧,討論了多CDC ACM在NXP RT1060平臺(tái)的實(shí)現(xiàn)。文中的工作在MCUXpresso SDK USB協(xié)議棧的基礎(chǔ)上做了兩處改進(jìn):

1.由于Notification功能在大多數(shù)實(shí)際的CDC ACM應(yīng)用中基本不會(huì)用到,本文去掉了Notification使用的EP,在EHCI USB控制器支持8個(gè)雙向硬件EP的情況下,實(shí)現(xiàn)了多達(dá)7個(gè)CDC ACM通道的理論最大值。

2.屏蔽了復(fù)雜的USB協(xié)議和代碼的諸多細(xì)節(jié),使得CDC ACM 的數(shù)量?jī)H僅由一個(gè)宏來(lái)進(jìn)行控制,這樣把開(kāi)發(fā)時(shí)切換CDC ACM數(shù)目的時(shí)間,從數(shù)小時(shí)到數(shù)天縮短為秒級(jí),大幅提升了用戶使用體驗(yàn)。改進(jìn)之后的代碼經(jīng)過(guò)在RT1060 EVK上面測(cè)試,運(yùn)行良好。

1.淺析CDC ACM

USB CDC的內(nèi)容非常廣泛,本文只討論其最常見(jiàn)的一種應(yīng)用模型——ACM。ACM是英文Abstract Control Model的縮寫(xiě)。這個(gè)模型是隸屬于PSTN設(shè)備,PSTN是Public Switched Telephone Network的英文縮寫(xiě)。PSTN是一種非常古老的電話交換網(wǎng)絡(luò)。ACM是為模擬PSTN中傳統(tǒng)的Modem設(shè)備而設(shè)計(jì)的。

我們知道,Modem的控制接口正是UART。全功能支持Modem的UART控制信號(hào)線多達(dá)9根。但是在嵌入式的世界,更多使用的是精簡(jiǎn)版本的UART,即只使用TX、RX、GND這三個(gè)信號(hào)實(shí)現(xiàn)簡(jiǎn)單的雙向通信。所以我們可以把CDC ACM看成是一個(gè)USB to UART的Bridge。

隨著時(shí)代的發(fā)展,很多PC,尤其是筆記本電腦,目前已經(jīng)取消了UART,USB成為了主流的標(biāo)配。但是,多年來(lái),由于UART簡(jiǎn)單易用,并且有深厚的群眾基礎(chǔ),經(jīng)年累月的使用習(xí)慣,放棄UART會(huì)是一件很痛苦的事情。而主流的OS比如Linux、Windows、MacOS對(duì)CDC ACM的支持都很好,CDC ACM逐漸的代替了傳統(tǒng)的物理串口,延續(xù)了傳統(tǒng)物理串口在新型電腦上的使用。在PC上,UART的肉體滅亡了,但是靈魂依舊永存,依附于USB,UART會(huì)一直存在。

從協(xié)議的角度講CDC ACM,相信會(huì)很枯燥。因?yàn)閁SB浩如煙海的復(fù)雜協(xié)議會(huì)看得每個(gè)正常的人心煩意亂。所以小編這里并不準(zhǔn)備把整個(gè)CDC ACM的協(xié)議內(nèi)容在這里完整的講一遍,那實(shí)在是太復(fù)雜了。但是如果完全不講協(xié)議,小編也無(wú)法表達(dá)多CDC ACM實(shí)現(xiàn)技術(shù)的重點(diǎn)。下面小編會(huì)嘗試用最簡(jiǎn)潔的方式來(lái)進(jìn)行表達(dá),會(huì)涉及協(xié)議,但是會(huì)突出重點(diǎn),省略掉很多不重要的細(xì)節(jié)。

讓我們先看看一個(gè)CDC ACM是如何構(gòu)成的:

這里可以看到,一個(gè)CDC ACM實(shí)例由Communication接口和Data接口構(gòu)成。Communication接口包含class專(zhuān)用接口和一個(gè)可選的中斷型EP。而Data接口包含一對(duì)雙向的BULK EP用于數(shù)據(jù)通信,他們就是虛擬UART的TX和RX的物理載體。

在我們SDK的默認(rèn)實(shí)現(xiàn)中,Communication接口下的端點(diǎn)默認(rèn)是使能的。這樣,實(shí)現(xiàn)一個(gè)CDC ACM通道就需要2個(gè)端點(diǎn),RT1060的USB控制器共有8個(gè)雙向端點(diǎn)。除去端點(diǎn)0,只有7個(gè)端點(diǎn)可以用于CDC ACM,這樣RT1060上可實(shí)現(xiàn)的CDC ACM實(shí)例最大數(shù)目為3。

而根據(jù)USB規(guī)范,Communication接口下的端點(diǎn)是可選的,小編嘗試了對(duì)此端點(diǎn)進(jìn)行移除。移除后,每個(gè)CDC ACM僅占用一個(gè)雙向端點(diǎn),這樣,最終成功實(shí)現(xiàn)了7個(gè)CDC ACM實(shí)例。

小編在實(shí)踐的過(guò)程中,心中一直有個(gè)疑問(wèn),那就是Communication接口的那個(gè)Notification用的INT IN EP到底是干嘛用的。借助協(xié)議分析儀提供的線索,小編終于在Spec中找到了定義:

說(shuō)白了是全功能UART的設(shè)備狀態(tài)模擬,用于原始Modem的狀態(tài)上報(bào)和載波控制。而我們大多數(shù)的情況下使用CDC ACM,只是為了做簡(jiǎn)單的雙向收發(fā),而并不需要全功能的UART。在移除了Notification EP后,系統(tǒng)會(huì)變得更加簡(jiǎn)單,CDC ACM模擬的全功能UART退化為只有TX、RX的精簡(jiǎn)版本。

小編在實(shí)踐過(guò)程中的另一個(gè)疑問(wèn)是,對(duì)于多CDC的情況,設(shè)置波特率之類(lèi)的命令,是如何區(qū)分該命令是給哪個(gè)CDC ACM的實(shí)例呢?

借助于USB邏輯分析儀,我們可以很快找到答案,每一組命令都是針對(duì)某一個(gè)Interface的,我們可以通過(guò)Interface的編號(hào)來(lái)識(shí)別當(dāng)前的命令是傳給哪一個(gè)CDC ACM實(shí)例的。

下圖更加清晰地展示了實(shí)現(xiàn)的諸多細(xì)節(jié)。需要注意的是,這些命令是從EP0走的,移除Notification EP對(duì)此命令并無(wú)影響。

說(shuō)到這里,小編想小結(jié)一下:CDC ACM是用于模擬PSTN環(huán)境下的Modem控制接口,即全功能UART,我們可以在此基礎(chǔ)上進(jìn)行精簡(jiǎn),得到僅具備TX, RX功能的虛擬UART設(shè)備。

2.通過(guò)一個(gè)宏定義來(lái)控制CDC的實(shí)例數(shù)

由于USB協(xié)議和代碼的復(fù)雜性,為了方便用戶使用,小編實(shí)現(xiàn)了通過(guò)一個(gè)宏定義來(lái)控制CDC的通道數(shù)。用戶只需要修改一個(gè)宏定義的值,就可以控制CDC的通道數(shù)量,代碼如下:#define USB_DEVICE_CONFIG_CDC_ACM (6U)

具體的實(shí)現(xiàn),有興趣的讀者可以去參考本文提供的代碼,這里小編只說(shuō)一下實(shí)現(xiàn)的思路。

為了實(shí)現(xiàn)通過(guò)一個(gè)宏控制CDC的數(shù)量,我們需要軟件能夠提供以下功能:自動(dòng)分配每個(gè)CDC ACM的接口編號(hào)

自動(dòng)分配每個(gè)CDC ACM的端點(diǎn)編號(hào)

自動(dòng)生成配置描述符

自動(dòng)初始化SDK USB協(xié)議棧的數(shù)據(jù)結(jié)構(gòu)

自動(dòng)匹配SDK USB協(xié)議棧的其他各種要求

為了完成所有這些自動(dòng)化的操作,經(jīng)粗略統(tǒng)計(jì),在原始SDK的基礎(chǔ)上,涉及的更改點(diǎn)大約有66處。

3.測(cè)試

1.CDC通道數(shù)測(cè)試:

小編依次修改配置宏定義,成功的測(cè)試了CDC ACM通道數(shù)從1到7的全部情況。

下面是7個(gè)通道枚舉后,在設(shè)備管理器中顯示的截圖:

2.7個(gè)CDC通道同時(shí)通信測(cè)試:為了進(jìn)行測(cè)試,小編同時(shí)開(kāi)了7個(gè)串口終端,測(cè)試結(jié)果如下圖所示,7個(gè)終端均能獨(dú)立正常通信。

4.獲取源代碼

本文的原代碼可以從github.com進(jìn)行下載,無(wú)需密碼,下載鏈接為:http://github.com/jiaguonxpcom/usb_ncdc

該代碼編譯后可以直接下載到RT1060 EVK運(yùn)行。

5.特別感謝

在本人的實(shí)踐過(guò)程中,最開(kāi)始只是實(shí)現(xiàn)了nCDC用一個(gè)宏定義的自動(dòng)生成部分,并未能成功實(shí)現(xiàn)CDC ACM的Communication接口下的EP移除,在RT1060最大僅能自動(dòng)實(shí)現(xiàn)3個(gè)CDC ACM實(shí)例。

來(lái)自NXP LPC/Kinetis SE團(tuán)隊(duì)的ZhangYang同學(xué)提供的AN給出了詳細(xì)的操作細(xì)節(jié)(ZhangYang同學(xué)成功的在Kinetis MCU上實(shí)現(xiàn)了15個(gè)CDC ACM實(shí)例,其USB控制器支持16個(gè)硬件端點(diǎn))。另外,來(lái)自NXP中國(guó)區(qū)SE團(tuán)隊(duì)的資深USB專(zhuān)家梁平老師提供了寶貴的理論指導(dǎo)意見(jiàn)。在二位同事的熱心幫助下,才使本文設(shè)計(jì)的實(shí)驗(yàn)?zāi)艹晒?shí)現(xiàn),并發(fā)布本文章。

在此,小編向二位表示深深的感謝!

相關(guān)推薦

電子產(chǎn)業(yè)圖譜