From b8e12eed8038d172aacfd7381785643f2da9664c Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 1 Jan 2023 00:44:33 +0000 Subject: [PATCH] WSL `qmk flash firmware.bin` workaround (#19434) --- lib/python/qmk/flashers.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/python/qmk/flashers.py b/lib/python/qmk/flashers.py index 6b48b9406c9..e902e5072fe 100644 --- a/lib/python/qmk/flashers.py +++ b/lib/python/qmk/flashers.py @@ -1,3 +1,4 @@ +import platform import shutil import time import os @@ -56,6 +57,20 @@ def _check_dfu_programmer_version(): return False +def _find_usb_device(vid_hex, pid_hex): + # WSL doesnt have access to USB - use powershell instead...? + if 'microsoft' in platform.uname().release.lower(): + ret = cli.run(['powershell.exe', '-command', 'Get-PnpDevice -PresentOnly | Select-Object -Property InstanceId']) + if f'USB\\VID_{vid_hex:04X}&PID_{pid_hex:04X}' in ret.stdout: + return (vid_hex, pid_hex) + else: + with DelayedKeyboardInterrupt(): + # PyUSB does not like to be interrupted by Ctrl-C + # therefore we catch the interrupt with a custom handler + # and only process it once pyusb finished + return usb.core.find(idVendor=vid_hex, idProduct=pid_hex) + + def _find_bootloader(): # To avoid running forever in the background, only look for bootloaders for 10min start_time = time.time() @@ -64,11 +79,7 @@ def _find_bootloader(): for vid, pid in BOOTLOADER_VIDS_PIDS[bl]: vid_hex = int(f'0x{vid}', 0) pid_hex = int(f'0x{pid}', 0) - with DelayedKeyboardInterrupt(): - # PyUSB does not like to be interrupted by Ctrl-C - # therefore we catch the interrupt with a custom handler - # and only process it once pyusb finished - dev = usb.core.find(idVendor=vid_hex, idProduct=pid_hex) + dev = _find_usb_device(vid_hex, pid_hex) if dev: if bl == 'atmel-dfu': details = _PID_TO_MCU[pid]