diff --git a/scripts/flash-sdcard.sh b/scripts/flash-sdcard.sh index 7ee03cce..08886409 100755 --- a/scripts/flash-sdcard.sh +++ b/scripts/flash-sdcard.sh @@ -10,6 +10,7 @@ KLIPPER_BIN_DEFAULT=$KLIPPER_BIN KLIPPER_DICT_DEFAULT="${SRCDIR}/out/klipper.dict" SPI_FLASH="${SRCDIR}/scripts/spi_flash/spi_flash.py" BAUD_ARG="" +CHECK_ARG="" # Force script to exit if an error occurs set -e @@ -17,7 +18,7 @@ print_help_message() { echo "SD Card upload utility for Klipper" echo - echo "usage: flash_sdcard.sh [-h] [-l] [-b ] [-f ] [-d ]" + echo "usage: flash_sdcard.sh [-h] [-l] [-c] [-b ] [-f ] [-d ]" echo " " echo echo "positional arguments:" @@ -27,13 +28,14 @@ print_help_message() echo "optional arguments:" echo " -h show this message" echo " -l list available boards" + echo " -c run flash check/verify only (skip upload)" echo " -b serial baud rate (default is 250000)" echo " -f path to klipper.bin" echo " -d path to klipper.dict for firmware validation" } # Parse command line "optional args" -while getopts "hlb:f:d:" arg; do +while getopts "hlcb:f:d:" arg; do case $arg in h) print_help_message @@ -43,6 +45,7 @@ while getopts "hlb:f:d:" arg; do ${KLIPPY_ENV} ${SPI_FLASH} -l exit 0 ;; + c) CHECK_ARG="-c";; b) BAUD_ARG="-b ${OPTARG}";; f) KLIPPER_BIN=$OPTARG;; d) KLIPPER_DICT=$OPTARG;; @@ -82,4 +85,4 @@ fi # Run Script echo "Flashing ${KLIPPER_BIN} to ${DEVICE}" -${KLIPPY_ENV} ${SPI_FLASH} ${BAUD_ARG} ${KLIPPER_DICT} ${DEVICE} ${BOARD} ${KLIPPER_BIN} +${KLIPPY_ENV} ${SPI_FLASH} ${CHECK_ARG} ${BAUD_ARG} ${KLIPPER_DICT} ${DEVICE} ${BOARD} ${KLIPPER_BIN} diff --git a/scripts/spi_flash/spi_flash.py b/scripts/spi_flash/spi_flash.py index 6bcef362..db1e3f59 100644 --- a/scripts/spi_flash/spi_flash.py +++ b/scripts/spi_flash/spi_flash.py @@ -785,6 +785,13 @@ class SDCardSPI: if err_msgs: raise OSError("\n".join(err_msgs)) +SDIO_WARNING = """ +This board requires a manual reboot to complete the flash process. +If the board's bootloader uses SDIO mode for its SDCard, then a full +power cycle is required. Please perform the power cycle now and then +rerun this utility with the 'check' option to verify flash. +""" + class MCUConnection: def __init__(self, k_reactor, device, baud, board_cfg): self.reactor = k_reactor @@ -989,6 +996,9 @@ class MCUConnection: return sd_chksm def verify_flash(self, req_chksm, old_dictionary, req_dictionary): + if bool(self.board_config.get('skip_verify', False)): + output_line(SDIO_WARNING) + return output("Verifying Flash...") validation_passed = False msgparser = self._serial.get_msgparser() @@ -1063,6 +1073,7 @@ class SPIFlash: self.firmware_checksum = None self.task_complete = False self.need_upload = True + self.need_verify = True self.old_dictionary = None self.new_dictionary = None if args['klipper_dict_path'] is not None: @@ -1092,7 +1103,7 @@ class SPIFlash: raise SPIFlashError("Unable to reconnect") output_line("Done") - def run_reset(self, eventtime): + def run_reset_upload(self, eventtime): # Reset MCU to default state if necessary self.mcu_conn.connect() if self.mcu_conn.check_need_restart(): @@ -1102,6 +1113,16 @@ class SPIFlash: self.need_upload = False self.run_sdcard_upload(eventtime) + def run_reset_verify(self, eventtime): + # Reset MCU to default state if necessary + self.mcu_conn.connect() + if self.mcu_conn.check_need_restart(): + self.mcu_conn.reset() + self.task_complete = True + else: + self.need_verify = False + self.run_verify(eventtime) + def run_sdcard_upload(self, eventtime): # Reconnect and upload if not self.mcu_conn.connected: @@ -1121,7 +1142,8 @@ class SPIFlash: def run_verify(self, eventtime): # Reconnect and verify - self.mcu_conn.connect() + if not self.mcu_conn.connected: + self.mcu_conn.connect() self.mcu_conn.configure_mcu() self.mcu_conn.verify_flash(self.firmware_checksum, self.old_dictionary, self.new_dictionary) @@ -1148,12 +1170,18 @@ class SPIFlash: self.mcu_conn = k_reactor = None def run(self): - self.run_reactor_task(self.run_reset) - self._wait_for_reconnect() - if self.need_upload: - self.run_reactor_task(self.run_sdcard_upload) + if not bool(self.board_config.get('verify_only', False)): + self.run_reactor_task(self.run_reset_upload) self._wait_for_reconnect() - self.run_reactor_task(self.run_verify) + if self.need_upload: + self.run_reactor_task(self.run_sdcard_upload) + self._wait_for_reconnect() + self.run_reactor_task(self.run_verify) + else: + self.run_reactor_task(self.run_reset_verify) + if self.need_verify: + self._wait_for_reconnect() + self.run_reactor_task(self.run_verify) def main(): parser = argparse.ArgumentParser( @@ -1177,6 +1205,9 @@ def main(): parser.add_argument( "-d", "--dict_path", metavar="", type=str, default=None, help="Klipper firmware dictionary") + parser.add_argument( + "-c","--check", action="store_true", + help="Perform flash check/verify only") parser.add_argument( "device", metavar="", help="Device Serial Port") parser.add_argument( @@ -1195,6 +1226,10 @@ def main(): flash_args['baud'] = args.baud flash_args['klipper_bin_path'] = args.klipper_bin_path flash_args['klipper_dict_path'] = args.dict_path + flash_args['verify_only'] = args.check + if args.check: + # override board_defs setting when doing verify-only: + flash_args['skip_verify'] = False check_need_convert(args.board, flash_args) fatfs_lib.check_fatfs_build(output) try: