unpyc3 seems to have a better job with img loader

This commit is contained in:
Emil Lerch 2023-04-22 13:59:15 -07:00
parent 7c5202c699
commit 44b46a128c

View File

@ -1,9 +1,10 @@
# decompyle3 version 3.9.0 import os
# Python bytecode version base 3.7.0 (3394) import sys
# Decompiled from: Python 3.7.16 (default, Mar 30 2023, 01:25:49) import time
# [GCC 12.2.1 20220924] import hashlib
# Embedded file name: libs/base/bflb_img_loader.py import binascii
import os, sys, time, hashlib, binascii, traceback, threading import traceback
import threading
from Crypto.Cipher import AES from Crypto.Cipher import AES
from libs import bflb_utils from libs import bflb_utils
from libs.base import bflb_img_create from libs.base import bflb_img_create
@ -44,78 +45,7 @@ class BflbImgLoader(object):
self.isp_baudrate = 2000000 self.isp_baudrate = 2000000
if interface == 'uart': if interface == 'uart':
self.bflb_serial_object = bflb_serial.BLSerialUart(rts_state=True, dtr_state=True) self.bflb_serial_object = bflb_serial.BLSerialUart(rts_state=True, dtr_state=True)
self._bootrom_cmds = {'get_chip_id':{'cmd_id':'05', self._bootrom_cmds = {'get_chip_id': {'cmd_id': '05', 'data_len': '0000', 'callback': None}, 'get_boot_info': {'cmd_id': '10', 'data_len': '0000', 'callback': None}, 'load_boot_header': {'cmd_id': '11', 'data_len': '00b0', 'callback': None}, '808_load_boot_header': {'cmd_id': '11', 'data_len': '0160', 'callback': None}, '628_load_boot_header': {'cmd_id': '11', 'data_len': '0100', 'callback': None}, '616_load_boot_header': {'cmd_id': '11', 'data_len': '0100', 'callback': None}, '702l_load_boot_header': {'cmd_id': '11', 'data_len': '00F0', 'callback': None}, 'load_publick_key': {'cmd_id': '12', 'data_len': '0044', 'callback': None}, 'load_publick_key2': {'cmd_id': '13', 'data_len': '0044', 'callback': None}, 'load_signature': {'cmd_id': '14', 'data_len': '0004', 'callback': None}, 'load_signature2': {'cmd_id': '15', 'data_len': '0004', 'callback': None}, 'load_aes_iv': {'cmd_id': '16', 'data_len': '0014', 'callback': None}, 'load_seg_header': {'cmd_id': '17', 'data_len': '0010', 'callback': None}, 'load_seg_data': {'cmd_id': '18', 'data_len': '0100', 'callback': None}, 'check_image': {'cmd_id': '19', 'data_len': '0000', 'callback': None}, 'run_image': {'cmd_id': '1a', 'data_len': '0000', 'callback': None}, 'change_rate': {'cmd_id': '20', 'data_len': '0008', 'callback': None}, 'reset': {'cmd_id': '21', 'data_len': '0000', 'callback': None}, 'flash_erase': {'cmd_id': '30', 'data_len': '0000', 'callback': None}, 'flash_write': {'cmd_id': '31', 'data_len': '0100', 'callback': None}, 'flash_read': {'cmd_id': '32', 'data_len': '0100', 'callback': None}, 'flash_boot': {'cmd_id': '33', 'data_len': '0000', 'callback': None}, 'efuse_write': {'cmd_id': '40', 'data_len': '0080', 'callback': None}, 'efuse_read': {'cmd_id': '41', 'data_len': '0000', 'callback': None}}
'data_len':'0000',
'callback':None},
'get_boot_info':{'cmd_id':'10',
'data_len':'0000',
'callback':None},
'load_boot_header':{'cmd_id':'11',
'data_len':'00b0',
'callback':None},
'808_load_boot_header':{'cmd_id':'11',
'data_len':'0160',
'callback':None},
'628_load_boot_header':{'cmd_id':'11',
'data_len':'0100',
'callback':None},
'616_load_boot_header':{'cmd_id':'11',
'data_len':'0100',
'callback':None},
'702l_load_boot_header':{'cmd_id':'11',
'data_len':'00F0',
'callback':None},
'load_publick_key':{'cmd_id':'12',
'data_len':'0044',
'callback':None},
'load_publick_key2':{'cmd_id':'13',
'data_len':'0044',
'callback':None},
'load_signature':{'cmd_id':'14',
'data_len':'0004',
'callback':None},
'load_signature2':{'cmd_id':'15',
'data_len':'0004',
'callback':None},
'load_aes_iv':{'cmd_id':'16',
'data_len':'0014',
'callback':None},
'load_seg_header':{'cmd_id':'17',
'data_len':'0010',
'callback':None},
'load_seg_data':{'cmd_id':'18',
'data_len':'0100',
'callback':None},
'check_image':{'cmd_id':'19',
'data_len':'0000',
'callback':None},
'run_image':{'cmd_id':'1a',
'data_len':'0000',
'callback':None},
'change_rate':{'cmd_id':'20',
'data_len':'0008',
'callback':None},
'reset':{'cmd_id':'21',
'data_len':'0000',
'callback':None},
'flash_erase':{'cmd_id':'30',
'data_len':'0000',
'callback':None},
'flash_write':{'cmd_id':'31',
'data_len':'0100',
'callback':None},
'flash_read':{'cmd_id':'32',
'data_len':'0100',
'callback':None},
'flash_boot':{'cmd_id':'33',
'data_len':'0000',
'callback':None},
'efuse_write':{'cmd_id':'40',
'data_len':'0080',
'callback':None},
'efuse_read':{'cmd_id':'41',
'data_len':'0000',
'callback':None}}
def close_port(self): def close_port(self):
if self.bflb_serial_object is not None: if self.bflb_serial_object is not None:
@ -132,23 +62,19 @@ class BflbImgLoader(object):
tmp = bflb_utils.bytearray_reverse(read_data[120:124]) tmp = bflb_utils.bytearray_reverse(read_data[120:124])
self._segcnt = bflb_utils.bytearray_to_int(tmp) self._segcnt = bflb_utils.bytearray_to_int(tmp)
bflb_utils.printf('segcnt is ', self._segcnt) bflb_utils.printf('segcnt is ', self._segcnt)
else: elif section == '808_load_boot_header':
if section == '808_load_boot_header':
tmp = bflb_utils.bytearray_reverse(read_data[140:144]) tmp = bflb_utils.bytearray_reverse(read_data[140:144])
self._segcnt = bflb_utils.bytearray_to_int(tmp) self._segcnt = bflb_utils.bytearray_to_int(tmp)
bflb_utils.printf('segcnt is ', self._segcnt) bflb_utils.printf('segcnt is ', self._segcnt)
else: elif section == '628_load_boot_header':
if section == '628_load_boot_header':
tmp = bflb_utils.bytearray_reverse(read_data[136:140]) tmp = bflb_utils.bytearray_reverse(read_data[136:140])
self._segcnt = bflb_utils.bytearray_to_int(tmp) self._segcnt = bflb_utils.bytearray_to_int(tmp)
bflb_utils.printf('segcnt is ', self._segcnt) bflb_utils.printf('segcnt is ', self._segcnt)
else: elif section == '616_load_boot_header':
if section == '616_load_boot_header':
tmp = bflb_utils.bytearray_reverse(read_data[132:136]) tmp = bflb_utils.bytearray_reverse(read_data[132:136])
self._segcnt = bflb_utils.bytearray_to_int(tmp) self._segcnt = bflb_utils.bytearray_to_int(tmp)
bflb_utils.printf('segcnt is ', self._segcnt) bflb_utils.printf('segcnt is ', self._segcnt)
else: elif section == '702l_load_boot_header':
if section == '702l_load_boot_header':
tmp = bflb_utils.bytearray_reverse(read_data[120:124]) tmp = bflb_utils.bytearray_reverse(read_data[120:124])
self._segcnt = bflb_utils.bytearray_to_int(tmp) self._segcnt = bflb_utils.bytearray_to_int(tmp)
bflb_utils.printf('segcnt is ', self._segcnt) bflb_utils.printf('segcnt is ', self._segcnt)
@ -169,13 +95,12 @@ class BflbImgLoader(object):
data_read = bytearray(0) data_read = bytearray(0)
tmp = bflb_utils.int_to_2bytearray_l(len(read_data)) tmp = bflb_utils.int_to_2bytearray_l(len(read_data))
data = cmd_id + bytearray(1) + tmp + read_data data = cmd_id + bytearray(1) + tmp + read_data
if self._chip_type == 'bl702': if self._chip_type == 'bl702' and section == 'run_image':
if section == 'run_image': sub_module = __import__('libs.base.' + self._chip_type, fromlist=[self._chip_type])
sub_module = __import__(('libs.base.' + self._chip_type), fromlist=[self._chip_type])
data = sub_module.chiptype_patch.img_load_create_predata_before_run_img() data = sub_module.chiptype_patch.img_load_create_predata_before_run_img()
self.bflb_serial_object.write(data) self.bflb_serial_object.write(data)
if section == 'get_boot_info' or section == 'load_seg_header' or section == 'get_chip_id': if section == 'get_boot_info' or section == 'load_seg_header' or section == 'get_chip_id':
res, data_read = self.bflb_serial_object.deal_response() (res, data_read) = self.bflb_serial_object.deal_response()
else: else:
res = self.bflb_serial_object.deal_ack() res = self.bflb_serial_object.deal_ack()
if res.startswith('OK') is True: if res.startswith('OK') is True:
@ -185,7 +110,6 @@ class BflbImgLoader(object):
bflb_utils.printf('result: ', res) bflb_utils.printf('result: ', res)
except IOError: except IOError:
bflb_utils.printf('python IO error') bflb_utils.printf('python IO error')
return (res, data_read) return (res, data_read)
def boot_process_one_section(self, section, data_len): def boot_process_one_section(self, section, data_len):
@ -209,7 +133,7 @@ class BflbImgLoader(object):
data = cmd_id + tmp + oldv + newv data = cmd_id + tmp + oldv + newv
self.bflb_serial_object.if_write(data) self.bflb_serial_object.if_write(data)
bflb_utils.printf() bflb_utils.printf()
stime = 110 / float(baudrate) * 2 stime = 110/float(baudrate)*2
if stime < 0.003: if stime < 0.003:
stime = 0.003 stime = 0.003
time.sleep(stime) time.sleep(stime)
@ -244,14 +168,12 @@ class BflbImgLoader(object):
bflb_utils.printf('GPIO7(RX)是否连接到USB转串口的TX引脚') bflb_utils.printf('GPIO7(RX)是否连接到USB转串口的TX引脚')
bflb_utils.printf('GPIO14(TX)是否连接到USB转串口的RX引脚') bflb_utils.printf('GPIO14(TX)是否连接到USB转串口的RX引脚')
bflb_utils.printf('在使用烧录软件进行烧录前是否在GPIO24拉高的情况下使用Reset/Chip_En复位了芯片') bflb_utils.printf('在使用烧录软件进行烧录前是否在GPIO24拉高的情况下使用Reset/Chip_En复位了芯片')
else: elif self._chip_type == 'bl602':
if self._chip_type == 'bl602':
bflb_utils.printf('GPIO8是否上拉到板子自身的3.3V而不是外部的3.3V') bflb_utils.printf('GPIO8是否上拉到板子自身的3.3V而不是外部的3.3V')
bflb_utils.printf('GPIO7(RX)是否连接到USB转串口的TX引脚') bflb_utils.printf('GPIO7(RX)是否连接到USB转串口的TX引脚')
bflb_utils.printf('GPIO16(TX)是否连接到USB转串口的RX引脚') bflb_utils.printf('GPIO16(TX)是否连接到USB转串口的RX引脚')
bflb_utils.printf('在使用烧录软件进行烧录前是否在GPIO8拉高的情况下使用Reset/Chip_En复位了芯片') bflb_utils.printf('在使用烧录软件进行烧录前是否在GPIO8拉高的情况下使用Reset/Chip_En复位了芯片')
else: elif self._chip_type == 'bl702':
if self._chip_type == 'bl702':
bflb_utils.printf('GPIO28是否上拉到板子自身的3.3V而不是外部的3.3V') bflb_utils.printf('GPIO28是否上拉到板子自身的3.3V而不是外部的3.3V')
bflb_utils.printf('GPIO15(RX)是否连接到USB转串口的TX引脚') bflb_utils.printf('GPIO15(RX)是否连接到USB转串口的TX引脚')
bflb_utils.printf('GPIO14(TX)是否连接到USB转串口的RX引脚') bflb_utils.printf('GPIO14(TX)是否连接到USB转串口的RX引脚')
@ -272,17 +194,12 @@ class BflbImgLoader(object):
while True: while True:
if self._shakehand_flag is True: if self._shakehand_flag is True:
break break
if not self._chip_type == 'bl702' or self._chip_type == 'bl702l': if self._chip_type == 'bl702' or self._chip_type == 'bl702l':
self.bflb_serial_object.write(self.get_sync_bytes(int(0.003 * speed / 10))) self.bflb_serial_object.write(self.get_sync_bytes(int(0.003*speed/10)))
else: else:
self.bflb_serial_object.write(self.get_sync_bytes(int(0.006 * speed / 10))) self.bflb_serial_object.write(self.get_sync_bytes(int(0.006*speed/10)))
except Exception as e: except Exception as e:
try:
bflb_utils.printf('Error: %s' % e) bflb_utils.printf('Error: %s' % e)
finally:
e = None
del e
def get_sync_bytes(self, length): def get_sync_bytes(self, length):
try: try:
@ -291,36 +208,29 @@ class BflbImgLoader(object):
while i < length: while i < length:
data[i] = 85 data[i] = 85
i += 1 i += 1
return data return data
except Exception as e: except Exception as e:
try:
bflb_utils.printf('Error: %s' % e) bflb_utils.printf('Error: %s' % e)
finally:
e = None
del e
def set_isp_baudrate(self, isp_baudrate): def set_isp_baudrate(self, isp_baudrate):
bflb_utils.printf('isp mode speed: ', isp_baudrate) bflb_utils.printf('isp mode speed: ', isp_baudrate)
self.isp_baudrate = isp_baudrate self.isp_baudrate = isp_baudrate
def toggle_boot_or_shake_hand(self, run_sign, do_reset=False, reset_hold_time=100, shake_hand_delay=100, reset_revert=True, cutoff_time=0, isp_mode_sign=False, isp_timeout=0, boot_load=False, shake_hand_retry=2): def toggle_boot_or_shake_hand(self, run_sign, do_reset=False, reset_hold_time=100, shake_hand_delay=100, reset_revert=True, cutoff_time=0, isp_mode_sign=False, isp_timeout=0, boot_load=False, shake_hand_retry=2):
""" '''
When run_sign is 2, it run shakehand. When run_sign is 2, it run shakehand.
""" '''
device = self._device device = self._device
speed = self._speed speed = self._speed
if run_sign == 2: if run_sign == 2:
shake_hand_retry = shake_hand_retry shake_hand_retry = shake_hand_retry
else: elif run_sign == 1:
if run_sign == 1:
shake_hand_retry = 1 shake_hand_retry = 1
if self.bflb_serial_object: if self.bflb_serial_object:
try: try:
timeout = self.bflb_serial_object.get_timeout() timeout = self.bflb_serial_object.get_timeout()
blusbserialwriteflag = False blusbserialwriteflag = False
if isp_mode_sign: if isp_mode_sign and isp_timeout > 0:
if isp_timeout > 0:
wait_timeout = isp_timeout wait_timeout = isp_timeout
self.bflb_serial_object.set_timeout(0.1) self.bflb_serial_object.set_timeout(0.1)
self._shakehand_flag = False self._shakehand_flag = False
@ -329,7 +239,7 @@ class BflbImgLoader(object):
self.bflb_serial_object.repeat_init(device, self.isp_baudrate, self._chip_type, self._chip_name) self.bflb_serial_object.repeat_init(device, self.isp_baudrate, self._chip_type, self._chip_name)
self.bflb_serial_object.write(b'\r\nispboot if\r\nreboot\r\n') self.bflb_serial_object.write(b'\r\nispboot if\r\nreboot\r\n')
fl_thrx = None fl_thrx = None
fl_thrx = threading.Thread(target=(self.send_55_command), args=(speed,)) fl_thrx = threading.Thread(target=self.send_55_command, args=(speed,))
fl_thrx.setDaemon(True) fl_thrx.setDaemon(True)
fl_thrx.start() fl_thrx.start()
bflb_utils.printf('Please Press Reset Key!') bflb_utils.printf('Please Press Reset Key!')
@ -340,7 +250,7 @@ class BflbImgLoader(object):
while time.time() - time_stamp < wait_timeout: while time.time() - time_stamp < wait_timeout:
if self._chip_type == 'bl602' or self._chip_type == 'bl702': if self._chip_type == 'bl602' or self._chip_type == 'bl702':
self.bflb_serial_object.set_timeout(0.01) self.bflb_serial_object.set_timeout(0.01)
success, ack = self.bflb_serial_object.read(3000) (success, ack) = self.bflb_serial_object.read(3000)
if ack.find(b'Boot2 ISP Shakehand Suss') != -1: if ack.find(b'Boot2 ISP Shakehand Suss') != -1:
self._shakehand_flag = True self._shakehand_flag = True
if ack.find(b'Boot2 ISP Ready') != -1: if ack.find(b'Boot2 ISP Ready') != -1:
@ -349,7 +259,7 @@ class BflbImgLoader(object):
self.bflb_serial_object.set_timeout(timeout) self.bflb_serial_object.set_timeout(timeout)
return 'OK' return 'OK'
else: else:
success, ack = self.bflb_serial_object.read(3000) (success, ack) = self.bflb_serial_object.read(3000)
if ack.find(b'Boot2 ISP Ready') != -1: if ack.find(b'Boot2 ISP Ready') != -1:
bflb_utils.printf('isp ready') bflb_utils.printf('isp ready')
self._shakehand_flag = True self._shakehand_flag = True
@ -359,7 +269,7 @@ class BflbImgLoader(object):
self.bflb_serial_object.set_timeout(0.1) self.bflb_serial_object.set_timeout(0.1)
if self._chip_type == 'bl602' or self._chip_type == 'bl702': if self._chip_type == 'bl602' or self._chip_type == 'bl702':
self.bflb_serial_object.set_timeout(0.5) self.bflb_serial_object.set_timeout(0.5)
success, ack = self.bflb_serial_object.read(15) (success, ack) = self.bflb_serial_object.read(15)
self.bflb_serial_object.set_timeout(0.005) self.bflb_serial_object.set_timeout(0.005)
ack += self.bflb_serial_object.read(15)[1] ack += self.bflb_serial_object.read(15)[1]
self.bflb_serial_object.set_timeout(tmp_timeout) self.bflb_serial_object.set_timeout(tmp_timeout)
@ -370,26 +280,224 @@ class BflbImgLoader(object):
self.bflb_serial_object.write(bytearray.fromhex('a0000000')) self.bflb_serial_object.write(bytearray.fromhex('a0000000'))
return 'OK' return 'OK'
else: else:
while 1: while shake_hand_retry > 0:
ack = self.bflb_serial_object.raw_read() if cutoff_time != 0 and blusbserialwriteflag is not True:
if len(ack) == 0: cutoff_revert = False
break if cutoff_time > 1000:
cutoff_revert = True
cutoff_time = cutoff_time - 1000
self.bflb_serial_object.setRTS(1)
time.sleep(0.2)
self.bflb_serial_object.setRTS(0)
time.sleep(0.05)
self.bflb_serial_object.setRTS(1)
if cutoff_revert:
self.bflb_serial_object.setDTR(0)
else:
self.bflb_serial_object.setDTR(1)
bflb_utils.printf('tx rx and power off, press the machine!')
bflb_utils.printf('cutoff time is ', cutoff_time/1000.0)
time.sleep(cutoff_time/1000.0)
if cutoff_revert:
self.bflb_serial_object.setDTR(1)
else:
self.bflb_serial_object.setDTR(0)
bflb_utils.printf('power on tx and rx ')
time.sleep(0.1) time.sleep(0.1)
while True: elif run_sign == 2:
ack = self.bflb_serial_object.raw_read() self.bflb_serial_object.setDTR(0)
if len(ack) == 0: bflb_utils.printf('default set DTR high ')
break time.sleep(0.1)
if do_reset is True and blusbserialwriteflag is not True:
self.bflb_serial_object.setRTS(0)
time.sleep(0.2)
if reset_revert:
self.bflb_serial_object.setRTS(1)
time.sleep(0.001)
reset_cnt = 2
if reset_hold_time > 1000:
reset_cnt = int(reset_hold_time//1000)
reset_hold_time = reset_hold_time % 1000
while reset_cnt > 0:
if reset_revert:
self.bflb_serial_object.setRTS(0)
else:
self.bflb_serial_object.setRTS(1)
time.sleep(reset_hold_time/1000.0)
if reset_revert:
self.bflb_serial_object.setRTS(1)
else:
self.bflb_serial_object.setRTS(0)
if shake_hand_delay > 0:
time.sleep(shake_hand_delay/1000.0)
else:
time.sleep(0.005)
if reset_revert:
self.bflb_serial_object.setRTS(0)
else:
self.bflb_serial_object.setRTS(1)
time.sleep(reset_hold_time/1000.0)
if reset_revert:
self.bflb_serial_object.setRTS(1)
else:
self.bflb_serial_object.setRTS(0)
if shake_hand_delay > 0:
time.sleep(shake_hand_delay/1000.0)
else:
time.sleep(0.005)
reset_cnt -= 1
bflb_utils.printf('reset cnt: ' + str(reset_cnt) + ', reset hold: ' + str(reset_hold_time/1000.0) + ', shake hand delay: ' + str(shake_hand_delay/1000.0))
if blusbserialwriteflag:
self.bflb_serial_object.bl_usb_serial_write(cutoff_time, reset_revert)
bflb_utils.printf('clean buf')
self.bflb_serial_object.set_timeout(0.1)
self.bflb_serial_object.clear_buf()
if run_sign == 1:
self.bflb_serial_object.set_timeout(timeout)
return 'OK'
if self._602a0_dln_fix:
self.bflb_serial_object.set_timeout(0.5)
else:
self.bflb_serial_object.set_timeout(0.1)
bflb_utils.printf('send sync')
if self._chip_type == 'bl702' or self._chip_type == 'bl702l':
self.bflb_serial_object.write(self.get_sync_bytes(int(0.003*speed/10)))
else:
self.bflb_serial_object.write(self.get_sync_bytes(int(0.006*speed/10)))
if self._chip_type == 'bl808':
time.sleep(0.3)
self.bflb_serial_object.write(bflb_utils.hexstr_to_bytearray('5000080038F0002000000018'))
if self._602a0_dln_fix:
time.sleep(4)
(success, ack) = self.bflb_serial_object.read(1000)
bflb_utils.printf('ack is ', binascii.hexlify(ack))
if ack.find(b'O') != -1 or ack.find(b'K') != -1:
self.bflb_serial_object.set_timeout(timeout)
if self._602a0_dln_fix:
self.bflb_serial_object.write(bytearray(2))
time.sleep(0.03)
return 'OK'
if len(ack) != 0:
bflb_utils.printf('reshake')
if do_reset is False:
bflb_utils.printf('sleep')
time.sleep(3)
else:
bflb_utils.printf('retry')
shake_hand_retry -= 1
time.sleep(0.1)
while shake_hand_retry > 0:
if cutoff_time != 0 and blusbserialwriteflag is not True:
cutoff_revert = False
if cutoff_time > 1000:
cutoff_revert = True
cutoff_time = cutoff_time - 1000
self.bflb_serial_object.setRTS(1)
time.sleep(0.2)
self.bflb_serial_object.setRTS(0)
time.sleep(0.05)
self.bflb_serial_object.setRTS(1)
if cutoff_revert:
self.bflb_serial_object.setDTR(0)
else:
self.bflb_serial_object.setDTR(1)
bflb_utils.printf('tx rx and power off, press the machine!')
bflb_utils.printf('cutoff time is ', cutoff_time/1000.0)
time.sleep(cutoff_time/1000.0)
if cutoff_revert:
self.bflb_serial_object.setDTR(1)
else:
self.bflb_serial_object.setDTR(0)
bflb_utils.printf('power on tx and rx ')
time.sleep(0.1)
elif run_sign == 2:
self.bflb_serial_object.setDTR(0)
bflb_utils.printf('default set DTR high ')
time.sleep(0.1)
if do_reset is True and blusbserialwriteflag is not True:
self.bflb_serial_object.setRTS(0)
time.sleep(0.2)
if reset_revert:
self.bflb_serial_object.setRTS(1)
time.sleep(0.001)
reset_cnt = 2
if reset_hold_time > 1000:
reset_cnt = int(reset_hold_time//1000)
reset_hold_time = reset_hold_time % 1000
while reset_cnt > 0:
if reset_revert:
self.bflb_serial_object.setRTS(0)
else:
self.bflb_serial_object.setRTS(1)
time.sleep(reset_hold_time/1000.0)
if reset_revert:
self.bflb_serial_object.setRTS(1)
else:
self.bflb_serial_object.setRTS(0)
if shake_hand_delay > 0:
time.sleep(shake_hand_delay/1000.0)
else:
time.sleep(0.005)
if reset_revert:
self.bflb_serial_object.setRTS(0)
else:
self.bflb_serial_object.setRTS(1)
time.sleep(reset_hold_time/1000.0)
if reset_revert:
self.bflb_serial_object.setRTS(1)
else:
self.bflb_serial_object.setRTS(0)
if shake_hand_delay > 0:
time.sleep(shake_hand_delay/1000.0)
else:
time.sleep(0.005)
reset_cnt -= 1
bflb_utils.printf('reset cnt: ' + str(reset_cnt) + ', reset hold: ' + str(reset_hold_time/1000.0) + ', shake hand delay: ' + str(shake_hand_delay/1000.0))
if blusbserialwriteflag:
self.bflb_serial_object.bl_usb_serial_write(cutoff_time, reset_revert)
bflb_utils.printf('clean buf')
self.bflb_serial_object.set_timeout(0.1)
self.bflb_serial_object.clear_buf()
if run_sign == 1:
self.bflb_serial_object.set_timeout(timeout)
return 'OK'
if self._602a0_dln_fix:
self.bflb_serial_object.set_timeout(0.5)
else:
self.bflb_serial_object.set_timeout(0.1)
bflb_utils.printf('send sync')
if self._chip_type == 'bl702' or self._chip_type == 'bl702l':
self.bflb_serial_object.write(self.get_sync_bytes(int(0.003*speed/10)))
else:
self.bflb_serial_object.write(self.get_sync_bytes(int(0.006*speed/10)))
if self._chip_type == 'bl808':
time.sleep(0.3)
self.bflb_serial_object.write(bflb_utils.hexstr_to_bytearray('5000080038F0002000000018'))
if self._602a0_dln_fix:
time.sleep(4)
(success, ack) = self.bflb_serial_object.read(1000)
bflb_utils.printf('ack is ', binascii.hexlify(ack))
if ack.find(b'O') != -1 or ack.find(b'K') != -1:
self.bflb_serial_object.set_timeout(timeout)
if self._602a0_dln_fix:
self.bflb_serial_object.write(bytearray(2))
time.sleep(0.03)
return 'OK'
if len(ack) != 0:
bflb_utils.printf('reshake')
if do_reset is False:
bflb_utils.printf('sleep')
time.sleep(3)
else:
bflb_utils.printf('retry')
shake_hand_retry -= 1
self.bflb_serial_object.set_timeout(tmp_timeout) self.bflb_serial_object.set_timeout(tmp_timeout)
break break
self._shakehand_flag = True self._shakehand_flag = True
self.bflb_serial_object.set_timeout(timeout) self.bflb_serial_object.set_timeout(timeout)
self.bflb_serial_object.repeat_init(device, speed, self._chip_type, self._chip_name) self.bflb_serial_object.repeat_init(device, speed, self._chip_type, self._chip_name)
time.sleep(2.2) time.sleep(2.2)
if self.bflb_serial_object._is_bouffalo_chip(): if self.bflb_serial_object._is_bouffalo_chip() and boot_load:
if boot_load:
blusbserialwriteflag = True blusbserialwriteflag = True
while shake_hand_retry > 0: while shake_hand_retry > 0:
if cutoff_time != 0 and blusbserialwriteflag is not True: if cutoff_time != 0 and blusbserialwriteflag is not True:
@ -407,21 +515,19 @@ class BflbImgLoader(object):
else: else:
self.bflb_serial_object.setDTR(1) self.bflb_serial_object.setDTR(1)
bflb_utils.printf('tx rx and power off, press the machine!') bflb_utils.printf('tx rx and power off, press the machine!')
bflb_utils.printf('cutoff time is ', cutoff_time / 1000.0) bflb_utils.printf('cutoff time is ', cutoff_time/1000.0)
time.sleep(cutoff_time / 1000.0) time.sleep(cutoff_time/1000.0)
if cutoff_revert: if cutoff_revert:
self.bflb_serial_object.setDTR(1) self.bflb_serial_object.setDTR(1)
else: else:
self.bflb_serial_object.setDTR(0) self.bflb_serial_object.setDTR(0)
bflb_utils.printf('power on tx and rx ') bflb_utils.printf('power on tx and rx ')
time.sleep(0.1) time.sleep(0.1)
else: elif run_sign == 2:
if run_sign == 2:
self.bflb_serial_object.setDTR(0) self.bflb_serial_object.setDTR(0)
bflb_utils.printf('default set DTR high ') bflb_utils.printf('default set DTR high ')
time.sleep(0.1) time.sleep(0.1)
if do_reset is True: if do_reset is True and blusbserialwriteflag is not True:
if blusbserialwriteflag is not True:
self.bflb_serial_object.setRTS(0) self.bflb_serial_object.setRTS(0)
time.sleep(0.2) time.sleep(0.2)
if reset_revert: if reset_revert:
@ -429,41 +535,39 @@ class BflbImgLoader(object):
time.sleep(0.001) time.sleep(0.001)
reset_cnt = 2 reset_cnt = 2
if reset_hold_time > 1000: if reset_hold_time > 1000:
reset_cnt = int(reset_hold_time // 1000) reset_cnt = int(reset_hold_time//1000)
reset_hold_time = reset_hold_time % 1000 reset_hold_time = reset_hold_time % 1000
while reset_cnt > 0: while reset_cnt > 0:
if reset_revert: if reset_revert:
self.bflb_serial_object.setRTS(0) self.bflb_serial_object.setRTS(0)
else: else:
self.bflb_serial_object.setRTS(1) self.bflb_serial_object.setRTS(1)
time.sleep(reset_hold_time / 1000.0) time.sleep(reset_hold_time/1000.0)
if reset_revert: if reset_revert:
self.bflb_serial_object.setRTS(1) self.bflb_serial_object.setRTS(1)
else: else:
self.bflb_serial_object.setRTS(0) self.bflb_serial_object.setRTS(0)
if shake_hand_delay > 0: if shake_hand_delay > 0:
time.sleep(shake_hand_delay / 1000.0) time.sleep(shake_hand_delay/1000.0)
else: else:
time.sleep(0.005) time.sleep(0.005)
if reset_revert: if reset_revert:
self.bflb_serial_object.setRTS(0) self.bflb_serial_object.setRTS(0)
else: else:
self.bflb_serial_object.setRTS(1) self.bflb_serial_object.setRTS(1)
time.sleep(reset_hold_time / 1000.0) time.sleep(reset_hold_time/1000.0)
if reset_revert: if reset_revert:
self.bflb_serial_object.setRTS(1) self.bflb_serial_object.setRTS(1)
else: else:
self.bflb_serial_object.setRTS(0) self.bflb_serial_object.setRTS(0)
if shake_hand_delay > 0: if shake_hand_delay > 0:
time.sleep(shake_hand_delay / 1000.0) time.sleep(shake_hand_delay/1000.0)
else: else:
time.sleep(0.005) time.sleep(0.005)
reset_cnt -= 1 reset_cnt -= 1
bflb_utils.printf('reset cnt: ' + str(reset_cnt) + ', reset hold: ' + str(reset_hold_time/1000.0) + ', shake hand delay: ' + str(shake_hand_delay/1000.0))
bflb_utils.printf('reset cnt: ' + str(reset_cnt) + ', reset hold: ' + str(reset_hold_time / 1000.0) + ', shake hand delay: ' + str(shake_hand_delay / 1000.0))
if blusbserialwriteflag: if blusbserialwriteflag:
self.bflb_serial_object.bl_usb_serial_write(cutoff_time, reset_revert) self.bflb_serial_object.bl_usb_serial_write(cutoff_time, reset_revert)
else:
bflb_utils.printf('clean buf') bflb_utils.printf('clean buf')
self.bflb_serial_object.set_timeout(0.1) self.bflb_serial_object.set_timeout(0.1)
self.bflb_serial_object.clear_buf() self.bflb_serial_object.clear_buf()
@ -476,15 +580,15 @@ class BflbImgLoader(object):
self.bflb_serial_object.set_timeout(0.1) self.bflb_serial_object.set_timeout(0.1)
bflb_utils.printf('send sync') bflb_utils.printf('send sync')
if self._chip_type == 'bl702' or self._chip_type == 'bl702l': if self._chip_type == 'bl702' or self._chip_type == 'bl702l':
self.bflb_serial_object.write(self.get_sync_bytes(int(0.003 * speed / 10))) self.bflb_serial_object.write(self.get_sync_bytes(int(0.003*speed/10)))
else: else:
self.bflb_serial_object.write(self.get_sync_bytes(int(0.006 * speed / 10))) self.bflb_serial_object.write(self.get_sync_bytes(int(0.006*speed/10)))
if self._chip_type == 'bl808': if self._chip_type == 'bl808':
time.sleep(0.3) time.sleep(0.3)
self.bflb_serial_object.write(bflb_utils.hexstr_to_bytearray('5000080038F0002000000018')) self.bflb_serial_object.write(bflb_utils.hexstr_to_bytearray('5000080038F0002000000018'))
if self._602a0_dln_fix: if self._602a0_dln_fix:
time.sleep(4) time.sleep(4)
success, ack = self.bflb_serial_object.read(1000) (success, ack) = self.bflb_serial_object.read(1000)
bflb_utils.printf('ack is ', binascii.hexlify(ack)) bflb_utils.printf('ack is ', binascii.hexlify(ack))
if ack.find(b'O') != -1 or ack.find(b'K') != -1: if ack.find(b'O') != -1 or ack.find(b'K') != -1:
self.bflb_serial_object.set_timeout(timeout) self.bflb_serial_object.set_timeout(timeout)
@ -500,16 +604,10 @@ class BflbImgLoader(object):
else: else:
bflb_utils.printf('retry') bflb_utils.printf('retry')
shake_hand_retry -= 1 shake_hand_retry -= 1
self.bflb_serial_object.set_timeout(timeout) self.bflb_serial_object.set_timeout(timeout)
return 'FL' return 'FL'
except Exception as e: except Exception as e:
try:
bflb_utils.printf('Error: %s' % e) bflb_utils.printf('Error: %s' % e)
finally:
e = None
del e
else: else:
return 'FL' return 'FL'
@ -519,16 +617,14 @@ class BflbImgLoader(object):
if self._chip_type == 'wb03': if self._chip_type == 'wb03':
self.toggle_boot_or_shake_hand(1, do_reset, reset_hold_time, shake_hand_delay, reset_revert, cutoff_time, isp_mode_sign, isp_timeout, boot_load) self.toggle_boot_or_shake_hand(1, do_reset, reset_hold_time, shake_hand_delay, reset_revert, cutoff_time, isp_mode_sign, isp_timeout, boot_load)
bflb_utils.printf('get_chip_id') bflb_utils.printf('get_chip_id')
ret, data_read = self.boot_process_one_section('get_chip_id', 0) (ret, data_read) = self.boot_process_one_section('get_chip_id', 0)
if ret.startswith('OK') is False: if ret.startswith('OK') is False:
bflb_utils.printf('fail') bflb_utils.printf('fail')
return ( return (ret, None)
ret, None)
data_read = binascii.hexlify(data_read) data_read = binascii.hexlify(data_read)
bflb_utils.printf('data read is ', data_read) bflb_utils.printf('data read is ', data_read)
chip_id = data_read.decode('utf-8') chip_id = data_read.decode('utf-8')
if chip_id != '43484950574230334130305f424c0000': if chip_id != '43484950574230334130305f424c0000' and chip_id != '43484950574230334130305F424C0000':
if chip_id != '43484950574230334130305F424C0000':
return 'shake hand fail' return 'shake hand fail'
else: else:
if self._chip_type == 'bl602': if self._chip_type == 'bl602':
@ -541,8 +637,7 @@ class BflbImgLoader(object):
self.issue_log_print() self.issue_log_print()
bflb_utils.set_error_code('0050') bflb_utils.set_error_code('0050')
return 'shake hand fail' return 'shake hand fail'
if sh_baudrate != wk_baudrate: if sh_baudrate != wk_baudrate and self.boot_inf_change_rate(self._device, 'change_rate', wk_baudrate) != 'OK':
if self.boot_inf_change_rate(self._device, 'change_rate', wk_baudrate) != 'OK':
bflb_utils.printf('change rate fail') bflb_utils.printf('change rate fail')
return 'change rate fail' return 'change rate fail'
bflb_utils.printf('shake hand success') bflb_utils.printf('shake hand success')
@ -551,11 +646,10 @@ class BflbImgLoader(object):
def img_load_main_process(self, file, group, record_bootinfo=None): def img_load_main_process(self, file, group, record_bootinfo=None):
encrypt_blk_size = 16 encrypt_blk_size = 16
bflb_utils.printf('get_boot_info') bflb_utils.printf('get_boot_info')
ret, data_read = self.boot_process_one_section('get_boot_info', 0) (ret, data_read) = self.boot_process_one_section('get_boot_info', 0)
if ret.startswith('OK') is False: if ret.startswith('OK') is False:
bflb_utils.printf('fail') bflb_utils.printf('fail')
return ( return (ret, None)
ret, None)
data_read = binascii.hexlify(data_read) data_read = binascii.hexlify(data_read)
bflb_utils.printf('data read is ', data_read) bflb_utils.printf('data read is ', data_read)
bootinfo = data_read.decode('utf-8') bootinfo = data_read.decode('utf-8')
@ -566,26 +660,21 @@ class BflbImgLoader(object):
chipid = bootinfo[34:36] + bootinfo[32:34] + bootinfo[30:32] + bootinfo[28:30] + bootinfo[26:28] + bootinfo[24:26] chipid = bootinfo[34:36] + bootinfo[32:34] + bootinfo[30:32] + bootinfo[28:30] + bootinfo[26:28] + bootinfo[24:26]
bflb_utils.printf('========= ChipID: ', chipid, ' =========') bflb_utils.printf('========= ChipID: ', chipid, ' =========')
bflb_utils.printf('last boot info: ', record_bootinfo) bflb_utils.printf('last boot info: ', record_bootinfo)
if record_bootinfo != None: if record_bootinfo != None and bootinfo[8:] == record_bootinfo[8:]:
if bootinfo[8:] == record_bootinfo[8:]:
bflb_utils.printf('repeated chip') bflb_utils.printf('repeated chip')
return ( return ('repeat_burn', bootinfo)
'repeat_burn', bootinfo)
if bootinfo[:8] == 'FFFFFFFF' or bootinfo[:8] == 'ffffffff': if bootinfo[:8] == 'FFFFFFFF' or bootinfo[:8] == 'ffffffff':
bflb_utils.printf('eflash loader present') bflb_utils.printf('eflash loader present')
return ( return ('error_shakehand', bootinfo)
'error_shakehand', bootinfo)
sign = 0 sign = 0
encrypt = 0 encrypt = 0
if self._chip_type == 'bl60x': if self._chip_type == 'bl60x':
sign = int(data_read[8:10], 16) & 3 sign = int(data_read[8:10], 16) & 3
encrypt = (int(data_read[8:10], 16) & 12) >> 2 encrypt = (int(data_read[8:10], 16) & 12) >> 2
else: elif self._chip_type == 'bl602' or self._chip_type == 'bl702' or self._chip_type == 'bl702l':
if self._chip_type == 'bl602' or self._chip_type == 'bl702' or self._chip_type == 'bl702l':
sign = int(data_read[8:10], 16) sign = int(data_read[8:10], 16)
encrypt = int(data_read[10:12], 16) encrypt = int(data_read[10:12], 16)
else: elif self._chip_type == 'bl808' or self._chip_type == 'bl628':
if self._chip_type == 'bl808' or self._chip_type == 'bl628':
if group == 0: if group == 0:
sign = int(data_read[8:10], 16) sign = int(data_read[8:10], 16)
encrypt = int(data_read[12:14], 16) encrypt = int(data_read[12:14], 16)
@ -597,28 +686,22 @@ class BflbImgLoader(object):
encrypt = int(data_read[10:12], 16) encrypt = int(data_read[10:12], 16)
bflb_utils.printf('sign is ', sign, ' encrypt is ', encrypt) bflb_utils.printf('sign is ', sign, ' encrypt is ', encrypt)
if encrypt == 1 or sign == 1: if encrypt == 1 or sign == 1:
if encrypt == 1 and self.encrypt_key != None and self.encrypt_iv != None and sign == 1 and self.encrypt_key != None and self.private_key != None: if encrypt == 1 and self.encrypt_key != None and self.encrypt_iv != None and sign == 1 and self.public_key != None and self.private_key != None:
ret, encrypted_data = bflb_img_create.encrypt_loader_bin(self._chip_type, file, sign, encrypt, self.encrypt_key, self.encrypt_iv, self.public_key, self.private_key) (ret, encrypted_data) = bflb_img_create.encrypt_loader_bin(self._chip_type, file, sign, encrypt, self.encrypt_key, self.encrypt_iv, self.public_key, self.private_key)
else: elif encrypt == 1 and self.encrypt_key != None and self.encrypt_iv != None and sign == 0:
if encrypt == 1and self.encrypt_key != None and self.encrypt_key != None and sign == 0: (ret, encrypted_data) = bflb_img_create.encrypt_loader_bin(self._chip_type, file, sign, encrypt, self.encrypt_key, self.encrypt_iv, self.public_key, self.private_key)
ret, encrypted_data = bflb_img_create.encrypt_loader_bin(self._chip_type, file, sign, encrypt, self.encrypt_key, self.encrypt_iv, self.public_key, self.private_key) elif encrypt == 0 and sign == 1 and self.public_key != None and self.private_key != None:
else: (ret, encrypted_data) = bflb_img_create.encrypt_loader_bin(self._chip_type, file, sign, encrypt, self.encrypt_key, self.encrypt_iv, self.public_key, self.private_key)
if encrypt == 0and sign == 1 and sign == 1 and self.private_key != None:
ret, encrypted_data = bflb_img_create.encrypt_loader_bin(self._chip_type, file, sign, encrypt, self.encrypt_key, self.encrypt_iv, self.public_key, self.private_key)
else: else:
if encrypt == 1 and sign == 1: if encrypt == 1 and sign == 1:
bflb_utils.printf('Error: Aes-encrypt and ecc-signature is None!') bflb_utils.printf('Error: Aes-encrypt and ecc-signature is None!')
else: elif encrypt == 1 and sign == 0:
if encrypt == 1 and sign == 0:
bflb_utils.printf('Error: Aes-encrypt is None!') bflb_utils.printf('Error: Aes-encrypt is None!')
else: elif encrypt == 0 and sign == 1:
if encrypt == 0:
if sign == 1:
bflb_utils.printf('Error: Ecc-signature is None!') bflb_utils.printf('Error: Ecc-signature is None!')
return ( return ('', bootinfo)
'', bootinfo)
if ret == True: if ret == True:
filename, ext = os.path.splitext(file) (filename, ext) = os.path.splitext(file)
file_encrypt = filename + '_encrypt' + ext file_encrypt = filename + '_encrypt' + ext
fp = open(file_encrypt, 'wb') fp = open(file_encrypt, 'wb')
fp.write(encrypted_data) fp.write(encrypted_data)
@ -633,70 +716,62 @@ class BflbImgLoader(object):
if self._chip_type == 'wb03': if self._chip_type == 'wb03':
self._imge_fp.read(208) self._imge_fp.read(208)
if self._chip_type == 'bl808': if self._chip_type == 'bl808':
ret, dmy = self.boot_process_one_section('808_load_boot_header', 0) (ret, dmy) = self.boot_process_one_section('808_load_boot_header', 0)
elif self._chip_type == 'bl628':
(ret, dmy) = self.boot_process_one_section('628_load_boot_header', 0)
elif self._chip_type == 'bl616' or self._chip_type == 'wb03':
(ret, dmy) = self.boot_process_one_section('616_load_boot_header', 0)
elif self._chip_type == 'bl702l':
(ret, dmy) = self.boot_process_one_section('702l_load_boot_header', 0)
else: else:
if self._chip_type == 'bl628': (ret, dmy) = self.boot_process_one_section('load_boot_header', 0)
ret, dmy = self.boot_process_one_section('628_load_boot_header', 0)
else:
if self._chip_type == 'bl616' or self._chip_type == 'wb03':
ret, dmy = self.boot_process_one_section('616_load_boot_header', 0)
else:
if self._chip_type == 'bl702l':
ret, dmy = self.boot_process_one_section('702l_load_boot_header', 0)
else:
ret, dmy = self.boot_process_one_section('load_boot_header', 0)
if ret.startswith('OK') is False: if ret.startswith('OK') is False:
return (ret, bootinfo) return (ret, bootinfo)
if sign != 0: if sign != 0:
ret, dmy = self.boot_process_one_section('load_publick_key', 0) (ret, dmy) = self.boot_process_one_section('load_publick_key', 0)
if ret.startswith('OK') is False: if ret.startswith('OK') is False:
return (ret, bootinfo) return (ret, bootinfo)
if self._chip_type == 'bl60x' or self._chip_type == 'bl808' or self._chip_type == 'bl628': if self._chip_type == 'bl60x' or self._chip_type == 'bl808' or self._chip_type == 'bl628':
ret, dmy = self.boot_process_one_section('load_publick_key2', 0) (ret, dmy) = self.boot_process_one_section('load_publick_key2', 0)
if ret.startswith('OK') is False: if ret.startswith('OK') is False:
return (ret, bootinfo) return (ret, bootinfo)
ret, dmy = self.boot_process_one_section('load_signature', 0) (ret, dmy) = self.boot_process_one_section('load_signature', 0)
if ret.startswith('OK') is False: if ret.startswith('OK') is False:
return (ret, bootinfo) return (ret, bootinfo)
if self._chip_type == 'bl60x' or self._chip_type == 'bl808' or self._chip_type == 'bl628': if self._chip_type == 'bl60x' or self._chip_type == 'bl808' or self._chip_type == 'bl628':
ret, dmy = self.boot_process_one_section('load_signature2', 0) (ret, dmy) = self.boot_process_one_section('load_signature2', 0)
if ret.startswith('OK') is False: if ret.startswith('OK') is False:
return (ret, bootinfo) return (ret, bootinfo)
if encrypt != 0: if encrypt != 0:
ret, dmy = self.boot_process_one_section('load_aes_iv', 0) (ret, dmy) = self.boot_process_one_section('load_aes_iv', 0)
if ret.startswith('OK') is False: if ret.startswith('OK') is False:
return (ret, bootinfo) return (ret, bootinfo)
segs = 0 segs = 0
while segs < self._segcnt: while segs < self._segcnt:
send_len = 0 send_len = 0
segdata_len = 0 segdata_len = 0
ret, data_read = self.boot_process_one_section('load_seg_header', 0) (ret, data_read) = self.boot_process_one_section('load_seg_header', 0)
if ret.startswith('OK') is False: if ret.startswith('OK') is False:
return (ret, bootinfo) return (ret, bootinfo)
else:
tmp = bflb_utils.bytearray_reverse(data_read[4:8]) tmp = bflb_utils.bytearray_reverse(data_read[4:8])
segdata_len = bflb_utils.bytearray_to_int(tmp) segdata_len = bflb_utils.bytearray_to_int(tmp)
bflb_utils.printf('segdata_len is ', segdata_len) bflb_utils.printf('segdata_len is ', segdata_len)
if encrypt == 1: if encrypt == 1 and segdata_len % encrypt_blk_size != 0:
if segdata_len % encrypt_blk_size != 0:
segdata_len = segdata_len + encrypt_blk_size - segdata_len % encrypt_blk_size segdata_len = segdata_len + encrypt_blk_size - segdata_len % encrypt_blk_size
while send_len < segdata_len: while send_len < segdata_len:
left = segdata_len - send_len left = segdata_len - send_len
if left > 4080: if left > 4080:
left = 4080 left = 4080
ret, dmy = self.boot_process_one_section('load_seg_data', left) (ret, dmy) = self.boot_process_one_section('load_seg_data', left)
if ret.startswith('OK') is False: if ret.startswith('OK') is False:
return (ret, bootinfo) return (ret, bootinfo)
send_len = send_len + left send_len = send_len + left
bflb_utils.printf(send_len, '/', segdata_len) bflb_utils.printf(send_len, '/', segdata_len)
if self._callback is not None: if self._callback is not None:
self._callback(send_len, segdata_len, sys._getframe().f_code.co_name) self._callback(send_len, segdata_len, sys._getframe().f_code.co_name)
segs = segs + 1 segs = segs + 1
(ret, dmy) = self.boot_process_one_section('check_image', 0)
ret, dmy = self.boot_process_one_section('check_image', 0) return (ret, bootinfo)
return (
ret, bootinfo)
def img_get_bootinfo(self, sh_baudrate, wk_baudrate, callback=None, do_reset=False, reset_hold_time=100, shake_hand_delay=100, reset_revert=True, cutoff_time=0, shake_hand_retry=2, isp_mode_sign=False, isp_timeout=0, boot_load=True): def img_get_bootinfo(self, sh_baudrate, wk_baudrate, callback=None, do_reset=False, reset_hold_time=100, shake_hand_delay=100, reset_revert=True, cutoff_time=0, shake_hand_retry=2, isp_mode_sign=False, isp_timeout=0, boot_load=True):
bflb_utils.printf('========= image get bootinfo =========') bflb_utils.printf('========= image get bootinfo =========')
@ -706,19 +781,17 @@ class BflbImgLoader(object):
self.bflb_serial_object.close() self.bflb_serial_object.close()
return (False, b'') return (False, b'')
time.sleep(0.5) time.sleep(0.5)
ret, data_read = self.boot_process_one_section('get_boot_info', 0) (ret, data_read) = self.boot_process_one_section('get_boot_info', 0)
if ret.startswith('OK') is False: if ret.startswith('OK') is False:
bflb_utils.printf('get_boot_info no ok') bflb_utils.printf('get_boot_info no ok')
return ( return (ret, b'')
ret, b'')
data_read = binascii.hexlify(data_read) data_read = binascii.hexlify(data_read)
bflb_utils.printf('data read is ', data_read) bflb_utils.printf('data read is ', data_read)
return ( return (True, data_read)
True, data_read)
def img_loader_reset_cpu(self): def img_loader_reset_cpu(self):
bflb_utils.printf('========= reset cpu =========') bflb_utils.printf('========= reset cpu =========')
ret, data_read = self.boot_process_one_section('reset', 0) (ret, data_read) = self.boot_process_one_section('reset', 0)
if ret.startswith('OK') is False: if ret.startswith('OK') is False:
bflb_utils.printf('reset cpu fail') bflb_utils.printf('reset cpu fail')
return False return False
@ -733,12 +806,10 @@ class BflbImgLoader(object):
if ret == 'shake hand fail' or ret == 'change rate fail': if ret == 'shake hand fail' or ret == 'change rate fail':
bflb_utils.printf('shake hand fail') bflb_utils.printf('shake hand fail')
self.bflb_serial_object.close() self.bflb_serial_object.close()
return ( return (False, bootinfo, ret)
False, bootinfo, ret)
time.sleep(0.01) time.sleep(0.01)
if self._eflash_loader_file1 is not None: if self._eflash_loader_file1 is not None and self._eflash_loader_file1 != '':
if self._eflash_loader_file1 != '': (res, bootinfo) = self.img_load_main_process(self._eflash_loader_file1, 0, record_bootinfo)
res, bootinfo = self.img_load_main_process(self._eflash_loader_file1, 0, record_bootinfo)
if res.startswith('OK') is False: if res.startswith('OK') is False:
if res.startswith('repeat_burn') is True: if res.startswith('repeat_burn') is True:
return (False, bootinfo, res) return (False, bootinfo, res)
@ -746,9 +817,8 @@ class BflbImgLoader(object):
if res.startswith('error_shakehand') is True: if res.startswith('error_shakehand') is True:
bflb_utils.printf('shakehand with eflash loader found') bflb_utils.printf('shakehand with eflash loader found')
return (False, bootinfo, res) return (False, bootinfo, res)
if self._eflash_loader_file2 is not None: if self._eflash_loader_file2 is not None and self._eflash_loader_file2 != '':
if self._eflash_loader_file2 != '': (res, bootinfo) = self.img_load_main_process(self._eflash_loader_file2, 1, record_bootinfo)
res, bootinfo = self.img_load_main_process(self._eflash_loader_file2, 1, record_bootinfo)
if res.startswith('OK') is False: if res.startswith('OK') is False:
if res.startswith('repeat_burn') is True: if res.startswith('repeat_burn') is True:
return (False, bootinfo, res) return (False, bootinfo, res)
@ -758,30 +828,20 @@ class BflbImgLoader(object):
return (False, bootinfo, res) return (False, bootinfo, res)
bflb_utils.printf('Run img') bflb_utils.printf('Run img')
self._imge_fp.close() self._imge_fp.close()
res, dmy = self.boot_process_one_section('run_image', 0) (res, dmy) = self.boot_process_one_section('run_image', 0)
if res.startswith('OK') is False: if res.startswith('OK') is False:
bflb_utils.printf('Img run fail') bflb_utils.printf('Img run fail')
success = False success = False
time.sleep(0.1) time.sleep(0.1)
except Exception as e: except Exception as e:
try:
bflb_utils.printf(e) bflb_utils.printf(e)
traceback.print_exc(limit=5, file=(sys.stdout)) traceback.print_exc(limit=5, file=sys.stdout)
return ( return (False, bootinfo, '')
False, bootinfo, '') return (success, bootinfo, '')
finally:
e = None
del e
return (
success, bootinfo, '')
if __name__ == '__main__': if __name__ == '__main__':
img_load_t = BflbImgLoader() img_load_t = BflbImgLoader()
if len(sys.argv) == 3: if len(sys.argv) == 3:
img_load_t.img_load_process(sys.argv[1], 115200, 115200, sys.argv[2], '') img_load_t.img_load_process(sys.argv[1], 115200, 115200, sys.argv[2], '')
else: elif len(sys.argv) == 4:
if len(sys.argv) == 4:
img_load_t.img_load_process(sys.argv[1], 115200, 115200, sys.argv[2], sys.argv[3]) img_load_t.img_load_process(sys.argv[1], 115200, 115200, sys.argv[2], sys.argv[3])
# okay decompiling ./libs/base/bflb_img_loader.pyc