Created
September 7, 2022 07:14
-
-
Save hanetzer/1d110e7bd9deaed8f4d1f2fad429e33a to your computer and use it in GitHub Desktop.
stdin
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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