WSL2 通过 USBIP 连接USB串口设备 JetsonUSB备份刷机

Win11 和 WSL2的USB/IP配置

参考:

# wsl2, ubuntu18
sudo apt install linux-tools-5.4.0-77-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20

# win11
# 下载最新版安装
# https://github.com/dorssel/usbipd-win/releases

# 常用操作, 均在管理员模式powershell
# Win11图标右键 -> Windows终端(管理员)
# 列出所有连接到 Windows 的 USB 设备
usbipd wsl list
# 附加到默认wsl分发版
usbipd wsl attach --busid <busid>
# 附加到指定wsl
usbipd wsl attach -d Ubuntu-18.04 --busid 5-2
# 断开连接
usbipd wsl detach --busid <busid>

USB设备附加到WSL2后, 可以 lsusb 查看设备, 有的默认有通用驱动, 有的没有需要现装:

常用的USB设备, 如USB转串口, 调试设备, USB打印机, USB网卡, CAN分析仪, 加密狗等都可以通过这种方式挂载到WSL2, OpenWRT路由器 或者 远程Linux服务器.

10G虚拟以太网 和 iPerf3 测速

iPerf官网: iPerf - The TCP, UDP and SCTP network bandwidth measurement tool, 可以下载Windows和Linux程序包

WSL2 安装

$ wget https://iperf.fr/download/source/iperf-3.1.3-source.tar.gz
$ tar xvf iperf-3.1.3-source.tar.gz 
$ cd iperf-3.1.3/
$ ./configure; make; sudo make install
$ sudo ldconfig

Win11 PowerShell 里面开启服务

> ipconfig
以太网适配器 vEthernet (WSL):
	IPv4 地址 . . . . . . . . . . . . : 172.27.160.1

PS D:\MyProgram\iPerf3\iperf-3.1.3-win64> .\iperf3.exe -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

WSL2 里面测试

$ iperf3 -c 172.27.160.1
Connecting to host 172.27.160.1, port 5201
[  4] local 172.27.165.112 port 58268 connected to 172.27.160.1 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  1.45 GBytes  12.4 Gbits/sec    0    452 KBytes
[  4]   1.00-2.00   sec  1.49 GBytes  12.8 Gbits/sec    0    452 KBytes
[  4]   2.00-3.00   sec  1.47 GBytes  12.7 Gbits/sec    0    452 KBytes
[  4]   3.00-4.00   sec  1.49 GBytes  12.8 Gbits/sec    0    452 KBytes
[  4]   4.00-5.00   sec  1.32 GBytes  11.3 Gbits/sec    0    452 KBytes
[  4]   5.00-6.00   sec  1.51 GBytes  13.0 Gbits/sec    0    452 KBytes
[  4]   6.00-7.00   sec  1.52 GBytes  13.0 Gbits/sec    0    452 KBytes
[  4]   7.00-8.00   sec  1.52 GBytes  13.1 Gbits/sec    0    452 KBytes
[  4]   8.00-9.00   sec  1.52 GBytes  13.0 Gbits/sec    0    452 KBytes
[  4]   9.00-10.00  sec  1.51 GBytes  12.9 Gbits/sec    0    452 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  14.8 GBytes  12.7 Gbits/sec    0             sender

[  4]   0.00-10.00  sec  14.8 GBytes  12.7 Gbits/sec                  receiver

iperf Done.

PowerShell 里看也是 10Gbps

在这里插入图片描述

所以通过USBIP的方式挂单个USB 3.x或多个USB2.0设备应该是压力不大 ???

NVIDIA Jetson USB

开发 Jetson TX2/Xavier/Orin 的时候, 批量生成一般会用到USB来备份镜像或刷机, 那用WSL2到底支不支持呢?

支持, 不过需要加一个 -a 参数启用自动重连, 因为Jetson备份或者刷机的时候会有几次复位操作, USB会断开连接, 需要自动重连到WSL2.

> usbipd wsl attach --help
usbipd-win 2.3.0

Description:
  Attaches a USB device to a WSL instance.

  The first time a device is attached this command will include a 'bind', for which administrator privileges are required. Subsequent attaches can be
  done with standard user privileges.

  Exactly one of the options '--busid' or '--hardware-id' is required.

