前言
為啥是TinyUSB?給強大的RT配個輕巧的USB棧!
USB這個讓我們方便快捷的接口,幾乎無處不在。在嵌入式世界里,尤其是用上了像NXP i.MX RT這樣性能強勁的跨界MCU,我們自然希望它能輕松駕馭USB通信。官方所提供的示例只涵蓋了USB基礎(chǔ)類,對于諸如ECM、NCM等特定類的開發(fā)而言,若要從頭開始構(gòu)建,有可能會拖延客戶項目的推進。
這時候,TinyUSB閃亮登場!
想象一下,一個開源(MIT 協(xié)議)、輕量級、跨平臺、示例友好的USB協(xié)議棧,是不是有點小激動?
選擇TinyUSB的幾大優(yōu)勢:
-
輕巧高效:資源占用小,對內(nèi)存和 Flash 都很友好。對于性能本就充裕的RT系列,更是能跑得飛起
-
功能全面:支持常見的設(shè)備類(CDC, MSC, HID, MIDI, Vendor等)和主機功能,甚至復(fù)雜的復(fù)合設(shè)備也不在話下。你想讓你的RT板子變成U盤、虛擬串口、鍵盤鼠標?TinyUSB都能幫你搞定
-
易于移植:清晰的架構(gòu)設(shè)計和OSAL,無論是裸機還是RTOS環(huán)境,移植起來都相對順暢
-
社區(qū)活躍 & 開源免費:MIT協(xié)議方便客戶使用。同時提供了大量的例程,即使是初學者也可以通過這個項目入門USB開發(fā)
一、準備事項:裝備檢查
動手之前,確保你的“武器庫”齊全:
-
硬件平臺:一塊NXPi.MX RT開發(fā)板,本文以RT1060-EVK為例,和能把它“安排”明白的調(diào)試器(JLink或LinkServer都行)。
-
軟件工具:
-
MCUXpresso IDE: NXP 的官方 IDE,我們的主戰(zhàn)場(版本越新越好)
-
Git: 版本控制神器,管理代碼和子模塊的必備佳品
-
Make: 構(gòu)建工具,跑 TinyUSB 自帶腳本會用到
-
Python: 同樣是跑腳本用
開辟工作目錄并獲取TinyUSB源碼。創(chuàng)建項目文件夾,然后用 Git 初始化,拉取TinyUSB庫。
mkdir //TinyUSB_Porting
|
把TinyUSB官方倉庫加進來,用子模塊的方式,既能保持項目整潔,又能方便地到最新版。
git submodule add https://github.com/hathach/tinyusb.git tinyusb
|
二、小試牛刀:命令行下的“熱身運動”
在直接跳進IDE的“大坑”之前,咱們先在命令行下跑個官方示例,確保TinyUSB和 NXP的底層驅(qū)動能跑通,能避免很多不必要的麻煩。
步驟1: 選個入門示例開動
TinyUSB 的examples/device 目錄下有很多好玩的示例。我們就選 cdc_msc 這個經(jīng)典的“二合一”設(shè)備(虛擬串口 + U盤)開刀。
cd tinyusb/examples/device/cdc_msc
|
步驟2:TinyUSB獲取NXP的依賴項
TinyUSB支持很多芯片和開發(fā)板,對于NXP RT,它提供了腳本來自動下載 MCUXpresso SDK的相關(guān)驅(qū)動。
# 告訴 Make 我們用的是 RT1060EVK 板子
|
!!友情提示:NXP 的 Kinetis、LPC、MCX等系列需要用不同的參數(shù)去拉取各自的依賴包,別搞混了,對于同一個系列的MCU,只需要拉取一次就可以了。
步驟3: 編譯!看看會不會“炸”
是時候檢驗成果了。用Make命令編譯這個示例:
# 參數(shù)解釋:
|
步驟4: 下載!是騾子是馬拉出來遛遛
把編譯好的固件燒錄到你的RT板子上,插上USB線(連接到板子的 USB Device 端口)。如果你的電腦成功識別出一個U盤,那就穩(wěn)了!這證明TinyUSB和NXP底層驅(qū)動這對“CP”在你這塊板子上是能正常工作的。
三、主戰(zhàn)場:MCUXpresso IDE集成
熱身完畢,該進入主戰(zhàn)場——MCUXpresso IDE了。我們要把TinyUSB“塞”進一個標準的IDE工程里。
步驟1: 建立“根據(jù)地” (創(chuàng)建基礎(chǔ)工程)
在 IDE 里,為你的 RT MCU創(chuàng)建一個新的工程。你可以從 hello_world 這種簡單的 SDK 示例開始,或者干脆創(chuàng)建一個只包含必要驅(qū)動的空工程。確保這個基礎(chǔ)工程能獨立編譯、下載、運行。
步驟2: 給 TinyUSB 安個“家” (添加源碼文件夾)
為了不讓項目結(jié)構(gòu)亂成一鍋粥,我們在 IDE 里給 TinyUSB 單獨創(chuàng)建一個“家”(源文件夾)。
1.右鍵項目-> New -> Source Folder。
2.取個名字,比如tinyusb。
步驟3: 搬運 TinyUSB 的“家當” (復(fù)制核心文件)
把之前 Git 下載的 tinyusb/src目錄下的核心文件復(fù)制到剛創(chuàng)建的 tinyusb 文件夾里。注意只選擇需要的device端代碼即可。主要包括:
-
src/common: 通用工具函數(shù)
-
src/device: USB 設(shè)備協(xié)議棧核心代碼
-
src/class: 你需要用到的 USB 功能類驅(qū)動(比如cdc, msc)
-
src/osal: 操作系統(tǒng)抽象層
-
src/portable/nxp/chipidea/ci_hs和nxp/ehci: NXP RT 芯片上USB 控制器的底層驅(qū)動
-
src/tusb.c, src/tusb.h:TinyUSB 的主入口和核心頭文件
-
src/tusb_option.h: 默認編譯選項
步驟4: 把“說明書”和“應(yīng)用代碼”也拿過來 (復(fù)制配置和示例文件)
cdc_msc 示例能跑起來,還需要幾個關(guān)鍵的配置文件和應(yīng)用層代碼。把它們從 examples/device/cdc_msc/src/ 復(fù)制到 IDE 項目的主源碼目錄(通常叫source 或src):
-
main.c: 示例的主函數(shù)(替換掉hello_world.c)
-
msc_disk.c / .h: U盤功能的底層存儲接口(你需要實現(xiàn)它來讀寫你的存儲器)
-
tusb_config.h: TinyUSB的配置文件。所有功能的開關(guān)、參數(shù)都在這里調(diào)
- usb_descriptors.c / .h:USB設(shè)備的“身份證”——各種描述符。電腦就是靠這些信息來認識設(shè)備
示例代碼會調(diào)用TinyUSB重寫的板級初始化函數(shù)。檢查下 examples/device/cdc_msc/src/ 和 hw/bsp 目錄下類似 board_api.h family.c 這樣的文件,有的話也一并復(fù)制到你項目的board 或bsp目錄。
步驟6: 給編譯器“指路” (配置 IncludePaths)
現(xiàn)在文件都搬過來了,但編譯器還不知道去哪找頭文件。我們需要在 IDE 里配置包含路徑:
-
右鍵項目-> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCUC Compiler -> Includes
-
點擊"Add...",把下面這些路徑加進去(根據(jù)實際項目結(jié)構(gòu)可能需要微調(diào))
TinyUSB 用宏定義來識別目標平臺和開關(guān)功能。我們需要告訴它現(xiàn)在是在為誰工作:
-
右鍵項目-> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCUC Compiler -> Preprocessor。
-
點擊"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ā)板上的各種PINMUX,直接使用TinyUSB中:tinyusbhwspimxrtoardsmimxrt1060_evk下提供的配置替換即可!
集成路上總會有些小坎坷:
-
SDK 組件缺失: 從hello_world工程開始移植TinyUSB可能會缺少相關(guān)組件,比如OCOTP,可以通過MCUXpressoIDE中的管理工具很方便的添加它們。
-
family.c和board_api.h的“戲份”: 這些文件通常負責板級的初始化(比如 board_init())。確保它們已經(jīng)正確移植好!
4. TinyUSB配置文件和Class文件
-
tusb_config.h (協(xié)議棧的“控制面板”):
-
這個文件用于TinyUSB的基礎(chǔ)配置。雖然有些配置(如MCU類型 CFG_TUSB_MCU)可能通過編譯器 -D參數(shù)傳入,但大部分基礎(chǔ)和類相關(guān)的配置都在這里完成。
-
usb_descriptors.c / .h (設(shè)備的“身份證”和“說明書”):
-
這里定義了所有USB 描述符:設(shè)備描述符、配置描述符、接口描述符、端點描述符、字符串描述符等等。
-
class文件夾:參考cdc/msc,其他類型的示例移植方法也是類似的。
五、勝利收官:總結(jié)展望
恭喜!如果你一路跟著走到這里,并且成功讓你的NXP RT開發(fā)板在電腦上被識別為一個 USB disk 設(shè)備,那么你已經(jīng)掌握了在MCUXpresso IDE環(huán)境下移植TinyUSB 的核心技巧。
現(xiàn)在,RTMCU已經(jīng)插上了TinyUSB的“翅膀”,可以更自由地翱翔在USB的世界里了。以此為起點,我們可以探索TinyUSB 支持的其他USB Class (HID, MIDI, 網(wǎng)卡等)、將TinyUSB集成到你的實際項目中,實現(xiàn)更復(fù)雜的USB功能或者host端協(xié)議棧!這些就留給感興趣的小伙伴來嘗試了!
[參考鏈接]:
-
https://github.com/hathach?/tinyusb
-
https://docs.tinyusb.org/en/stable/r?eference/getting_started.html
恩智浦MCU加油站
恩智浦半導(dǎo)體NXP Semiconductors N.V.(納斯達克股票代碼:NXPI)是汽車、工業(yè)物聯(lián)網(wǎng)、移動設(shè)備和通信基礎(chǔ)設(shè)施市場值得信賴的合作伙伴,致力于提供創(chuàng)新解決方案。
-
mcu
+關(guān)注
關(guān)注
146文章
17847瀏覽量
360625 -
usb
+關(guān)注
關(guān)注
60文章
8146瀏覽量
270939 -
恩智浦
+關(guān)注
關(guān)注
14文章
5948瀏覽量
113262 -
i.mxrt1060
+關(guān)注
關(guān)注
1文章
3瀏覽量
3074
原文標題:RT1060移植TinyUSB:快速擴展大量USB Class示例
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
米爾NXP i.MX 91核心板發(fā)布,助力新一代入門級Linux應(yīng)用開發(fā)
NXP i.MX 91開發(fā)板#支持快速創(chuàng)建基于Linux?的邊緣器件

《電子發(fā)燒友電子設(shè)計周報》聚焦硬科技領(lǐng)域核心價值 第11期:2025.05.12--2025.05.16
NXP i.MX 93 開發(fā)板#提供高效的機器學習 支持高能效的邊緣計算

NXP首款搭載MPU的FRDM產(chǎn)品怎么樣?FRDM i.MX93開發(fā)板開箱速覽

在i.MX RT處理器上使用PXP實現(xiàn)縮放和旋轉(zhuǎn)組合操作

NXP專為邊緣AI打造的i.MX RT700跨界MCU到底強在哪?

i.MX Linux開發(fā)實戰(zhàn)指南—基于野火i.MX系列開發(fā)板
使用TPS65023的NXP i.MX 7電源設(shè)計

NXP Semiconductors i.MX 93處理器特性概述

使用TPS6521815 PMIC為NXP i.MX 6ULL、6UltraLite供電

使用TPS6521825和LP873347 PMIC為NXP i.MX 8M Mini和Nano供電

使用TPS6521815 PMIC為NXP i.MX 7處理器供電

使用TPS6521815 PMIC為NXP i.MX 6Solo、6DualLite供電

評論