Added erase mode
This commit is contained in:
Binary file not shown.
@@ -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
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user