Started working on internal checksum transfers
This commit is contained in:
@@ -32,6 +32,12 @@ def crc16_fdl(data: bytes): # used in FDL1/2 mode
|
|||||||
crc += (crc >> 16)
|
crc += (crc >> 16)
|
||||||
return ~crc & 0xffff
|
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):
|
def hdlc_encode(data, fdl = False, nocrc = False):
|
||||||
if nocrc:
|
if nocrc:
|
||||||
crc = 0
|
crc = 0
|
||||||
@@ -120,18 +126,14 @@ BSL_CMD_READ_MIDST = 0x11
|
|||||||
BSL_CMD_READ_END = 0x12
|
BSL_CMD_READ_END = 0x12
|
||||||
|
|
||||||
BSL_CMD_KEEP_CHARGE = 0x13
|
BSL_CMD_KEEP_CHARGE = 0x13
|
||||||
BSL_CMD_EXTTABLE = 0x14
|
|
||||||
BSL_CMD_READ_FLASH_UID = 0x15
|
BSL_CMD_READ_FLASH_UID = 0x15
|
||||||
BSL_CMD_READ_SOFTSIM_EID = 0x16
|
|
||||||
BSL_CMD_POWER_OFF = 0x17
|
BSL_CMD_POWER_OFF = 0x17
|
||||||
BSL_CMD_CHECK_ROOT = 0x19
|
BSL_CMD_READ_CHIP_UID = 0x1A
|
||||||
BSL_CMD_READ_CHIP_UID = 0x1a
|
BSL_CMD_ENABLE_WRITE_FLASH = 0x1B
|
||||||
BSL_CMD_ENABLE_WRITE_FLASH = 0x1b
|
BSL_CMD_ENABLE_SECUREBOOT = 0x1C
|
||||||
BSL_CMD_ENABLE_SECUREBOOT = 0x1c
|
BSL_CMD_EXEC_NAND_INIT = 0x21
|
||||||
BSL_CMD_READ_RF_TRANSCEIVER_TYPE = 0x24
|
|
||||||
BSL_CMD_CHECK_BAUD = FLAG_BYTE
|
|
||||||
|
|
||||||
BSL_DDR_VERIFY = 0x26
|
BSL_CMD_CHECK_BAUD = FLAG_BYTE
|
||||||
|
|
||||||
BSL_CMD_END_PROCESS = 0x7F
|
BSL_CMD_END_PROCESS = 0x7F
|
||||||
|
|
||||||
@@ -218,7 +220,10 @@ def shape_data_packet(dtype, data, dlen = 0):
|
|||||||
packethdr = pack('>HH', dtype, dlen)
|
packethdr = pack('>HH', dtype, dlen)
|
||||||
return packethdr + data
|
return packethdr + data
|
||||||
|
|
||||||
def cmd_data_start(targetAddr, targetLen):
|
def cmd_data_start(targetAddr, targetLen, externalCrc = 0):
|
||||||
|
if externalCrc:
|
||||||
|
datahdr = pack('>LLL', targetAddr, targetLen, externalCrc)
|
||||||
|
else:
|
||||||
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)
|
||||||
|
|
||||||
@@ -251,9 +256,6 @@ 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_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)
|
||||||
|
|
||||||
|
|||||||
+34
-14
@@ -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 = 40000
|
genTimeout = 120000
|
||||||
|
|
||||||
# all main procedures
|
# all main procedures
|
||||||
|
|
||||||
@@ -64,21 +64,22 @@ 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, forceErase = False):
|
def send_file_to_addr(fname, faddr, fdlBooted = False, flashMode = False, fbs = 1024):
|
||||||
pSize = MAX_PKT_SIZE
|
pSize = MAX_PKT_SIZE
|
||||||
|
print('Initializing data transfer...')
|
||||||
|
dataCrc = 0
|
||||||
|
if flashMode:
|
||||||
|
# faddr is our flash offset in this case, and we directly pass the data buffer to the function
|
||||||
|
pSize = fbs
|
||||||
|
fdata = fname
|
||||||
|
flen = len(fdata)
|
||||||
|
else:
|
||||||
f = open(fname, 'rb')
|
f = open(fname, 'rb')
|
||||||
fdata = f.read()
|
fdata = f.read()
|
||||||
f.close()
|
f.close()
|
||||||
flen = len(fdata)
|
flen = len(fdata)
|
||||||
print('Initializing data transfer...')
|
dataCrc = unicmd.chksum32(fdata)
|
||||||
if flashMode:
|
resp = reqresp(unicmd.cmd_data_start(faddr, flen, dataCrc), fdlBooted)
|
||||||
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)
|
|
||||||
else:
|
|
||||||
resp = reqresp(unicmd.cmd_data_start(faddr, flen), fdlBooted)
|
|
||||||
rcode, rlen, r = unicmd.resp_decode(resp, 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
|
assert rcode == unicmd.BSL_REP_ACK, 'Could not start data transfer, response code is %X' % rcode
|
||||||
print('Starting data transfer...')
|
print('Starting data transfer...')
|
||||||
@@ -93,7 +94,7 @@ def send_file_to_addr(fname, faddr, fdlBooted = False, flashMode = False, fbs =
|
|||||||
print('\nEnding data transfer...')
|
print('\nEnding data transfer...')
|
||||||
resp = reqresp(unicmd.cmd_data_end(), fdlBooted)
|
resp = reqresp(unicmd.cmd_data_end(), fdlBooted)
|
||||||
rcode, rlen, r = unicmd.resp_decode(resp, 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
|
assert rcode == unicmd.BSL_REP_ACK, 'Could not finalize data transfer, response code is %X' % rcode
|
||||||
print('Data transfer successful')
|
print('Data transfer successful')
|
||||||
|
|
||||||
@@ -128,7 +129,7 @@ def read_partition(partid, partsize, partoffset, outfile, rbblocksize):
|
|||||||
outf.flush()
|
outf.flush()
|
||||||
print('\nPartition dumped!')
|
print('\nPartition dumped!')
|
||||||
|
|
||||||
# memory eraser
|
# memory eraser and writer
|
||||||
|
|
||||||
def erase_flash_mem(size, faddr):
|
def erase_flash_mem(size, faddr):
|
||||||
print('Erasing %d bytes in the flash memory at offset 0x%X...' % (size, faddr - UNISOC_FLASH_BASE_ADDR))
|
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
|
assert rcode == unicmd.BSL_REP_ACK, 'Could not erase flash memory, response code is %X' % rcode
|
||||||
print('Flash range erased!')
|
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):
|
def auto_int(x):
|
||||||
return int(x,0)
|
return int(x,0)
|
||||||
|
|
||||||
@@ -221,7 +241,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, forceErase)
|
write_flash_mem(outfile, readoffset, 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