Usage:
  usbipd wsl attach [options]

Options:
  -a, --auto-attach            Automatically re-attach when the device is detached or unplugged
  -b, --busid <BUSID>          Attach device having <BUSID>
  -d, --distribution <NAME>    Name of the WSL distribution to attach to
  -i, --hardware-id <VID:PID>  Attach device having <VID>:<PID>
  -?, -h, --help               Show help and usage information

让Jetson进入Recovery模式:

  • 供电
  • 按住Recovery按键不松手
  • 按一下 Power / Reset 键
  • 松开Recovery按键

把Jetson备份用的USB连到WSL2上

# powershell(管理员)
> usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
6-4    0955:7c18  APX                                                           Not attached
# 加-a参数, 占用终端不会退出
> usbipd wsl attach -a -d Ubuntu-18.04 --busid 6-4

先来测试下Jetson的备份

BOARD=jetson-tx2-devkit
cd Linux_for_Tegra
sudo ./flash.sh -r -k APP -G bootloader/system_20220715.img $(BOARD) mmcblk0p1

中间的复位都能重连上, 看起来没有问题

在这里插入图片描述

最后也确实打包成功:

在这里插入图片描述

接着再把打包好的镜像刷回去测试一下

BOARD=jetson-tx2-devkit
cd Linux_for_Tegra/bootloader
mv system_20220711.img system.img
cd ..
sudo ./flash.sh -r ${BOARD} mmcblk0p1

刷机成功, 没有压力

在这里插入图片描述

那以后使用 Win11 + WSL2 开发Jetson岂不是原地飞升, 再也不用折腾 双电脑, 双系统 或 虚拟机了 !!!

WSL2使用USB串口

PL2303

这个更新到Win11后, 可能需要更换老驱动才行, 自行搜索, 这里不再赘述, 操作

# Win11图标右键 -> Windows终端(管理员)
$ usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
5-2    067b:2303  Prolific USB-to-Serial Comm Port (COM14)                      Not attached
5-4    067b:2303  Prolific USB-to-Serial Comm Port (COM3)                       Not attached

# 把COM14附到Ubuntu(两个WSL2: Ubuntu和Ubuntu-18.04)
$ usbipd wsl attach -d Ubuntu-18.04 --busid 5-2

#####################################################

# Ubuntu-18.04, VID_067B & PID_2303 就是指的 PL2303
$ lsusb
Bus 001 Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port

$ uname -a
Linux DESKTOP-N0N0EQI 5.10.60.1-microsoft-standard-WSL2

# WSL2需要从源码编译安装驱动
wget https://prolificusa.com/app/uploads/2019/06/PL2303G_Linux_Driver_v1.0.4.zip
unzip PL2303G_Linux_Driver_v1.0.4.zip
cd PL2303G_Linux_Driver_v1.0.4/5.2_ok

# 改Makefile加上install
obj-m   += pl2303.o
all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
install:
	sudo insmod pl2303.ko;\
	sudo mkdir -p /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial;\
	sudo cp pl2303.ko /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial;\
	sudo sh -c 'echo "pl2303" >> /etc/modules-load.d/modules.conf'
clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
	
# 编译安装
make all
make install

# 检验
$ ls /dev/ttyUSB*
/dev/ttyUSB0

连接如图

在这里插入图片描述

WSL2里面使用Minicom测试, Windows使用SSCOM

# WSL2
sudo minicom -b 115200 -D /dev/ttyUSB0

测试如图

在这里插入图片描述

参考: Ubuntu18系统 PL2303GT驱动安装及绑定_家家的快乐空间的博客-CSDN博客

CH34x

常见的CH340, CH341等. 官网驱动下载:

遗憾的是, 只适用于 Linux 内核 2.6.25 ~ 3.13.x. 对于WSL2的5.10.x并不能编译通过. 解决办法:

# 内核中USB串口芯片的源码都在 /drivers/usb/serial/ 目录
# ch341.c;   cp210x.c;   pl2303.c, pl2303.h
# https://github.com/microsoft/WSL2-Linux-Kernel/blob/d489414c23/drivers/usb/serial/ch341.c
# 复制源码, 保存为 ch34x.c

