5
5
import serial
6
6
import threading
7
7
import argparse
8
+
8
9
from serial .tools .miniterm import console , character , LF
9
10
10
11
sfl_magic_len = 14
13
14
14
15
# General commands
15
16
sfl_cmd_abort = 0x00
16
- sfl_cmd_load = 0x01
17
- sfl_cmd_jump = 0x02
17
+ sfl_cmd_load = 0x01
18
+ sfl_cmd_jump = 0x02
19
+
18
20
19
21
# Replies
20
- sfl_ack_success = 'K'
22
+ sfl_ack_success = 'K'
21
23
sfl_ack_crcerror = 'C'
22
- sfl_ack_unknown = 'U'
23
- sfl_ack_error = 'E'
24
+ sfl_ack_unknown = 'U'
25
+ sfl_ack_error = 'E'
26
+
24
27
25
- # XXX : can we get CRC16 from a standard Python library as it's done
26
- # for CRC32 with binascii?
27
28
crc16_table = [
28
29
0x0000 , 0x1021 , 0x2042 , 0x3063 , 0x4084 , 0x50A5 , 0x60C6 , 0x70E7 ,
29
30
0x8108 , 0x9129 , 0xA14A , 0xB16B , 0xC18C , 0xD1AD , 0xE1CE , 0xF1EF ,
@@ -64,7 +65,7 @@ def crc16(l):
64
65
crc = 0
65
66
for d in l :
66
67
crc = crc16_table [((crc >> 8 ) ^ d ) & 0xff ] ^ (crc << 8 )
67
- return crc
68
+ return crc & 0xffff
68
69
69
70
70
71
class SFLFrame :
@@ -87,8 +88,8 @@ def encode(self):
87
88
self .raw = []
88
89
self .raw .append (self .length )
89
90
self .compute_crc ()
90
- self .raw . append (( self . crc & 0xff00 ) >> 8 )
91
- self .raw .append (self . crc & 0x00ff )
91
+ for d in self .crc . to_bytes ( 2 , "big" ):
92
+ self .raw .append (d )
92
93
self .raw .append (self .cmd )
93
94
for d in self .payload :
94
95
self .raw .append (d )
@@ -165,14 +166,11 @@ def upload(self, filename, address):
165
166
while len (data ) != 0 :
166
167
print ("{}%\r " .format (100 * position // length ), end = "" )
167
168
frame = SFLFrame ()
168
- if len (data ) > 251 :
169
- frame_data = data [:251 ]
170
- frame .length = len (frame_data )+ 4
169
+ frame_data = data [:251 ]
170
+ frame .length = len (frame_data ) + 4
171
171
frame .cmd = sfl_cmd_load
172
- frame .payload .append ((current_address & 0xff000000 ) >> 24 )
173
- frame .payload .append ((current_address & 0x00ff0000 ) >> 16 )
174
- frame .payload .append ((current_address & 0x0000ff00 ) >> 8 )
175
- frame .payload .append ((current_address & 0x000000ff ) >> 0 )
172
+ for d in current_address .to_bytes (4 , "big" ):
173
+ frame .payload .append (d )
176
174
for d in frame_data :
177
175
frame .payload .append (d )
178
176
if self .send_frame (frame ) == 0 :
@@ -193,10 +191,8 @@ def boot(self):
193
191
frame = SFLFrame ()
194
192
frame .length = 4
195
193
frame .cmd = sfl_cmd_jump
196
- frame .payload .append ((self .kernel_address & 0xff000000 ) >> 24 )
197
- frame .payload .append ((self .kernel_address & 0x00ff0000 ) >> 16 )
198
- frame .payload .append ((self .kernel_address & 0x0000ff00 ) >> 8 )
199
- frame .payload .append ((self .kernel_address & 0x000000ff ) >> 0 )
194
+ for d in self .kernel_address .to_bytes (4 , "big" ):
195
+ frame .payload .append (d )
200
196
self .send_frame (frame )
201
197
202
198
def detect_magic (self , data ):
@@ -290,7 +286,7 @@ def _get_args():
290
286
parser .add_argument ("--port" , default = "2" , help = "serial port" )
291
287
parser .add_argument ("--speed" , default = 115200 , help = "serial baudrate" )
292
288
parser .add_argument ("--kernel" , default = None , help = "kernel image" )
293
- parser .add_argument ("--kernel-adr" , default = 0x40000000 , help = "kernel address" )
289
+ parser .add_argument ("--kernel-adr" , default = " 0x40000000" , help = "kernel address" )
Has conversations. Original line has conversations. 294
290
return parser .parse_args ()
295
291
296
292
if __name__ == "__main__" :