ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RT-Thread 中的 CherryUSB:嵌入式 USB 主从协议栈架构、移植与实战指南

RT-Thread 中的 CherryUSB:嵌入式 USB 主从协议栈架构、移植与实战指南 操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载CherryUSB 是一个面向嵌入式系统带 USB IP的轻量级、可移植、高性能 USB 主机/设备协议栈在 RT-Thread 仓库中以组件形式集成于components/drivers/usb/cherryusb/。本文以该组件自带的 README.md 为主线结合仓库内的核心源码、Kconfig 配置、SConscript 构建脚本与 RT-Thread 平台适配层系统讲解 CherryUSB 的设计理念、Device/Host 双协议栈能力、资源占用、USB IP 支持矩阵以及在 RT-Thread 中如何通过 menuconfig 选配、移植并快速跑通 CDC_ACM、MSC、HID 等典型应用。阅读完本文你将掌握 CherryUSB 在 RT-Thread 中的完整使用链路从协议栈架构理解、Kconfig 裁剪、模板 demo 上手到基于 RT-Thread 设备框架的串口/磁盘/网卡等设备接入方法。一、为什么选择 CherryUSB三大设计目标CherryUSB 面向带 USB IP 的嵌入式系统设计核心目标是让开发者学得会、用得起、跑得快。其设计取舍体现在三个层面1.1 易于学习 USB代码精简逻辑简单无复杂 C 语言语法核心代码core/usbd_core.c、core/usbh_core.c保持高度可读性树状化编程代码层层递进从 USB 基础规范、枚举流程、驱动加载到 IP 驱动porting逐步展开模板化 Class 驱动与移植驱动class/下每个类驱动、port/下每个 IP 移植均有清晰模板可参考 class/template 与 port/templateAPI 分类清晰Device 侧分为初始化、注册类、命令回调、数据收发四类Host 侧分为初始化、查找类、数据收发三类开发者按类别调用即可无需理解协议栈内部细节。1.2 易于使用 USB考虑到开发者普遍熟悉 UART 与 DMACherryUSB 的数据收发接口被设计为等价于 UART TX DMA / UART RX DMA的使用体验收发长度无限制用户只需给出缓冲区和长度无需关心 USB 分包过程——分包逻辑由 porting 层在底层处理上层业务代码与普通串口收发几乎没有心智差异显著降低上手门槛。1.3 易于发挥 USB 性能为了逼近 USB 硬件理论带宽CherryUSB 在性能关键路径上做了如下设计这也是其区别于通用协议栈的关键Porting 驱动直接对接寄存器无抽象层封装避免多层函数调用损耗Memory zero copy数据零拷贝避免多余内存搬运IP 带 DMA 则使用 DMA 模式利用 DMA 的硬件分包能力长度无限制方便直接对接硬件 DMA最大化 DMA 优势分包过程在中断上下文中执行缩短延迟提升吞吐。二、仓库目录结构CherryUSB 组件在 RT-Thread 仓库中的完整目录结构如下对应 README.md 的 Directory Structure 一节目录描述classUSB Class 主从驱动cdc、hid、msc、audio、video、wireless、serial 等commonUSB spec 宏定义、常用工具、标准接口定义usb_def.h、usb_hc.h、usb_dc.h、usb_osal.h 等coreUSB 主从协议栈核心实现usbd_core.c、usbh_core.c、usbotg_core.cdemo主从 Class democdc_acm_template.c、hid_mouse_template.c、msc_ram_template.c 等osalOS 封装层RT-Thread 对应 usb_osal_rtthread.cplatform其他 OS 全家桶适配其中 rtthread 为 RT-Thread 设备框架适配portUSB DCD/HCD 移植层按 USB IP 分类dwc2、musb、ehci、ohci、xhci 等tools工具与测试脚本如 tools/test_srcipts 下的 CDC 速度测试与 HID 自定义测试脚本KconfigRT-Thread menuconfig 配置入口SConscriptRT-Thread SCons 构建脚本cherryusb_config_template.h协议栈配置模板编译时作为usb_config.h使用三、Device 协议栈USB 从机3.1 架构与定位CherryUSB Device 协议栈对标准设备请求、CLASS 请求、VENDOR 请求以及 custom 特殊请求规范了一套统一的函数框架采用面向对象 链表方式组织用户无需关心底层逻辑即可快速构建复合设备。同时规范了一套标准的dcd porting 接口用于适配不同的 USB IP实现面向 IP 编程。从 usbd_core.h 的源码可以看到核心抽象struct usbd_interface接口对象包含 class 请求处理回调、vendor 请求回调、notify 回调以及 HID 报告描述符指针通过usbd_add_interface()挂入协议栈struct usbd_endpoint端点对象包含端点地址与用户自定义端点中断回调ep_cb通过usbd_add_endpoint()挂入struct usb_descriptor描述符集合通过usbd_desc_register()注册设备/配置/字符串等描述符回调事件类型enum usbd_event_type覆盖 ERROR、RESET、SOF、CONNECTED、DISCONNECTED、SUSPEND、RESUME、CONFIGURED、SET_INTERFACE、REMOTE_WAKEUP、INIT、DEINIT 等全部生命周期事件。这种注册式框架让端点中断回调完全交给用户处理用户可以在端点中断里做任何想做的事这正是 README 中Support endpoint irq callback register by users的实现基础。3.2 功能清单README 中列出的 Device 协议栈能力当前仓库实现包括支持 USB2.0 全速FS与高速HS设备USB3.0 超高速为 TODO 状态支持端点中断注册由 porting 交给用户处理中断内数据支持复合设备Composite Device支持 CDC_ACM、CDC_ECM通信设备类支持 HID人机接口设备支持 MSC大容量存储类支持 UVC1.0、UVC1.5视频类支持 UAC1.0、UAC2.0音频类支持 RNDIS远程 NDIS即 USB 虚拟网卡支持 DFU设备固件升级类支持 MIDI支持 MTP媒体传输协议支持 TMC测试与测量类支持 WINUSB1.0、WINUSB2.0、WEBUSB、BOS支持 Vendor 显示类驱动USB 图形显示支持 Vendor 类支持 UF2批量刷写协议支持 ADBAndroid Debug Bridge当前仅支持 shell支持同一 USB IP 下的多从机multi device。3.3 资源占用README 给出了 Device 协议栈各核心模块的资源占用参考GCC 10.2 -O2关闭日志bus表示总线数量默认CONFIG_USBDEV_MAX_BUS 1文件FLASH (Byte)No Cache RAM (Byte)RAM (Byte)Heap (Byte)usbd_core.c~4000(512(default) 320) * bus80usbd_cdc_acm.c~400000usbd_msc.c~3200(128 512(default)) * bus16 * bus0usbd_hid.c~200000usbd_audio.c~130008 * bus0usbd_video.c~25000124 * bus0usbd_rndis.c~20002 * 1580(default) 156 8760usbd_cdc_ecm.c~15002 * 1514(default) 16420usbd_mtp.c~90002048(default) 128sizeof(struct mtp_object) * n0usbd_dfu.c~800010这些数值与 cherryusb_config_template.h 中的默认配置宏一一对应例如 RNDIS 的 1580 字节默认帧缓存对应CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZEMSC 的 512 字节缓存对应CONFIG_USBDEV_MSC_MAX_BUFSIZE。从表中可以直观看出核心栈仅约 4KB FLASHHID/CDC_ACM 等常见类驱动占用极低非常适合资源受限的 MCU。3.4 快速上手以 CDC_ACM 模板为例仓库 demo 目录提供了大量开箱即用的模板其中 cdc_acm_template.c 是理解 Device 协议栈编程模型的最佳入口其初始化流程完整呈现了注册描述符 → 添加接口 → 添加端点 → 初始化四步void cdc_acm_init(uint8_t busid, uintptr_t reg_base) { usbd_desc_register(busid, cdc_descriptor); /* ① 注册描述符集合 */ usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, intf0)); /* ② 添加接口 */ usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, intf1)); usbd_add_endpoint(busid, cdc_out_ep); /* ③ 添加端点 */ usbd_add_endpoint(busid, cdc_in_ep); usbd_initialize(busid, reg_base, usbd_event_handler); /* ④ 初始化并使能 */ }该模板同时展示了端点数据收发与 ZLP零长包处理的典型写法事件回调usbd_event_handler中在USBD_EVENT_CONFIGURED时发起首次 OUT 端点读取OUT 端点完成回调中再次调用usbd_ep_start_read()续传形成流水线接收IN 端点完成回调中当发送长度恰好是 MPS最大包长整数倍时发送 ZLP否则清除 busy 标志。CDC_MAX_MPS在CONFIG_USB_HS下为 512全速下为 64。数据收发接口usbd_ep_start_read()/usbd_ep_start_write()的长度无限制特性由 porting 层自动分包正是 README 强调的等价于 UART DMA 收发体验的来源。四、Host 协议栈USB 主机4.1 架构与定位CherryUSB Host 协议栈对挂载在 root hub 和外部 hub 上的设备实现了一套标准枚举流程并为不同 Class 规范了标准接口用来指示枚举后与断开连接后该类驱动需要执行的动作。同样地它规范了标准的hcd porting 接口适配不同 USB IP并且协议栈本身由 OS 管理通过 osal 适配不同 OSRT-Thread 对应实现基于信号量、互斥量、消息队列与线程。从 usbh_core.h 可以看到 Host 侧的核心抽象struct usbh_class_driver类驱动标准接口只有connect()与disconnect()两个回调配合CLASS_CONNECT/CLASS_DISCONNECT宏在枚举/断开时被自动调用struct usbh_class_info类匹配信息通过CLASS_INFO_DEFINE放入独立段.usbh_class_info实现自动加载支持的 Class 驱动id_table支持 VID/PID 精确匹配struct usbh_hubport/struct usbh_hub端口与 hub 结构支持多级 HUB最多 7 级README 注明测试1 拖 10无问题当前仅 dwc2/ehci/xhci/rp2040 支持struct usbh_bus总线对象内含 hub 管理线程hub_thread、消息队列hub_mq与信号量hub_sem传输接口usbh_control_transfer()、usbh_bulk_urb_fill()、usbh_int_urb_fill()等同时支持阻塞式与异步传输usbh_complete_callback_t完成回调。4.2 功能清单README 中列出的 Host 协议栈能力包括支持 low speed、full speed、high speed 与 super speed 设备自动加载支持的 Class 驱动支持阻塞式传输与异步传输支持复合设备多级 HUB 支持最高可扩展至 7 级支持 CDC_ACM、CDC_ECM、CDC_NCM支持 HID支持 MSC支持 UVC1.0、UVC1.5支持 UAC1.0支持 RNDIS支持 DFU支持 USB Bluetooth可对接 nimble 与 zephyr 蓝牙协议栈支持 CLASS 0xE0 或类似 CDC_ACM 的厂商自定义类支持 Vendor 串口类CH34X、CP210X、PL2303、FTDI、GSM支持 Vendor 网络类RTL8152、AX88772支持 USB modeswitch支持 Android Open AccessoryAOA支持同一 USB IP 下的多主机。此外Host 协议栈还提供lsusb 功能借助 RT-Thread shell 插件rt_usb_msh.c 中MSH_CMD_EXPORT(lsusb, ls usb devices)可以查看所有挂载设备的信息包括外部 hub 上的设备。4.3 资源占用README 给出的 Host 协议栈资源占用参考GCC 10.2 -O2关闭日志x为对应类实例数量受 4.4 节宏控制文件FLASH (Byte)No Cache RAM (Byte)RAM (Byte)Heap (Byte)usbh_core.c~4000(512(default) 8 * (1x) * n) * bussizeof(struct usbh_hub) * busraw_config_descusbh_hub.c~3000(32 4 * (1x)) * bus12 sizeof(struct usbh_hub) * x0usbh_msc.c~1500128 * x4 sizeof(struct usbh_msc) * x0usbh_hid.c~200064 * x4 sizeof(struct usbh_hid) * x0usbh_video.c~2500128 * x4 sizeof(struct usbh_video) * x0usbh_audio.c~3000128 * x4 sizeof(struct usbh_audio) * x0usbh_rndis.c~3000512 2 * 2048(default)sizeof(struct usbh_rndis) * 10usbh_cdc_ecm.c~15002 * 1514 16sizeof(struct usbh_cdc_ecm) * 10usbh_cdc_ncm.c~20002 * 2048(default) 16 32sizeof(struct usbh_cdc_ncm) * 10usbh_bluetooth.c~10002 * 2048(default)sizeof(struct usbh_bluetooth) * 10usbh_asix.c~35002 * 2048(default) 16 32sizeof(struct usbh_asix) * 10usbh_rtl8152.c~550016K 2K(default) 2 32sizeof(struct usbh_rtl8152) * 10usbh_serial.c~3000(512 * 2 32 * 2) * xsizeof(struct usbh_serial) * x (2048 default)0usbh_cdc_acm.c~1000000usbh_ch340.c~1200000usbh_ftdi.c~1200000usbh_cp2102.c~2200000usbh_pl2303.c~2500000usbh_gsm.c~3000004.4 影响资源占用的配置宏README 明确指出上表中的sizeof(struct usbh_hub)与sizeof(struct usbh_hubport)受以下宏影响这些宏的默认值同时出现在 cherryusb_config_template.h 中#define CONFIG_USBHOST_MAX_EXTHUBS 1 /* 外部 HUB 最大数量 */ #define CONFIG_USBHOST_MAX_EHPORTS 4 /* 每个 HUB 最大下游端口数 */ #define CONFIG_USBHOST_MAX_INTERFACES 8 /* 单个设备最大接口数 */ #define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 2 /* 接口最大备用设置(alt setting)数 */ #define CONFIG_USBHOST_MAX_ENDPOINTS 4 /* 接口最大端点数量 */而各类实例数量x受以下宏影响#define CONFIG_USBHOST_MAX_SERIAL_CLASS 4 /* 串口类设备最大实例数 */ #define CONFIG_USBHOST_MAX_HID_CLASS 4 /* HID 设备最大实例数 */ #define CONFIG_USBHOST_MAX_MSC_CLASS 2 /* MSC 设备最大实例数 */ #define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 /* 音频设备最大实例数 */ #define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 /* 视频设备最大实例数 */这些宏直接决定usbh_hub.c中child[CONFIG_USBHOST_MAX_EHPORTS]数组、usbh_interface中altsetting[CONFIG_USBHOST_MAX_INTF_ALTSETTINGS]数组、usbh_interface_altsetting中ep[CONFIG_USBHOST_MAX_ENDPOINTS]数组等的静态内存规模是嵌入式资源裁剪的首要入手点。五、USB IP 支持情况README 列出了标准与商业 USB IP 的支持矩阵√ 表示当前支持× 表示暂不支持表格中的 device/host 列表示该 IP 在对应角色下的控制器驱动类型IPDeviceHost支持状态OHCI (intel)noneOHCI√EHCI (intel)noneEHCI√XHCI (intel)noneXHCI√UHCI (intel)noneUHCI×DWC2 (synopsys)DWC2DWC2√MUSB (mentor)MUSBMUSB√FOTG210 (faraday)FOTG210EHCI√CHIPIDEA (synopsys)CHIPIDEAEHCI√CDNS2 (cadence)CDNS2CDNS2√CDNS3 (cadence)CDNS3XHCI×DWC3 (synopsys)DWC3XHCI×在仓库 port 目录中每种已支持 IP 均有对应子目录及移植说明如 port/dwc2/README.md、port/ehci其中 DWC2/MUSB 等主流 IP 还附带多厂商 glue 层如 ST、ESP、全志、GD、国民技术、博流等同一份控制器驱动可复用多家芯片。值得留意的是README 明确标注CDNS3、DWC3 的 Device/Host 支持状态为 ×TODO选用前需确认自己的 IP 是否在支持矩阵内。六、在 RT-Thread 中的集成与配置6.1 menuconfig 配置总览CherryUSB 在 RT-Thread 中以组件形式随仓库源码提供配置入口为 Kconfig总开关为menuconfig RT_USING_CHERRYUSB bool Using USB with CherryUSB启用后分为两大分支RT_CHERRYUSB_DEVICEUSB 从机模式速度选择FS / HS / AUTOCHERRYUSB_DEVICE_SPEEDIP 选择RT_CHERRYUSB_DEVICE_CUSTOM自行实现移植或具体 IP包括 fsdev_st、dwc2_st/esp/kendryte/infineon/at/hc/nation/gd/custom、musb_es/sunxi/bk/sifli/custom、chipidea_mcx、kinetis_mcx/mm32、bouffalo、hpm、aic、rp2040、ch32、pusb2、nrf5x 等Class 开关CDC_ACM、HID、MSC、AUDIO、VIDEO、CDC_RNDIS、CDC_ECM、CDC_NCM、MTP、ADB、DFU、DISPLAY以及 CDC_ACM_CHARDEV、MSC_BLKDEV 等 RT-Thread 设备框架对接选项模板选择CHERRYUSB_DEVICE_TEMPLATE可直接编译内置 democdc_acm、msc_ram、hid_keyboard/hid_mouse/hid_custom、video、audio_v1/v2、cdc_rndis、cdc_ecm、cdc_ncm、dfu、cdc_acm_msc、cdc_acm_msc_hid、winusbv1/v2、webusb_hid、display、adb、cdc_acm_chardev。RT_CHERRYUSB_HOSTUSB 主机模式IP 选择RT_CHERRYUSB_HOST_CUSTOM或 ehci_bouffalo/hpm/aic/mcx/nuc980/ma35d0、dwc2_st/esp/kendryte/infineon/at/hc/nation、musb_es/sunxi/bk/sifli、pusb2、xhci、rp2040 等Class/驱动开关CDC_ACM、HID、MSC、CDC_ECM/RNDIS/NCM、VIDEO、AUDIO、BLUETOOTH、ASIX、RTL8152、FTDI、CH34X、CP210X、PL2303、GSM配套参数hub 处理线程优先级与栈大小CONFIG_USBHOST_PSC_PRIO默认 0、CONFIG_USBHOST_PSC_STACKSIZE、控制传输缓冲与超时CONFIG_USBHOST_REQUEST_BUFFER_LEN默认 512、CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT默认 500ms、串口接收缓冲CONFIG_USBHOST_SERIAL_RX_SIZE默认 2048、MSC 挂载点CONFIG_USB_DFS_MOUNT_POINT默认 / 等。Kconfig 中的依赖关系自动化处理了不少集成工作例如开启 Host MSC 会自动select RT_USING_DFS与RT_USING_DFS_ELMFAT开启 CDC_ECM/RNDIS/NCM/ASIX/RTL8152 会自动select RT_USING_LWIP从而保证文件系统与网络协议栈配套就绪串口类驱动CDC_ACM、FTDI、CH34X、CP210X、PL2303、GSM统一select CONFIG_USBHOST_SERIAL。6.2 SConscript 构建逻辑SConscript 负责按配置裁剪编译单元核心逻辑定义UsbStack组depend [RT_USING_CHERRYUSB]启用 Device 模式时加入core/usbd_core.c与 osal/usb_osal_rtthread.c若选择RT_CHERRYUSB_DEVICE_SPEED_HS自动追加宏定义CONFIG_USB_HS对应配置模板中// #define CONFIG_USB_HS注释项按所选 IP 追加对应 port 文件如 dwc2 时加入port/dwc2/usb_dc_dwc2.c 对应厂商 glue 文件CUSTOM 选项仅加入裸控制器驱动glue 层需用户自行提供按所选 Class 追加class/下对应源文件按所选模板追加 demo 下的模板文件Host 模式下自动加入core/usbh_core.c、class/hub/usbh_hub.c、osal/usb_osal_rtthread.c串口/网络/MSC 等类会连带编译platform/rtthread/下的设备框架适配层rt_usbh_serial.c、rt_usbh_msc.c、rt_usbh_lwip.c特殊 IP如飞腾 pusb2 与 xhci通过LIBPATH/LIBS链接预编译库libpusb2_*.a、libxhci_*.a并按ARCH_ARMV8/ARCH_ARM_CORTEX_A自动选择 a64 或 a32 变体所有分支最后都会加入 rt_usb_msh.c 与 rt_usb_check.c。6.3 编译期约束检查rt_usb_check.c 在编译期强制校验若干 RT-Thread 配置是移植排错的重要依据必须启用软定时器#error must enable RT_USING_TIMER_SOFT to support timer callback in thread——Host 栈的 HUB 轮询依赖软定时器在线程上下文中回调软定时器线程栈 ≥ 1024RT_TIMER_THREAD_STACK_SIZE must be 1024对 Cortex-M7、Cortex-A、RISCV64 及 HPM/博流等芯片必须启用RT_USING_CACHE启用RT_USING_CACHE时若未配置 no cache RAM 则必须启用CONFIG_USB_DCACHE_ENABLE。6.4 MSH 命令RT-Thread shellMSH下可直接使用的命令由 rt_usb_msh.c 导出usbh_init busid reg_base # 初始化 USB 主机如 usbh_init 0 0x50000000 usbh_deinit busid # 反初始化 USB 主机 lsusb # 列出所有挂载设备含外部 HUB 上的设备 usbh_serial # 串口类设备测试启用 CONFIG_USBHOST_SERIAL 时可用其中usbh_init的reg_base为十六进制寄存器基址内部调用usbh_initialize(busid, reg_base, NULL)。设备模式的初始化则通常在应用代码中调用如模板中的cdc_acm_init(busid, reg_base)或使用 BSP 提供的示例初始化流程。七、与 RT-Thread 设备框架的对接CherryUSB 在 platform/rtthread 目录下提供了完整的 RT-Thread 设备框架适配使 USB 设备对上层表现为标准 RT-Thread 设备业务代码无需关心 USB 细节。7.1 USB 转串口Host 串口类rt_usbh_serial.c 将 USB 串口类设备CDC_ACM、CH34X、CP210X、PL2303、FTDI、GSM注册为 RT-Thread 字符设备usbh_serial_register()创建struct rt_device默认波特率 115200/8/N/1见rt_usbh_serial_open()中的termios初始化并支持RT_DEVICE_CTRL_CONFIG控制命令动态配置串口参数注册标志含RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_REMOVABLE支持热插拔与中断接收通知rx_indicate回调写路径自动处理DMA 对齐当用户缓冲区地址未按CONFIG_USB_ALIGN_SIZE对齐时内部使用rt_malloc_align()拷贝对齐后再调用usbh_serial_write()启用RT_USING_POSIX_DEVIO时设置fops可直接以 POSIX 文件接口open/read/write访问。7.2 磁盘与网卡适配Host MSC 通过 rt_usbh_msc.c 对接 RT-Thread DFS 文件系统配合 Kconfig 自动选中的RT_USING_DFS/RT_USING_DFS_ELMFATU 盘插入后挂载到CONFIG_USB_DFS_MOUNT_POINT指定路径默认 /即可用文件系统 API 读写网络类CDC_ECM/RNDIS/NCM/ASIX/RTL8152通过 rt_usbh_lwip.c 对接 lwIP插入 USB 网卡后自动创建网卡设备供 lwIP 使用设备侧则提供rt_usbd_serial.cCDC_ACM 转字符设备、rt_usbd_msc.cMSC 块设备、rt_usbd_adb.cADB shell等适配。7.3 配置模板中的关键宏cherryusb_config_template.h 是编译期的核心配置模板编译时以usb_config.h被各源文件包含以下宏值得重点掌握公共配置CONFIG_USB_PRINTF在__RTTHREAD__环境下自动映射为rt_kprintf否则为printfCONFIG_USB_DBG_LEVEL调试级别默认USB_DBG_INFOCONFIG_USB_ALIGN_SIZE数据对齐字节数启用 DMA/DCache 时建议 32/64否则 4USB_NOCACHE_RAM_SECTION将关键收发缓冲放入.noncacheable段避免 DMA 与 Cache 一致性问题。Device 侧CONFIG_USBDEV_REQUEST_BUFFER_LEN默认 512EP0 控制传输缓冲CONFIG_USBDEV_EP0_PRIO/CONFIG_USBDEV_EP0_STACKSIZE默认 4 / 2048EP0 处理线程启用CONFIG_USBDEV_EP0_THREAD时生效CONFIG_USBDEV_MSC_MAX_LUN/CONFIG_USBDEV_MSC_MAX_BUFSIZE默认 1 / 512MSC 逻辑单元数与最大缓冲增大可提速但必须是块大小的整数倍Kconfig 中亦有说明CONFIG_USBDEV_MTP_MAX_BUFSIZE/CONFIG_USBDEV_MTP_MAX_OBJECTS/CONFIG_USBDEV_MTP_MAX_PATHNAME2048 / 256 / 256MTP 参数CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE默认 1580须为 (153644) 的整数倍RNDIS 帧缓冲CONFIG_USBDEV_RNDIS_USING_LWIP/CONFIG_USBDEV_CDC_ECM_USING_LWIP设备侧虚拟网卡对接 lwIP。Host 侧CONFIG_USBHOST_REQUEST_BUFFER_LEN默认 512EP0 控制传输缓冲上限CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT默认 500ms控制传输超时CONFIG_USBHOST_SERIAL_RX_SIZE默认 2048串口接收环形缓冲CONFIG_USBHOST_MSC_TIMEOUT默认 5000msMSC 命令超时CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE/_TX_SIZE等默认 2048网络类收发缓冲注释特别提示 RX 大小应大于 lwIP 的 TCP 接收窗口TCP_WND避免溢出同时指出lwIP 不支持一次多 pbuf因此增大 TX 值不会有性能提升CONFIG_USBDEV_MAX_BUS/CONFIG_USBHOST_MAX_BUS默认 1多总线支持CONFIG_USB_HS置位时 IP 将按高速模式初始化内部/外部高速 PHYREADME 中注明某些芯片仅特定引脚支持 HS。八、配套工具与进一步资源组件内附带测试脚本于 tools/test_srciptstest_cdc_speed.py用于 CDC 传输速度测试test_hid_inout.py用于 HID 自定义输入输出测试配合 Python 与主机端工具即可验证收发正确性与带宽Cherry Descriptor Generator官方描述符生成器可在线生成设备/配置/字符串描述符并粘贴进模板使用本仓库 demo 各模板中的描述符数组即此类格式如USB_DEVICE_DESCRIPTOR_INIT(...)、CDC_ACM_DESCRIPTOR_INIT(...)宏展开结果官方文档、Demo 仓库与视频教程CherryUSB Cheese需 V1.4.3 以上版本可作为深入学习的辅助资料在 RT-Thread 生态中CherryUSB 同时以软件包形式在 RT-Thread 软件包中心提供本仓库为随源码集成的组件版本VERSION 文件标识当前版本为 1.6.1并已支持 YOC、ESP-Registry 等其他嵌入式生态。九、结语CherryUSB 以面向 IP 编程为设计哲学用标准的 dcd/hcd 移植接口隔离了上层协议栈与底层 USB 控制器差异配合模板化 Class 驱动与精简 API在 RT-Thread 中实现了开箱即用的 USB 主从能力。本文从设计理念、双协议栈架构、资源占用、IP 支持矩阵到 Kconfig 选配、构建逻辑、编译约束、MSH 命令与设备框架对接完整还原了 README.md 的核心内容并结合 Kconfig、SConscript、cherryusb_config_template.h 及 platform/rtthread 适配层给出了源码级佐证。对于需要自研 USB 设备串口、U 盘、HID、声卡、摄像头或主机U 盘、USB 网卡、USB 蓝牙、4G 模块的 RT-Thread 项目CherryUSB 提供了一条清晰、可控、可裁剪的落地路径——下一步选一个支持矩阵内的 BSP在 menuconfig 中勾选对应 IP 与 Class跑通第一个模板 demo 即可。赞分享操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载相关推荐RT-Thread 集成 CherryUSB轻量级 USB 主从协议栈的架构解析与实战配置指南RT Thread 集成 CherryUSB轻量级 USB 主从协议栈的架构解析与实战配置指南 CherryUSB 是一个面向嵌入式系统带 USB IP的操作系统嵌入式物联网嵌入式OSRTOSCherryUSB嵌入式USB协议栈构建高效USB设备与主机的终极指南CherryUSB嵌入式USB协议栈构建高效USB设备与主机的终极指南 还在为嵌入式系统中复杂的USB通信而烦恼吗CherryUSB提供了一个轻量级、可移植嵌入式驱动开发物联网【免费下载】 CherryUSB项目移植指南从零开始实现USB主从协议栈移植CherryUSB项目移植指南从零开始实现USB主从协议栈移植 前言 CherryUSB是一款轻量级、高性能的USB协议栈支持多种USB IP核和操作系统。嵌入式驱动开发物联网上一篇Poem框架部署指南从本地开发到生产环境的完整流程下一篇终极Kryo与Maven集成指南5分钟快速配置Java序列化依赖创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表