# Makefile
ifeq ($(KERNELRELEASE), )
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
default:
	$(MAKE) -C $(KERNELDIR)  M=$(PWD)  
clean:
	rm -rf .tmp_versions Module.symvers *.mod.c *.o *.ko .*.cmd Module.markers modules.order
load:
	modprobe usbserial
	insmod ch34x.ko
unload:
	rmmod ch34x
install:
	sudo insmod ch34x.ko;\
	sudo mkdir -p /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial;\
	sudo cp ch34x.ko /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial;\
	sudo sh -c 'echo "ch34x" >> /etc/modules-load.d/modules.conf';\
	sudo depmod
else
	obj-m := ch34x.o
endif

# 编译, 安装
make clean
sudo make
sudo make install

# 测试
# powershell(管理员)
> usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
5-3    1a86:7523  USB-SERIAL CH340 (COM4)                                       Not attached
# 把 CH340 附到WSL2
> usbipd wsl attach -d Ubuntu-18.04 --busid 5-3
# 如果想重连到Win11, 用 usbipd wsl detach --busid 5-3
# WSL2
$ lsusb
Bus 001 Device 007: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
$ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1
# 短接CH340的TX/RX, 用minicom测试
$ sudo minicom -b 115200 -D /dev/ttyUSB1

# 重启测试
# powershell(管理员), wsl --shutdown 或者
> Get-Service LxssManager | Restart-Service
> usbipd wsl attach -d Ubuntu-18.04 --busid 5-3
# wsl, 发现/etc/modules-load.d/modules.conf没有生效, 还是得手动modprobe
$ sudo modprobe ch34x
$ ls /dev/ttyUSB*

CP210x

常用的CP2102, CP2104, CP2105等

# 内核中USB串口芯片的源码都在 /drivers/usb/serial/ 目录
# ch341.c;   cp210x.c;   pl2303.c, pl2303.h;    ftdi
# 下载cp210x.c
# https://github.com/microsoft/WSL2-Linux-Kernel/blob/d489414c23/drivers/usb/serial/cp210x.c

# Makefile
ifeq ($(KERNELRELEASE), )
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
default:
	$(MAKE) -C $(KERNELDIR)  M=$(PWD)  
clean:
	rm -rf .tmp_versions Module.symvers *.mod.c *.o *.ko .*.cmd *.mod Module.markers modules.order
load:
	modprobe usbserial
	insmod cp210x.ko
unload:
	rmmod cp210x
install:
	sudo insmod cp210x.ko;\
	sudo mkdir -p /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial;\
	sudo cp cp210x.ko /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial;\
	sudo depmod
else
	obj-m := cp210x.o
endif

# 编译, 安装
make clean
sudo make
sudo make install

# 测试

# powershell(管理员)
> usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
6-4    10c4:ea60  Silicon Labs CP210x USB to UART Bridge (COM5)                 Not attached
# 把 cp2104 附到WSL2
> usbipd wsl attach -d Ubuntu-18.04 --busid 6-4
# 如果想从wsl2断开, 重连到Win11, 用 usbipd wsl detach --busid 6-4

# WSL2
$ lsusb
Bus 001 Device 007: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
$ ls /dev/ttyUSB*
/dev/ttyUSB0
# 短接cp2104的TX/RX, 用minicom测试
$ sudo minicom -b 115200 -D /dev/ttyUSB0

# 重启测试
# powershell(管理员), wsl --shutdown 或者
> Get-Service LxssManager | Restart-Service
> usbipd wsl attach -d Ubuntu-18.04 --busid 6-4
# wsl
$ sudo modprobe cp210x
$ ls /dev/ttyUSB*

ST-Link V2

有一个虚拟串口, 可以支持到 2Mbps, 测试发现, 仅使用虚拟串口, 可以免驱, /dev/ttyACM*

# powershell 管理员
> usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
6-4    0483:374b  ST-Link Debug, USB 大容量存储设备, STMicroelectronics STL...  Not attached
> usbipd wsl attach -d Ubuntu-18.04 --busid 6-4
usbipd: warning: USB filter 'USBPcap' is known to be incompatible with this software; 'bind --force' will be required.

