diff options
author | MechMerlin <30334081+mechmerlin@users.noreply.github.com> | 2019-02-18 08:35:34 -0800 |
---|---|---|
committer | Drashna Jaelre <drashna@live.com> | 2019-02-18 08:35:34 -0800 |
commit | f0edc993b7beb15cc9c0443677801daddcae710b (patch) | |
tree | 0d0ee27fca9ea4384a905cdc26878aaa796ee18d /keyboards/winkeyless/bface/program | |
parent | 593d08d6aec38aca6f38db4a17f3d8cdcd13bf28 (diff) |
[Keyboard] Winkeyless Directory (#5163)
* introduce wkl directory and readme
* move bface into winkeyless directory and edit readme for new make instructions
* move bmini into the winkeyless directory and edit readme
* move bmini ex into winkeyless directory
* edit readme some more
* add newbs guide to readmes
* fix path to bface
* temporarily turn off community layout support until we refactor this taking out all the custom ps2avrgb stuff
Diffstat (limited to 'keyboards/winkeyless/bface/program')
-rwxr-xr-x | keyboards/winkeyless/bface/program | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/keyboards/winkeyless/bface/program b/keyboards/winkeyless/bface/program new file mode 100755 index 0000000000..298e645477 --- /dev/null +++ b/keyboards/winkeyless/bface/program @@ -0,0 +1,105 @@ +#!/usr/bin/env python +# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>, Sebastian Kaim <sebb@sebb767.de> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +from __future__ import print_function + +import os +import sys +import time +import usb + + +def checkForKeyboardInNormalMode(): + """Returns a device if a ps2avrGB device in normal made (that is in keyboard mode) or None if it is not found.""" + return usb.core.find(idVendor=0x20A0, idProduct=0x422D) + +def checkForKeyboardInBootloaderMode(): + """Returns True if a ps2avrGB device in bootloader (flashable) mode is found and False otherwise.""" + return (usb.core.find(idVendor=0x16c0, idProduct=0x05df) is not None) + +def flashKeyboard(firmware_file): + """Calls bootloadHID to flash the given file to the device.""" + print('Flashing firmware to device ...') + if os.system('bootloadHID -r "%s"' % firmware_file) == 0: + print('\nDone!') + else: + print('\nbootloadHID returned an error.') + +def printDeviceInfo(dev): + """Prints all infos for a given USB device""" + print('Device Information:') + print(' idVendor: %d (0x%04x)' % (dev.idVendor, dev.idVendor)) + print(' idProduct: %d (0x%04x)' % (dev.idProduct, dev.idProduct)) + print('Manufacturer: %s' % (dev.iManufacturer)) + print('Serial: %s' % (dev.iSerialNumber)) + print('Product: %s' % (dev.iProduct), end='\n\n') + +def sendDeviceToBootloaderMode(dev): + """Tries to send a given ps2avrGB keyboard to bootloader mode to allow flashing.""" + try: + dev.set_configuration() + + request_type = usb.util.build_request_type( + usb.util.CTRL_OUT, + usb.util.CTRL_TYPE_CLASS, + usb.util.CTRL_RECIPIENT_DEVICE) + + USBRQ_HID_SET_REPORT = 0x09 + HID_REPORT_OPTION = 0x0301 + + dev.ctrl_transfer(request_type, USBRQ_HID_SET_REPORT, HID_REPORT_OPTION, 0, [0, 0, 0xFF] + [0] * 5) + except usb.core.USBError: + # for some reason I keep getting USBError, but it works! + pass + + +if len(sys.argv) < 2: + print('Usage: %s <firmware.hex>' % sys.argv[0]) + sys.exit(1) + +kb = checkForKeyboardInNormalMode() + +if kb is not None: + print('Found a keyboad in normal mode. Attempting to send it to bootloader mode ...', end='') + sendDeviceToBootloaderMode(kb) + print(' done.') + print("Hint: If your keyboard can't be set to bootloader mode automatically, plug it in while pressing the bootloader key to do so manually.") + print(" You can find more infos about this here: https://github.com/qmk/qmk_firmware/tree/master/keyboards/ps2avrGB#setting-the-board-to-bootloader-mode") + +attempts = 12 # 60 seconds +found = False +for attempt in range(1, attempts + 1): + print("Searching for keyboard in bootloader mode (%i/%i) ... " % (attempt, attempts), end='') + + if checkForKeyboardInBootloaderMode(): + print('Found', end='\n\n') + flashKeyboard(sys.argv[1]) + found = True + break + else: + print('Nothing.', end='') + + if attempt != attempts: # no need to wait on the last attempt + print(' Sleeping 5 seconds.', end='') + time.sleep(5) + + # print a newline + print() + +if not found: + print("Couldn't find a flashable keyboard. Aborting.") + sys.exit(2) + |