From 5d260d3440a76a286f1a354ed03a0f5b6ed20188 Mon Sep 17 00:00:00 2001 From: Luxferre <3335173-suborg@users.noreply.gitlab.com> Date: Mon, 20 Dec 2021 12:53:02 +0200 Subject: [PATCH] Added erase mode --- fdls/sc6531efm/nor_fdl.bin | Bin 30156 -> 30156 bytes unicmd.py | 23 ++++++++--------------- uniflash.py | 19 ++++++++++++++++--- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/fdls/sc6531efm/nor_fdl.bin b/fdls/sc6531efm/nor_fdl.bin index b2e9096b1b735e4302749efe4df5912ffc6be4d5..8ce972af3ab7bdbe7a145fae0672983c807c6d0d 100644 GIT binary patch delta 65 zcmX@}n(@qQ#tk=0j5!&gpaDi(0~roL45VwU8U6zSLxUXyLjxm(&0sy5yYwIcLH83} delta 65 zcmX@}n(@qQ#tk=0jJX(~paI6P1~MEN7#ge?82(r>{09OC2790wBZS>xHJQ8gAOJoD B6I%cP diff --git a/unicmd.py b/unicmd.py index f9baba9..a9659ab 100644 --- a/unicmd.py +++ b/unicmd.py @@ -182,6 +182,7 @@ BSL_WRITE_ERROR = 0xA2 BSL_CHIPID_NOT_MATCH = 0xA3 BSL_FLASH_CFG_ERROR = 0xA4 BSL_REP_DOWN_STL_SIZE_ERROR = 0xA5 +BSL_REP_SECURITY_VERIFICATION_FAIL = 0xA6 BSL_REP_PHONE_IS_ROOTED = 0xA7 BSL_REP_SEC_VERIFY_ERROR = 0xAA BSL_REP_READ_CHIP_UID = 0xAB @@ -221,10 +222,6 @@ def cmd_data_start(targetAddr, targetLen): datahdr = pack('>LL', targetAddr, targetLen) return shape_data_packet(BSL_CMD_START_DATA, datahdr) -def cmd_data_start_flash(targetPartId, targetLen, checksum): - datahdr = pack('>LLL', targetPartId, targetLen, checksum) - return shape_data_packet(BSL_CMD_START_DATA, datahdr) - def cmd_data_send(data): return shape_data_packet(BSL_CMD_MIDST_DATA, data) @@ -241,9 +238,6 @@ def cmd_connect(): def cmd_reset(): return shape_cmd_packet(BSL_CMD_NORMAL_RESET) -def cmd_keep_charge(): - return shape_cmd_packet(BSL_CMD_KEEP_CHARGE) - def cmd_sync(): return pack('>H', BSL_CMD_CHECK_BAUD) @@ -257,16 +251,15 @@ def cmd_read_chip_type(): def cmd_read_sector_size(): return shape_cmd_packet(BSL_CMD_READ_SECTOR_SIZE) -def cmd_read_flash_type(): - return shape_cmd_packet(BSL_CMD_READ_FLASH_TYPE) - -def cmd_enable_flash(targetAddr): - #datahdr = pack('>L', targetAddr) - datahdr = pack('>LL', targetAddr, 1) - return shape_data_packet(BSL_CMD_ENABLE_WRITE_FLASH, datahdr) - 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) + +def cmd_erase_flash(targetAddr, targetLen): + datahdr = pack('>LL', targetAddr, targetLen) + return shape_data_packet(BSL_CMD_ERASE_FLASH, datahdr) + +def cmd_end_flash_process(): + return shape_cmd_packet(BSL_CMD_END_PROCESS) diff --git a/uniflash.py b/uniflash.py index 890b9f7..137f358 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 = 4000 +genTimeout = 40000 # all main procedures @@ -64,7 +64,7 @@ def handshake(fdlBooted = False): if len(r): print('>', r.decode()) -def send_file_to_addr(fname, faddr, fdlBooted = False, flashMode = False, fbs = 1024): +def send_file_to_addr(fname, faddr, fdlBooted = False, flashMode = False, fbs = 1024, forceErase = False): pSize = MAX_PKT_SIZE f = open(fname, 'rb') fdata = f.read() @@ -72,6 +72,8 @@ def send_file_to_addr(fname, faddr, fdlBooted = False, flashMode = False, fbs = flen = len(fdata) print('Initializing data transfer...') if flashMode: + if forceErase: + erase_flash_mem(flen, UNISOC_FLASH_BASE_ADDR + faddr) pSize = fbs # faddr is our flash offset in this case resp = reqresp(unicmd.cmd_data_start(UNISOC_FLASH_BASE_ADDR + faddr, flen), fdlBooted) @@ -126,6 +128,15 @@ def read_partition(partid, partsize, partoffset, outfile, rbblocksize): outf.flush() print('\nPartition dumped!') +# memory eraser + +def erase_flash_mem(size, faddr): + print('Erasing %d bytes in the flash memory at offset 0x%X...' % (size, faddr - UNISOC_FLASH_BASE_ADDR)) + resp = reqresp(unicmd.cmd_erase_flash(faddr, size), True) + rcode, rlen, r = unicmd.resp_decode(resp, True) + assert rcode == unicmd.BSL_REP_ACK, 'Could not erase flash memory, response code is %X' % rcode + print('Flash range erased!') + def auto_int(x): return int(x,0) @@ -140,6 +151,7 @@ if __name__ == '__main__': # main app start parser.add_argument('-p','--partid', type=auto_int, default=0x80000003, help='partition ID for readback (defaults to 0x80000003 that can address full flash space on SC6531E/F/M)') parser.add_argument('-s','--start', type=auto_int, default=0, help='start position (in the partition, defaults to 0)') parser.add_argument('-l', '--length', type=auto_int, default=0x400000, help='data length in bytes to read/write, defaults to 0x400000') + parser.add_argument('-e','--force-erase', type=bool, default=False, help='Erase target flash memory area before writing') parser.add_argument('-bs','--block-size', type=auto_int, default=4096, help='Readback/write block size (in bytes), defaults to 4096') parser.add_argument('-dv','--device-vid', type=auto_int, default=UNISOC_VID, help='Override device vendor ID') parser.add_argument('-dp','--device-pid', type=auto_int, default=UNISOC_PID, help='Override device product ID') @@ -164,6 +176,7 @@ if __name__ == '__main__': # main app start readbs = args.block_size readoffset = args.start readlen = args.length + forceErase = args.force_erase print('Using FDL1 %s, loading to 0x%X' % (fdl1Name, fdl1Addr)) print('Using FDL2 %s, loading to 0x%X' % (fdl2Name, fdl2Addr)) @@ -208,7 +221,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) + send_file_to_addr(outfile, readoffset, True, True, readbs, forceErase) print('Flash memory written, disconnect the device!') else: read_partition(partitionId, readlen, readoffset, outfile, readbs)