11#!/usr/bin/env python
2- VERSION = "1.2.3 "
2+ VERSION = "1.2.5 "
33
44# Copyright (c) 2019, Pycom Limited.
55#
@@ -67,6 +67,7 @@ def special_print(self, msg, flush=None, end='\n'):
6767 print (msg , flush = flush , end = end )
6868
6969 def read_rsp (self , size = None , timeout = - 1 ):
70+ time .sleep (.25 )
7071 if timeout < 0 :
7172 timeout = 20000
7273 elif timeout is None :
@@ -338,15 +339,17 @@ def __get_wait_msg(self, load_fff=True):
338339
339340
340341
341- def __run (self , file_path = None , baudrate = 921600 , port = None , resume = False , load_ffh = False , mirror = False , switch_ffh = False , bootrom = False , rgbled = 0x050505 , debug = False , pkgdebug = False , atneg = True , max_try = 10 , direct = True , atneg_only = False , info_only = False , expected_smod = None , verbose = False , load_fff = False ):
342+ def __run (self , file_path = None , baudrate = 921600 , port = None , resume = False , load_ffh = False , mirror = False , switch_ffh = False , bootrom = False , rgbled = 0x050505 , debug = False , pkgdebug = False , atneg = True , max_try = 10 , direct = True , atneg_only = False , info_only = False , expected_smod = None , verbose = False , load_fff = False , mtools = False ):
342343 self .__wait_msg = False
343344 mirror = True if atneg_only else mirror
344345 recover = True if atneg_only else load_ffh
345346 resume = True if mirror or recover or atneg_only or info_only else resume
346347 verbose = True if debug else verbose
347348 load_fff = False if bootrom and switch_ffh else load_fff
349+ target_baudrate = baudrate
348350 baudrate = self .__modem_speed if self .__speed_detected else baudrate
349351 if debug : print ('mirror? {} recover? {} resume? {} direct? {} atneg_only? {} bootrom? {} load_fff? {}' .format (mirror , recover , resume , direct , atneg_only , bootrom , load_fff ))
352+ if debug : print ('baudrate: {} target_baudrate: {}' .format (baudrate , target_baudrate ))
350353 abort = True
351354 external = False
352355 self .__serial = None
@@ -416,7 +419,7 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
416419 if not self .wakeup_modem (baudrate , port , 10 , 1 , debug ):
417420 return False
418421
419- if not resume :
422+ if ( not resume ) or mtools :
420423
421424 # bind to AT channel
422425 self .__serial .write (b"AT+BIND=AT\r \n " )
@@ -430,17 +433,42 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
430433 response = self .read_rsp (size = 100 )
431434 if debug : print ("ATE0 returned {}" .format (response ))
432435
433- self .__serial .read (100 )
436+ self .__serial .read ()
434437 if debug : print ('Entering upgrade mode...' )
435438
439+ if verbose : print ("Sending AT+SMLOG?" )
440+ self .__serial .write (b'AT+SMLOG?\r \n ' )
441+ response = self .read_rsp (size = 100 )
442+ if verbose : print ("AT+SMLOG? returned {}" .format (response ))
443+
436444 self .__serial .write (b"AT+SMOD?\r \n " )
437445 response = self .return_pretty_response (self .read_rsp (size = 7 ))
438- self .__serial .read (100 )
439446 if debug : print ("AT+SMOD? returned {}" .format (response ))
440447
448+ if verbose : print ('Sending AT+FSRDFILE="/fs/crashdump"' )
449+ self .__serial .write (b'AT+FSRDFILE="/fs/crashdump"\r \n ' )
450+ response = self .read_rsp (size = 100 )
451+ if verbose : print ('AT+FSRDFILE="/fs/crashdump" returned {}' .format (response ))
452+ self .__serial .read ()
453+
441454 self .__serial .write (b"AT+SQNSUPGRADENTF=\" started\" \r \n " )
455+ response = self .read_rsp (size = 100 )
456+ if verbose : print ('AT+SQNSUPGRADENTF="started" returned {}' .format (response ))
442457 self .wait_for_modem ()
443- if not load_fff :
458+
459+ if verbose : print ('Sending AT+SQNWL="sqndcc",2' )
460+ self .__serial .write (b'AT+SQNWL="sqndcc",2\r \n ' )
461+ response = self .read_rsp (size = 100 )
462+ if verbose : print ('AT+SQNWL="sqndcc",2 returned {}' .format (response ))
463+ self .__serial .read (100 )
464+
465+ if verbose : print ("Sending AT+CFUN=4" )
466+ self .__serial .write (b'AT+CFUN=4\r \n ' )
467+ response = self .read_rsp (size = 100 )
468+ if verbose : print ("AT+CFUN=4 returned {}" .format (response ))
469+ self .__serial .read (100 )
470+
471+ if not (load_fff or mtools ):
444472 self .__serial .write (b"AT+SMSWBOOT=3,1\r \n " )
445473 resp = self .read_rsp (100 )
446474 if debug : print ('AT+SMSWBOOT=3,1 returned: {}' .format (resp ))
@@ -463,6 +491,23 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
463491 self .wait_for_modem ()
464492 self .__serial .write (b"AT\r \n " )
465493
494+ if verbose : print ("Sending AT+CFUN=4" )
495+ self .__serial .write (b'AT+CFUN=4\r \n ' )
496+ response = self .read_rsp (size = 100 )
497+ if verbose : print ("AT+CFUN=4 returned {}" .format (response ))
498+
499+ if verbose : print ("Sending AT+SMLOG?" )
500+ self .__serial .write (b'AT+SMLOG?\r \n ' )
501+ response = self .read_rsp (size = 100 )
502+ if verbose : print ("AT+SMLOG? returned {}" .format (response ))
503+
504+ if verbose : print ('Sending AT+FSRDFILE="/fs/crashdump"' )
505+ self .__serial .write (b'AT+FSRDFILE="/fs/crashdump"\r \n ' )
506+ response = self .read_rsp (size = 100 )
507+ if verbose : print ('AT+FSRDFILE="/fs/crashdump" returned {}' .format (response ))
508+ self .__serial .read ()
509+
510+
466511 else :
467512 self .__serial .read (100 )
468513 if debug : print ('Entering recovery mode' )
@@ -492,10 +537,6 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
492537 print ('Starting STP ON_THE_FLY' )
493538
494539 self .__serial .read (100 )
495- if verbose : print ("Sending AT+CFUN=4" )
496- resonse = self .__serial .write (b'AT+CFUN=4\r \n ' )
497- if verbose : print ("AT+CFUN=4 returned {}" .format (response ))
498- self .__serial .read (100 )
499540
500541 if load_fff :
501542 if debug : print ("Sending AT+SMSTPU" )
@@ -512,8 +553,11 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
512553 self .__serial .read ()
513554 elif recover and (not direct ):
514555 if atneg :
515- result = self .at_negotiation (baudrate , port , max_try , mirror , atneg_only , debug )
556+ result = self .at_negotiation (baudrate , port , max_try , mirror , atneg_only , debug , target_baudrate )
516557 if result :
558+ baudrate = target_baudrate
559+ self .__modem_speed = target_baudrate
560+ self .__speed_detected = True
517561 if atneg_only :
518562 return True
519563 if mirror :
@@ -671,7 +715,15 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
671715 time .sleep (0.5 )
672716
673717 if 'success' in sqnup_result :
718+ if verbose : print ('Sending AT+SQNSUPGRADENTF="success"' )
674719 self .__serial .write (b"AT+SQNSUPGRADENTF=\" success\" \r \n " )
720+ resonse = self .read_rsp (100 )
721+ if verbose : print ('AT+SQNSUPGRADENTF="success" returned {}' .format (response ))
722+ time .sleep (.25 )
723+ if verbose : print ('Sending AT+FSRDFILE="/fs/crashdump"' )
724+ self .__serial .write (b'AT+FSRDFILE="/fs/crashdump"\r \n ' )
725+ resonse = self .read_rsp (100 )
726+ if verbose : print ('AT+FSRDFILE="/fs/crashdump" returned {}' .format (response ))
675727 self .__serial .read ()
676728 return True
677729 elif sqnup_result is None :
@@ -712,7 +764,11 @@ def wakeup_modem(self, baudrate, port, max_try, delay, debug, msg='Attempting AT
712764 MAX_TRY = max_try
713765 count = 0
714766 if msg is not None :
715- print (msg )
767+ if debug :
768+ print (msg + ' [{}]' .format (baudrate ))
769+ else :
770+ print (msg )
771+
716772 self .__serial .read ()
717773 self .__serial .write (b"AT\r \n " )
718774 response = self .read_rsp (size = 25 )
@@ -729,10 +785,13 @@ def wakeup_modem(self, baudrate, port, max_try, delay, debug, msg='Attempting AT
729785 self .__serial = UART (1 , baudrate = baudrate , pins = self .__pins , timeout_chars = 100 )
730786 return count < MAX_TRY
731787
732- def at_negotiation (self , baudrate , port , max_try , mirror , atneg_only , debug ):
788+ def at_negotiation (self , baudrate , port , max_try , mirror , atneg_only , debug , target_baudrate ):
733789 MAX_TRY = max_try
734790 count = 0
735- print ('Attempting AT auto-negotiation...' )
791+ if debug :
792+ print ('Attempting AT auto-negotiation... with baudrate {} and target_baudrate {}' .format (baudrate , target_baudrate ))
793+ else :
794+ print ('Attempting AT auto-negotiation...' )
736795 self .__serial .write (b"AT\r \n " )
737796 response = self .read_rsp (size = 20 )
738797 if debug : print ('{}' .format (response ))
@@ -746,19 +805,21 @@ def at_negotiation(self, baudrate, port, max_try, mirror, atneg_only, debug):
746805 if debug : print ('{}' .format (response ))
747806 if b'OK' in response :
748807 self .__serial .read ()
749- cmd = "AT+IPR=%d\n " % baudrate
750- if debug : print ('Setting baudrate to {}' .format (baudrate ))
808+ cmd = "AT+IPR=%d\n " % target_baudrate
809+ if debug : print ('Setting baudrate to {}' .format (target_baudrate ))
751810 self .__serial .write (cmd .encode ())
752811 response = self .read_rsp (size = 6 )
753812 if debug : print ('{}' .format (response ))
754813 if b'OK' in response :
814+ self .__modem_speed = target_baudrate
815+ self .__speed_detected = True
755816 if atneg_only :
756817 return True
757818 if 'FiPy' in self .__sysname or 'GPy' in self .__sysname :
758- self .__serial = UART (1 , baudrate = baudrate , pins = self .__pins , timeout_chars = 100 )
819+ self .__serial = UART (1 , baudrate = target_baudrate , pins = self .__pins , timeout_chars = 100 )
759820 else :
760821 self .__serial = None
761- self .__serial = serial .Serial (port , baudrate , bytesize = serial .EIGHTBITS , timeout = 0.1 )
822+ self .__serial = serial .Serial (port , target_baudrate , bytesize = serial .EIGHTBITS , timeout = 0.1 )
762823 self .__serial .reset_input_buffer ()
763824 self .__serial .reset_output_buffer ()
764825 self .__serial .flush ()
@@ -774,7 +835,7 @@ def at_negotiation(self, baudrate, port, max_try, mirror, atneg_only, debug):
774835 print ('ERROR in AT+SMOD returned {}' .format (response ))
775836 return False
776837 else :
777- print ('ERROR in AT+IPR={} returned {}' .format (baudrate , response ))
838+ print ('ERROR in AT+IPR={} returned {}' .format (target_baudrate , response ))
778839 return False
779840 else :
780841 print ('ERROR sending AT command... no response? {}' .format (response ))
@@ -794,7 +855,7 @@ def success_message(self, port=None, verbose=False, debug=False):
794855 print ("Here is the current firmware version:\n " )
795856 self .show_info (port = port , verbose = verbose , debug = debug )
796857
797- def upgrade (self , ffile , mfile = None , baudrate = 921600 , retry = False , resume = False , debug = False , pkgdebug = False , verbose = False , load_fff = True , load_only = False ):
858+ def upgrade (self , ffile , mfile = None , baudrate = 921600 , retry = False , resume = False , debug = False , pkgdebug = False , verbose = False , load_fff = True , load_only = False , mtools = False ):
798859 success = True
799860 if not retry and mfile is not None :
800861 if resume or self .__check_br (br_only = True , verbose = verbose , debug = debug ):
@@ -819,7 +880,7 @@ def upgrade(self, ffile, mfile=None, baudrate=921600, retry=False, resume=False,
819880 print ('Unable to upgrade bootrom.' )
820881 if debug : print ('Success2? {}' .format (success ))
821882 if success :
822- if self .__run (file_path = ffile , resume = True if mfile is not None else resume , baudrate = baudrate , direct = False , debug = debug , pkgdebug = pkgdebug , verbose = verbose , load_fff = False if mfile else load_fff ):
883+ if self .__run (file_path = ffile , resume = True if mfile is not None else resume , baudrate = baudrate , direct = False , debug = debug , pkgdebug = pkgdebug , verbose = verbose , load_fff = False if mfile else load_fff , mtools = mtools ):
823884 if self .__check_br (verbose = verbose , debug = debug ):
824885 self .__run (bootrom = True , debug = debug , direct = False , pkgdebug = pkgdebug , verbose = verbose , load_fff = True )
825886 self .success_message (verbose = verbose , debug = debug )
@@ -839,8 +900,15 @@ def upgrade_uart(self, ffh_mode=False, mfile=None, retry=False, resume=False, co
839900 print ('Preparing modem for upgrade...' )
840901 if not retry and ffh_mode :
841902 success = False
842- success = self .__run (bootrom = True , resume = resume , switch_ffh = True , direct = False , debug = debug , pkgdebug = pkgdebug , verbose = verbose )
843- time .sleep (1 )
903+ if self .__check_br (verbose = verbose , debug = debug ):
904+ success = self .__run (bootrom = True , resume = resume , switch_ffh = True , direct = False , debug = debug , pkgdebug = pkgdebug , verbose = verbose )
905+ time .sleep (1 )
906+ else :
907+ print ('FFH mode is not necessary... ignoring!' )
908+ print ('Do not specify updater.elf when updating!' )
909+ mfile = None
910+ ffh_mode = False
911+ success = True
844912 if success :
845913 if mfile is not None :
846914 success = False
@@ -904,6 +972,7 @@ def run(ffile, mfile=None, baudrate=921600, verbose=False, debug=False, load_fff
904972 print_welcome ()
905973 retry = False
906974 resume = False
975+ mtools = False
907976 sqnup = sqnsupgrade ()
908977 if sqnup .check_files (ffile , mfile , debug ):
909978 state = sqnup .detect_modem_state (debug = debug , hangup = hangup )
@@ -916,11 +985,13 @@ def run(ffile, mfile=None, baudrate=921600, verbose=False, debug=False, load_fff
916985 print ('Your modem is in recovery mode. Please specify updater.elf file' )
917986 reconnect_uart ()
918987 sys .exit (1 )
919- elif state == 4 or state == 1 :
988+ elif state == 4 :
920989 resume = True
990+ elif state == 1 :
991+ mtools = True
921992 elif state == - 1 :
922993 detect_error ()
923- sqnup .upgrade (ffile = ffile , mfile = mfile , baudrate = baudrate , retry = retry , resume = resume , debug = debug , pkgdebug = False , verbose = verbose , load_fff = load_fff )
994+ sqnup .upgrade (ffile = ffile , mfile = mfile , baudrate = baudrate , retry = retry , resume = resume , debug = debug , pkgdebug = False , verbose = verbose , load_fff = load_fff , mtools = mtools )
924995 reconnect_uart ()
925996
926997 def uart (ffh_mode = False , mfile = None , color = 0x050505 , verbose = False , debug = False , hangup = True ):
0 commit comments