From 22628a7afd5f4b977cdede220d485de9e118a0f3 Mon Sep 17 00:00:00 2001 From: Ryan Date: Wed, 20 Apr 2022 16:52:39 +1000 Subject: [PATCH] [Windows] Add support for LUFA-HID/QMK-HID (#348) --- readme.md | 1 + .../Helpers/EmbeddedResourceHelper.cs | 1 + windows/QMK Toolbox/MainWindow.cs | 1 + windows/QMK Toolbox/QMK Toolbox.csproj | 2 ++ .../Resources/hid_bootloader_cli.exe | Bin 0 -> 81920 bytes .../Usb/Bootloader/BootloaderType.cs | 2 ++ .../Usb/Bootloader/LufaHidDevice.cs | 29 ++++++++++++++++++ windows/QMK Toolbox/Usb/UsbListener.cs | 10 ++++++ 8 files changed, 46 insertions(+) create mode 100644 windows/QMK Toolbox/Resources/hid_bootloader_cli.exe create mode 100644 windows/QMK Toolbox/Usb/Bootloader/LufaHidDevice.cs diff --git a/readme.md b/readme.md index a0ac0be8ef..fd50b9fb4e 100644 --- a/readme.md +++ b/readme.md @@ -23,6 +23,7 @@ QMK Toolbox supports the following bootloaders: - BootloadHID (Atmel, PS2AVRGB) via [bootloadHID](https://www.obdev.at/products/vusb/bootloadhid.html) - Caterina (Arduino, Pro Micro) via [avrdude](http://nongnu.org/avrdude/) - HalfKay (Teensy, Ergodox EZ) via [Teensy Loader](https://pjrc.com/teensy/loader_cli.html) + - LUFA/QMK HID via [hid_bootloader_cli](/~https://github.com/abcminiuser/lufa) - LUFA Mass Storage And the following ISP flashers: diff --git a/windows/QMK Toolbox/Helpers/EmbeddedResourceHelper.cs b/windows/QMK Toolbox/Helpers/EmbeddedResourceHelper.cs index 482a4f12bd..7a7b18e6c5 100644 --- a/windows/QMK Toolbox/Helpers/EmbeddedResourceHelper.cs +++ b/windows/QMK Toolbox/Helpers/EmbeddedResourceHelper.cs @@ -17,6 +17,7 @@ public static class EmbeddedResourceHelper "bootloadHID.exe", "dfu-programmer.exe", "dfu-util.exe", + "hid_bootloader_cli.exe", "mdloader.exe", "teensy_loader_cli.exe", "libftdi1.dll", diff --git a/windows/QMK Toolbox/MainWindow.cs b/windows/QMK Toolbox/MainWindow.cs index 4d6ebc5f8b..3d996a5d50 100644 --- a/windows/QMK Toolbox/MainWindow.cs +++ b/windows/QMK Toolbox/MainWindow.cs @@ -72,6 +72,7 @@ private void MainWindow_Load(object sender, EventArgs e) logTextBox.LogInfo(" - BootloadHID (Atmel, PS2AVRGB) via bootloadHID (https://www.obdev.at/products/vusb/bootloadhid.html)"); logTextBox.LogInfo(" - Caterina (Arduino, Pro Micro) via avrdude (http://nongnu.org/avrdude/)"); logTextBox.LogInfo(" - HalfKay (Teensy, Ergodox EZ) via Teensy Loader (https://pjrc.com/teensy/loader_cli.html)"); + logTextBox.LogInfo(" - LUFA/QMK HID via hid_bootloader_cli (/~https://github.com/abcminiuser/lufa)"); logTextBox.LogInfo(" - LUFA Mass Storage"); logTextBox.LogInfo("Supported ISP flashers:"); logTextBox.LogInfo(" - AVRISP (Arduino ISP)"); diff --git a/windows/QMK Toolbox/QMK Toolbox.csproj b/windows/QMK Toolbox/QMK Toolbox.csproj index 883fed7c25..76623d2c09 100644 --- a/windows/QMK Toolbox/QMK Toolbox.csproj +++ b/windows/QMK Toolbox/QMK Toolbox.csproj @@ -118,6 +118,7 @@ + @@ -185,6 +186,7 @@ + diff --git a/windows/QMK Toolbox/Resources/hid_bootloader_cli.exe b/windows/QMK Toolbox/Resources/hid_bootloader_cli.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d62229e40701f9c6c02d12e2d322f2ccdc79a6 GIT binary patch literal 81920 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 z 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 await RunProcessAsync("hid_bootloader_cli.exe", $"-mmcu={mcu} \"{file}\" -v"); + + // hid_bootloader_cli 210130 lacks -b flag + // Next LUFA release should have it thanks to abcminiuser/lufa#173 + //public async override Task Reset(string mcu) => await RunProcessAsync("hid_bootloader_cli.exe", $"-mmcu={mcu} -bv"); + } +} diff --git a/windows/QMK Toolbox/Usb/UsbListener.cs b/windows/QMK Toolbox/Usb/UsbListener.cs index e2d52ef241..f2a0d92be7 100644 --- a/windows/QMK Toolbox/Usb/UsbListener.cs +++ b/windows/QMK Toolbox/Usb/UsbListener.cs @@ -170,6 +170,9 @@ private static IUsbDevice CreateDevice(ManagementBaseObject d) return new HalfKayDevice(usbDevice); case BootloaderType.KiibohdDfu: return new KiibohdDfuDevice(usbDevice); + case BootloaderType.LufaHid: + case BootloaderType.QmkHid: + return new LufaHidDevice(usbDevice); case BootloaderType.LufaMs: return new LufaMsDevice(usbDevice); case BootloaderType.Stm32Dfu: @@ -194,6 +197,13 @@ private static BootloaderType GetDeviceType(ushort vendorId, ushort productId, u { case 0x2045: return BootloaderType.LufaMs; + case 0x2067: + if (revisionBcd == 0x0936) // Unicode Ψ + { + return BootloaderType.QmkHid; + } + + return BootloaderType.LufaHid; case 0x2FEF: // ATmega16U2 case 0x2FF0: // ATmega32U2 case 0x2FF3: // ATmega16U4