From f5637b9bc7306c5f58061cb4c0cc63864a431115 Mon Sep 17 00:00:00 2001 From: Luxferre <3335173-suborg@users.noreply.gitlab.com> Date: Mon, 20 Dec 2021 16:35:51 +0200 Subject: [PATCH] Started working on internal checksum transfers --- unicmd.py | 30 ++++++++++++++++-------------- uniflash.py | 48 ++++++++++++++++++++++++++++++++++-------------- 2 files changed, 50 insertions(+), 28 deletions(-) diff --git a/unicmd.py b/unicmd.py index a9659ab..ee985a0 100644 --- a/unicmd.py +++ b/unicmd.py @@ -32,6 +32,12 @@ def crc16_fdl(data: bytes): # used in FDL1/2 mode crc += (crc >> 16) return ~crc & 0xffff +def chksum32(data: bytes): # used in flashing mode + cksum = 0 + for c in data: + cksum = (cksum + c) & 0xffffffff + return cksum + def hdlc_encode(data, fdl = False, nocrc = False): if nocrc: crc = 0 @@ -120,18 +126,14 @@ BSL_CMD_READ_MIDST = 0x11 BSL_CMD_READ_END = 0x12 BSL_CMD_KEEP_CHARGE = 0x13 -BSL_CMD_EXTTABLE = 0x14 BSL_CMD_READ_FLASH_UID = 0x15 -BSL_CMD_READ_SOFTSIM_EID = 0x16 BSL_CMD_POWER_OFF = 0x17 -BSL_CMD_CHECK_ROOT = 0x19 -BSL_CMD_READ_CHIP_UID = 0x1a -BSL_CMD_ENABLE_WRITE_FLASH = 0x1b -BSL_CMD_ENABLE_SECUREBOOT = 0x1c -BSL_CMD_READ_RF_TRANSCEIVER_TYPE = 0x24 -BSL_CMD_CHECK_BAUD = FLAG_BYTE +BSL_CMD_READ_CHIP_UID = 0x1A +BSL_CMD_ENABLE_WRITE_FLASH = 0x1B +BSL_CMD_ENABLE_SECUREBOOT = 0x1C +BSL_CMD_EXEC_NAND_INIT = 0x21 -BSL_DDR_VERIFY = 0x26 +BSL_CMD_CHECK_BAUD = FLAG_BYTE BSL_CMD_END_PROCESS = 0x7F @@ -218,8 +220,11 @@ def shape_data_packet(dtype, data, dlen = 0): packethdr = pack('>HH', dtype, dlen) return packethdr + data -def cmd_data_start(targetAddr, targetLen): - datahdr = pack('>LL', targetAddr, targetLen) +def cmd_data_start(targetAddr, targetLen, externalCrc = 0): + if externalCrc: + datahdr = pack('>LLL', targetAddr, targetLen, externalCrc) + else: + datahdr = pack('>LL', targetAddr, targetLen) return shape_data_packet(BSL_CMD_START_DATA, datahdr) def cmd_data_send(data): @@ -251,9 +256,6 @@ def cmd_read_chip_type(): def cmd_read_sector_size(): return shape_cmd_packet(BSL_CMD_READ_SECTOR_SIZE) -def cmd_read_flash_info(): - return shape_cmd_packet(BSL_CMD_READ_FLASH_INFO) - def cmd_read_flash(targetAddr, targetLen, offset): return pack('>HHLLL', BSL_CMD_READ_FLASH, 12, targetAddr, targetLen, offset) diff --git a/uniflash.py b/uniflash.py index 137f358..24f865f 100644 --- a/uniflash.py +++ b/uniflash.py @@ -12,7 +12,7 @@ UNISOC_PID = 0x4d00 UNISOC_FLASH_BASE_ADDR = 0x10000000 MAX_PKT_SIZE = 1024 bSize = 512 # read block size -genTimeout = 40000 +genTimeout = 120000 # all main procedures @@ -64,21 +64,22 @@ def handshake(fdlBooted = False): if len(r): print('>', r.decode()) -def send_file_to_addr(fname, faddr, fdlBooted = False, flashMode = False, fbs = 1024, forceErase = False): +def send_file_to_addr(fname, faddr, fdlBooted = False, flashMode = False, fbs = 1024): pSize = MAX_PKT_SIZE - f = open(fname, 'rb') - fdata = f.read() - f.close() - flen = len(fdata) print('Initializing data transfer...') + dataCrc = 0 if flashMode: - if forceErase: - erase_flash_mem(flen, UNISOC_FLASH_BASE_ADDR + faddr) + # faddr is our flash offset in this case, and we directly pass the data buffer to the function pSize = fbs - # faddr is our flash offset in this case - resp = reqresp(unicmd.cmd_data_start(UNISOC_FLASH_BASE_ADDR + faddr, flen), fdlBooted) + fdata = fname + flen = len(fdata) else: - resp = reqresp(unicmd.cmd_data_start(faddr, flen), fdlBooted) + f = open(fname, 'rb') + fdata = f.read() + f.close() + flen = len(fdata) + dataCrc = unicmd.chksum32(fdata) + resp = reqresp(unicmd.cmd_data_start(faddr, flen, dataCrc), fdlBooted) rcode, rlen, r = unicmd.resp_decode(resp, fdlBooted) assert rcode == unicmd.BSL_REP_ACK, 'Could not start data transfer, response code is %X' % rcode print('Starting data transfer...') @@ -93,7 +94,7 @@ def send_file_to_addr(fname, faddr, fdlBooted = False, flashMode = False, fbs = print('\nEnding data transfer...') resp = reqresp(unicmd.cmd_data_end(), fdlBooted) rcode, rlen, r = unicmd.resp_decode(resp, fdlBooted) - if not flashMode or rcode != unicmd.BSL_FLASH_CFG_ERROR: # on flashing, ignore 0xA4 error + if not flashMode or (rcode != unicmd.BSL_FLASH_CFG_ERROR and rcode != unicmd.BSL_WRITE_ERROR): # on flashing, ignore 0xA2 and 0xA4 errors assert rcode == unicmd.BSL_REP_ACK, 'Could not finalize data transfer, response code is %X' % rcode print('Data transfer successful') @@ -128,7 +129,7 @@ def read_partition(partid, partsize, partoffset, outfile, rbblocksize): outf.flush() print('\nPartition dumped!') -# memory eraser +# memory eraser and writer def erase_flash_mem(size, faddr): print('Erasing %d bytes in the flash memory at offset 0x%X...' % (size, faddr - UNISOC_FLASH_BASE_ADDR)) @@ -137,6 +138,25 @@ def erase_flash_mem(size, faddr): assert rcode == unicmd.BSL_REP_ACK, 'Could not erase flash memory, response code is %X' % rcode print('Flash range erased!') +def write_flash_mem(infile, offset, blocksize, forceErase): + startAddr = UNISOC_FLASH_BASE_ADDR + offset + f = open(infile, 'rb') + fdata = f.read() + f.close() + flen = len(fdata) + if forceErase: + erase_flash_mem(flen, startAddr) + send_file_to_addr(fdata, startAddr, True, True, blocksize) + ''' + UNISOC_MAX_DL_CHUNK = 0x300000 + curAddr = startAddr + while fdata: + fchunk = fdata[:UNISOC_MAX_DL_CHUNK] + send_file_to_addr(fchunk, curAddr, True, True, blocksize) + curAddr += len(fchunk) + fdata = fdata[UNISOC_MAX_DL_CHUNK:] + ''' + def auto_int(x): return int(x,0) @@ -221,7 +241,7 @@ if __name__ == '__main__': # main app start if is_flash: print('Writing flash at offset 0x%X from %s...' % (readoffset, outfile)) - send_file_to_addr(outfile, readoffset, True, True, readbs, forceErase) + write_flash_mem(outfile, readoffset, readbs, forceErase) print('Flash memory written, disconnect the device!') else: read_partition(partitionId, readlen, readoffset, outfile, readbs)