Nous avons récemment eu l'occasion d'installer la dernière versions de WSL (Windows Subsystem for Linux) sur une machine de développement Windows, afin de pouvoir lancer des procédures de tests conçues pour fonctionner sous Linux. Comme cela fonctionne plutôt bien, nous nous sommes dit que nous serons pas les seuls à le faire, et qu'il serait judicieux de documenter l'utilisation des modules Yoctopuce dans cet environnement.
L'intégration de Linux dans WSL est tellement transparente sur certains aspects (intégration du shell Linux dans les fenêtres de commande, panachage des fenêtres Linux et Windows, etc.) qu'on aurait vite fait d'oublier qu'il s'agit en réalité d'une intégration par virtualisation: lorsque vous lancez le premier shell, c'est toute une machine virtuelle avec un système Linux qui est lancée pour vous, bien que Windows ne vous en montre qu'une petite partie. Et comme les programmes Linux sont exécutés dans cette machine virtuelle, ils n'ont pas un accès direct aux périphériques USB.
Si vous souhaitez utiliser des modules Yoctopuce depuis un processus WSL, vous devez donc mettre en place un mécanisme qui permette à Windows de partager les périphériques avec la machine virtuelle Linux. Il existe deux solutions pour cela: la solution plug-and-play de Yoctopuce, VirtualHub, et une solution générique (mais moins plug-and-play) proposée par Microsoft, basée sur la solution USB/IP et le logiciel open source usbipd-win.
Solution 1: VirtualHub
VirtualHub est un logiciel mis à disposition par Yoctopuce pour tester et configurer les modules Yoctopuce, qui permet aussi d'offrir un accès aux modules USB à travers un réseau IP, et de partager l'accès aux modules USB entre plusieurs applications. Il peut donc assez naturellement être utilisé pour partager l'accès aux modules USB avec des programmes Linux fonctionnant dans WSL.
Pour cela,
- Installez VirtualHub sous Windows. Vous pouvez choisir de le lancer automatiquement comme service pour vous assurer qu'il soit toujours disponible.
- Pour accéder aux modules depuis un programme Windows, utilisez l'adresse IP 127.0.0.1. Par exemple, dans votre programme, initialisez la librairie Yoctopuce avec l'appel:
YAPI.RegisterHost("127.0.0.1")
ou si vous utilisez la librairie en ligne de commande:YModule -r 127.0.0.1 inventory - Pour accéder aux modules depuis un programme Linux, utilisez l'adresse IP virtuelle de Windows, allouée dynamiquement par WSL. Vous pouvez la trouver avec la commande bash suivante:
ip route show default
En principe, elle ressemblera à quelque chose comme 172.25.128.1. Dans votre programme Linux, initialisez donc la librairie Yoctopuce avec l'appel:YAPI.RegisterHost("172.25.128.1")
Pour éviter d'avoir à rechercher cette adresse IP à chaque démarrage (elle peut changer), vous pouvez ajouter la ligne suivante au fichier ~/.bashrc:
Après avoir relancé bash, si vous avez installé la librairie Yoctopuce en ligne de commande, vous pourrez par exemple utiliser:
Attention: si vous posez la question à ChatGPT, il risque de vous conseiller d'utiliser l'adresse IP présente dans /etc/resolv.conf. Ne suivez pas ce conseil, cela ne marchera pas si votre WSL est configuré en mode NAT.
Solution 2: USB/IP
La solution USB/IP est faite de deux composants: un driver Linux capable de faire apparaître des périphériques USB virtuels, et un programme usbipd qui fournit à ce driver un accès distant exclusif à des périphériques USB, sélectionnés sur l'hôte où usbipd est lancé. C'est la solution documentée sur le site de Microsoft pour le partage de périphériques USB avec WSL, mais il s'agit en réalité d'un projet open source maintenu par des développeurs externes à Microsoft.
La solution USB/IP exige de spécifier explicitement quel périphérique USB doit être capturé sur la machine Windows et attaché à la machine virtuelle Linux. Cela se fait avec l'outil en ligne de commande usbipd. La méthode la plus simple pour installer et utiliser cet outil est d'utiliser une fenêtre Windows PowerShell avec les droits d'administrateur. Suivez les étapes ci-dessous:
- Installez l'outil usbipd-win avec la commande suivante:winget install --exact dorssel.usbipd-win
- Branchez sur la machine le module Yoctopuce que vous voulez transférer à Linux
- Listez les modules USB détectés par Windows avec la commande suivante:usbipd list
Vous devriez obtenir une liste ressemblant à ceci:BUSID VID:PID DEVICE STATE
1-9 06cb:00bd Synaptics UWP WBDI Not shared
1-10 056a:51a0 Wacom Device Not shared
1-14 8087:0029 Intel(R) Wireless Bluetooth(R) Not shared
17-3 1e7d:2de6 USB Input Device Not shared
17-4 046d:c349 USB Input Device Not shared
20-1 058f:8468 USB Mass Storage Device Not shared
26-1 24e0:00c7 USB Input Device Not shared - Retrouvez le module Yoctopuce dans la liste: c'est celui dont la valeur VID:PID commence par 24e0, qui est le VendorID de Yoctopuce. Notez son BUSID, en l'occurrence 26-1.
- Pour partager ce périphérique et l'attacher à WSL, utilisez les commandes suivantes:usbipd bind -b 26-1
usbipd attach -w -b 26-1 - Sous Linux, vous devriez alors pouvoir accéder au module. Prenez soin de lire notre introduction sur l'utilisation des modules Yoctopuce sous Linux si vous n'êtes pas familier avec l'utilisation de USB sous Linux, car ce n'est pas aussi trivial que sous Windows.
Attention, c'est maintenant que les choses se compliquent un peu avec USB/IP. Si pour une raison ou une autre le périphérique USB se déconnecte, même temporairement pour une mise à jour de firmware par exemple, il ne se réattachera pas automatiquement à Linux. Le système usbipd a mémorisé la commande bind pour ce module sur cette prise USB particulière, mais pas le rattachement à WSL. Et si vous branchez le même module sur une autre prise USB, il ne sera même pas bindé à usbipd. C'est donc une solution assez partielle.
Pour améliorer la situation, nous vous recommandons d'utiliser un bind et un attach automatiques. Toujours dans une fenêtre Windows Powershell avec droits administrateur, lancez les commandes suivantes:
usbipd attach -a -u -w -b 26-1
Cette dernière commande ne rend pas la main: elle reste active et surveille la prise USB pour attacher automatiquement au système Linux sous WSL tout périphérique détecté. De la même manière, la commande policy add permet de faire un bind automatique pour n'importe quel périphérique branché sur cette prise USB. La combinaison de ces deux commandes correspond donc littéralement à allouer une prise USB au système Linux, ce qui est un comportement plus compréhensible que la solution de base fournie par USB/IP. Mais attention, si vous fermez le PowerShell, l'attachement automatique disparaîtra...
Dans tous les cas, que ce soit après un bind manuel ou automatique, quand vous n'avez plus besoin de partager vos périphériques USB avec Linux, prenez soin de désactiver tous les bindings faits par usbipd, sinon vous risquez de vous retrouver avec des modules Yoctopuce qui n'apparaissent plus sous Windows. Dans une fenêtre Windows Powershell avec droits d'administrateurs, lancez les commandes suivantes:
usbipd policy remove -a
usbipd unbind -a
Ceci rétablira la visibilité de tous les modules USB pour Windows.
Quelle approche choisir ?
Si vous avez le choix entre les deux approches, la solution du VirtualHub est clairement plus simple à mettre en place, et elle supporte bien plus facilement la connexion/déconnexion dynamique des modules USB. Elle est donc recommandée.
Par contre, si vous devez tester le code d'accès natif USB sous Linux, ou si vous n'avez pas accès au code source du programme et qu'il ne supporte que la connexion via USB, vous serez obligé d'utiliser usbipd. C'est clairement moins pratique, mais si vous prenez l'option de dédier une prise USB à votre Linux et que vous faites un raccourci vers un script PowerShell automatique qui lance les commandes de bind et d'attach, c'est parfaitement utilisable.
Si vous utilisez USB/IP ne serait-ce que pour quelques tests, n'oubliez vraiment pas de lancer les trois commandes ci-dessus pour désactiver tous les bindings. Sinon, vous risquez fort de vous retrouver avec des périphériques USB qui n'apparaissent plus sous Windows ou ne répondent plus.