3434import json
3535import glob
3636
37+ # for RPI double reset: install sudo apt install python3-gpiozero or sudo pip install gpiozero
38+ from gpiozero import LED
39+
40+
3741ENUM_TIMEOUT = 10
3842
3943
4044# get usb serial by id
4145def get_serial_dev (id , vendor_str , product_str , ifnum ):
4246 if vendor_str and product_str :
4347 # known vendor and product
48+ vendor_str = vendor_str .replace (' ' , '_' )
49+ product_str = product_str .replace (' ' , '_' )
4450 return f'/dev/serial/by-id/usb-{ vendor_str } _{ product_str } _{ id } -if{ ifnum :02d} '
4551 else :
4652 # just use id: mostly for cp210x/ftdi flasher
@@ -115,7 +121,7 @@ def flash_jlink(board, firmware):
115121
116122def flash_openocd (board , firmware ):
117123 ret = subprocess .run (
118- f'openocd -c "adapter serial { board ["flasher_sn" ]} " { board ["flasher_args" ]} -c "program { firmware } " -c " reset init" -c "resume" -c " exit"' ,
124+ f'openocd -c "adapter serial { board ["flasher_sn" ]} " { board ["flasher_args" ]} -c "program { firmware } reset exit"' ,
119125 shell = True , stdout = subprocess .PIPE , stderr = subprocess .STDOUT )
120126 return ret
121127
@@ -133,6 +139,35 @@ def flash_esptool(board, firmware):
133139 return ret
134140
135141
142+ def doublereset_with_rpi_gpio (board ):
143+ # Off = 0 = Reset
144+ led = LED (board ["flasher_reset_pin" ])
145+
146+ led .off ()
147+ time .sleep (0.1 )
148+ led .on ()
149+ time .sleep (0.1 )
150+ led .off ()
151+ time .sleep (0.1 )
152+ led .on ()
153+
154+ def flash_bossac (board , firmware ):
155+ # double reset to enter bootloader
156+ doublereset_with_rpi_gpio (board )
157+
158+ port = get_serial_dev (board ["uid" ], board ["flashser_vendor" ], board ["flasher_product" ], 0 )
159+ timeout = ENUM_TIMEOUT
160+ while timeout :
161+ if os .path .exists (port ):
162+ time .sleep (0.5 )
163+ break
164+ else :
165+ time .sleep (0.5 )
166+ timeout = timeout - 0.5
167+ ret = subprocess .run (f'bossac --port { port } { board ["flasher_args" ]} -U -i -R -e -w { firmware } ' , shell = True , stdout = subprocess .PIPE ,
168+ stderr = subprocess .STDOUT )
169+ return ret
170+
136171# -------------------------------------------------------------
137172# Tests
138173# -------------------------------------------------------------
@@ -305,7 +340,7 @@ def main(config_file, board):
305340
306341 for test in test_list :
307342 fw_list = [
308- # cmake: esp32 use .bin file
343+ # cmake: esp32 & samd51 use .bin file
309344 f'cmake-build/cmake-build-{ item ["name" ]} /device/{ test } /{ test } .elf' ,
310345 f'cmake-build/cmake-build-{ item ["name" ]} /device/{ test } /{ test } .bin' ,
311346 # make
0 commit comments