---
# System prepended metadata

title: Connecting USB devices to wsl2

---

# Connecting USB devices to wsl2

This document contains information on forwarding usb devices to wsl2 in windows 10/11 systems. 

### My setup

1. Windows 11
2. wsl2
    a. Kernel info
    ```
    $ uname -r
    5.15.90.1-microsoft-standard-WSL2
    ```
    b. OS information
    ```
    $ lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 22.04.3 LTS
    Release:        22.04
    Codename:       jammy
    ```




### Install package for windows
Download latest installer(.msi) from here https://github.com/dorssel/usbipd-win/releases/tag/v4.0.0

### Install packages for wsl2/ubuntu

1. Sync'ng time between wsl2 and windows. This is required to avoid any ssl errors
    ```
    sudo hwclock -s
    ```
2. Update packages and sources
    ```
    sudo apt update
    ```
3. Install required packages
As documented [here](https://learn.microsoft.com/en-us/windows/wsl/connect-usb#install-the-usbip-tools-and-hardware-database-in-linux)

    ```
    sudo apt install linux-tools-generic hwdata
    sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20
    ```

### Attach the device to wsl2

1. Connect a usb device which is to be forwarded to wsl2.
2. Ensure that **wsl2** is up and running.
3. Get the busid of device by running `usbipd list` in **windows** `powershell`(admin)
![image](https://hackmd.io/_uploads/H18rU0_v6.png)
4. Bind the device. In **windows** `powershell` (admin) run
    > This is required only once for a device
    ```
    usbipd bind --busid=2-2
    ```
5. Attach device to **wsl2**. In **windows** `powershell` (admin) run
    > This is required every time device reconnects
    ```
    usbipd attach --wsl --busid=1-2
    ```
6. Now in **wsl2**, run `lsusb` . The device should show up.
    ```
    $ lsusb
    Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 001 Device 003: ID 0483:374e STMicroelectronics STLINK-V3
    ```
### Setting up permissions for usb debugging in wsl2

1. Setup `udev` rules
The following list contains a few of the commonly used debuggers. For custom rules see this [tutorial](https://www.clearpathrobotics.com/assets/guides/kinetic/ros/Udev%20Rules.html) 
    a. Setup OpenOCD udev rules
    ```
    curl -fsSL https://raw.githubusercontent.com/openocd-org/openocd/master/contrib/60-openocd.rules | sudo tee /etc/udev/rules.d/60-openocd.rules
    ```
    b. Setup SEGGER udev rules
        //Todo
    c. Wlink udev rules
        //Todo
2. Restart udev service
    ```
    sudo service udev restart
    ```
3. Add user to `plugdev` group
    ```
    sudo usermod -aG plugdev $USER
    ```
4. Verify whether the current user was added
    ```
    groups `whoami`
    ```
5. Now reconnect the device and attach it to wsl2 as stated above.
6. Verify if rules are set.
    a. Find device id
    ```
    $ lsusb
    Bus 001 Device 006: ID 0483:374e STMicroelectronics STLINK-V3
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    ```
    b. Check device permissions and user group
    Use the syntax `ls -l /dev/bus/usb/<Bus>/<Device>` 
    ```
    $ ls -l /dev/bus/usb/001/006
    crw-rw-rw- 1 root plugdev 189, 5 Dec 27 14:14 /dev/bus/usb/001/006
    ```
    Ensure that the device is accesible by plugdev group and also the read, write permissions

### Now the device should be accessible by wsl2 applications

## References

1. https://github.com/arduino/OpenOCD/blob/master/contrib/60-openocd.rules
2. https://docs.platformio.org/en/stable/core/installation/udev-rules.html
3. https://embedded-trainings.ferrous-systems.com/installation#linux-only-usb