TinyUSB的设备端移植
2026-06-15
本文链接为:http://www.usbzh.com/article/detail-1717.html ,欢迎转载,转载请附上本文链接。
以下是对该 MCU 移植 TinyUSB 所需回调函数的必要性及功能分析表格。
代码中实现了 TinyUSB 设备控制驱动(DCD)层所需的接口,部分函数是必须实现的,部分为可选或内部辅助函数。
一、TinyUSB DCD 标准对外接口(协议栈直接调用)
| 函数 | 实现要求 | 核心作用 |
|---|---|---|
| dcd_init | 必须 | USB控制器硬件初始化、中断配置、EP0包长配置,拉起总线连接 |
| dcd_int_enable | 必须 | NVIC层打开USB全局中断 |
| dcd_int_disable | 必须 | NVIC层关闭USB全局中断 |
| dcd_set_address | 必须 | 暂存主机下发设备地址,发送0长度IN状态包 |
| dcd_connect | 必须 | 开启D+/D-上拉电阻,告知主机设备在线 |
| dcd_disconnect | 必须 | 关闭上拉电阻,模拟设备断开 |
| dcd_int_handler | 必须 | USB硬件中断服务函数,识别各类中断源,调用tusb_isr()上报协议栈 |
| dcd_edpt0_status_complete | 必须 | 控制传输状态阶段完成,SetAddress流程中写入硬件地址寄存器 |
| dcd_edpt_open | 必须 | 配置非0端点:传输类型、包大小、方向、Toggle、FIFO等 |
| dcd_edpt_xfer | 必须 | 启动IN/OUT端点数据传输,处理零长度包特殊逻辑 |
| dcd_edpt_stall | 必须 | 将端点置为STALL握手错误状态,EP0需单独适配硬件 |
| dcd_edpt_clear_stall | 必须 | 清除端点STALL,恢复正常数据传输 |
| dcd_sof_enable | 可选 | 开关SOF帧起始中断;不用帧定时可空实现 |
| dcd_remote_wakeup | 可选 | 输出总线恢复信号实现远程唤醒;无低功耗唤醒需求可空实现 |
| dcd_edpt_close | 可选 | 关闭单个端点;单固定配置可填空,多接口/交替设置场景必须实现 |
| dcd_edpt_close_all | 可选 | 批量关闭所有端点,多用于复位清理,栈极少主动调用 |
二、驱动内部私有辅助函数(非TinyUSB标准API,协议栈不调用)
| 函数 | 定位 | 作用说明 |
|---|---|---|
| get_device_addr | 内部辅助 | 查询当前生效USB设备地址 |
| dcd_transmit_packet | 内部辅助 | 底层IN数据包发送,分包处理大数据 |
| dcd_ep_tx_handle | 内部辅助 | IN发送完成中断处理,续发剩余数据或上报传输完成 |
| dcd_ep_rx_handle | 内部辅助 | OUT接收中断处理,拷贝FIFO数据至缓冲区并上报完成 |
| dcd_BusReset | 内部辅助 | 总线复位事件处理:清FIFO、重置Toggle、复位地址与端点状态 |
| dcd_BusSuspend | 内部辅助 | 总线挂起,切入低功耗时钟模式 |
| dcd_BusResume | 内部辅助 | 总线恢复,打开高速时钟退出低功耗 |
| dcd_EP0SendStall | 内部辅助 | EP0专用STALL硬件操作封装 |
精简结论
- 必须类接口缺一不可,缺失会导致枚举失败、数据收发异常;
- 可选接口按需填空,复杂USB设备(多接口、唤醒、切换配置)需完整实现;
- 辅助函数不对外导出,但为硬件时序、代码分层稳定运行必不可少。
TinyUSB





