前言
為啥是TinyUSB?給強(qiáng)大的RT配個(gè)輕巧的USB棧!
USB這個(gè)讓我們方便快捷的接口,幾乎無(wú)處不在。在嵌入式世界里,尤其是用上了像NXP i.MX RT這樣性能強(qiáng)勁的跨界MCU,我們自然希望它能輕松駕馭USB通信。官方所提供的示例只涵蓋了USB基礎(chǔ)類(lèi),對(duì)于諸如ECM、NCM等特定類(lèi)的開(kāi)發(fā)而言,若要從頭開(kāi)始構(gòu)建,有可能會(huì)拖延客戶項(xiàng)目的推進(jìn)。
這時(shí)候,TinyUSB閃亮登場(chǎng)!
想象一下,一個(gè)開(kāi)源(MIT 協(xié)議)、輕量級(jí)、跨平臺(tái)、示例友好的USB協(xié)議棧,是不是有點(diǎn)小激動(dòng)?
選擇TinyUSB的幾大優(yōu)勢(shì):
-
輕巧高效:資源占用小,對(duì)內(nèi)存和 Flash 都很友好。對(duì)于性能本就充裕的RT系列,更是能跑得飛起
-
功能全面:支持常見(jiàn)的設(shè)備類(lèi)(CDC, MSC, HID, MIDI, Vendor等)和主機(jī)功能,甚至復(fù)雜的復(fù)合設(shè)備也不在話下。你想讓你的RT板子變成U盤(pán)、虛擬串口、鍵盤(pán)鼠標(biāo)?TinyUSB都能幫你搞定
-
易于移植:清晰的架構(gòu)設(shè)計(jì)和OSAL,無(wú)論是裸機(jī)還是RTOS環(huán)境,移植起來(lái)都相對(duì)順暢
-
社區(qū)活躍 & 開(kāi)源免費(fèi):MIT協(xié)議方便客戶使用。同時(shí)提供了大量的例程,即使是初學(xué)者也可以通過(guò)這個(gè)項(xiàng)目入門(mén)USB開(kāi)發(fā)
一、準(zhǔn)備事項(xiàng):裝備檢查
動(dòng)手之前,確保你的“武器庫(kù)”齊全:
-
硬件平臺(tái):一塊NXPi.MX RT開(kāi)發(fā)板,本文以RT1060-EVK為例,和能把它“安排”明白的調(diào)試器(JLink或LinkServer都行)。
-
軟件工具:
-
MCUXpresso IDE: NXP 的官方 IDE,我們的主戰(zhàn)場(chǎng)(版本越新越好)
-
Git: 版本控制神器,管理代碼和子模塊的必備佳品
-
Make: 構(gòu)建工具,跑 TinyUSB 自帶腳本會(huì)用到
-
Python: 同樣是跑腳本用
開(kāi)辟工作目錄并獲取TinyUSB源碼。創(chuàng)建項(xiàng)目文件夾,然后用 Git 初始化,拉取TinyUSB庫(kù)。
|
mkdir //TinyUSB_Porting
|
把TinyUSB官方倉(cāng)庫(kù)加進(jìn)來(lái),用子模塊的方式,既能保持項(xiàng)目整潔,又能方便地到最新版。
|
git submodule add https://github.com/hathach/tinyusb.git tinyusb
|
二、小試牛刀:命令行下的“熱身運(yùn)動(dòng)”
在直接跳進(jìn)IDE的“大坑”之前,咱們先在命令行下跑個(gè)官方示例,確保TinyUSB和 NXP的底層驅(qū)動(dòng)能跑通,能避免很多不必要的麻煩。
步驟1: 選個(gè)入門(mén)示例開(kāi)動(dòng)
TinyUSB 的examples/device 目錄下有很多好玩的示例。我們就選 cdc_msc 這個(gè)經(jīng)典的“二合一”設(shè)備(虛擬串口 + U盤(pán))開(kāi)刀。
|
cd tinyusb/examples/device/cdc_msc
|
步驟2:TinyUSB獲取NXP的依賴項(xiàng)
TinyUSB支持很多芯片和開(kāi)發(fā)板,對(duì)于NXP RT,它提供了腳本來(lái)自動(dòng)下載 MCUXpresso SDK的相關(guān)驅(qū)動(dòng)。
|
# 告訴 Make 我們用的是 RT1060EVK 板子
|
??!友情提示:NXP 的 Kinetis、LPC、MCX等系列需要用不同的參數(shù)去拉取各自的依賴包,別搞混了,對(duì)于同一個(gè)系列的MCU,只需要拉取一次就可以了。
步驟3: 編譯!看看會(huì)不會(huì)“炸”
是時(shí)候檢驗(yàn)成果了。用Make命令編譯這個(gè)示例:
|
# 參數(shù)解釋?zhuān)?br />
# BOARD=mimxrt1060_evk - 目標(biāo)板
|

