Project

General

Profile

New Model #4129 » mcp_dump_d74.py

Use the MCP protocol to get a dump of the settings memory - Angus Ainslie, 06/13/2020 10:23 AM

 
#!/usr/bin/python3

import ast
import serial
import argparse
import socket
import select
import string
import struct
from time import sleep

DEBUG=True

parser = argparse.ArgumentParser(description='MCP dump the radio memories')
parser.add_argument('device', nargs=1, help='radio serial port')

START_MCP=b'0M PROGRAM\r'
START_ACK=b'0M\r'
STOP_MCP=b'E'
STOP_ACK=b'\x06\r\x00'
MCP_SUCCESS=b'\x06'
MCP_FAIL=b'\x0f'

#name table offset
# 0x00010100
OFFSET_ADDR=0x00010100

args = parser.parse_args()

def wait_serial(ser):
timeout = 20

while timeout > 0 :
sleep(0.1)
nbytes = ser.in_waiting
if nbytes:
data = ser.read(nbytes)
#if DEBUG:
# print("Bytes %s" % data)

return data
timeout = timeout - 1

return None

ser = serial.Serial(str(args.device[0]), 9600)
dump_file = open( "dumpfile.txt", 'wb' )
ser.write(b'ID\r')
print("ID %s", wait_serial(ser))

ser.write(START_MCP)
data = wait_serial(ser)
print("Command %s data %s" % (START_MCP, data))

for i in range( 0, int(0xffffff / 256)):
addr2 = ((i * 256) >> 16) & 0xff
addr1 = ((i * 256) >> 8) & 0xff
addr0 = (i * 256) & 0xff
print( "reading address %s %s %s" % (hex(addr2), hex(addr1), hex(addr0)))
cmd = struct.pack('>cBBBB', b'R', addr2, addr1, addr0, 0)
ser.write(cmd)
data = wait_serial(ser) # get data
ser.write(MCP_SUCCESS)
status = ser.read(1)
print("Command %s data %s status %s" % (cmd, data, status))
dump_file.write( data[5:] )

ser.write(STOP_MCP)
data = wait_serial(ser)
print("Command %s data %s" % (STOP_MCP, data))

dump_file.close()
ser.close()

(6-6/10)