tw88xx_utils/tw88xx_util.py
2022-01-10 01:22:38 +01:00

98 lines
3.1 KiB
Python

import argparse
from tw88xx import TW88xx
parser = argparse.ArgumentParser(description='TW88xx debug utility.')
def auto_int(x):
return int(x, 0)
parser.add_argument('command',
help='the command to execute',
choices=('dump_flash', 'get_id', 'dump_regs', 'dump_lut')
)
parser.add_argument('-f', '--flash_file',
help='file to read from / write into'
)
parser.add_argument('-i', '--interface',
help='the i2c interface to use',
choices=('devi2c', 'swd')
)
parser.add_argument('-j', '--jlink',
help='J-Link (serial) to use for SWD',
default=None
)
parser.add_argument('-b', '--bus',
help='/dev/i2c bus number',
type=int,
default=1
)
parser.add_argument('-t', '--type',
help='TX88xx type',
choices=('tw8836',),
default='tw8836'
)
parser.add_argument('--start',
help='begin of reading range',
type=auto_int,
default=0
)
parser.add_argument('--length',
help='amount to read',
type=auto_int,
default=0
)
args = parser.parse_args()
if args.interface == 'swd':
from i2c_interfaces import JLinkSwdI2CInterface
i2c = JLinkSwdI2CInterface(jlink_serial=args.jlink)
elif args.interface == 'devi2c':
from i2c_interfaces import DevI2CInterface
i2c = DevI2CInterface(bus=args.bus)
i2c.open()
if args.type == 'tw8836':
from tw8836 import TW8836
tw88xx = TW8836(i2c)
if args.command == 'get_id':
id = tw88xx.read_reg(0x000)
print(f'{id:02x}')
flash_id = tw88xx.execute_flash_cmd(cmd=[0x9f], read_len=3)
print(flash_id.hex())
elif args.command == 'dump_flash':
tw88xx.execute_flash_cmd(cmd=[0xE9], read_len=0)
data = []
BS = 4
tw88xx.prepare_flash_read(cmd_len=4, read_len=BS)
for block_start in range(args.start, args.start+args.length, BS):
cmd = [0x03, (block_start >> 16) & 0xFF, (block_start >> 8) & 0xFF, block_start & 0xFF]
block = tw88xx.do_flash_cmd(cmd, read_len=BS)
data.extend(block)
print(f'{(block_start-args.start) / (args.length)*100:02.4f}% {block_start:06x}: {block.hex()}')
print(bytes(data).hex())
with open(args.flash_file, 'wb') as f:
f.write(bytes(data))
elif args.command == 'dump_regs':
if not args.start:
tw88xx.dump_regs()
else:
for r in range(args.start, args.start+args.length+1):
if r in tw88xx.REGS:
v = tw88xx.read_reg(r)
print(f'{r:03x} = {v:02x} ({tw88xx.REGS[r]})')
elif args.command == 'dump_lut':
tbl = tw88xx.dump_lut()
if args.flash_file:
with open(args.flash_file, 'w') as f:
for r in sorted(tbl):
f.write(f'{r:03x}={bytes(tbl[r]).hex()}\n')