步驟4: 下載!是騾子是馬拉出來(lái)遛遛
把編譯好的固件燒錄到你的RT板子上,插上USB線(連接到板子的 USB Device 端口)。如果你的電腦成功識(shí)別出一個(gè)U盤(pán),那就穩(wěn)了!這證明TinyUSB和NXP底層驅(qū)動(dòng)這對(duì)“CP”在你這塊板子上是能正常工作的。
三、主戰(zhàn)場(chǎng):MCUXpresso IDE集成
熱身完畢,該進(jìn)入主戰(zhàn)場(chǎng)——MCUXpresso IDE了。我們要把TinyUSB“塞”進(jìn)一個(gè)標(biāo)準(zhǔn)的IDE工程里。
步驟1: 建立“根據(jù)地” (創(chuàng)建基礎(chǔ)工程)
在 IDE 里,為你的 RT MCU創(chuàng)建一個(gè)新的工程。你可以從 hello_world 這種簡(jiǎn)單的 SDK 示例開(kāi)始,或者干脆創(chuàng)建一個(gè)只包含必要驅(qū)動(dòng)的空工程。確保這個(gè)基礎(chǔ)工程能獨(dú)立編譯、下載、運(yùn)行。
步驟2: 給 TinyUSB 安個(gè)“家” (添加源碼文件夾)
為了不讓項(xiàng)目結(jié)構(gòu)亂成一鍋粥,我們?cè)?IDE 里給 TinyUSB 單獨(dú)創(chuàng)建一個(gè)“家”(源文件夾)。
1.右鍵項(xiàng)目-> New -> Source Folder。
2.取個(gè)名字,比如tinyusb。
步驟3: 搬運(yùn) TinyUSB 的“家當(dāng)” (復(fù)制核心文件)
把之前 Git 下載的 tinyusb/src目錄下的核心文件復(fù)制到剛創(chuàng)建的 tinyusb 文件夾里。注意只選擇需要的device端代碼即可。主要包括:
-
src/common: 通用工具函數(shù)
-
src/device: USB 設(shè)備協(xié)議棧核心代碼
-
src/class: 你需要用到的 USB 功能類(lèi)驅(qū)動(dòng)(比如cdc, msc)
-
src/osal: 操作系統(tǒng)抽象層
-
src/portable/nxp/chipidea/ci_hs和nxp/ehci: NXP RT 芯片上USB 控制器的底層驅(qū)動(dòng)
-
src/tusb.c, src/tusb.h:TinyUSB 的主入口和核心頭文件
-
src/tusb_option.h: 默認(rèn)編譯選項(xiàng)

步驟4: 把“說(shuō)明書(shū)”和“應(yīng)用代碼”也拿過(guò)來(lái) (復(fù)制配置和示例文件)
cdc_msc 示例能跑起來(lái),還需要幾個(gè)關(guān)鍵的配置文件和應(yīng)用層代碼。把它們從 examples/device/cdc_msc/src/ 復(fù)制到 IDE 項(xiàng)目的主源碼目錄(通常叫source 或src):
-
main.c: 示例的主函數(shù)(替換掉hello_world.c)
-
msc_disk.c / .h: U盤(pán)功能的底層存儲(chǔ)接口(你需要實(shí)現(xiàn)它來(lái)讀寫(xiě)你的存儲(chǔ)器)
-
tusb_config.h: TinyUSB的配置文件。所有功能的開(kāi)關(guān)、參數(shù)都在這里調(diào)
- usb_descriptors.c / .h:USB設(shè)備的“身份證”——各種描述符。電腦就是靠這些信息來(lái)認(rèn)識(shí)設(shè)備
示例代碼會(huì)調(diào)用TinyUSB重寫(xiě)的板級(jí)初始化函數(shù)。檢查下 examples/device/cdc_msc/src/ 和 hw/bsp 目錄下類(lèi)似 board_api.h family.c 這樣的文件,有的話也一并復(fù)制到你項(xiàng)目的board 或bsp目錄。
步驟6: 給編譯器“指路” (配置 IncludePaths)
現(xiàn)在文件都搬過(guò)來(lái)了,但編譯器還不知道去哪找頭文件。我們需要在 IDE 里配置包含路徑:
-
右鍵項(xiàng)目-> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCUC Compiler -> Includes
-
點(diǎn)擊"Add...",把下面這些路徑加進(jìn)去(根據(jù)實(shí)際項(xiàng)目結(jié)構(gòu)可能需要微調(diào))

TinyUSB 用宏定義來(lái)識(shí)別目標(biāo)平臺(tái)和開(kāi)關(guān)功能。我們需要告訴它現(xiàn)在是在為誰(shuí)工作:
-
右鍵項(xiàng)目-> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCUC Compiler -> Preprocessor。
-
點(diǎn)擊"Add...",添加以下宏定義:
-
CFG_TUSB_MCU=OPT_MCU_MIMXRT1XXX: 關(guān)鍵!這就是告訴 TinyUSB:“現(xiàn)在需要跑在 NXP RT 芯片上!”
- 按需添加其他調(diào)試宏,比如 CFG_TUSB_DEBUG=2

