|  | # Copyright 2023 The Pigweed Authors | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); you may not | 
|  | # use this file except in compliance with the License. You may obtain a copy of | 
|  | # the License at | 
|  | # | 
|  | #     https://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | 
|  | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | 
|  | # License for the specific language governing permissions and limitations under | 
|  | # the License. | 
|  | """Flash Gonk via dfu-util.""" | 
|  |  | 
|  | import argparse | 
|  | from pathlib import Path | 
|  | import shutil | 
|  | import signal | 
|  | import subprocess | 
|  | import sys | 
|  |  | 
|  | import pw_cli.color | 
|  |  | 
|  | _COLOR = pw_cli.color.colors() | 
|  |  | 
|  | DFU_SERIAL_STRING = 'STM32FxSTM32' | 
|  |  | 
|  |  | 
|  | def _parse_args(): | 
|  | parser = argparse.ArgumentParser(description=__doc__) | 
|  | parser.add_argument( | 
|  | '--dfu-serial-string', | 
|  | default=DFU_SERIAL_STRING, | 
|  | help=f'Serial string to pass to dfu-util. Default: {DFU_SERIAL_STRING}', | 
|  | ) | 
|  |  | 
|  | parser.add_argument( | 
|  | 'bin_file', | 
|  | help='Binary to flash with dfu-util', | 
|  | type=Path, | 
|  | ) | 
|  | return parser.parse_args() | 
|  |  | 
|  |  | 
|  | def main( | 
|  | bin_file: Path, | 
|  | dfu_serial_string: str, | 
|  | ) -> int: | 
|  | """Flash Gonk via dfu-util.""" | 
|  |  | 
|  | dfu_util_binary = shutil.which('dfu-util') | 
|  | if not dfu_util_binary or not Path(dfu_util_binary).is_file(): | 
|  | raise FileNotFoundError('Unable to find "dfu-util"') | 
|  |  | 
|  | if not bin_file.is_file(): | 
|  | raise FileNotFoundError(f'Unable to find the file "{bin_file}"') | 
|  |  | 
|  | dfu_flash_args = [ | 
|  | dfu_util_binary, | 
|  | '--device', | 
|  | '0483:df11', | 
|  | '--dfuse-address', | 
|  | '0x08000000:leave', | 
|  | '--serial', | 
|  | dfu_serial_string, | 
|  | '--alt', | 
|  | '0', | 
|  | '--download', | 
|  | str(bin_file), | 
|  | ] | 
|  |  | 
|  | print( | 
|  | _COLOR.cyan('Running ==>'), | 
|  | ' '.join(dfu_flash_args), | 
|  | ) | 
|  |  | 
|  | # Ignore Ctrl-C to allow dfu-util to handle normally. | 
|  | signal.signal(signal.SIGINT, signal.SIG_IGN) | 
|  | return subprocess.run(dfu_flash_args, check=False).returncode | 
|  |  | 
|  |  | 
|  | def dfu_flash() -> None: | 
|  | sys.exit(main(**vars(_parse_args()))) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | dfu_flash() |