39
39
import sys
40
40
import time
41
41
import math
42
- import os .path
43
42
from sys import exit
44
43
45
44
# ***********************************************************************************
54
53
SVL_CMD_RETRY = 0x05 # request re-send frame
55
54
SVL_CMD_DONE = 0x06 # finished - all data sent
56
55
57
- # Global variables
58
-
59
- barWidthInCharacters = 50 # Width of progress bar, ie [###### % complete
60
-
61
-
56
+ barWidthInCharacters = 50 # Width of progress bar, ie [###### % complete
57
+
58
+ crcTable = (
59
+ 0x0000 , 0x8005 , 0x800F , 0x000A , 0x801B , 0x001E , 0x0014 , 0x8011 ,
60
+ 0x8033 , 0x0036 , 0x003C , 0x8039 , 0x0028 , 0x802D , 0x8027 , 0x0022 ,
61
+ 0x8063 , 0x0066 , 0x006C , 0x8069 , 0x0078 , 0x807D , 0x8077 , 0x0072 ,
62
+ 0x0050 , 0x8055 , 0x805F , 0x005A , 0x804B , 0x004E , 0x0044 , 0x8041 ,
63
+ 0x80C3 , 0x00C6 , 0x00CC , 0x80C9 , 0x00D8 , 0x80DD , 0x80D7 , 0x00D2 ,
64
+ 0x00F0 , 0x80F5 , 0x80FF , 0x00FA , 0x80EB , 0x00EE , 0x00E4 , 0x80E1 ,
65
+ 0x00A0 , 0x80A5 , 0x80AF , 0x00AA , 0x80BB , 0x00BE , 0x00B4 , 0x80B1 ,
66
+ 0x8093 , 0x0096 , 0x009C , 0x8099 , 0x0088 , 0x808D , 0x8087 , 0x0082 ,
67
+ 0x8183 , 0x0186 , 0x018C , 0x8189 , 0x0198 , 0x819D , 0x8197 , 0x0192 ,
68
+ 0x01B0 , 0x81B5 , 0x81BF , 0x01BA , 0x81AB , 0x01AE , 0x01A4 , 0x81A1 ,
69
+ 0x01E0 , 0x81E5 , 0x81EF , 0x01EA , 0x81FB , 0x01FE , 0x01F4 , 0x81F1 ,
70
+ 0x81D3 , 0x01D6 , 0x01DC , 0x81D9 , 0x01C8 , 0x81CD , 0x81C7 , 0x01C2 ,
71
+ 0x0140 , 0x8145 , 0x814F , 0x014A , 0x815B , 0x015E , 0x0154 , 0x8151 ,
72
+ 0x8173 , 0x0176 , 0x017C , 0x8179 , 0x0168 , 0x816D , 0x8167 , 0x0162 ,
73
+ 0x8123 , 0x0126 , 0x012C , 0x8129 , 0x0138 , 0x813D , 0x8137 , 0x0132 ,
74
+ 0x0110 , 0x8115 , 0x811F , 0x011A , 0x810B , 0x010E , 0x0104 , 0x8101 ,
75
+ 0x8303 , 0x0306 , 0x030C , 0x8309 , 0x0318 , 0x831D , 0x8317 , 0x0312 ,
76
+ 0x0330 , 0x8335 , 0x833F , 0x033A , 0x832B , 0x032E , 0x0324 , 0x8321 ,
77
+ 0x0360 , 0x8365 , 0x836F , 0x036A , 0x837B , 0x037E , 0x0374 , 0x8371 ,
78
+ 0x8353 , 0x0356 , 0x035C , 0x8359 , 0x0348 , 0x834D , 0x8347 , 0x0342 ,
79
+ 0x03C0 , 0x83C5 , 0x83CF , 0x03CA , 0x83DB , 0x03DE , 0x03D4 , 0x83D1 ,
80
+ 0x83F3 , 0x03F6 , 0x03FC , 0x83F9 , 0x03E8 , 0x83ED , 0x83E7 , 0x03E2 ,
81
+ 0x83A3 , 0x03A6 , 0x03AC , 0x83A9 , 0x03B8 , 0x83BD , 0x83B7 , 0x03B2 ,
82
+ 0x0390 , 0x8395 , 0x839F , 0x039A , 0x838B , 0x038E , 0x0384 , 0x8381 ,
83
+ 0x0280 , 0x8285 , 0x828F , 0x028A , 0x829B , 0x029E , 0x0294 , 0x8291 ,
84
+ 0x82B3 , 0x02B6 , 0x02BC , 0x82B9 , 0x02A8 , 0x82AD , 0x82A7 , 0x02A2 ,
85
+ 0x82E3 , 0x02E6 , 0x02EC , 0x82E9 , 0x02F8 , 0x82FD , 0x82F7 , 0x02F2 ,
86
+ 0x02D0 , 0x82D5 , 0x82DF , 0x02DA , 0x82CB , 0x02CE , 0x02C4 , 0x82C1 ,
87
+ 0x8243 , 0x0246 , 0x024C , 0x8249 , 0x0258 , 0x825D , 0x8257 , 0x0252 ,
88
+ 0x0270 , 0x8275 , 0x827F , 0x027A , 0x826B , 0x026E , 0x0264 , 0x8261 ,
89
+ 0x0220 , 0x8225 , 0x822F , 0x022A , 0x823B , 0x023E , 0x0234 , 0x8231 ,
90
+ 0x8213 , 0x0216 , 0x021C , 0x8219 , 0x0208 , 0x820D , 0x8207 , 0x0202 )
62
91
# ***********************************************************************************
63
92
#
64
93
# Compute CRC on a byte array
65
94
#
66
95
# ***********************************************************************************
67
- def get_crc16 (data ):
68
- # To perform the division perform the following:
69
-
70
- # Load the register with zero bits.
71
- # Augment the message by appending W zero bits to the end of it.
72
- # While (more message bits)
73
- # Begin
74
- # Shift the register left by one bit, reading the next bit of the
75
- # augmented message into register bit position 0.
76
- # If (a 1 bit popped out of the register during step 3)
77
- # Register = Register XOR Poly.
78
- # End
79
- # The register now contains the remainder.
80
- register = 0x0000
81
- poly = 0x8005
82
-
83
- data = bytearray (data )
84
- data .extend (bytearray (2 ))
85
- bits = 8 * len (data )
86
-
87
- def get_data_bit (bit ):
88
- byte = int (bit / 8 )
89
- if (data [byte ] & (0x80 >> (bit % 8 ))):
90
- return 1
91
- return 0
92
96
93
- for bit in range (bits ):
94
97
95
- c = 0
96
- if (register & 0x8000 ):
97
- c = 1
98
-
99
- register <<= 1
100
- register &= 0xFFFF
101
-
102
- if (get_data_bit (bit )):
103
- register |= 0x0001
104
-
105
- if (c ):
106
- register = (register ^ poly )
98
+ def get_crc16 (data ):
107
99
108
- return register
100
+ #Table and code ported from Artemis SVL bootloader
101
+ crc = 0x0000
102
+ data = bytearray (data )
103
+ for ch in data :
104
+ tableAddr = ch ^ (crc >> 8 )
105
+ CRCH = (crcTable [tableAddr ] >> 8 ) ^ (crc & 0xFF )
106
+ CRCL = crcTable [tableAddr ] & 0x00FF
107
+ crc = CRCH << 8 | CRCL
108
+ return crc
109
109
110
110
111
111
@@ -197,9 +197,10 @@ def phase_setup(ser):
197
197
# ***********************************************************************************
198
198
def phase_bootload (ser ):
199
199
200
+ startTime = time .time ()
200
201
frame_size = 512 * 4
201
202
202
- resend_max = 64
203
+ resend_max = 4
203
204
resend_count = 0
204
205
205
206
verboseprint ('\n phase:\t bootload' )
@@ -213,9 +214,10 @@ def phase_bootload(ser):
213
214
progressChars = 0
214
215
215
216
if (not args .verbose ):
216
- print ("[" , end = '' )
217
+ print ("[" , end = '' )
217
218
218
- verboseprint ('\t have ' + str (total_len ) + ' bytes to send in ' + str (total_frames ) + ' frames' )
219
+ verboseprint ('\t have ' + str (total_len ) +
220
+ ' bytes to send in ' + str (total_frames ) + ' frames' )
219
221
220
222
bl_done = False
221
223
bl_failed = False
@@ -247,10 +249,12 @@ def phase_bootload(ser):
247
249
if ( curr_frame <= total_frames ):
248
250
frame_data = application [((curr_frame - 1 )* frame_size ):((curr_frame - 1 + 1 )* frame_size )]
249
251
if (args .verbose ):
250
- verboseprint ('\t sending frame #' + str (curr_frame )+ ', length: ' + str (len (frame_data )))
252
+ verboseprint ('\t sending frame #' + str (curr_frame ) +
253
+ ', length: ' + str (len (frame_data )))
251
254
else :
252
255
percentComplete = curr_frame * 100 / total_frames
253
- percentCompleteInChars = math .ceil (percentComplete / 100 * barWidthInCharacters )
256
+ percentCompleteInChars = math .ceil (
257
+ percentComplete / 100 * barWidthInCharacters )
254
258
while (progressChars < percentCompleteInChars ):
255
259
progressChars = progressChars + 1
256
260
print ('#' , end = '' , flush = True )
@@ -264,9 +268,12 @@ def phase_bootload(ser):
264
268
bl_done = True
265
269
266
270
if ( bl_failed == False ):
267
- twopartprint ('\n \t ' , ' Upload complete' )
271
+ twopartprint ('\n \t ' , 'Upload complete' )
272
+ endTime = time .time ()
273
+ bps = total_len / (endTime - startTime )
274
+ verboseprint ('\n \t Nominal bootload bps: ' + str (round (bps , 2 )))
268
275
else :
269
- twopartprint ('\n \t ' , ' Upload failed' )
276
+ twopartprint ('\n \t ' , 'Upload failed' )
270
277
271
278
return bl_failed
272
279
@@ -317,9 +324,6 @@ def main():
317
324
num_tries = 3
318
325
319
326
print ('\n \n Artemis SVL Bootloader' )
320
- if not os .path .exists (args .binfile ):
321
- print ("Bin file {} does not exits." .format (args .binfile ))
322
- exit ()
323
327
324
328
for _ in range (num_tries ):
325
329
@@ -335,7 +339,7 @@ def main():
335
339
if ( bl_failed == False ):
336
340
break
337
341
338
- except serial . SerialException :
342
+ except :
339
343
phase_serial_port_help ()
340
344
341
345
exit ()
@@ -379,7 +383,7 @@ def verboseprint(*args):
379
383
# Print each argument separately so caller doesn't need to
380
384
# stuff everything to be printed into a single string
381
385
for arg in args :
382
- print (arg , end = '' ),
386
+ print (arg , end = '' , flush = True ),
383
387
print ()
384
388
else :
385
389
verboseprint = lambda * a : None # do-nothing function
0 commit comments