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

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

NXP首款搭載MPU的FRDM產品怎么樣?FRDM i.MX93開發板開箱速覽

在i.MX RT處理器上使用PXP實現縮放和旋轉組合操作

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

i.MX Linux開發實戰指南—基于野火i.MX系列開發板
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供電

評論