请注意,本文提供方法基于zephyr OS制作,由于目前zephyr项目的USB子系统处于大规模重构状态,所以本方案不受zephyr正式支持。详细请参考:
https://github.com/zephyrproject-rtos/zephyr/pull/46862
背景
目前,我们有许多MCU项目利用USB协议与PC进行通信,绝大多数使用USB从机协议,随着Wifi协议的广泛使用以及速度的提升,我认为绝大多数的USB设备都可以经由网络协议而渐渐变得无线化。
但是,如果完全将协议栈转换为网络,会导致一系列兼容软件或驱动需要再次适配,较大的开发量和不明显的收益使得各大厂商在这方面进展缓慢。
本文介绍一种基于USBIP的USB设备无线化方法,希望能够推进设备线束的无线化进程。

灵感来源(废话部分,技术无关,可以跳过😄)
前段时间有幸从artery公司木一川
先生处得到一片at32 demo板,正巧促使我简单的学习了一下openocd和cmsisdap。发现cmsis-dap协议很容易就可以在zephyr中引用,以获得大量开发板支持。
但是如果只是制作一个普通的dap仿真器,比较缺少挑战性,因此我决定尝试制作无线的仿真器。
最初的目标是通过TCP转发cmsis-dap协议,修改openocd以支援网络设备,但是后面我意识到这会导致windows的KEIL和IAR等IDE环境难以运用。
因此,我将目标转向USB设备的网络访问,因此了解了USBIP协议,并且偶然发现zephyr OS中对USBIP是有部分实现的,我只需要简单的将他扩展到其他设备即可,因此便有了本文。
方案介绍
再次提示,本方案虽然基于zephyr OS制作,但是由于zephyr OS的USB subsystem处于大规模重构状态,所以不受zephyr主线支持!
实现代码请参考:https://github.com/zephyrproject-rtos/zephyr/pull/46862
实际在下面设备中运行通过:
- STM32F746G_EVAL (有线网络)
- ESP32C3(WIFI网络,没有串口芯片版本,9.9元)(我制作了board支持,但是板子下架了,理论上官方的esp32c3也可以使用)
传统USB程序结构
这里指的传统zephyr USB 设备程序(因为zephyr系统目前没有host设备,这也是大规模重构的原因)。
如果您的程序目前采用其他方式架构(可能大部分程序都是吧),您首先需要将其移植到zephyr OS。(目前USB subsystem处于不稳定状态,商业用户需要谨慎考虑)

USBIP 网络USB设备
本方案工作在UDD层,通过注册zephyr USB device驱动,并将其转换为USBIP协议。因此没有虽然没有USB硬件,但是在操作系统看来和有USB驱动是一样的。

注意:
- 这不是标准USBIP Server的实现,但是我认为对于绝大多数的USB设备已经足够实现功能
使用
MCU程序
建议创建如下application
- 启动后的wifi配置:帐号,密码,功耗等(有线网络可忽略)
- 静态IP或DHCP服务
简单使用教程
- 使用usbip客户端,确认基本通信
usbip list -r FEILONG-CMSIS-DAP
- 挂载usbip设备
sudo usbip attach -r FEILONG-CMSIS-DAP -b 1-1
- 调试可以使用wireshark,内置有USBIP协议。
windows
请参考
https://github.com/cezanne/usbip-win
有些功能可能需要使用zadig安装驱动:
linux
linux用户应该不需要多说,参考archlinux wiki即可使用。
https://wiki.archlinux.org/title/USB/IP
注意:
在linux上使用时,如果在使用过程中,没有detach直接复位、断电等,会造成linux内核出现异常,重启后即可解决。(windows没有发现此类问题)