60 lines
1.7 KiB
Python
Executable File

#!/usr/bin/python
import time
import serial
import serial.tools.list_ports as lports
import argparse
def main(args):
# Find which serial port to use (assumes only the keyboard is connected)
if args.port == '':
port_list = lports.comports()
if len(port_list) != 1:
print('No serial ports detected, quitting...')
quit()
else:
port = port_list[0].device
else:
port = args.port
# Based on https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/master/tools/linux/src/upload-reset/upload-reset.c
# Send magic sequence of DTR and RTS followed by the magic word "1EAF"
with serial.Serial(port=port, baudrate=args.baudrate) as ser:
ser.rts = False
ser.dtr = False
ser.dtr = True
time.sleep(0.05)
ser.dtr = False
ser.rts = True
ser.dtr = True
time.sleep(0.05)
ser.dtr = False
time.sleep(0.05)
ser.write(b'1EAF')
# Wait for the DFU mode reboot
time.sleep(args.sleep * 1e-3)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser = argparse.ArgumentParser(description="Enter DFU mode of DevTerm's keyboard.")
parser.add_argument('-p', '--port', dest='port', type=str, default='',
help='Serial port (default: detect serial ports).')
parser.add_argument('-b', '--baudrate', dest='baudrate', type=int, default=9600,
help='Baudrate (default: 9600bps).')
parser.add_argument('-s', '--sleep', dest='sleep', type=int, default=1500,
help='Wait SLEEP milliseconds (ms) after enabling DFU mode (default: 1500ms).')
args = parser.parse_args()
main(args)