blob: a7136a0c5564e11aeeec2b4e7d17e57894436a48 [file]
#!/usr/bin/env python3
import argparse
import serial
import serial.tools.list_ports
import sys
import os
import os.path
import time
from tqdm import tqdm
parser = argparse.ArgumentParser(description='32blit binary flasher.')
parser.add_argument("file", help="Path to the binary file (e.g. 'build.stm32/voxel.bin')")
parser.add_argument("port", help="Name of the serial port (e.g. 'COM4', '/dev/ttyS4', etc.)")
parser.add_argument("--target", help="Target either 'sd' or 'flash'", default="sd", choices=["sd", "flash"])
args = parser.parse_args()
print("32blit binary flasher.")
port = args.port
target = args.target
path = args.file
valid_ports = [port[0] for port in serial.tools.list_ports.comports()]
if port not in valid_ports:
print("Specified port '{0}' not valid".format(port))
sys.exit(os.EX_OSFILE)
if not os.path.isfile(path):
print("Specified binary file '{0}' does not exist".format(path))
sys.exit(os.EX_NOINPUT)
serial_port = None
try:
serial_port = serial.Serial(port, 115200, timeout=1)
except OSError:
print("Could not open port '{0}'".format(port))
print("The port may not exist or you may not have permission to access it.")
sys.exit(os.EX_OSFILE)
file_size = os.stat(path).st_size
file_name = os.path.basename(path)
sent_byte_count = 0
chunk_size = 64
# such reset, very boot
#serial_port.write(b"32BL_RST\x00")
#sys.exit()
serial_port.reset_output_buffer()
command = "SAVE\x00{0}\x00{1}\x00".format(file_name, file_size)
serial_port.write(bytes(command, "ascii"))
with open(path, "rb") as f:
progress = tqdm(total=file_size, desc="Flashing...", unit_scale=True, unit_divisor=1024, unit="B", ncols=70, dynamic_ncols=True)
while sent_byte_count < file_size:
data = f.read(chunk_size)
serial_port.write(data)
sent_byte_count += chunk_size
progress.update(chunk_size)
progress.close()