2021-07-25 15:16:57 +00:00
|
|
|
|
|
|
|
import argparse
|
|
|
|
import glob, shutil
|
|
|
|
import sys
|
|
|
|
import traceback
|
|
|
|
|
|
|
|
from typing import *
|
|
|
|
|
2021-08-17 21:42:57 +00:00
|
|
|
import dpctl.connection as devconn
|
|
|
|
import dpctl.protocol as devproto
|
|
|
|
import dpctl.commands as devcmds
|
2021-07-25 15:16:57 +00:00
|
|
|
|
|
|
|
|
2021-08-17 21:42:57 +00:00
|
|
|
def dpctl_do(args: Any) -> int:
|
2021-07-25 15:16:57 +00:00
|
|
|
def get_device_info(conn, args): return devcmds.get_device_info(conn)
|
|
|
|
def get_mode_info(conn, args): return devcmds.get_mode_info(conn, args.mode)
|
|
|
|
def set_mode(conn, args): return devcmds.set_mode(conn, args.mode)
|
2021-08-01 03:22:33 +00:00
|
|
|
def bootloader(conn, args): return devcmds.set_mode(conn, 0)
|
2021-07-25 15:16:57 +00:00
|
|
|
|
|
|
|
def uart_hw_flowctl(conn, args):
|
|
|
|
if args.get: return devcmds.uart_hw_flowctl_get(conn)
|
|
|
|
fcen = args.set
|
2021-07-25 16:16:55 +00:00
|
|
|
if isinstance(fcen, list): fcen = fcen[0]
|
2021-07-25 15:16:57 +00:00
|
|
|
if fcen is None:
|
|
|
|
if args.enable: fcen = True
|
|
|
|
elif args.disable: fcen = False
|
|
|
|
if fcen is None:
|
|
|
|
print("Error: none of '--get', '--set', '--enable' or '--disable' specified.")
|
|
|
|
return 1
|
|
|
|
return devcmds.uart_hw_flowctl_set(conn, fcen)
|
|
|
|
def tempsensor(conn, args):
|
|
|
|
if args.get: return devcmds.tempsensor_get(conn)
|
|
|
|
tsen = args.set
|
2021-07-25 16:16:55 +00:00
|
|
|
if isinstance(tsen, list): tsen = tsen[0]
|
2021-07-25 15:16:57 +00:00
|
|
|
if tsen is None:
|
2021-07-25 16:16:55 +00:00
|
|
|
if args.disable: tsen = 0xff
|
2021-07-25 15:16:57 +00:00
|
|
|
if tsen is None:
|
|
|
|
print("Error: none of '--get', '--set' or '--disable' specified.")
|
|
|
|
return 1
|
|
|
|
return devcmds.tempsensor_set(conn, tsen)
|
|
|
|
def jtag_scan(conn, args):
|
2021-08-01 03:22:33 +00:00
|
|
|
return devcmds.jtag_scan(conn, args.type, args.start, args.end)
|
2021-07-25 15:16:57 +00:00
|
|
|
def sump_ovclk(conn, args):
|
|
|
|
if args.get: return devcmds.sump_overclock_get(conn)
|
|
|
|
oven = args.set
|
2021-07-25 16:16:55 +00:00
|
|
|
if isinstance(oven, list): oven = oven[0]
|
2021-07-25 15:16:57 +00:00
|
|
|
if oven is None:
|
|
|
|
if args.enable: oven = 1
|
|
|
|
elif args.disable: oven = 0
|
|
|
|
if oven is None:
|
|
|
|
print("Error: none of '--get', '--set', '--enable' or '--disable' specified.")
|
|
|
|
return 1
|
|
|
|
return devcmds.sump_overclock_set(conn, oven)
|
|
|
|
|
|
|
|
|
|
|
|
#print(repr(args))
|
|
|
|
cmds = {
|
|
|
|
'get-device-info': get_device_info,
|
|
|
|
'get-mode-info': get_mode_info,
|
|
|
|
'set-mode': set_mode,
|
2021-08-01 03:22:33 +00:00
|
|
|
'bootloader': bootloader,
|
2021-07-25 15:16:57 +00:00
|
|
|
|
|
|
|
'uart-cts-rts': uart_hw_flowctl,
|
|
|
|
'tempsensor': tempsensor,
|
|
|
|
'jtag-scan': jtag_scan,
|
|
|
|
'sump-overclock': sump_ovclk,
|
|
|
|
}
|
|
|
|
|
|
|
|
if args.subcmd is None:
|
|
|
|
print("No subcommand specified?!")
|
|
|
|
return 1
|
|
|
|
|
|
|
|
subfn = cmds.get(args.subcmd, None)
|
|
|
|
if subfn is None:
|
|
|
|
print("Unknown subcommand '%s'" % args.subcmd)
|
|
|
|
return 1
|
|
|
|
|
|
|
|
conn = devconn.connect(args.conn)
|
|
|
|
if isinstance(conn, str):
|
|
|
|
print("Could not connect to a device: %s." % conn)
|
|
|
|
return 1
|
|
|
|
|
2021-08-17 21:42:57 +00:00
|
|
|
with devproto.DPDevice(conn) as dev:
|
2021-07-25 15:16:57 +00:00
|
|
|
return subfn(dev, args)
|
|
|
|
|
|
|
|
|
|
|
|
def main() -> int:
|
2021-08-17 21:42:57 +00:00
|
|
|
parser = argparse.ArgumentParser(prog="dpctl")
|
2021-07-25 15:16:57 +00:00
|
|
|
|
|
|
|
def auto_int(x):
|
|
|
|
return int(x, 0)
|
|
|
|
|
|
|
|
# commands:
|
|
|
|
# * get device info
|
|
|
|
# * get mode info
|
|
|
|
# * set mode
|
|
|
|
#
|
|
|
|
# * mode 1 (general):
|
|
|
|
# * 0x16 0x??: usb hwflowctl on/off, 0x??=0xc3: get current value
|
|
|
|
# * 0x15 0x00: get tempsensor active/address
|
|
|
|
# * 0x15 0x01 0x??: set tempsensor active/address
|
|
|
|
#
|
|
|
|
# * mode 2 (isp/jtag/...): probably nothing
|
|
|
|
#
|
|
|
|
# * mode 3 (jtag pinout scanner):
|
|
|
|
# * 0x30: get status
|
|
|
|
# * 0x31: get result (5 bytes: pin numbers of tck,tms,tdi,tdo,trst)
|
|
|
|
# * 0x32 0xNN 0xMM: start scan (pins 0xNN..0xMM)
|
|
|
|
#
|
|
|
|
# * mode 4 (sump logic analyzer):
|
|
|
|
# * 0x40: get overclock
|
|
|
|
# * 0x41: set overclock
|
|
|
|
#
|
|
|
|
# * mode 5 (ftdi/fx2 emul): probably nothing
|
|
|
|
|
|
|
|
parser.add_argument('--conn', type=str, default=None,
|
2021-08-17 21:42:57 +00:00
|
|
|
help="Connection string. Either a dragonprobe-char "+\
|
|
|
|
"device in /dev, a USB bus.device number, or a USB " + \
|
|
|
|
"VID:PID pair. Defaults to trying /dev/dragonprobe-* " + \
|
|
|
|
"(if there is only one), and cafe:1312 otherwise.")
|
2021-07-25 15:16:57 +00:00
|
|
|
#parser.descripiton = ...
|
|
|
|
|
|
|
|
subcmds = parser.add_subparsers(required=True, metavar="subcommand",
|
|
|
|
dest="subcmd", help="Command to send to "+\
|
|
|
|
"the device",
|
|
|
|
description="For more info on each " + \
|
|
|
|
"subcommand, run the program with " + \
|
|
|
|
"'subcommand --help' as arguments.")
|
|
|
|
|
|
|
|
# general subcommands
|
|
|
|
getdevinfo = subcmds.add_parser("get-device-info", help="Shows device info")
|
|
|
|
|
|
|
|
getmodeinfo = subcmds.add_parser("get-mode-info", help="Shows mode info."+\
|
|
|
|
" A mode can optionally be specified, "+\
|
|
|
|
"default is the current mode.")
|
|
|
|
getmodeinfo.add_argument('mode', default=None, nargs='?', #type=int,
|
|
|
|
help="Mode to get info of. Defaults to the " + \
|
|
|
|
"current mode, 'all' means all modes.")
|
|
|
|
|
|
|
|
setmode = subcmds.add_parser("set-mode", help="Set the device mode")
|
|
|
|
setmode.add_argument('mode', type=int, help="Mode to switch to, required.")
|
|
|
|
|
2021-08-01 03:22:33 +00:00
|
|
|
bootloader = subcmds.add_parser("bootloader", help="Set the device in bootloader mode")
|
|
|
|
|
2021-07-25 15:16:57 +00:00
|
|
|
# mode 1 commands
|
2021-07-25 16:16:55 +00:00
|
|
|
usbhwfctl = subcmds.add_parser("uart-cts-rts", help="Get, enable/disable"+\
|
2021-07-25 15:16:57 +00:00
|
|
|
" UART hardware flow control")
|
|
|
|
uartopts = usbhwfctl.add_mutually_exclusive_group()
|
|
|
|
uartopts.add_argument('--get', default=False, action='store_true',
|
|
|
|
help="Get current hardware flow control setting")
|
|
|
|
uartopts.add_argument('--set', default=None, type=bool, nargs=1,
|
|
|
|
help="Set hardware flow control")
|
|
|
|
uartopts.add_argument('--enable', default=False, action='store_true',
|
|
|
|
help="Enable hardware flow control, short for "+\
|
|
|
|
"--set true")
|
|
|
|
uartopts.add_argument('--disable', default=False, action='store_true',
|
|
|
|
help="Disable hardware flow control, short for "+\
|
|
|
|
"--set false")
|
|
|
|
|
|
|
|
tempsense = subcmds.add_parser("tempsensor", help="Get or set the IRC " + \
|
|
|
|
"emulation enable/address of the " + \
|
|
|
|
"temperature sensor.")
|
|
|
|
tsopts = tempsense.add_mutually_exclusive_group()
|
|
|
|
tsopts.add_argument('--get', default=False, action='store_true',
|
|
|
|
help="Get current I2C emul state/address")
|
|
|
|
tsopts.add_argument('--set', default=None, type=auto_int, nargs=1,
|
|
|
|
help="Set emulated I2C address of the temperature "+\
|
|
|
|
"sensor. 0 (or another invalid I2C device address) "+\
|
|
|
|
"to disable the emulated I2C sensor device.")
|
|
|
|
tsopts.add_argument('--disable', default=False, action='store_true',
|
|
|
|
help="Disable emulated I2C temperature sensor, "+\
|
|
|
|
"short for --set true")
|
|
|
|
|
|
|
|
jtagscan = subcmds.add_parser("jtag-scan", help="JTAG pinout scanner")
|
2021-08-01 03:22:33 +00:00
|
|
|
jtagscan.add_argument("type", type=str, help="Pinout type to check for.",
|
|
|
|
choices=['jtag', 'swd']) # TODO: SBW etc
|
|
|
|
jtagscan.add_argument("start", type=int, help="Number of the start "+\
|
2021-07-25 15:16:57 +00:00
|
|
|
"of the pin range to scan (inclusive)")
|
2021-08-01 03:22:33 +00:00
|
|
|
jtagscan.add_argument("end", type=int, help="Number of the end of "+\
|
2021-07-25 15:16:57 +00:00
|
|
|
"the pin range to scan (inclusive)")
|
|
|
|
|
|
|
|
sumpla = subcmds.add_parser("sump-overclock",
|
|
|
|
help="SUMP logic analyzer overclock")
|
|
|
|
sumpopts = sumpla.add_mutually_exclusive_group()
|
|
|
|
sumpopts.add_argument('--get', default=False, action='store_true',
|
|
|
|
help="Get current overclocking state")
|
|
|
|
sumpopts.add_argument('--set', default=None, type=int, nargs=1,
|
|
|
|
help="Set current overclocking state")
|
|
|
|
sumpopts.add_argument('--enable', default=False, action='store_true',
|
|
|
|
help="Enable overclocking, short for --set 1")
|
|
|
|
sumpopts.add_argument('--disable', default=False, action='store_true',
|
|
|
|
help="Disable overclocking, short for --set 0")
|
|
|
|
|
|
|
|
args = parser.parse_args()
|
2021-08-17 21:42:57 +00:00
|
|
|
return dpctl_do(args)
|
2021-07-25 15:16:57 +00:00
|
|
|
|