
嵌入式驱动开发通信物联网【免费下载链接】tinyusbAn open source cross-platform USB stack for embedded system项目地址https://gitcode.com/gh_mirrors/ti/tinyusb点击查看免费下载TinyUSB 0.9.0 于 2021 年 3 月 12 日发布是该项目在设备栈与主机栈双线演进中的一个关键版本。本文基于 0.9.0 发布说明 系统梳理该版本的核心变更并结合当前仓库源码深入解读 HID 类驱动的破坏性 API 重构、Gamepad 报告描述符的 DPad/Hat 支持、CDC break 请求回调以及主机侧 MSC 类驱动的命名与能力升级为仍在使用 0.8.x API 的开发者提供清晰的迁移视角。版本概览0.9.0 的变更横跨设备栈与主机栈两大体系设备侧DCDDevice Controller Driver针对 RP2040、Sony CXD56、NXP Transdimension 三款控制器进行了修复与优化USBD 层修正了状态 ZLP 与端点大小校验DFU Runtime、CDC、HID、MIDI 四个设备类均有行为或 API 变更其中 HID 类是本次唯一带有 Breaking破坏性标记的改动。主机侧HCD 引入rhport参数并重构了 EHCI/OHCI 驱动抽象MSC 主机类驱动完成了一轮大规模 API 重命名与能力补全。平台与构建新增 RT-Thread 操作系统基础支持make构建可在运行时按需拉取 MCU 驱动的 git 子模块pico-sdk 升级至 v1.1.0。该版本收录于 changelog 索引 中全量贡献者名单见发布说明末尾hathach、HiFiPhile、majbthrd 等 14 位。设备控制器驱动DCD修复RP2040内存与枚举可靠性修复RP2040 控制器在 0.9.0 中得到四项重要修复集中在缓冲区管理与初始化流程修复端点缓冲区重分配越界问题Fix endpoint buffer reallocation overrun problem之前端点缓冲区动态重分配时可能越界导致相邻缓冲区被覆盖修复初始化时 osal_pico 队列溢出Fix osal_pico queue overflow in initialization初始化阶段的队列溢出可能造成事件丢失修复等时Isochronous端点在传输中的缓冲区大小计算等时传输的缓冲区尺寸此前计算有误优化硬件端点结构体以降低 RAM 占用Optimize hardware endpoint struct to reduce RAM usage通过压缩硬件端点描述结构减少内存开销修复禁用上拉时对 SE0 的枚举等待死循环检查Fix enum workaround forever check for SE0 when pull up is disabled上拉被禁用时原有的 SE0 检测逻辑可能陷入无限等待。Sony CXD56Spresense在 Spresense 上传递正确的速度信息Pass the correct speed on Spresense此前枚举上报的速度可能与实际不符修复 setup processed 标志位Fix setup processed flag确保 SETUP 阶段的状态机正确推进。NXP Transdimension更新dcd_init()以将控制器复位到设备模式Update dcd_init() to reset controller to device mode保证初始化后控制器处于正确的设备Device模式而非 Host 模式与主机侧hcd_init()的复位逻辑相对应。USB 设备栈USBD层修复USBD 层在 0.9.0 有三处行为修正直接影响类驱动的标准请求处理修复类驱动对端点返回tud_control_status()的 SET/CLEAR_FEATURE 状态 ZLP 问题Fix issue with status zlp此前类驱动通过tud_control_status()返回状态阶段时端点特性设置/清除请求可能遗漏零长度包ZLP应答导致主机端状态机卡住修正全速 Bulk 端点大小检查Correct endpoint size check for fullspeed bulk全速Fullspeed下 Bulk 端点合法的包大小应为 8、16、32、64 字节0.9.0 之前的大小校验未覆盖全部合法取值可能误拒合法描述符即使类驱动未实现 SET_INTERFACE 也予以 ACKAck SET_INTERFACE even if it is not implementedSET_INTERFACE 属于可选实现的请求此前类驱动未实现时设备会 STALL0.9.0 起默认应答成功避免主机因 STALL 而中断后续枚举流程。设备类驱动变更DFU Runtime函数重命名dfu_rt()更名为dfu_runtime()仅涉及可读性改进无行为变化。DFU设备固件升级Runtime 接口用于在应用运行时切换到 DFU 模式。CDC支持 break 请求与接收行为调整0.9.0 为 CDC 设备类新增 break 请求回调// 新增回调当主机发送 SET_FEATURE(BREAK) 时被调用 // duration_msbreak 持续时间毫秒 TU_ATTR_WEAK void tud_cdc_send_break_cb(uint8_t itf, uint16_t duration_ms);该回调在 cdc_device.c 中通过弱符号TU_ATTR_WEAK定义应用只需按需覆写从源码看它是在设备栈解析到 break 请求request-wValue时被调用的应用可在其中驱动 UART 的 break 信号线或做其他业务处理。对应接口声明位于 cdc_device.h。同时 CDC 接收行为有一个次要行为变化当tud_cdc_rx_wanted_cb()被触发时wanted_char可能不再是 FIFO 中的最后一个字节。这意味着应用不应假设目标字符之后没有更多数据需要基于 FIFO 实际可读数据量自行处理。HIDBreaking 变更——为多实例引入接口索引参数0.9.0 对 HID 类驱动 API 做了破坏性重构为所有主要回调增加接口interface参数以支持设备上挂载多个 HID 实例如同时存在键盘 鼠标 手柄。签名发生变化的回调共 5 个tud_hid_descriptor_report_cb()tud_hid_get_report_cb()tud_hid_set_report_cb()tud_hid_boot_mode_cb()tud_hid_set_idle_cb()从当前仓库 hid_device.c 看这套接口索引设计延续至今回调首个参数即 HID 接口实例索引例如uint8_t const * tud_hid_descriptor_report_cb(uint8_t instance); uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen); void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize); bool tud_hid_set_idle_cb(uint8_t instance, uint8_t idle_rate);对应声明见 hid_device.h。这些回调在设备栈处理报告描述符、GET_REPORT、SET_REPORT、SET_IDLE、OUT 报告等请求时按实例分发调用是 0.9.0 多 HID 实例支持的核心机制。迁移注意升级到 0.9.0 的应用必须为上述回调统一补上itf/instance形参并按实例区分返回报告描述符与处理报告否则编译报错且多实例场景行为不正确。HID新增报告完成回调除上述签名变更外0.9.0 新增了tud_hid_report_complete_cb()在 HID 报告发送完成后回调用于获知 IN 端点传输结束void tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, uint16_t len);当前源码 hid_device.c 在 IN 传输完成时以实际传输字节数调用它。该回调对需要发送完再切换状态如游戏手柄摇杆上报后复位、上报节流的典型场景非常有用。HIDGamepad 增加 DPad/Hat 支持这是 0.9.0 最受关注的设备侧功能增强。发布说明指出TUD_HID_REPORT_DESC_GAMEPAD()宏升级为支持 16 个按钮、2 个摇杆、1 个 DPad/Hat新增hid_gamepad_report_t数据结构以及GAMEPAD_BUTTON_与GAMEPAD_HAT_枚举将 Gamepad 加入hid_composite/hid_composite_freertos示例对应示例目录 examples/device/hid_composite 与 examples/device/hid_composite_freertos。报告结构hid_gamepad_report_t定义于 hid.h紧凑打包为typedef struct TU_ATTR_PACKED { int8_t x; // 左摇杆 X 轴增量 int8_t y; // 左摇杆 Y 轴增量 int8_t z; // 右摇杆 Z 轴 int8_t rz; // 右摇杆 Rz 轴 int8_t rx; // 左扳机trigger轴 int8_t ry; // 右扳机trigger轴 uint8_t hat; // DPad/Hat 方向掩码 uint32_t buttons; // 按钮位掩码 } hid_gamepad_report_t;按钮枚举GAMEPAD_BUTTON_0~GAMEPAD_BUTTON_31以TU_BIT(n)位掩码定义并提供了与 Linux input 事件码一致的语义别名hid.h#define GAMEPAD_BUTTON_A GAMEPAD_BUTTON_0 // SOUTH #define GAMEPAD_BUTTON_B GAMEPAD_BUTTON_1 // EAST #define GAMEPAD_BUTTON_X GAMEPAD_BUTTON_3 // NORTH #define GAMEPAD_BUTTON_Y GAMEPAD_BUTTON_4 // WEST #define GAMEPAD_BUTTON_SELECT GAMEPAD_BUTTON_10 #define GAMEPAD_BUTTON_START GAMEPAD_BUTTON_11 #define GAMEPAD_BUTTON_THUMBL GAMEPAD_BUTTON_13 #define GAMEPAD_BUTTON_THUMBR GAMEPAD_BUTTON_14Hat 枚举GAMEPAD_HAT_以角度方位编码GAMEPAD_HAT_CENTERED 0居中顺时针依次为 UP(1)、UP_RIGHT(2)、RIGHT(3)、DOWN_RIGHT(4)、DOWN(5)、DOWN_LEFT(6)、LEFT(7)、UP_LEFT(8)hid.h。报告描述符模板TUD_HID_REPORT_DESC_GAMEPAD()定义于 hid_device.h0.9.0 起加入 Hat 段整体布局为6 个 8 位模拟轴X、Y、Z、Rz、Rx、Ry逻辑范围-127 ~ 127HID_LOGICAL_MIN(0x81)/HID_LOGICAL_MAX(0x7f)1 个 8 位 DPad/Hat 开关HID_USAGE_DESKTOP_HAT_SWITCH逻辑范围1 ~ 8、物理范围0 ~ 315度步进 45 度32 个 1 位按钮HID_USAGE_MIN(1)~HID_USAGE_MAX(32)。说明0.9.0 发布时按钮数为 16 个当前仓库的模板已演进为 32 个按钮按钮位掩码为 32 bit与buttons字段的uint32_t类型对应结构与 0.9.0 引入的设计一脉相承。开发者在实现手柄类设备时可直接复用该模板并填充hid_gamepad_report_t。MIDI三处修复修复 FIFO 满时丢 MIDI sysex 消息Fix dropping MIDI sysex message when fifo is full系统专属消息SysEx往往很长此前 FIFO 打满会导致报文被静默丢弃0.9.0 修复了溢出路径修复tud_midi_write24()中 cable 与 channel 的参数拼写问题Fix typo使示例中 cable number 与 channel 的语义不再混淆便于正确区分 USB 端点 cable 与 MIDI 通道修正错误的端点描述符长度Fix incorrect endpoint descriptor lengthMIDI v1 走 Audio v1 类规范其端点描述符应为 9 字节而非 7 字节此修复保证 MIDI 端点描述符在枚举时合法。主机控制器驱动HCD重构0.9.0 对主机侧控制器层做了一次影响面较大的抽象重构为hcd_init()增加rhport参数Add rhport to hcd_init()根端口root port索引被显式传入为多根端口控制器做准备改进 EHCI/OHCI 驱动抽象将ehci/ohci驱动文件迁移至 portable 目录对应 ehci 与 ohci将hcd_lpc18_43更名为hcd_transdimension以hcd_ehci_init()、hcd_ehci_register_addr()等子 API 组织 EHCI 初始化与寄存器地址注册更新 NXP Transdimensionhcd_init()以复位控制器到 Host 模式并完成该 HCD 向 i.MX RT10xxrt10xx的移植。这些改动使 EHCI/OHCI 风格的控制器可以共享通用逻辑同时保留各芯片的寄存器接入差异。主机类驱动MSC 大规模 API 演进0.9.0 中主机侧 MSC 类驱动Mass Storage Class经历了一轮彻底的能力补全与命名统一这是本次发布在主机栈侧的核心内容。API 重命名与设备栈命名风格对齐0.8.x 旧名称0.9.0 新名称tuh_msc_scsi_inquiry()tuh_msc_inquiry()tuh_msc_mounted_cb()tuh_msc_mount_cb()tuh_msc_unmounted_cb()tuh_msc_unmount_cb()tuh_msc_is_busy()tuh_msc_ready()重命名方向明确去掉冗余的scsi_前缀、回调去掉ed后缀以匹配设备栈如tud_xxx_cb的命名习惯、is_busy()改为更语义化的ready()。当前仓库 msc_host.h 中的 API 形态与 0.9.0 的命名完全一致。新增能力读写命令新增tuh_msc_read10()与tuh_msc_write10()封装 SCSI READ(10)/WRITE(10) 命令供应用按 LBA逻辑块地址读写磁盘容量查询新增tuh_msc_get_block_count()与tuh_msc_get_block_size()分别返回指定 LUN 的块数量与块大小枚举集成Read_Capacity读容量作为设备枚举流程的一部分被自动调用挂载回调触发时即可直接查询容量信息多 LUN 配置新增CFG_TUH_MSC_MAXLUN默认值 4用于在主机侧为每个 MSC 设备预留 LUN 容量表。当前源码 msc_host.h 仍保留该默认定义。#ifndef CFG_TUH_MSC_MAXLUN #define CFG_TUH_MSC_MAXLUN 4 // 默认支持最多 4 个 LUN #endif主机侧 MSC 的典型应用如 msc_file_explorer 示例从此不再需要自行实现读容量逻辑可直接基于tuh_msc_mount_cb()内获取的块数/块大小组织文件系统访问。其他平台与构建改进RT-Thread 操作系统支持0.9.0 为 TinyUSB 增加了 RT-Thread 的基础支持包括 OSAL 移植与 BSP 集成。当前仓库保留了两处直接证据osal_rtthread.h将 TinyUSB 的osal_*抽象映射到 RT-Thread 的互斥锁、信号量、队列原语lib/rt-thread包含tusb_config.hRT-Thread 场景下的配置模板与 tusb_rt_thread_port.c移植端口实现并提供SConscript便于集成到 RT-Thread 的 scons 构建体系。同时发布说明提到将零位字段zero bitfield length改为更显式的 padding消除编译器对长度为 0 的位域的警告与可移植性隐患——这类声明在 USB 描述符结构体中很常见改动直接影响协议结构体的内存布局一致性。构建系统改进按需拉取子模块Build example now fetch required submodules on the fly运行make时构建系统会自动拉取对应 MCU 驱动的 git 子模块无需开发者预先执行submodule init降低上手门槛pico-sdk 升级至 v1.1.0RP2040 平台示例同步跟进新 SDK。新增板卡0.9.0 新增三块开发板支持对应 BSP 家族目录如下新板卡对应 BSP 家族Microchip SAM E54 Xplained Prosamd5x_e5xLPCXpresso 55s28lpc55LPCXpresso 18s37lpc18迁移与升级要点总结对从 0.8.x 升级到 0.9.0 的开发者需重点处理三处变更HID 回调签名Breaking5 个tud_hid_*_cb()回调必须增加接口索引形参多实例 HID 设备如键盘 手柄组合建议立即用该参数区分实例主机 MSC API 重命名tuh_msc_scsi_inquiry/tuh_msc_mounted_cb/tuh_msc_unmounted_cb/tuh_msc_is_busy四类旧符号已删除需机械替换为新名称控制器初始化语义NXP Transdimension 平台dcd_init()/hcd_init()的复位方向更明确设备模式 / Host 模式依赖旧初始化行为的自定义 BSP 需复核。其余修复RP2040 缓冲区越界、MIDI sysex 丢失、全速 Bulk 端点大小校验、SET_INTERFACE 默认 ACK 等均为透明行为修正升级后直接受益。关于 0.9.0 之后的演进历史可继续参阅 changelog 索引 中各后续版本的发布说明。赞分享嵌入式驱动开发通信物联网【免费下载链接】tinyusbAn open source cross-platform USB stack for embedded system项目地址https://gitcode.com/gh_mirrors/ti/tinyusb点击查看免费下载相关推荐TinyUSB主机栈实战HID/MSC/CDC三大类设备通信开发TinyUSB主机栈实战HID/MSC/CDC三大类设备通信开发 引言嵌入式USB主机开发的痛点与解决方案 在嵌入式系统开发中实现USB主机功能往往面临诸嵌入式驱动开发通信物联网TinyUSB 0.21.0 版本解析新增 MCU 支持、异步主机栈重构与 MIDI 2.0 双栈驱动TinyUSB 0.21.0 版本解析新增 MCU 支持、异步主机栈重构与 MIDI 2.0 双栈驱动 本文基于 docs/changelog/0.21.0.嵌入式驱动开发通信物联网TinyUSB 0.14.0 版本深度解析USBH 主机栈 API 重构、双角色支持与音频反馈端点实战TinyUSB 0.14.0 版本深度解析USBH 主机栈 API 重构、双角色支持与音频反馈端点实战 版本发布说明 本文以 TinyUSB 0.14.0嵌入式驱动开发通信物联网上一篇如何利用PSBits绕过AppLocker完整实战教程下一篇UFLO2企业级工作流系统快速搭建业务流程管理平台的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考