Skip to content

Instantly share code, notes, and snippets.

@hanetzer
Created September 7, 2022 07:14
Show Gist options
  • Save hanetzer/1d110e7bd9deaed8f4d1f2fad429e33a to your computer and use it in GitHub Desktop.
Save hanetzer/1d110e7bd9deaed8f4d1f2fad429e33a to your computer and use it in GitHub Desktop.
stdin
#!/usr/bin/env python3
import argparse
from colorama import Fore, Style
from cmsis_svd.parser import SVDParser
import struct
import sys
SPC = " "
def parse_reg_fields(register, value, bitstart, bitnum):
periname = register[0]
regname = register[1].name
description = register[1].description
print(f"{periname}:{regname}[{bitstart+bitnum}:{bitstart}] ({description})")
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument(
'--file', type=str, required=True,
help="file with reg data")
parser.add_argument(
'--svd', type=str, required=True,
help="SVD file to use to parse reg data")
parser.add_argument(
'--offset', type=int, required=False, default=0,
help="offset of reg data in file")
parser.add_argument(
'--size', type=int, required=True,
help="size of reg data in file")
args = parser.parse_args()
print(args)
if args.size % 16 != 0:
print("Size should be multiple of 16 bytes.")
sys.exit(1)
svd = SVDParser.for_xml_file(args.svd)
reg_lookup = {}
for peripheral in svd.get_device().peripherals:
baseaddr = peripheral.base_address
for register in peripheral.registers:
reg_lookup[baseaddr + register.address_offset] = (peripheral.name, register)
# print(reg_lookup)
try:
regfile = open(args.file, 'rb')
except OSError as e:
print("Error: {}".format(e.strerror))
regfile.seek(args.offset)
print("reg value delay attrs")
while True:
reg = struct.unpack('<I', regfile.read(4))[0]
value = struct.unpack('<I', regfile.read(4))[0]
delay = struct.unpack('<I', regfile.read(4))[0]
attr = struct.unpack('<I', regfile.read(4))[0]
if not any((reg,value,delay,attr)):
break
else:
if reg != 0:
try:
regi = reg_lookup[reg]
except KeyError as e:
raise KeyError(hex(e.args[0])) from e
write = attr & 0x7
read = (attr & 0x70000) >> 16
print(Style.RESET_ALL, end='')
print(f"{reg:#010x} {value:#010x} {delay:#010x} {attr:#010x}", end='')
if write & 0x4 == 0x4:
print(Fore.BLUE + " WRITE ", end='')
writeNum = (attr & 0xf8) >> 3
writeStart = (attr & 0xf800) >> 11
parse_reg_fields(regi, value, writeStart, writeNum)
elif read & 0x4 == 0x4:
print(Fore.GREEN + " READ ", end='')
readNum = (attr & 0xf80000) >> 19
readStart = (attr & 0xf8000000) >> 27
parse_reg_fields(regi, value, readStart, readNum)
elif delay > 0:
print(Fore.YELLOW + " DELAY {}".format(delay))
else:
print(Fore.RED + " UNKNOWN")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment