完全指南:用 CherryUSB 打通 MSC 存储、lwip 网络与 ADB 调试)
操作系统嵌入式物联网嵌入式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 主机/设备协议栈而components/drivers/usb/cherryusb/platform/正是它为各类开源操作系统与框架提供的平台适配层。本文以该目录下的 README.md 为核心骨架结合本仓库内 RT-Thread 平台适配源码platform/rtthread/下的 8 个文件、Kconfig 与 SConscript 构建脚本系统讲解如何把 CherryUSB 的 USB MSC、CDC、网络类等能力无缝接入 RT-Thread 的设备模型、DFS 文件系统、lwip 协议栈与 FinSH shell同时覆盖 Fatfs、Nuttx、Threadx、Zephyr、LVGL、Blackmagic、DAPLINK、UF2、QMK 等平台的既有支持矩阵。读完本文你将掌握从 Kconfig 开启功能到源码级验证的完整链路。一、platform 目录的角色定位协议栈与操作系统的翻译层CherryUSB 本身只提供 USB 协议栈class/、core/、common/、port/而不同操作系统对块设备、字符设备、文件系统、网络接口有各自抽象。platform/目录存在的意义就是充当两者之间的桥梁——把 CherryUSB 的 USB 类驱动翻译成目标 OS 的设备接口让应用层完全感知不到 USB 细节。本仓库实际落地的平台适配目录如下其余平台为上游声明能力仓库快照中未包含对应源码目录对接目标主要能力platform/rtthread/RT-Threadrt_device、DFS、lwip、mshlsusb、字符设备、ADB shellplatform/lvgl/LVGLHID 鼠标/键盘作为输入设备兼容 LVGL 8.x 与 9.xplatform/blackmagic/Blackmagic 调试器USB 设备端 CDC ACMplatform/daplink/DAPLINKDAPLINK v2.1 设备端 CDC ACM WinUSBHID/MSC 可选platform/uf2/UF2 刷写协议设备端 MSC 实现的 UF2 拖拽刷写从 SConscript 可以看到platform/rtthread/rt_usb_msh.c与platform/rtthread/rt_usb_check.c在启用RT_USING_CHERRYUSB时无条件参与编译其余文件则按功能开关条件加入构建。二、开启功能的入口Kconfig 与 SConscript 的联动CherryUSB 在 RT-Thread 中作为组件通过 Kconfig 管理总开关为RT_USING_CHERRYUSB下面分为RT_CHERRYUSB_DEVICE与RT_CHERRYUSB_HOST两大菜单见 Kconfig。构建系统根据这些开关决定把哪些platform/rtthread/源码纳入编译Kconfig 开关编译的文件提供的能力RT_CHERRYUSB_DEVICE_CDC_ACM_CHARDEVplatform/rtthread/rt_usbd_serial.c设备端 CDC ACM 字符设备usb-acm0等RT_CHERRYUSB_DEVICE_MSC_BLKDEVplatform/rtthread/rt_usbd_msc.c设备端 MSC 对接 rt_device 块设备RT_CHERRYUSB_DEVICE_ADBplatform/rtthread/rt_usbd_adb.cADB shell 重定向RT_CHERRYUSB_HOST_CDC_ACM/FTDI/CH34X/CP210X/PL2303/GSMplatform/rtthread/rt_usbh_serial.c主机端 USB 串口字符设备RT_USING_DFSRT_CHERRYUSB_HOST_MSCplatform/rtthread/rt_usbh_msc.c主机端 U 盘挂载到 DFSRT_CHERRYUSB_HOST_CDC_ECM/CDC_RNDIS/CDC_NCM/ASIX/RTL8152platform/rtthread/rt_usbh_lwip.c主机端 USB 网卡对接 lwip关键点主机端网络类开关如RT_CHERRYUSB_HOST_CDC_RNDIS在 Kconfig 中会select RT_USING_LWIP并自动置位对应的CONFIG_USBHOST_PLATFORM_CDC_RNDIS等内部宏见 Kconfig主机串口类开关则会select CONFIG_USBHOST_SERIAL见 Kconfig。这些CONFIG_USBHOST_PLATFORM_*宏正是 rt_usbh_lwip.c 编译时检查至少启用一种 USB 以太网的依据。三、RT-Thread 支持层源码深度解析3.1 设备端 MSC把 USB U 盘能力交给 rt_device 块设备platform/rtthread/rt_usbd_msc.c实现了设备端模拟 U 盘 RT-Thread 本地块设备的组合。它要求必须开启CONFIG_USBDEV_MSC_THREAD将 MSC 读写从中断上下文迁移到线程见 rt_usbd_msc.c块设备名默认为sd0可用CONFIG_USBDEV_MSC_BLOCK_DEV_NAME覆盖见 rt_usbd_msc.c。实现上三个回调把 SCSI 层与 RT-Thread 设备抽象绑定在一起usbd_msc_get_cap()通过rt_device_control(RT_DEVICE_CTRL_BLK_GETGEOME)读取扇区数与扇区大小usbd_msc_sector_read()/usbd_msc_sector_write()调用rt_device_read()/rt_device_write()完成数据搬运usbd_msc_blkdev_init()负责rt_device_find()找到块设备、以读写方式打开并将 MSC 接口注册进 USB 设备栈。由此PC 端插入后看到的是一个标准 MSC U 盘而底层数据实际来自 RT-Thread 的sd0SD 卡、Flash 等任何实现了块设备接口的介质。与之配套的 RAM 盘演示模板在 demo/msc_ram_template.c。3.2 设备端 CDC ACMUSB 串口字符设备platform/rtthread/rt_usbd_serial.c将设备端 CDC ACM 封装为 RT-Thread 字符设备设备名格式为usb-acm%d见 rt_usbd_serial.c。相关配置项CONFIG_USBDEV_MAX_CDC_ACM_CLASS最大串口实例数默认 4CONFIG_USBDEV_SERIAL_RX_BUFSIZE接收环形缓冲大小默认 2048。其读写逻辑有两个值得注意的工程细节写路径采用信号量同步usbd_serial_write()先usb_osal_sem_reset(tx_done)再发起usbd_ep_start_write()随后阻塞等待usb_osal_sem_take(tx_done, 3000)3 秒超时返回-RT_ETIMEOUT见 rt_usbd_serial.cZLP零长度包处理当发送长度恰为端点 MPS 整数倍时BULK IN 回调会自动补发一个零长度包保证 USB 协议语义正确见 rt_usbd_serial.c。配合 demo/cdc_acm_rttchardev_template.c 中的cdc_acm_enter/cdc_acm_exit命令可把 FinSH 控制台重定向到 USB 串口。3.3 ADB shell用 adb 命令操作 RT-Thread 终端platform/rtthread/rt_usbd_adb.c实现 Android Debug Bridge 的设备端支持注册名为adb-sh的字符设备并提供两条 msh 命令adb_enter执行finsh_set_device(adb-sh)与rt_console_set_device(adb-sh)将 FinSH 与内核打印全部切到 ADB 通道adb_exit关闭 ADB 会话并恢复原控制台设备。数据路径上接收侧通过rt_ringbuffer缓冲并在rx_indicate通知上层见 rt_usbd_adb.c发送侧依赖tx_done信号量等待 ADB 写完成见 rt_usbd_adb.c。这样用户在 PC 上用adb shell即可直接进入 RT-Thread 的 FinSH 交互环境。接收缓冲区大小由CONFIG_USBDEV_SHELL_RX_BUFSIZE控制默认 2048。3.4 主机端 MSCU 盘即插即用挂载到 DFSplatform/rtthread/rt_usbh_msc.c是USB 主机读 U 盘的核心实现依赖链为编译期要求RT_USING_DFS_ELMFATFAT 文件系统组件必须开启见 rt_usbh_msc.c挂载点格式由CONFIG_USB_DFS_MOUNT_POINT定义默认/可携带%c占位符区分多块盘见 rt_usbh_msc.c设备名统一为/dev/sd%c第一块 U 盘即/dev/sda见 rt_usbh_msc.c。实现要点热插拔线程usbh_msc_run()动态rt_malloc一个struct rt_device注册为RT_Device_Class_Block类型并带RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE标志随后创建usbh_msc线程执行挂载见 rt_usbh_msc.c自动挂载/卸载挂载线程调用dfs_mount(name, mount_point, elm, 0, 0)并打印结果拔盘时usbh_msc_stop()执行dfs_unmount()并注销、释放设备见 rt_usbh_msc.c对齐缓冲兜底读写时若传入缓冲区地址不满足CONFIG_USB_ALIGN_SIZE对齐会临时rt_malloc_align分配对齐缓冲并在 DMA 传输后拷贝回来见 rt_usbh_msc.c规避 DMA 对齐陷阱几何信息上报RT_DEVICE_CTRL_BLK_GETGEOME控制命令直接透传 MSC 类的blocksize与blocknum见 rt_usbh_msc.c。3.5 主机端网络类USB 网卡接入 lwipplatform/rtthread/rt_usbh_lwip.c统一承载五类 USB 以太网设备CDC_ECM、CDC_RNDIS、CDC_NCM、ASIX、RTL8152各自编译期通过CONFIG_USBHOST_PLATFORM_*宏开关且网络接口名固定为u0ECM、u1NCM、u2RNDIS、u3ASIX、u4RTL8152。该文件对 lwip 的配置有硬性要求均为#error级约束必须启用RT_USING_LWIP212LWIP_TCPIP_CORE_LOCKING必须为 1PBUF_POOL_BUFSIZE必须大于 1600否则容纳不下最大以太网帧RT_LWIP_TCPTHREAD_STACKSIZE必须不小于 2048。并给出三条性能建议#warning级启用LWIP_NO_RX_THREAD/LWIP_NO_TX_THREADUSB 类自带收发线程无需 rt-thread 的 eth 收发线程以及将LWIP_TCPIP_CORE_LOCKING_INPUT设为 1USB 在自建线程中喂包配合 core locking 输入可获得更好性能。数据通路设计上发送侧usbh_lwip_eth_output_common()把 pbuf 链逐节点拷贝进 USB 的 DMA 发送缓冲后调用类驱动的*_eth_output()接收侧usbh_lwip_eth_input_common()依据LWIP_TCPIP_CORE_LOCKING_INPUT选择PBUF_REF零拷贝直接引用 USB 缓冲或PBUF_POOL拷贝一份两种入栈方式见 rt_usbh_lwip.c。每个类驱动都实现了rt_eth的eth_tx回调、NIOCTL_GADDR控制命令返回 MAC并在*_run()中调用eth_device_init()eth_device_linkchange(RT_TRUE)注册网络设备、创建2048字节栈的接收线程。3.6 主机端串口类FTDI/CH34X/CP210X/PL2303 变字符设备platform/rtthread/rt_usbh_serial.c把主机端识别到的 USB 转串口芯片统一封装为 RT-Thread 字符设备。打开设备时默认配置 115200-8-N-1baudrate115200, databits8, parity0, stopbits0并支持通过RT_DEVICE_CTRL_CONFIG控制命令实时修改波特率等参数见 rt_usbh_serial.c。其底层为class/serial/usbh_serial.c的通用串口抽象Kconfig 中列出的 CDC_ACM、FTDI、CH34X、CP210X、PL2303、GSM4G 模块任一开启都会引入该平台文件见 SConscript。3.7 msh 命令lsusb 与主机初始化/反初始化platform/rtthread/rt_usb_msh.c无条件编译为 FinSH 注册了三条命令usbh_init busid reg_base按总线号与寄存器基址十六进制字符串经strtoll解析初始化 USB 主机控制器usbh_deinit busid反初始化指定总线lsusb枚举并打印所有挂载设备含外部 HUB 上的设备信息实现在 core/usbh_core.c。此外开启CONFIG_USBHOST_SERIAL时还会导出usbh_serial测试命令。注意lsusb命令本身即由 msh 导出声明见 rt_usb_msh.c其功能实现位于usbh_core。3.8 编译期自检把错误挡在链接之前platform/rtthread/rt_usb_check.c是一组编译期断言从根源上避免配置错误启用主机栈时必须开启RT_USING_TIMER_SOFT软件定时器供中断回调中的定时任务使用且RT_TIMER_THREAD_STACK_SIZE 1024对 Cortex-M7、Cortex-A、RISCV64 及 HPM/BL61x/BL808 等带缓存芯片强制要求RT_USING_CACHE使用缓存且未配置 nocache RAM 时强制要求CONFIG_USB_DCACHE_ENABLE。这些#error在编译阶段即可提示开发者补齐 DMA 缓存一致性相关配置。四、其余操作系统/框架支持矩阵README 同时声明了 CherryUSB 对其他平台的支持能力适用于跨平台移植场景的选型参考FatfsUSB 主机 MSC读 U 盘 设备端 MTP媒体传输协议lwip独立版主机网络类覆盖 cdc_ecm/cdc_ncm/cdc_rndis/asix/rtl8152/bl616_wifiNuttx设备端/主机端 CDC ACM 字符设备、设备端/主机端 MSC 文件系统、主机端 CDC_RNDIS 网络Threadx主机 MSC 的 filex 支持Zephyrlsusb shell 支持、主机 MSC 磁盘支持QMK设备端 HID。需要说明的是本仓库快照的platform/下仅包含 RT-Thread、LVGL、Blackmagic、DAPLINK、UF2 五个目录的实际源码Fatfs/Nuttx/Threadx/Zephyr/QMK 属于 README 记载的上游支持矩阵具体实现需向上游 CherryUSB 发行版获取。五、LVGLUSB 鼠标键盘直接驱动图形界面platform/lvgl/为 LVGL 提供 HID 输入设备适配README 明确支持 LVGL 8.x 与 9.x 两个大版本。核心文件usbh_hid_lvgl.c内置完整的 HID 键码到 ASCII 映射表含大写、回车、退格等见 usbh_hid_lvgl.c并以LV_IMG_DECLARE(img_cursor)引入image_cursor.c中的自定义鼠标光标位图。接入后插入 USB 鼠标/键盘即可作为 LVGL 的 indev 输入源无需任何额外的物理按键矩阵或触摸屏。六、调试与刷写生态Blackmagic、DAPLINK 与 UF2platform 层还把 CherryUSB 设备端能力延伸到了调试与固件刷写领域Blackmagicplatform/blackmagic/bmp_port_cdc_acm.c以设备端 CDC ACM 实现 Blackmagic 调试器通信让目标板充当可对接 GDB 的调试探针DAPLINKplatform/daplink/dap_main.c、dap_main.h实现 DAPLINK v2.1主通道为 CDC ACM WinUSBHID 与 MSC 可选满足现代调试器的免驱WinUSB与拖拽磁盘特性UF2platform/uf2/bootuf2.c、bootuf2.h通过设备端 MSC 实现 UF2 块协议用户将.uf2固件直接拖入 U 盘即可完成刷写配套 demo/bootuf2/msc_bootuf2_template.c 演示模板与 tools/uf2/uf2conv.py 转换工具。七、上手实践建议先编译后接线在 menuconfig 中开启RT_USING_CHERRYUSB按目标场景选择 Device 或 Host 分支并勾选对应类驱动如 U 盘挂载选RT_CHERRYUSB_HOST_MSC其会自动依赖RT_USING_DFS_ELMFAT让 rt_usb_check.c 的编译期检查帮您确认缓存、定时器等前置项调试观察点主机侧先用 msh 命令usbh_init busid reg_base初始化控制器插入设备后用lsusb查看枚举结果再验证/dev/sda设备是否注册、df或ls是否能看到挂载点内容性能相关参数主机栈线程优先级CONFIG_USBHOST_PSC_PRIO默认 0数值越小优先级越高、栈大小CONFIG_USBHOST_PSC_STACKSIZE默认 4096、控制传输超时CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT默认 500ms均可在 Kconfig 中调整见 Kconfig网络场景务必按 rt_usbh_lwip.c 的约束配置 lwip源码对照阅读platform/rtthread/与class/如class/msc/、class/cdc/、class/serial/、class/wireless/、core/usbh_core.c、usbd_core.c配合阅读即可完整还原USB 枚举 → 类驱动 → 平台设备注册的全链路。八、结语platform/README.md虽短却精确刻画了 CherryUSB 的生态定位一套协议栈多种操作系统复用。而在 RT-Thread 一侧platform/rtthread/以极薄的适配层把 USB 能力完整嵌入 rt_device 模型、DFS、lwip 与 FinSH使开发者可以用最熟悉的 RT-Thread API 直接操作 U 盘、USB 串口、USB 网卡与 ADB 终端。理解这层翻译逻辑是高效使用 CherryUSB 于 RT-Thread 项目、乃至向其他平台移植的关键。赞分享操作系统嵌入式物联网嵌入式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 的 CHIPIDEA 设备控制器移植与配置指南RT Thread 中 CherryUSB 的 CHIPIDEA 设备控制器移植与配置指南 本篇指南以 RT Thread 仓库中 CherryUSB 组件下的操作系统嵌入式物联网嵌入式OSRTOSUltralytics Platform 集成指南打通 Slack 通知、云存储数据与标注平台的完整接入方案Ultralytics Platform 集成指南打通 Slack 通知、云存储数据与标注平台的完整接入方案 Ultralytics PlatformUlt人工智能深度学习计算机视觉预训练RT-Thread CherryUSB EHCI 主机控制器驱动支持芯片清单、移植要点与源码解析RT Thread CherryUSB EHCI 主机控制器驱动支持芯片清单、移植要点与源码解析 本指南以 RT Thread 仓库内 components/操作系统嵌入式物联网嵌入式OSRTOS上一篇Tachyon 椭圆曲线扩展实战用 generate_ec_points 代码生成器添加 Short Weierstrass 曲线下一篇Activepieces 集成 Sofya为 AI Agent 打造的一体化 Web 搜索与网页内容提取工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考