1
1
#!/usr/bin/env python
2
- VERSION = "1.2.2 "
2
+ VERSION = "1.2.3 "
3
3
4
4
# Copyright (c) 2019, Pycom Limited.
5
5
#
17
17
import sqnstp as stp
18
18
19
19
release = None
20
+
20
21
try :
21
22
sysname = os .uname ().sysname
22
23
if 'FiPy' in sysname or 'GPy' in sysname :
@@ -50,6 +51,8 @@ def __init__(self):
50
51
self .__resp_921600 = False
51
52
self .__serial = None
52
53
self .__kill_ppp_ok = False
54
+ self .__modem_speed = None
55
+ self .__speed_detected = False
53
56
54
57
if 'GPy' in self .__sysname :
55
58
self .__pins = ('P5' , 'P98' , 'P7' , 'P99' )
@@ -86,7 +89,8 @@ def read_rsp(self, size=None, timeout=-1):
86
89
else :
87
90
return b''
88
91
89
- def print_pretty_response (self , rsp , flush = False ):
92
+ def print_pretty_response (self , rsp , flush = False , prefix = None ):
93
+ if prefix is not None : self .special_print (prefix , flush = flush , end = ' ' )
90
94
lines = rsp .decode ('ascii' ).split ('\r \n ' )
91
95
for line in lines :
92
96
if 'OK' not in line and line != '' :
@@ -222,17 +226,20 @@ def __hangup_modem(self, delay, debug):
222
226
return False
223
227
224
228
225
- def detect_modem_state (self , retry = 3 , initial_delay = 1000 , debug = False ):
229
+ def detect_modem_state (self , retry = 5 , initial_delay = 1000 , hangup = True , debug = False ):
226
230
count = 0
227
231
self .__serial = UART (1 , baudrate = 921600 , pins = self .__pins , timeout_chars = 1 )
232
+ self .__modem_speed = 921600
228
233
self .__serial .read ()
229
234
while count < retry :
230
235
count += 1
231
236
delay = initial_delay * count
232
237
if debug : print ("The current delay is {}" .format (delay ))
233
238
self .__serial = UART (1 , baudrate = 921600 , pins = self .__pins , timeout_chars = 10 )
239
+ self .__modem_speed = 921600
234
240
#if True:
235
- if self .__hangup_modem (initial_delay , debug ):
241
+ if hangup and self .__hangup_modem (initial_delay , debug ):
242
+ self .__speed_detected = True
236
243
self .__serial .write (b"AT+SMOD?\r \n " )
237
244
time .sleep_ms (delay )
238
245
resp = self .__serial .read ()
@@ -242,6 +249,7 @@ def detect_modem_state(self, retry=3, initial_delay=1000, debug=False):
242
249
except :
243
250
pass
244
251
else :
252
+ self .__modem_speed = 921600
245
253
self .__serial = UART (1 , baudrate = 921600 , pins = self .__pins , timeout_chars = 1 )
246
254
self .__serial .read ()
247
255
self .__serial .write (b"AT\r \n " )
@@ -250,6 +258,7 @@ def detect_modem_state(self, retry=3, initial_delay=1000, debug=False):
250
258
self .__check_resp (resp )
251
259
if debug : print ('Response (AT #3) {}' .format (resp ))
252
260
if resp is not None and b'OK' in resp :
261
+ self .__speed_detected = True
253
262
self .__serial .write (b"AT+SMOD?\r \n " )
254
263
time .sleep_ms (delay )
255
264
resp = self .__serial .read ()
@@ -264,6 +273,7 @@ def detect_modem_state(self, retry=3, initial_delay=1000, debug=False):
264
273
self .__check_resp (resp )
265
274
if debug : print ('Response (AT #4) {}' .format (resp ))
266
275
if resp is not None and b'OK' in resp :
276
+ self .__speed_detected = True
267
277
self .__serial .write (b"AT+SMOD?\r \n " )
268
278
time .sleep_ms (delay )
269
279
resp = self .__serial .read ()
@@ -274,12 +284,14 @@ def detect_modem_state(self, retry=3, initial_delay=1000, debug=False):
274
284
pass
275
285
else :
276
286
if not self .__resp_921600 :
287
+ self .__modem_speed = 115200
277
288
self .__serial = UART (1 , baudrate = 115200 , pins = self .__pins , timeout_chars = 10 )
278
289
self .__serial .write (b"AT\r \n " )
279
290
time .sleep_ms (delay )
280
291
resp = self .__serial .read ()
281
292
if debug : print ('Response (AT #1 @ 115200) {}' .format (resp ))
282
293
if resp is not None and b'OK' in resp :
294
+ self .__speed_detected = True
283
295
self .__serial .write (b"AT+SMOD?\r \n " )
284
296
time .sleep_ms (delay )
285
297
resp = self .__serial .read ()
@@ -293,6 +305,7 @@ def detect_modem_state(self, retry=3, initial_delay=1000, debug=False):
293
305
resp = self .__serial .read ()
294
306
if debug : print ('Response (AT #2 @ 115200) {}' .format (resp ))
295
307
if resp is not None and b'OK' in resp :
308
+ self .__speed_detected = True
296
309
self .__serial .write (b"AT+SMOD?\r \n " )
297
310
time .sleep_ms (delay )
298
311
resp = self .__serial .read ()
@@ -303,6 +316,14 @@ def detect_modem_state(self, retry=3, initial_delay=1000, debug=False):
303
316
pass
304
317
return None
305
318
319
+ def get_imei (self ):
320
+ self .__serial = UART (1 , baudrate = 921600 , pins = self .__pins , timeout_chars = 10 )
321
+ self .__serial .write (b"AT+CGSN\r \n " )
322
+ time .sleep (.5 )
323
+ imei_val = self .read_rsp (2000 )
324
+ return self .return_pretty_response (imei_val )
325
+
326
+
306
327
def __get_power_warning (self ):
307
328
return "<<<=== DO NOT DISCONNECT POWER ===>>>"
308
329
@@ -317,21 +338,22 @@ def __get_wait_msg(self, load_fff=True):
317
338
318
339
319
340
320
- 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 , version_only = False , expected_smod = None , verbose = False , load_fff = False ):
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 ):
321
342
self .__wait_msg = False
322
343
mirror = True if atneg_only else mirror
323
344
recover = True if atneg_only else load_ffh
324
- resume = True if mirror or recover or atneg_only or version_only else resume
345
+ resume = True if mirror or recover or atneg_only or info_only else resume
325
346
verbose = True if debug else verbose
326
347
load_fff = False if bootrom and switch_ffh else load_fff
348
+ baudrate = self .__modem_speed if self .__speed_detected else baudrate
327
349
if debug : print ('mirror? {} recover? {} resume? {} direct? {} atneg_only? {} bootrom? {} load_fff? {}' .format (mirror , recover , resume , direct , atneg_only , bootrom , load_fff ))
328
350
abort = True
329
351
external = False
330
352
self .__serial = None
331
353
332
354
if 'FiPy' in self .__sysname or 'GPy' in self .__sysname :
333
355
334
- self .__serial = UART (1 , baudrate = 115200 if recover else baudrate , pins = self .__pins , timeout_chars = 100 )
356
+ self .__serial = UART (1 , baudrate = 115200 if recover and not self . __speed_detected else baudrate , pins = self .__pins , timeout_chars = 100 )
335
357
self .__serial .read ()
336
358
else :
337
359
if port is None :
@@ -340,15 +362,18 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
340
362
external = True
341
363
br = 115200 if recover and not direct else baudrate
342
364
if debug : print ('Setting baudrate to {}' .format (br ))
343
- self .__serial = serial .Serial (port , br , bytesize = serial .EIGHTBITS , timeout = 1 if version_only else 0.1 )
365
+ self .__serial = serial .Serial (port , br , bytesize = serial .EIGHTBITS , timeout = 1 if info_only else 0.1 )
344
366
self .__serial .reset_input_buffer ()
345
367
self .__serial .reset_output_buffer ()
346
368
347
- if version_only :
369
+ if info_only :
348
370
self .__serial .read ()
349
371
self .__serial .write (b'AT\r \n ' )
350
372
self .__serial .write (b'AT\r \n ' )
351
373
self .__serial .read ()
374
+ self .__serial .write (b"AT+CGSN\r \n " )
375
+ time .sleep (.5 )
376
+ shimei = self .read_rsp (2000 )
352
377
if verbose :
353
378
self .__serial .write (b"AT!=\" showver\" \r \n " )
354
379
else :
@@ -357,6 +382,8 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
357
382
shver = self .read_rsp (2000 )
358
383
if shver is not None :
359
384
self .print_pretty_response (shver )
385
+ if shimei is not None :
386
+ self .print_pretty_response (shimei , prefix = '\n IMEI:' )
360
387
return True
361
388
362
389
if debug : print ('Initial prepartion complete...' )
@@ -391,9 +418,17 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
391
418
392
419
if not resume :
393
420
421
+ # bind to AT channel
422
+ self .__serial .write (b"AT+BIND=AT\r \n " )
423
+ time .sleep (.5 )
424
+ response = self .read_rsp (size = 100 )
425
+ if debug : print ("AT+BIND=AT returned {}" .format (response ))
426
+
394
427
# disable echo
395
428
self .__serial .write (b"ATE0\r \n " )
396
- response = self .read_rsp (size = 6 )
429
+ time .sleep (.5 )
430
+ response = self .read_rsp (size = 100 )
431
+ if debug : print ("ATE0 returned {}" .format (response ))
397
432
398
433
self .__serial .read (100 )
399
434
if debug : print ('Entering upgrade mode...' )
@@ -673,22 +708,22 @@ def __check_br(self, br_only=False, verbose=False, debug=False):
673
708
674
709
def wakeup_modem (self , baudrate , port , max_try , delay , debug , msg = 'Attempting AT wakeup...' ):
675
710
if 'FiPy' in self .__sysname or 'GPy' in self .__sysname :
676
- self .__serial = UART (1 , baudrate = baudrate , pins = self .__pins , timeout_chars = 1 )
711
+ self .__serial = UART (1 , baudrate = baudrate , pins = self .__pins , timeout_chars = 10 )
677
712
MAX_TRY = max_try
678
713
count = 0
679
714
if msg is not None :
680
715
print (msg )
681
716
self .__serial .read ()
682
717
self .__serial .write (b"AT\r \n " )
683
- response = self .read_rsp (size = 6 )
718
+ response = self .read_rsp (size = 25 )
684
719
if debug : print ('{}' .format (response ))
685
720
while (not b'OK' in response ) and (count < MAX_TRY ):
686
721
count = count + 1
687
722
if debug : print ('count={}' .format (count ))
688
723
time .sleep (delay )
689
724
self .__serial .read ()
690
725
self .__serial .write (b"AT\r \n " )
691
- response = self .read_rsp (size = 6 )
726
+ response = self .read_rsp (size = 25 )
692
727
if debug : print ('{}' .format (response ))
693
728
if 'FiPy' in sysname or 'GPy' in sysname :
694
729
self .__serial = UART (1 , baudrate = baudrate , pins = self .__pins , timeout_chars = 100 )
@@ -699,15 +734,15 @@ def at_negotiation(self, baudrate, port, max_try, mirror, atneg_only, debug):
699
734
count = 0
700
735
print ('Attempting AT auto-negotiation...' )
701
736
self .__serial .write (b"AT\r \n " )
702
- response = self .read_rsp (size = 6 )
737
+ response = self .read_rsp (size = 20 )
703
738
if debug : print ('{}' .format (response ))
704
739
while (not b'OK' in response ) and (count < MAX_TRY ):
705
740
count = count + 1
706
741
if debug : print ('count={}' .format (count ))
707
742
time .sleep (1 )
708
743
self .__serial .read ()
709
744
self .__serial .write (b"AT\r \n " )
710
- response = self .read_rsp (size = 6 )
745
+ response = self .read_rsp (size = 20 )
711
746
if debug : print ('{}' .format (response ))
712
747
if b'OK' in response :
713
748
self .__serial .read ()
@@ -757,9 +792,9 @@ def uart_mirror(self, color):
757
792
def success_message (self , port = None , verbose = False , debug = False ):
758
793
print ("Your modem has been successfully updated." )
759
794
print ("Here is the current firmware version:\n " )
760
- self .show_version (port = port , verbose = verbose , debug = debug )
795
+ self .show_info (port = port , verbose = verbose , debug = debug )
761
796
762
- def upgrade (self , ffile , mfile = None , baudrate = 921600 , retry = False , resume = False , debug = False , pkgdebug = False , verbose = False , load_fff = True ):
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 ):
763
798
success = True
764
799
if not retry and mfile is not None :
765
800
if resume or self .__check_br (br_only = True , verbose = verbose , debug = debug ):
@@ -776,6 +811,8 @@ def upgrade(self, ffile, mfile=None, baudrate=921600, retry=False, resume=False,
776
811
success = False
777
812
success = self .__run (file_path = mfile , load_ffh = True , direct = False , baudrate = baudrate , debug = debug , pkgdebug = pkgdebug , verbose = verbose )
778
813
time .sleep (1 )
814
+ if load_only :
815
+ return True
779
816
else :
780
817
success = True
781
818
else :
@@ -818,8 +855,8 @@ def upgrade_uart(self, ffh_mode=False, mfile=None, retry=False, resume=False, co
818
855
else :
819
856
print ('Unable to upgrade bootrom.' )
820
857
821
- def show_version (self , port = None , debug = False , verbose = False ):
822
- self .__run (port = port , debug = debug , version_only = True , verbose = verbose )
858
+ def show_info (self , port = None , debug = False , verbose = False ):
859
+ self .__run (port = port , debug = debug , info_only = True , verbose = verbose )
823
860
824
861
def upgrade_ext (self , port , ffile , mfile , resume = False , debug = False , pkgdebug = False , verbose = False , load_fff = True ):
825
862
success = True
@@ -847,13 +884,29 @@ def print_welcome():
847
884
848
885
if 'FiPy' in sysname or 'GPy' in sysname :
849
886
850
- def run (ffile , mfile = None , baudrate = 921600 , verbose = False , debug = False , load_fff = True ):
887
+ def load (mfile , baudrate = 921600 , verbose = False , debug = False , hangup = False ):
888
+ print_welcome ()
889
+ sqnup = sqnsupgrade ()
890
+ if sqnup .check_files (mfile , None , debug ):
891
+ state = sqnup .detect_modem_state (debug = debug , hangup = hangup )
892
+ if debug : print ('Modem state: {}' .format (state ))
893
+ if state is None :
894
+ detect_error ()
895
+ elif state == 0 :
896
+ sqnup .upgrade (ffile = None , mfile = mfile , baudrate = baudrate , retry = True , resume = False , debug = debug , pkgdebug = False , verbose = verbose , load_fff = False , load_only = True )
897
+ elif state == - 1 :
898
+ detect_error ()
899
+ else :
900
+ print ('Modem must be in recovery mode!' )
901
+ reconnect_uart ()
902
+
903
+ def run (ffile , mfile = None , baudrate = 921600 , verbose = False , debug = False , load_fff = True , hangup = True ):
851
904
print_welcome ()
852
905
retry = False
853
906
resume = False
854
907
sqnup = sqnsupgrade ()
855
908
if sqnup .check_files (ffile , mfile , debug ):
856
- state = sqnup .detect_modem_state (debug = debug )
909
+ state = sqnup .detect_modem_state (debug = debug , hangup = hangup )
857
910
if debug : print ('Modem state: {}' .format (state ))
858
911
if state is None :
859
912
detect_error ()
@@ -863,19 +916,24 @@ def run(ffile, mfile=None, baudrate=921600, verbose=False, debug=False, load_fff
863
916
print ('Your modem is in recovery mode. Please specify updater.elf file' )
864
917
reconnect_uart ()
865
918
sys .exit (1 )
866
- elif state == 4 :
919
+ elif state == 4 or state == 1 :
867
920
resume = True
868
921
elif state == - 1 :
869
922
detect_error ()
870
923
sqnup .upgrade (ffile = ffile , mfile = mfile , baudrate = baudrate , retry = retry , resume = resume , debug = debug , pkgdebug = False , verbose = verbose , load_fff = load_fff )
871
924
reconnect_uart ()
872
925
873
- def uart (ffh_mode = False , mfile = None , color = 0x050505 , verbose = False , debug = False ):
926
+ def uart (ffh_mode = False , mfile = None , color = 0x050505 , verbose = False , debug = False , hangup = True ):
874
927
print_welcome ()
875
928
retry = False
876
929
resume = False
930
+ import pycom
931
+ state = None
877
932
sqnup = sqnsupgrade ()
878
- state = sqnup .detect_modem_state (debug = debug )
933
+ if verbose : print ('Trying to detect modem state...' )
934
+ state = sqnup .detect_modem_state (debug = debug , hangup = hangup )
935
+ if debug : print ('Modem state: {}' .format (state ))
936
+
879
937
if state is None :
880
938
detect_error ()
881
939
elif state == 0 :
@@ -888,22 +946,19 @@ def uart(ffh_mode=False, mfile=None, color=0x050505, verbose=False, debug=False)
888
946
detect_error ()
889
947
sqnup .upgrade_uart (ffh_mode , mfile , retry , resume , color , debug , False , verbose )
890
948
891
- def info (verbose = False , debug = False , retry = 5 ):
949
+ def info (verbose = False , debug = False , hangup = True ):
892
950
print_welcome ()
893
951
import pycom
894
- count = 0
952
+ state = None
895
953
sqnup = sqnsupgrade ()
896
- while count < retry :
897
- count += 1
898
- if verbose : print ('Trying to detect modem state [{}/{}]' .format (count , retry ))
899
- state = sqnup .detect_modem_state (debug = debug )
900
- if debug : print ('State: {} at count: {}' .format (state , count ))
901
- if state is not None : break
954
+ if verbose : print ('Trying to detect modem state...' )
955
+ state = sqnup .detect_modem_state (debug = debug , hangup = hangup )
956
+ if debug : print ('Modem state: {}' .format (state ))
902
957
903
958
if state is not None :
904
959
if state == 2 :
905
960
print ('Your modem is in application mode. Here is the current version:' )
906
- sqnup .show_version (verbose = verbose , debug = debug )
961
+ sqnup .show_info (verbose = verbose , debug = debug )
907
962
elif state == 1 :
908
963
print ('Your modem is in mTools mode.' )
909
964
elif state == 0 :
@@ -918,6 +973,15 @@ def info(verbose=False, debug=False, retry=5):
918
973
print ('Cannot determine modem state!' )
919
974
reconnect_uart ()
920
975
976
+ def imei (verbose = False , debug = False , retry = 5 , hangup = False ):
977
+ sqnup = sqnsupgrade ()
978
+ state = sqnup .detect_modem_state (debug = debug , hangup = hangup , retry = retry )
979
+ return sqnup .get_imei () if state == 2 else None
980
+
981
+ def state (verbose = False , debug = False , retry = 5 , hangup = False ):
982
+ sqnup = sqnsupgrade ()
983
+ return sqnup .detect_modem_state (debug = debug , hangup = hangup , retry = retry )
984
+
921
985
else :
922
986
def run (port , ffile , mfile = None , resume = False , debug = False , verbose = False , load_fff = True ):
923
987
print_welcome ()
@@ -927,4 +991,4 @@ def run(port, ffile, mfile=None, resume=False, debug=False, verbose=False, load_
927
991
928
992
def version (port , verbose = False , debug = False ):
929
993
sqnup = sqnsupgrade ()
930
- sqnup .show_version (port = port , debug = debug , verbose = verbose )
994
+ sqnup .show_info (port = port , debug = debug , verbose = verbose )
0 commit comments