3434import json
3535import glob
3636
37+ # for RPI double reset
38+ try :
39+ import gpiozero
40+ except ImportError :
41+ pass
42+
43+
3744ENUM_TIMEOUT = 10
3845
3946
4047# get usb serial by id
4148def get_serial_dev (id , vendor_str , product_str , ifnum ):
4249 if vendor_str and product_str :
4350 # known vendor and product
51+ vendor_str = vendor_str .replace (' ' , '_' )
52+ product_str = product_str .replace (' ' , '_' )
4453 return f'/dev/serial/by-id/usb-{ vendor_str } _{ product_str } _{ id } -if{ ifnum :02d} '
4554 else :
4655 # just use id: mostly for cp210x/ftdi flasher
@@ -115,7 +124,7 @@ def flash_jlink(board, firmware):
115124
116125def flash_openocd (board , firmware ):
117126 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"' ,
127+ f'openocd -c "adapter serial { board ["flasher_sn" ]} " { board ["flasher_args" ]} -c "program { firmware } reset exit"' ,
119128 shell = True , stdout = subprocess .PIPE , stderr = subprocess .STDOUT )
120129 return ret
121130
@@ -133,6 +142,37 @@ def flash_esptool(board, firmware):
133142 return ret
134143
135144
145+ def doublereset_with_rpi_gpio (board ):
146+ # Off = 0 = Reset
147+ led = gpiozero .LED (board ["flasher_reset_pin" ])
148+
149+ led .off ()
150+ time .sleep (0.1 )
151+ led .on ()
152+ time .sleep (0.1 )
153+ led .off ()
154+ time .sleep (0.1 )
155+ led .on ()
156+
157+ def flash_bossac (board , firmware ):
158+ # double reset to enter bootloader
159+ doublereset_with_rpi_gpio (board )
160+
161+ port = get_serial_dev (board ["uid" ], board ["flashser_vendor" ], board ["flasher_product" ], 0 )
162+ timeout = ENUM_TIMEOUT
163+ while timeout :
164+ if os .path .exists (port ):
165+ break
166+ else :
167+ time .sleep (0.5 )
168+ timeout = timeout - 0.5
169+ assert timeout , 'bossac bootloader is not available'
170+ # sleep a bit more for bootloader to be ready
171+ time .sleep (0.5 )
172+ ret = subprocess .run (f'bossac --port { port } { board ["flasher_args" ]} -U -i -R -e -w { firmware } ' , shell = True , stdout = subprocess .PIPE ,
173+ stderr = subprocess .STDOUT )
174+ return ret
175+
136176# -------------------------------------------------------------
137177# Tests
138178# -------------------------------------------------------------
@@ -305,7 +345,7 @@ def main(config_file, board):
305345
306346 for test in test_list :
307347 fw_list = [
308- # cmake: esp32 use .bin file
348+ # cmake: esp32 & samd51 use .bin file
309349 f'cmake-build/cmake-build-{ item ["name" ]} /device/{ test } /{ test } .elf' ,
310350 f'cmake-build/cmake-build-{ item ["name" ]} /device/{ test } /{ test } .bin' ,
311351 # make
0 commit comments