diff options
author | lokher <lokher@gmail.com> | 2023-04-26 16:32:15 +0800 |
---|---|---|
committer | lokher <lokher@gmail.com> | 2023-04-26 16:32:15 +0800 |
commit | e4f4ceaf3f2e3d25fb282273a81f9b58790fc427 (patch) | |
tree | c0a257eab0ffe5238fdf2c04882e8ee1fe8fc46e /lib/python/qmk/cli/flash.py | |
parent | 103badc87cb50db1ff3851c84331e86ba78fb681 (diff) |
merge upstream 713427c
Diffstat (limited to 'lib/python/qmk/cli/flash.py')
-rw-r--r-- | lib/python/qmk/cli/flash.py | 61 |
1 files changed, 40 insertions, 21 deletions
diff --git a/lib/python/qmk/cli/flash.py b/lib/python/qmk/cli/flash.py index 40bfbdab56..8724f26889 100644 --- a/lib/python/qmk/cli/flash.py +++ b/lib/python/qmk/cli/flash.py @@ -11,12 +11,24 @@ import qmk.path from qmk.decorators import automagic_keyboard, automagic_keymap from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json, build_environment from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keymap import keymap_completer, locate_keymap from qmk.flashers import flasher -def print_bootloader_help(): +def _is_keymap_target(keyboard, keymap): + if keymap == 'all': + return True + + if locate_keymap(keyboard, keymap): + return True + + return False + + +def _list_bootloaders(): """Prints the available bootloaders listed in docs.qmk.fm. """ + cli.print_help() cli.log.info('Here are the available bootloaders:') cli.echo('\tavrdude') cli.echo('\tbootloadhid') @@ -36,14 +48,29 @@ def print_bootloader_help(): cli.echo('\tuf2-split-left') cli.echo('\tuf2-split-right') cli.echo('For more info, visit https://docs.qmk.fm/#/flashing') + return False + + +def _flash_binary(filename, mcu): + """Try to flash binary firmware + """ + cli.echo('Flashing binary firmware...\nPlease reset your keyboard into bootloader mode now!\nPress Ctrl-C to exit.\n') + try: + err, msg = flasher(mcu, filename) + if err: + cli.log.error(msg) + return False + except KeyboardInterrupt: + cli.log.info('Ctrl-C was pressed, exiting...') + return True @cli.argument('filename', nargs='?', arg_only=True, type=qmk.path.FileType('r'), completer=FilesCompleter('.json'), help='A configurator export JSON to be compiled and flashed or a pre-compiled binary firmware file (bin/hex) to be flashed.') @cli.argument('-b', '--bootloaders', action='store_true', help='List the available bootloaders.') @cli.argument('-bl', '--bootloader', default='flash', help='The flash command, corresponding to qmk\'s make options of bootloaders.') @cli.argument('-m', '--mcu', help='The MCU name. Required for HalfKay, HID, USBAspLoader and ISP flashing.') -@cli.argument('-km', '--keymap', help='The keymap to build a firmware for. Use this if you dont have a configurator file. Ignored when a configurator file is supplied.') -@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='The keyboard to build a firmware for. Use this if you dont have a configurator file. Ignored when a configurator file is supplied.') +@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='The keyboard to build a firmware for. Ignored when a configurator export is supplied.') +@cli.argument('-km', '--keymap', completer=keymap_completer, help='The keymap to build a firmware for. Ignored when a configurator export is supplied.') @cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't actually build, just show the make command to be run.") @cli.argument('-j', '--parallel', type=int, default=1, help="Set the number of parallel make jobs; 0 means unlimited.") @cli.argument('-e', '--env', arg_only=True, action='append', default=[], help="Set a variable to be passed to make. May be passed multiple times.") @@ -56,30 +83,17 @@ def flash(cli): If a binary firmware is supplied, try to flash that. - If a Configurator JSON export is supplied this command will create a new keymap. Keymap and Keyboard arguments - will be ignored. + If a Configurator export is supplied this command will create a new keymap, overwriting an existing keymap if one exists. - If no file is supplied, keymap and keyboard are expected. + If a keyboard and keymap are provided this command will build a firmware based on that. If bootloader is omitted the make system will use the configured bootloader for that keyboard. """ - if cli.args.filename and cli.args.filename.suffix in ['.bin', '.hex']: - # Try to flash binary firmware - cli.echo('Flashing binary firmware...\nPlease reset your keyboard into bootloader mode now!\nPress Ctrl-C to exit.\n') - try: - err, msg = flasher(cli.args.mcu, cli.args.filename) - if err: - cli.log.error(msg) - return False - except KeyboardInterrupt: - cli.log.info('Ctrl-C was pressed, exiting...') - return True + if cli.args.filename and cli.args.filename.suffix in ['.bin', '.hex', '.uf2']: + return _flash_binary(cli.args.filename, cli.args.mcu) if cli.args.bootloaders: - # Provide usage and list bootloaders - cli.print_help() - print_bootloader_help() - return False + return _list_bootloaders() # Build the environment vars envs = build_environment(cli.args.env) @@ -94,6 +108,11 @@ def flash(cli): elif cli.config.flash.keyboard and cli.config.flash.keymap: # Generate the make command for a specific keyboard/keymap. + if not _is_keymap_target(cli.config.flash.keyboard, cli.config.flash.keymap): + cli.log.error('Invalid keymap argument.') + cli.print_help() + return False + if cli.args.clean: commands.append(create_make_command(cli.config.flash.keyboard, cli.config.flash.keymap, 'clean', **envs)) commands.append(create_make_command(cli.config.flash.keyboard, cli.config.flash.keymap, cli.args.bootloader, parallel=cli.config.flash.parallel, **envs)) |