November 12, 2021

USB serial on WSL2

最近有需要在 WSL2 上用 USB TTL 的需求。
這邊做一下紀錄。

我的 WSL2 Linux 用的是 Windows 11 + Ubuntu 20.04 LTS,以下就以這個為基礎做紀錄。

估狗了一下,大致上都是說需要 usbip 。簡單來說就是透過網路方式分享 USB`.
比較早的一些方案,抓 usbip for windows 然後重新 compile  WSL2 linux kernel 對我無效。
e.g.

最後找到這篇比較官方 (M$) 開發者的說明,還蠻新的


遵循這個 blog 的說明,Windows 需要安裝
usbipd-win

WSL2 上則是先安裝一些需要的工具

sudo apt install linux-tools-5.4.0-77-generic hwdata

然後編輯 sudoer

visudo

找到 Defaults secure_path 這行,修改如下 (紅色代表我新增的內容)

Defaults secure_path="/usr/lib/linux-tools/5.4.0-77-generic:...

做完這些,還需要打開 Windows 的防火牆設定。(重點,卡了我一點時間)


基本上就是去 Windows firewall 管理打開剛剛安裝的 usbipd-win 權限。
這樣 host 和 target 才能通。
接著用 Administrator 權限啟動 Windows terminal ,同時也要啟動 WSL2,接著就能在 Windows tesminal (power shell or command prompt) 執行 usbipd

查詢可用的 USB 裝置

usbipd wsl list

從這邊可以看到裝置的 BUS ID。然後就可以掛載。

usbipd wsl attach --busid <bus-id>

舉我的例子來說,


我想掛載 USB TTL,所以就用

usbipd wsl attach --busid 4-2

如果要取消掛載,就用

usbipd wsl detach --busid 4-2

然後在 WSL2 打 lsusb -t -v  還有 dmesg  應該就能看到裝置了。

BUT ... 因為我用的是 CP2102 的 USB TTL,似乎並沒有直接抓到。
所以還是要參考最早重新 compile  kernel 的文章來產生 kernel module。

替換 kernel 不用參考上面那篇,後來找到的方法感覺比較正統。

compile 好,make modules_install 後,把 Compile 好的 kernel copy 出來

cp vmlinux /mnt/c/User/YourName/vmlinux

編輯 /mnt/c/User/YourName/.wslconfig
內容

[WSL2]
kernel=C:\\Users\\YourName\\vmlinux


然後重新啟動 WSL2
Windows terminal 下關閉 wsl2
wsl --shutdown

然後重新啟動 WSL2,跑上面的 usbipd 指令。 
WSL2 裡

sudo modprobe cp210x

再觀察一下 dmesg,應該就能看到他被掛載到 /dev/ttyUSB0
達成我最早的目的。