步驟8: 配置“硬件接口” (Pin Mux 和 Clock)
別忘了硬件!它們負(fù)責(zé)開(kāi)發(fā)板上的各種PINMUX,直接使用TinyUSB中:tinyusbhwspimxrtoardsmimxrt1060_evk下提供的配置替換即可!

集成路上總會(huì)有些小坎坷:
-
SDK 組件缺失: 從hello_world工程開(kāi)始移植TinyUSB可能會(huì)缺少相關(guān)組件,比如OCOTP,可以通過(guò)MCUXpressoIDE中的管理工具很方便的添加它們。
-
family.c和board_api.h的“戲份”: 這些文件通常負(fù)責(zé)板級(jí)的初始化(比如 board_init())。確保它們已經(jīng)正確移植好!
4. TinyUSB配置文件和Class文件
-
tusb_config.h (協(xié)議棧的“控制面板”):
-
這個(gè)文件用于TinyUSB的基礎(chǔ)配置。雖然有些配置(如MCU類(lèi)型 CFG_TUSB_MCU)可能通過(guò)編譯器 -D參數(shù)傳入,但大部分基礎(chǔ)和類(lèi)相關(guān)的配置都在這里完成。
-
usb_descriptors.c / .h (設(shè)備的“身份證”和“說(shuō)明書(shū)”):
-
這里定義了所有USB 描述符:設(shè)備描述符、配置描述符、接口描述符、端點(diǎn)描述符、字符串描述符等等。
-
class文件夾:參考cdc/msc,其他類(lèi)型的示例移植方法也是類(lèi)似的。
五、勝利收官:總結(jié)展望
恭喜!如果你一路跟著走到這里,并且成功讓你的NXP RT開(kāi)發(fā)板在電腦上被識(shí)別為一個(gè) USB disk 設(shè)備,那么你已經(jīng)掌握了在MCUXpresso IDE環(huán)境下移植TinyUSB 的核心技巧。


現(xiàn)在,RTMCU已經(jīng)插上了TinyUSB的“翅膀”,可以更自由地翱翔在USB的世界里了。以此為起點(diǎn),我們可以探索TinyUSB 支持的其他USB Class (HID, MIDI, 網(wǎng)卡等)、將TinyUSB集成到你的實(shí)際項(xiàng)目中,實(shí)現(xiàn)更復(fù)雜的USB功能或者h(yuǎn)ost端協(xié)議棧!這些就留給感興趣的小伙伴來(lái)嘗試了!
[參考鏈接]:
-
https://github.com/hathach?/tinyusb
-
https://docs.tinyusb.org/en/stable/r?eference/getting_started.html
恩智浦MCU加油站
恩智浦半導(dǎo)體NXP Semiconductors N.V.(納斯達(dá)克股票代碼:NXPI)是汽車(chē)、工業(yè)物聯(lián)網(wǎng)、移動(dòng)設(shè)備和通信基礎(chǔ)設(shè)施市場(chǎng)值得信賴的合作伙伴,致力于提供創(chuàng)新解決方案。
-
mcu
+關(guān)注
關(guān)注
147文章
19103瀏覽量
403011 -
usb
+關(guān)注
關(guān)注
60文章
8472瀏覽量
285707 -
恩智浦
+關(guān)注
關(guān)注
14文章
6121瀏覽量
153100 -
i.mxrt1060
+關(guān)注
關(guān)注
1文章
3瀏覽量
3187
原文標(biāo)題:RT1060移植TinyUSB:快速擴(kuò)展大量USB Class示例
文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
在帶有 RT1060 IW612 的定制板上開(kāi)發(fā) Matter 恒溫器的問(wèn)題求解
使用 RT1060 離線學(xué)習(xí)單詞有可能嗎
i.MX 使用 SAI2 作為 TDM 從機(jī)的 RT 1060,無(wú)法正確接收接收數(shù)據(jù)怎么解決?
NXP PF3000:助力i.MX處理器的高效電源管理方案
探索NXP EdgeReady智能HMI解決方案:i.MX RT117H的無(wú)限可能
基于i.MX RT106V跨界MCU的智能語(yǔ)音UI邊緣就緒解決方案
探索NXP i.MX 93應(yīng)用處理器家族:高效邊緣計(jì)算的理想之選
探索i.MX RT1180:高性能處理器的技術(shù)剖析與應(yīng)用指南
i.MX RT1180實(shí)現(xiàn)EtherCAT+伺服控制的終極實(shí)踐
簡(jiǎn)單認(rèn)識(shí)NXP FRDM i.MX 93開(kāi)發(fā)板
恩智浦i.MX RT1180跨界MCU助力下一代伺服控制系統(tǒng)
恩智浦i.MX RT1180跨界處理器如何選型
米爾NXP i.MX 91核心板發(fā)布,助力新一代入門(mén)級(jí)Linux應(yīng)用開(kāi)發(fā)
NXP i.MX 91開(kāi)發(fā)板#支持快速創(chuàng)建基于Linux?的邊緣器件
NXP i.MX RT1060移植TinyUSB:快速擴(kuò)展大量USB Class示例

評(píng)論