9
9
10
10
from serial .tools .miniterm import console , character , LF
11
11
12
- sfl_magic_len = 14
12
+ sfl_prompt_req = "F7: boot from serial\n "
13
+ sfl_prompt_ack = "\x06 "
14
+
13
15
sfl_magic_req = "sL5DdSMmkekro\n "
14
16
sfl_magic_ack = "z6IHG7cYDID6o\n "
15
17
@@ -108,13 +110,15 @@ def get_file_data(filename):
108
110
109
111
110
112
class Flterm :
111
- def __init__ (self , kernel_image , kernel_address ):
113
+ def __init__ (self , serial_boot , kernel_image , kernel_address ):
114
+ self .serial_boot = serial_boot
112
115
self .kernel_image = kernel_image
113
116
self .kernel_address = kernel_address
114
117
115
118
self .reader_alive = False
116
119
self .writer_alive = False
117
120
121
+ self .detect_prompt_str = " " * len (sfl_prompt_req )
118
122
self .detect_magic_str = " " * len (sfl_magic_req )
119
123
120
124
def open (self , port , speed ):
@@ -195,6 +199,17 @@ def boot(self):
195
199
frame .payload .append (d )
196
200
self .send_frame (frame )
197
201
202
+ def detect_prompt (self , data ):
203
+ if data is not "" :
204
+ self .detect_prompt_str = self .detect_prompt_str [1 :] + data
205
+ return self .detect_prompt_str == sfl_prompt_req
206
+ else :
207
+ return False
208
+
209
+ def answer_prompt (self ):
210
+ print ("[FLTERM] Received serial boot prompt from the device." )
211
+ self .write_exact (sfl_prompt_ack )
212
+
198
213
def detect_magic (self , data ):
199
214
if data is not "" :
200
215
self .detect_magic_str = self .detect_magic_str [1 :] + data
@@ -221,6 +236,8 @@ def reader(self):
221
236
sys .stdout .flush ()
222
237
223
238
if self .kernel_image is not None :
239
+ if self .serial_boot and self .detect_prompt (c ):
240
+ self .answer_prompt ()
224
241
if self .detect_magic (c ):
225
242
self .answer_magic ()
226
243
@@ -285,14 +302,16 @@ def _get_args():
285
302
parser = argparse .ArgumentParser ()
286
303
parser .add_argument ("port" , help = "serial port" )
287
304
parser .add_argument ("--speed" , default = 115200 , help = "serial baudrate" )
305
+ parser .add_argument ("--serial-boot" , default = False , action = 'store_true' ,
306
+ help = "automatically initiate serial boot" )
288
307
parser .add_argument ("--kernel" , default = None , help = "kernel image" )
289
308
parser .add_argument ("--kernel-adr" , type = lambda a : int (a , 0 ), default = 0x40000000 , help = "kernel address" )
290
309
return parser .parse_args ()
291
310
292
311
293
312
def main ():
294
313
args = _get_args ()
295
- flterm = Flterm (args .kernel , args .kernel_adr )
314
+ flterm = Flterm (args .serial_boot , args . kernel , args .kernel_adr )
296
315
flterm .open (args .port , args .speed )
297
316
flterm .start ()
298
317
try :
0 commit comments