Added erase mode

This commit is contained in:
Luxferre
2021-12-20 12:53:02 +02:00
parent cc56feae3c
commit 5d260d3440
3 changed files with 24 additions and 18 deletions
Binary file not shown.
+8 -15
View File
@@ -182,6 +182,7 @@ BSL_WRITE_ERROR = 0xA2
BSL_CHIPID_NOT_MATCH = 0xA3 BSL_CHIPID_NOT_MATCH = 0xA3
BSL_FLASH_CFG_ERROR = 0xA4 BSL_FLASH_CFG_ERROR = 0xA4
BSL_REP_DOWN_STL_SIZE_ERROR = 0xA5 BSL_REP_DOWN_STL_SIZE_ERROR = 0xA5
BSL_REP_SECURITY_VERIFICATION_FAIL = 0xA6
BSL_REP_PHONE_IS_ROOTED = 0xA7 BSL_REP_PHONE_IS_ROOTED = 0xA7
BSL_REP_SEC_VERIFY_ERROR = 0xAA BSL_REP_SEC_VERIFY_ERROR = 0xAA
BSL_REP_READ_CHIP_UID = 0xAB BSL_REP_READ_CHIP_UID = 0xAB
@@ -221,10 +222,6 @@ def cmd_data_start(targetAddr, targetLen):
datahdr = pack('>LL', targetAddr, targetLen) datahdr = pack('>LL', targetAddr, targetLen)
return shape_data_packet(BSL_CMD_START_DATA, datahdr) 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): def cmd_data_send(data):
return shape_data_packet(BSL_CMD_MIDST_DATA, data) return shape_data_packet(BSL_CMD_MIDST_DATA, data)
@@ -241,9 +238,6 @@ def cmd_connect():
def cmd_reset(): def cmd_reset():
return shape_cmd_packet(BSL_CMD_NORMAL_RESET) return shape_cmd_packet(BSL_CMD_NORMAL_RESET)
def cmd_keep_charge():
return shape_cmd_packet(BSL_CMD_KEEP_CHARGE)
def cmd_sync(): def cmd_sync():
return pack('>H', BSL_CMD_CHECK_BAUD) return pack('>H', BSL_CMD_CHECK_BAUD)
@@ -257,16 +251,15 @@ def cmd_read_chip_type():
def cmd_read_sector_size(): def cmd_read_sector_size():
return shape_cmd_packet(BSL_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(): def cmd_read_flash_info():
return shape_cmd_packet(BSL_CMD_READ_FLASH_INFO) return shape_cmd_packet(BSL_CMD_READ_FLASH_INFO)
def cmd_read_flash(targetAddr, targetLen, offset): def cmd_read_flash(targetAddr, targetLen, offset):
return pack('>HHLLL', BSL_CMD_READ_FLASH, 12, 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)
+16 -3
View File
@@ -12,7 +12,7 @@ UNISOC_PID = 0x4d00
UNISOC_FLASH_BASE_ADDR = 0x10000000 UNISOC_FLASH_BASE_ADDR = 0x10000000
MAX_PKT_SIZE = 1024 MAX_PKT_SIZE = 1024
bSize = 512 # read block size bSize = 512 # read block size
genTimeout = 4000 genTimeout = 40000
# all main procedures # all main procedures
@@ -64,7 +64,7 @@ def handshake(fdlBooted = False):
if len(r): if len(r):
print('>', r.decode()) 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 pSize = MAX_PKT_SIZE
f = open(fname, 'rb') f = open(fname, 'rb')
fdata = f.read() fdata = f.read()
@@ -72,6 +72,8 @@ def send_file_to_addr(fname, faddr, fdlBooted = False, flashMode = False, fbs =
flen = len(fdata) flen = len(fdata)
print('Initializing data transfer...') print('Initializing data transfer...')
if flashMode: if flashMode:
if forceErase:
erase_flash_mem(flen, UNISOC_FLASH_BASE_ADDR + faddr)
pSize = fbs pSize = fbs
# faddr is our flash offset in this case # faddr is our flash offset in this case
resp = reqresp(unicmd.cmd_data_start(UNISOC_FLASH_BASE_ADDR + faddr, flen), fdlBooted) 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() outf.flush()
print('\nPartition dumped!') 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): def auto_int(x):
return int(x,0) 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('-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('-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('-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('-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('-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') 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 readbs = args.block_size
readoffset = args.start readoffset = args.start
readlen = args.length readlen = args.length
forceErase = args.force_erase
print('Using FDL1 %s, loading to 0x%X' % (fdl1Name, fdl1Addr)) print('Using FDL1 %s, loading to 0x%X' % (fdl1Name, fdl1Addr))
print('Using FDL2 %s, loading to 0x%X' % (fdl2Name, fdl2Addr)) print('Using FDL2 %s, loading to 0x%X' % (fdl2Name, fdl2Addr))
@@ -208,7 +221,7 @@ if __name__ == '__main__': # main app start
if is_flash: if is_flash:
print('Writing flash at offset 0x%X from %s...' % (readoffset, outfile)) 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!') print('Flash memory written, disconnect the device!')
else: else:
read_partition(partitionId, readlen, readoffset, outfile, readbs) read_partition(partitionId, readlen, readoffset, outfile, readbs)