.. _setup_wsl_usb:
Add USB support to WSL
======================
Using `usbipd-win `__
you can make USB devices that are connected to your Windows PC/laptop available in WSL.
As an example, the steps below were used to make a Peak USB-CAN adaptor accessible as a network interface in Ubuntu using ``SocketCAN``.
This assumes you have already successfully followed the steps in :ref:`setup_wsl_socketcan` and your WSL kernel supports USB.
Recent versions of Windows running WSL kernel :prop:`tool:wsl_kernel_version` or later already include support for many USB scenarios.
The steps below were performed with WSL up and running - with the CAN kernel modules loaded
and ``vcan0`` successfully created as described in :ref:`setup_wsl_socketcan`.
First, download the latest `usbipd-win `__ Windows installer and run it (you must have Administrator rights).
Once installed, in a command prompt with Administrator rights run ``usbipd list``
.. code-block:: bash
C:\>usbipd list
Connected:
BUSID VID:PID DEVICE STATE
2-3 0c45:6a09 Integrated Webcam Not shared
2-13 1357:0089 OpenSDA - CDC Serial Port (http://www.pemicro.com/opensda... Not shared
2-14 8087:0026 Intel(R) Wireless Bluetooth(R) Not shared
3-2 0c72:000c PCAN-USB Not shared
3-3 047f:c025 Plantronics C320-M, USB Input Device Not shared
4-3 0b95:1790 ASIX AX88179 USB 3.0 to Gigabit Ethernet Adapter Not shared
You can see in the above list the Peak CAN USB adaptor is listed as ``PCAN-USB`` with Bus ID = ``3-2``
In the same command prompt with Administrator rights run ``usbipd bind --busid 3-2``.
Now, when the devices are listed again you can see that the Peak CAN USB adaptor is "Shared",
meaning the device is available to WSL.
.. code-block:: bash
C:\>usbipd list
Connected:
BUSID VID:PID DEVICE STATE
2-3 0c45:6a09 Integrated Webcam Not shared
2-13 1357:0089 OpenSDA - CDC Serial Port (http://www.pemicro.com/opensda... Not shared
2-14 8087:0026 Intel(R) Wireless Bluetooth(R) Not shared
3-2 0c72:000c PCAN-USB Shared
3-3 047f:c025 Plantronics C320-M, USB Input Device Not shared
4-3 0b95:1790 ASIX AX88179 USB 3.0 to Gigabit Ethernet Adapter Not shared
This "Shared" status persists across reboots so you will not need to do this again
and you won't need Administrator rights for the remaining commands.
Once it is "Shared", a device can be "Attached" to WSL in a normal Windows command prompt (without Administrator rights) as follows...
.. code-block:: bash
C:\>usbipd attach --wsl --busid 3-2
usbipd: info: Using WSL distribution 'Ubuntu-x.x' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Using IP address 127.0.0.1 to reach the host.
The "Attached" status does not persist, you will need to reattach after every time WSL is restarted.
While "Attached" to WSL, you cannot use the device in Windows.
.. code-block:: bash
C:\>usbipd list
Connected:
BUSID VID:PID DEVICE STATE
2-3 0c45:6a09 Integrated Webcam Not shared
2-13 1357:0089 OpenSDA - CDC Serial Port (http://www.pemicro.com/opensda... Not shared
2-14 8087:0026 Intel(R) Wireless Bluetooth(R) Not shared
3-2 0c72:000c PCAN-USB Attached
3-3 047f:c025 Plantronics C320-M, USB Input Device Not shared
4-3 0b95:1790 ASIX AX88179 USB 3.0 to Gigabit Ethernet Adapter Not shared
Now, in a Ubuntu shell, you should see the USB device...
.. code-block:: bash
frank@C11-JQXQXCRB1VG:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 0c72:000c PEAK System PCAN-USB
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
frank@C11-JQXQXCRB1VG:~$
Next, create the file ``/etc/systemd/network/80-can.network`` containing...
.. code-block:: bash
[Match]
Name=can*
[CAN]
BitRate=500000
Then enable and start ``systemd-networkd``...
.. code-block:: bash
sudo systemctl enable systemd-networkd
sudo systemctl start systemd-networkd
If this is successful, a new network interface called ``can0`` should be created.
.. code-block:: bash
frank@C11-JQXQXCRB1VG:~$ ifconfig
can0: flags=193 mtu 16
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC)
RX packets 23 bytes 184 (184.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
After reboots, once the ``PCAN-USB`` is again "Attached" in a Windows command prompt,
and once the CAN modules are loaded in Ubuntu,
then the same ``can0`` interface will be recreated.
You can use the utilities ``candump`` and ``cansend`` with ``can0``, just as you did with ``vcan0`` in :ref:`setup_wsl_socketcan`
but in this case the CAN messages sent/received should be using the Peak CAN USB adaptor.
If you have a S32K148 Development Board attached to the Peak CAN USB adaptor
then using ``candump`` you should see CAN messages sent from an image running on that board.
Also, you can change the POSIX platform's code so that it attaches to ``can0`` instead of ``vcan0``,
then the POSIX build can communicate with the S32K148 Development Board over the Peak CAN USB adaptor.