# wsl2
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0483:374b STMicroelectronics ST-LINK/V2.1 (Nucleo-F103RB)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=vhci_hcd/8p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=vhci_hcd/8p, 480M
    |__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=, 12M
    |__ Port 1: Dev 3, If 1, Class=Mass Storage, Driver=, 12M
    |__ Port 1: Dev 3, If 2, Class=Communications, Driver=cdc_acm, 12M
    |__ Port 1: Dev 3, If 3, Class=CDC Data, Driver=cdc_acm, 12M
$ ls /dev/ttyACM*
/dev/ttyACM0
# 短接RX/TX测试
$ sudo minicom -b 2000000 -D /dev/ttyACM0

给当前用户永久串口读写权限

一般操作 /dev 设备都需要 sudo, 如:

  • 串口设备 /dev/ttyUSB*, /dev/ttyS*, /dev/ttyACM* 等,
  • SPI设备: /dev/spidev*

如果不想用sudo

# 临时
sudo chmod 777 /dev/ttyUSB0

# 永久
$ ls -l /dev/ttyUSB0 
crwxrwxrwx 1 root root 188, 0 Jul 15 10:20 /dev/ttyUSB0
## 将当前用户加入188左边的root用户组, aG: append groups
$ sudo usermod -aG root $(whoami)
$ sudo reboot

# 测试, 不需要sudo了
minicom -b 115200 -D /dev/ttyUSB0

直接编译进内核的方式

cd WSL2-Linux-Kernel-linux-msft-wsl-5.10.60.1
make menuconfig

按 / 搜索 ch34, cp210x, 2303 等, 直接编译进内核

在这里插入图片描述

编译内核

# make modules -j $(nproc)
# sudo make modules_install
make -j $(nproc)

关闭WSL2: wsl --shutdown, 把生成的 vmlinux 拷贝到 C:\Users\用户名\

在这里插入图片描述

配置 C:\Users\用户名\.wslconfig

[wsl2]
kernel=C:\\Users\\karoto\\vmlinux

重新打开WSL2, 把USB转串口附上去, 发现直接就识别了

# powershell(管理员)
> usbipd.exe wsl list
BUSID  VID:PID    DEVICE                                                        STATE
5-2    067b:2303  Prolific USB-to-Serial Comm Port (COM14)                      Not attached
> usbipd wsl attach -d Ubuntu-18.04 --busid 5-2

# wsl2
$ ls /dev/ttyUSB*
/dev/ttyUSB0

Wireshark 抓USB/IP

抓一下 USB/IP 通信情况, 走的TCP, 用的是 3240 端口, 有ACK

在这里插入图片描述

dev 和 lsusb 的对应关系

区分实际设备, /dev/ttyUSB*, 和 lsusb 中的对应关系:

  • 同种设备, 两个PL2303, 这个确实不大好区分, 插拔等
  • 同类设备, PL2303 和 CH340, 这个好区分
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 003: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 002: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=vhci_hcd/8p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=vhci_hcd/8p, 480M
    |__ Port 1: Dev 2, If 0, Class=Vendor Specific Class, Driver=ch34x, 12M
    |__ Port 2: Dev 3, If 0, Class=Vendor Specific Class, Driver=pl2303, 12M
    |__ Port 3: Dev 4, If 0, Class=Vendor Specific Class, Driver=pl2303, 12M
    
$ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2

# 如何确定哪个 /dev/ttyUSB* 是 CH340 呢 ?  
$ find /sys/bus/usb/devices/usb*/ -name dev | grep ttyUSB
/sys/bus/usb/devices/usb1/1-3/1-3:1.0/ttyUSB2/tty/ttyUSB2/dev	# 1-3: |__ Port 3
/sys/bus/usb/devices/usb1/1-1/1-1:1.0/ttyUSB1/tty/ttyUSB1/dev	# 1-1: |__ Port 1
/sys/bus/usb/devices/usb1/1-2/1-2:1.0/ttyUSB0/tty/ttyUSB0/dev	# 1-2: |__ Port 2

# ttyUSB1 是 CH340

参考:

欢迎扫描二维码关注微信公众号, 及时获取最新文章:
在这里插入图片描述

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值