hathach/tinyusb
GitHub: hathach/tinyusb
一个为嵌入式系统设计的开源跨平台USB Host和Device协议栈,强调线程安全、内存安全和高移植性。
Stars: 6561 | Forks: 1370
# TinyUSB
|构建状态| |CircleCI 状态| |文档状态| |静态分析| |模糊测试状态| |Membrowse| |许可证|
## 概述
.. figure:: docs/assets/logo.svg
:alt: TinyUSB
:align: left
.. raw:: html
TinyUSB 是一个用于嵌入式系统的开源跨平台 USB Host/Device 协议栈。它专为内存安全(无动态分配)和线程安全(所有中断都延迟到非 ISR 任务函数)而设计。该协议栈强调跨 50 多个 MCU 系列的可移植性、小内存占用和实时性能。
## 关键特性
* **线程安全:** USB 中断延迟到任务上下文处理
* **内存安全:** 无动态分配,所有缓冲区均为静态
* **可移植:** 支持 50 多个 MCU 系列
* **全面:** 包含 CDC、HID、MSC、Audio 和 Host 支持
* **RTOS 友好:** 支持裸机、FreeRTOS、RT-Thread 和 Mynewt
.. figure:: docs/assets/stack.svg
:width: 500px
:align: left
:alt: stackup
.. raw:: html
::
```
.
├── docs # Documentation
├── examples # Examples with make and cmake build system
├── hw
│ ├── bsp # Supported boards source files
│ └── mcu # Low level mcu core & peripheral drivers
├── lib # Sources from 3rd party such as FreeRTOS, FatFs ...
├── src # All sources files for TinyUSB stack itself.
├── test # Tests: unit test, fuzzing, hardware test
└── tools # Files used internally
```
## 快速入门
请参阅 `在线文档 `_ 以获取有关使用 TinyUSB 及其实现方式的信息。
查看 `入门指南`_ 以将 TinyUSB 添加到您的项目或构建示例。如果您是 TinyUSB 的新手,我们建议从 ``cdc_msc`` 示例开始。有一些 `支持的开发板`_ 应该可以直接开箱即用。
我们使用 `GitHub Discussions `_ 作为我们的论坛。这是一个向社区提问、寻求建议或讨论基于 TinyUSB 项目的好地方。
对于 Bug 和功能请求,请 `提出 issue `_ 并遵循那里的模板。
请参阅 `移植`_ 指南以添加对新 MCU 和开发板的支持。
## Device 协议栈
支持通过动态更改 USB 描述符来实现多设备配置,以及挂起、恢复和远程唤醒等低功耗功能。支持以下设备类:
- Audio Class 2.0 (UAC2)
- 蓝牙主机控制器接口 (BTH HCI)
- 通信设备类 (CDC)
- 设备固件升级 (DFU):DFU 模式(WIP)和 Runtime
- 人机接口设备 (HID):Generic (In & Out)、键盘、鼠标、游戏手柄等...
- 打印机类
- 大容量存储类 (MSC):支持多个 LUN
- 音乐设备数字接口 (MIDI)
- 媒体传输协议 (MTP/PTP)
- 网络:RNDIS、以太网控制模型 (ECM)、网络控制模型 (NCM)
- 测试与测量类 (USBTMC)
- Video 类 1.5 (UVC):开发中
- 带有通用 In & Out 端点的供应商特定类支持。可与 MS OS 2.0 兼容描述符一起使用,以在没有 INF 文件的情况下加载 winUSB 驱动程序。
- 带有供应商特定类的 `WebUSB `__
如果您有特殊需求,可以使用 ``usbd_app_driver_get_cb()`` 编写自己的类驱动程序,而无需修改协议栈。以下是 RPi 团队添加其重置接口的方法 `raspberrypi/pico-sdk#197 `_
## Host 协议栈
- 通信设备类:CDC-ACM
- USB 供应商串口:FTDI、CP210x、CH34x、PL2303
- 人机接口设备 (HID):键盘、鼠标、Generic
- 大容量存储类 (MSC)
- 音乐设备数字接口 (MIDI)
- 支持多级的 Hub
与 Device 协议栈类似,如果您有特殊需求,可以使用 ``usbh_app_driver_get_cb()`` 编写自己的类驱动程序,而无需修改协议栈。
## Power Delivery 协议栈
- 支持 USB Type-C 的 Power Delivery 3.0 (PD3.0) (WIP)
- 处于超级早期阶段,仅用于测试
- 仅支持 STM32 G4
## OS 抽象层
TinyUSB 通过将所有中断服务请求 (ISR) 事件推送到中央队列,然后在非 ISR 上下文任务函数中稍后处理,从而实现完全线程安全。它还使用信号量/互斥锁来访问共享资源,例如通信设备类 (CDC) FIFO。因此,该协议栈需要使用一些操作系统的基本 API。以下操作系统已经开箱即用支持。
- **No OS**
- **FreeRTOS**
- `RT-Thread `_: `仓库 `_
- **Mynewt** 由于 newt 包构建系统,Mynewt 示例最好放在其 `自己的仓库 `_ 中
## 支持的 CPU
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| Manufacturer | Family | Device | Host | Highspeed | Driver | Note |
+==============+=============================+========+======+===========+========================+====================+
| Allwinner | F1C100s/F1C200s | ✔ | | ✔ | sunxi | musb variant |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| Analog | MAX3421E | | ✔ | ✖ | max3421 | via SPI |
| +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | MAX32 650, 666, 690, | ✔ | | ✔ | musb | 1-dir ep |
| | MAX78002 | | | | | |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| Artery AT32 | F403a_407, F413 | ✔ | | | fsdev | 512 USB RAM |
| +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | F415, F435_437, F423, | ✔ | ✔ | | dwc2 | |
| | F425, F45x | | | | | |
| +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | F402_F405 | ✔ | ✔ | ✔ | dwc2 | F405 is HS |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| Bridgetek | FT90x | ✔ | | ✔ | ft9xx | 1-dir ep |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| Broadcom | BCM2711, BCM2837 | ✔ | | ✔ | dwc2 | |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| Dialog | DA1469x | ✔ | ✖ | ✖ | da146xx | |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| Espressif | S2, S3 | ✔ | ✔ | ✖ | dwc2 | |
| ESP32 +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | P4 | ✔ | ✔ | ✔ | dwc2 | |
| +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | H4 | ✔ | ✔ | ✖ | dwc2 | |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| GigaDevice | GD32VF103 | ✔ | | ✖ | dwc2 | |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| HPMicro | HPM6750 | ✔ | ✔ | ✔ | ci_hs, ehci | |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| Infineon | XMC4500 | ✔ | ✔ | ✖ | dwc2 | |
+--------------+-----+-----------------------+--------+------+-----------+------------------------+--------------------+
| MicroChip | SAM | D11, D21, L21, L22 | ✔ | | ✖ | samd | |
| | +-----------------------+--------+------+-----------+------------------------+--------------------+
| | | D51, E5x | ✔ | | ✖ | samd | |
| | +-----------------------+--------+------+-----------+------------------------+--------------------+
| | | G55 | ✔ | | ✖ | samg | 1-dir ep |
| | +-----------------------+--------+------+-----------+------------------------+--------------------+
| | | E70,S70,V70,V71 | ✔ | | ✔ | samx7x | 1-dir ep |
| +-----+-----------------------+--------+------+-----------+------------------------+--------------------+
| | PIC | 24 | ✔ | | | pic | ci_fs variant |
| | +-----------------------+--------+------+-----------+------------------------+--------------------+
| | | 32 mm, mk, mx | ✔ | | | pic | ci_fs variant |
| | +-----------------------+--------+------+-----------+------------------------+--------------------+
| | | dsPIC33 | ✔ | | | pic | ci_fs variant |
| | +-----------------------+--------+------+-----------+------------------------+--------------------+
| | | 32mz | ✔ | | | pic32mz | musb variant |
+--------------+-----+-----------------------+--------+------+-----------+------------------------+--------------------+
| MindMotion | mm32 | ✔ | | ✖ | mm32f327x_otg | ci_fs variant |
+--------------+-----+-----------------------+--------+------+-----------+------------------------+--------------------+
| NordicSemi | nRF 52833, 52840, 5340 | ✔ | ✖ | ✖ | nrf5x | only ep8 is ISO |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| Nuvoton | NUC120 | ✔ | ✖ | ✖ | nuc120 | |
| +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | NUC121/NUC125, NUC126 | ✔ | ✖ | ✖ | nuc121 | |
| +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | NUC505 | ✔ | | ✔ | nuc505 | |
+--------------+---------+-------------------+--------+------+-----------+------------------------+--------------------+
| NXP | iMXRT | RT 10xx, 11xx | ✔ | ✔ | ✔ | ci_hs, ehci | |
| +---------+-------------------+--------+------+-----------+------------------------+--------------------+
| | Kinetis | KL | ✔ | ⚠ | ✖ | ci_fs, khci | |
| | +-------------------+--------+------+-----------+------------------------+--------------------+
| | | K32L2 | ✔ | | ✖ | khci | ci_fs variant |
| +---------+-------------------+--------+------+-----------+------------------------+--------------------+
| | LPC | 11u, 13, 15 | ✔ | ✖ | ✖ | lpc_ip3511 | |
| | +-------------------+--------+------+-----------+------------------------+--------------------+
| | | 17, 40 | ✔ | ⚠ | ✖ | lpc17_40, ohci | |
| | +-------------------+--------+------+-----------+------------------------+--------------------+
| | | 18, 43 | ✔ | ✔ | ✔ | ci_hs, ehci | |
| | +-------------------+--------+------+-----------+------------------------+--------------------+
| | | 51u | ✔ | ✖ | ✖ | lpc_ip3511 | |
| | +-------------------+--------+------+-----------+------------------------+--------------------+
| | | 54, 55 | ✔ | | ✔ | lpc_ip3511 | |
| +---------+-------------------+--------+------+-----------+------------------------+--------------------+
| | MCX | N9 | ✔ | | ✔ | ci_fs, ci_hs, ehci | |
| | +-------------------+--------+------+-----------+------------------------+--------------------+
| | | A15 | ✔ | | | ci_fs | |
| +---------+-------------------+--------+------+-----------+------------------------+--------------------+
| | RW61x | ✔ | ✔ | ✔ | ci_hs, ehci | |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| Raspberry Pi | RP2040, RP2350 | ✔ | ✔ | ✖ | rp2040, pio_usb | |
+--------------+-----+-----------------------+--------+------+-----------+------------------------+--------------------+
| Renesas | RX | 63N, 65N, 72N | ✔ | ✔ | ✖ | rusb2 | |
| +-----+-----------------------+--------+------+-----------+------------------------+--------------------+
| | RA | 4M1, 4M3, 6M1 | ✔ | ✔ | ✖ | rusb2 | |
| | +-----------------------+--------+------+-----------+------------------------+--------------------+
| | | 6M5 | ✔ | ✔ | ✔ | rusb2 | |
+--------------+-----+-----------------------+--------+------+-----------+------------------------+--------------------+
| Silabs | EFM32GG12 | ✔ | | ✖ | dwc2 | |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| Sony | CXD56 | ✔ | ✖ | ✔ | cxd56 | |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| ST STM32 | F0, F3, L0, L1, L5, WBx5 | ✔ | ✖ | ✖ | stm32_fsdev | |
| +----+------------------------+--------+------+-----------+------------------------+--------------------+
| | F1 | 102, 103 | ✔ | ✖ | ✖ | stm32_fsdev | 512 USB RAM |
| | +------------------------+--------+------+-----------+------------------------+--------------------+
| | | 105, 107 | ✔ | ✔ | ✖ | dwc2 | |
| +----+------------------------+--------+------+-----------+------------------------+--------------------+
| | F2, F4, F7, H7, H7RS | ✔ | ✔ | ✔ | dwc2 | |
| +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | C0, G0, H5, U3 | ✔ | ✔ | ✖ | stm32_fsdev | 2KB USB RAM |
| +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | G4 | ✔ | ✖ | ✖ | stm32_fsdev | 1KB USB RAM |
| +----+------------------------+--------+------+-----------+------------------------+--------------------+
| | L4 | 4x2, 4x3 | ✔ | ✖ | ✖ | stm32_fsdev | 1KB USB RAM |
| | +------------------------+--------+------+-----------+------------------------+--------------------+
| | | 4x5, 4x6, 4+ | ✔ | ✔ | ✖ | dwc2 | |
| +----+------------------------+--------+------+-----------+------------------------+--------------------+
| | N6 | ✔ | ✔ | ✔ | dwc2 | |
| +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | U0 | ✔ | ✖ | ✖ | stm32_fsdev | 1KB USB RAM |
| +----+------------------------+--------+------+-----------+------------------------+--------------------+
| | U5 | 535, 545 | ✔ | ✔ | ✖ | stm32_fsdev | 2KB USB RAM |
| | +------------------------+--------+------+-----------+------------------------+--------------------+
| | | 575, 585 | ✔ | ✔ | ✖ | dwc2 | |
| | +------------------------+--------+------+-----------+------------------------+--------------------+
| | | 59x,5Ax,5Fx,5Gx | ✔ | ✔ | ✔ | dwc2 | |
+--------------+----+------------------------+--------+------+-----------+------------------------+--------------------+
| TI | MSP430 | ✔ | ✖ | ✖ | msp430x5xx | |
| +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | MSP432E4, TM4C123 | ✔ | | ✖ | musb | |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| ValentyUSB | eptri | ✔ | ✖ | ✖ | eptri | |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
| WCH | CH32F20x | ✔ | | ✔ | ch32_usbhs | |
| +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | CH32V20x | ✔ | | ✖ | stm32_fsdev/ch32_usbfs | |
| +-----------------------------+--------+------+-----------+------------------------+--------------------+
| | CH32V305, CH32V307 | ✔ | | ✔ | ch32_usbfs/hs | |
+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+
## 表格图例
========= =========================
✔ 支持
⚠ 部分支持
✖ 硬件不支持
\[空\] 未知
========= =========================
## 开发工具
以下工具免费提供以支持 TinyUSB 项目的开发:
- `IAR Build Tools (CX) `_ 用于嵌入式开发的专业 IDE 和编译器。
- `JetBrains CLion `_ 用于 C 和 C++ 开发的跨平台 IDE。
- `PVS-Studio `_ 用于 C、C++、C# 和 Java 代码的静态分析器。
.. |Build Status| image:: https://github.com/hathach/tinyusb/actions/workflows/build.yml/badge.svg
:target: https://github.com/hathach/tinyusb/actions/workflows/build.yml
.. |CircleCI Status| image:: https://dl.circleci.com/status-badge/img/circleci/4AYHvUhFxdnY4rA7LEsdqW/QmrpoL2AjGqetvFQNqtWyq/tree/master.svg?style=svg
:target: https://dl.circleci.com/status-badge/redirect/circleci/4AYHvUhFxdnY4rA7LEsdqW/QmrpoL2AjGqetvFQNqtWyq/tree/master
.. |Documentation Status| image:: https://readthedocs.org/projects/tinyusb/badge/?version=latest
:target: https://docs.tinyusb.org/en/latest/?badge=latest
.. |Static Analysis| image:: https://github.com/hathach/tinyusb/actions/workflows/static_analysis.yml/badge.svg
:target: https://github.com/hathach/tinyusb/actions/workflows/static_analysis.yml
.. |Fuzzing Status| image:: https://oss-fuzz-build-logs.storage.googleapis.com/badges/tinyusb.svg
:target: https://oss-fuzz-build-logs.storage.googleapis.com/index.html#tinyusb
.. |Membrowse| image:: https://membrowse.com/badge.svg
:target: https://membrowse.com/public/hathach/tinyusb
.. |License| image:: https://img.shields.io/badge/license-MIT-brightgreen.svg
:target: https://opensource.org/licenses/MIT
.. _Changelog: docs/info/changelog.rst
.. _Contributors: CONTRIBUTORS.rst
.. _Getting Started: docs/getting_started.rst
.. _Supported Boards: docs/reference/boards.rst
.. _Dependencies: docs/reference/dependencies.rst
.. _Concurrency: docs/reference/concurrency.rst
.. _Code of Conduct: CODE_OF_CONDUCT.rst
.. _Porting: docs/porting.rst
标签:CDC, DNS解析, FreeRTOS, HID, MCU, MSC, RTOS, RT-Thread, TinyUSB, USB Device, USB Host, USB协议栈, 内存安全, 单片机编程, 固件库, 实时性能, 客户端加密, 客户端加密, 嵌入式开发, 嵌入式系统, 嵌入式软件, 开源硬件, 开源项目, 无动态分配, 物联网, 物联网开发, 硬件抽象层, 线程安全, 网络安全监控, 音频类, 驱动开发