@@ -54,25 +54,31 @@ def get_device_serial_number(port):
5454 return device [1 ]
5555 return None
5656
57- def create_jlink_loadbin_command_file (binfile ):
58- cmd_load_bin = 'loadbin ' + binfile + ' 0x0\n '
57+ def create_jlink_loadbin_command_file (binfile , enable_update ):
58+ lines = []
59+ if not enable_update :
60+ lines .append ('exec DisableAutoUpdateFW\n ' )
61+ lines += ['r\n ' , 'h\n ' , f'loadbin { binfile } 0x0\n ' , 'r\n ' , 'g\n ' , 'exit\n ' ]
5962 with open (cmd_jlink ,'w' ) as f :
60- f .writelines (['r\n ' , 'h\n ' , cmd_load_bin , 'r\n ' , 'g\n ' , 'exit\n ' ])
61-
63+ f .writelines (lines )
6264 return cmd_jlink
6365
64- def create_jlink_mem_read_command_file (addr , bytes ):
65- #cmd_log_enable
66- cmd_mem_read = 'mem ' + addr + ', ' + bytes + '\n ' # todo: store register maps, bytes in file
66+ def create_jlink_mem_read_command_file (addr , bytes , enable_update ):
67+ lines = []
68+ if not enable_update :
69+ lines .append ('exec DisableAutoUpdateFW\n ' )
70+ lines += [f'mem { addr } , { bytes } \n ' , 'r\n ' , 'g\n ' , 'exit\n ' ]
6771 with open (cmd_jlink ,'w' ) as f :
68- f .writelines ([cmd_mem_read , 'r\n ' , 'g\n ' , 'exit\n ' ])
69-
72+ f .writelines (lines )
7073 return cmd_jlink
7174
72- def create_jlink_erase_command_file ():
75+ def create_jlink_erase_command_file (enable_update ):
76+ lines = []
77+ if not enable_update :
78+ lines .append ('exec DisableAutoUpdateFW\n ' )
79+ lines += ['r\n ' , 'h\n ' , 'erase\n ' , 'exit\n ' ]
7380 with open (cmd_jlink ,'w' ) as f :
74- f .writelines (['r\n ' , 'h\n ' , 'erase\n ' , 'exit\n ' ])
75-
81+ f .writelines (lines )
7682 return cmd_jlink
7783
7884def remove_jlink_command_file (cmd_file ):
@@ -94,7 +100,7 @@ def remove_backspaces(input_str):
94100 return '' .join (result )
95101
96102def jlink_commander (device , serial_num , cmd_file , console_output = False ):
97- jlink_cmd = [jlinkexe , '-autoconnect' , '1' ,'-exitonerror' , '1' , '-nogui' , '1' , '-device' , device , '-selectemubysn ' , serial_num , '-if' , 'swd' , '-speed' , '4000' , '-commandfile' , cmd_file ]
103+ jlink_cmd = [jlinkexe , '-autoconnect' , '1' ,'-exitonerror' , '1' , '-nogui' , '1' , '-device' , device , '-SelectEmuBySN ' , serial_num , '-if' , 'swd' , '-speed' , '4000' , '-commandfile' , cmd_file ]
98104
99105 #if console_output is True:
100106 #jlink_cmd.append('-log ') #todo: pipe this in a better way
@@ -125,13 +131,13 @@ def check_serial_number(serial_num):
125131 if serial_num == None :
126132 raise Exception ("Device not found! Please check the serial port" )
127133
128- def get_mem_contents (addr , bytes , device , port ):
134+ def get_mem_contents (addr , bytes , device , port , enable_update ):
129135 try :
130136 serial_num = get_device_serial_number (port )
131137 check_serial_number (serial_num )
132138 except ValueError as e :
133139 print (e )
134- jlink_cmd_file = create_jlink_mem_read_command_file (addr , bytes ) # todo: comes from proper metafile
140+ jlink_cmd_file = create_jlink_mem_read_command_file (addr , bytes , enable_update ) # todo: comes from proper metafile
135141 jlink_commander (device , serial_num , jlink_cmd_file , True )
136142 remove_jlink_command_file (jlink_cmd_file )
137143
@@ -143,6 +149,8 @@ def get_mem_contents(addr, bytes, device, port):
143149
144150 reg_contents = ""
145151 for line in lines :
152+ if getattr (sys , 'verbose' , True ):
153+ print (f"JLink Log: { line } " )
146154 if addr in line and '=' in line :
147155 reg_contents = re .findall ('[0-9,A-F]+' , line )
148156 break
@@ -165,11 +173,11 @@ def find_device_by_value(value):
165173 return device
166174 return None
167175
168- def check_device (device , port ):
176+ def check_device (device , port , enable_update ):
169177
170178 master_data = read_master_data ()
171179 # get value from reg
172- device_value = get_mem_contents (master_data [device ]['IDCHIP' ]['addr' ], master_data [device ]['IDCHIP' ]['size' ], device , port )
180+ device_value = get_mem_contents (master_data [device ]['IDCHIP' ]['addr' ], master_data [device ]['IDCHIP' ]['size' ], device , port , enable_update )
173181 device_value_masked = (int ('0x' + device_value ,16 )) & (int ('0x' + master_data [device ]['IDCHIP' ]['mask' ],16 )) # take only those bits which are needed
174182 device_value_masked = f'{ device_value_masked :x} '
175183 device_value_masked = device_value_masked .zfill (int (master_data [device ]['IDCHIP' ]['size' ])* 2 )
@@ -183,12 +191,12 @@ def check_device(device, port):
183191 print (f"Connected Device is: { real_device } ." )
184192 raise Exception (f"Device connected on port { port } does not match the selected device to flash" )
185193
186- def check_mem (device , port ):
194+ def check_mem (device , port , enable_update ):
187195
188196 if "XMC1" in device :
189197 master_data = read_master_data ()
190198 # get value from reg
191- device_value = get_mem_contents (master_data [device ]['FLSIZE' ]['addr' ], master_data [device ]['FLSIZE' ]['size' ], device , port )
199+ device_value = get_mem_contents (master_data [device ]['FLSIZE' ]['addr' ], master_data [device ]['FLSIZE' ]['size' ], device , port , enable_update )
192200 device_value = int ('0x' + device_value ,16 ) & int ('0x0003f000' ,16 ) # bit 17 to bit 12 are needed
193201 device_value = device_value >> int (master_data [device ]['FLSIZE' ]['bitposition_LSB' ])
194202 flash_size = (device_value - 1 )* 4 #flash size given by (ADDR-1)*4
@@ -208,7 +216,7 @@ def check_mem(device, port):
208216 else : #XMC4 series
209217 master_data = read_master_data ()
210218 # get value from reg
211- device_value = get_mem_contents (master_data [device ]['FLASH0_ID' ]['addr' ], master_data [device ]['FLASH0_ID' ]['size' ], device , port )
219+ device_value = get_mem_contents (master_data [device ]['FLASH0_ID' ]['addr' ], master_data [device ]['FLASH0_ID' ]['size' ], device , port , enable_update )
212220 device_value_masked = (int ('0x' + device_value ,16 )) & (int ('0x' + master_data [device ]['FLASH0_ID' ]['mask' ],16 )) # take only those bits which are needed
213221 device_value_masked = f'{ device_value_masked :x} '
214222 device_value_masked = device_value_masked .zfill (int (master_data [device ]['FLASH0_ID' ]['size' ])* 2 )
@@ -231,15 +239,15 @@ def get_default_port(port):
231239 return port
232240
233241
234- def upload (device , port , binfile , enable_jlink_log ):
242+ def upload (device , port , binfile , enable_jlink_log , enable_update ):
235243 serial_num = get_device_serial_number (port )
236- jlink_cmd_file = create_jlink_loadbin_command_file (binfile )
237- jlink_commander (device , serial_num , jlink_cmd_file , console_output = not enable_jlink_log ) # console_output = true will store the log to file instead of printing
244+ jlink_cmd_file = create_jlink_loadbin_command_file (binfile , enable_update )
245+ jlink_commander (device , serial_num , jlink_cmd_file , console_output = not enable_jlink_log )
238246 remove_jlink_command_file (jlink_cmd_file )
239247
240- def erase (device , port ):
248+ def erase (device , port , enable_update ):
241249 serial_num = get_device_serial_number (port )
242- jlink_cmd_file = create_jlink_erase_command_file ()
250+ jlink_cmd_file = create_jlink_erase_command_file (enable_update )
243251 jlink_commander (device , serial_num , jlink_cmd_file )
244252 remove_jlink_command_file (jlink_cmd_file )
245253
@@ -252,9 +260,9 @@ def main_parser_func(args):
252260 parser .print_help ()
253261
254262 def parser_upload_func (args ):
255- check_device (args .device , args .port )
256- check_mem (args .device , args .port )
257- upload (args .device , args .port , args .binfile , args .verbose )
263+ check_device (args .device , args .port , args . jlink_update )
264+ check_mem (args .device , args .port , args . jlink_update )
265+ upload (args .device , args .port , args .binfile , args .verbose , args . jlink_update )
258266 # remove console output file if verbose is not enabled
259267 if not args .verbose :
260268 # check if upload was successful by parsing the console output
@@ -276,7 +284,7 @@ def parser_upload_func(args):
276284
277285
278286 def parser_erase_func (args ):
279- erase (args .device , args .port )
287+ erase (args .device , args .port , args . jlink_update )
280288
281289 class ver_action (argparse .Action ):
282290 def __init__ (self , option_strings , dest , ** kwargs ):
@@ -299,13 +307,17 @@ def __call__(self, parser, namespace, values, option_string, **kwargs):
299307 required_upload .add_argument ('-p' ,'--port' , type = str , nargs = '?' , const = '' , help = 'serial port' )
300308 required_upload .add_argument ('-f' ,'--binfile' , type = str , help = 'binary file to upload' , required = True )
301309 required_upload .add_argument ('--verbose' , action = 'store_true' , help = 'Enable verbose logging' )
310+ parser_upload .add_argument ('--no-jlink-update' , dest = 'jlink_update' , action = 'store_false' , help = 'Disable JLink firmware update (default: enabled)' )
311+ parser_upload .set_defaults (jlink_update = True )
302312 parser_upload .set_defaults (func = parser_upload_func )
303313
304314 # Erase parser
305315 parser_erase = subparser .add_parser ('erase' , description = 'erase command' )
306316 required_erase = parser_erase .add_argument_group ('required arguments' )
307317 required_erase .add_argument ('-d' ,'--device' , type = str , help = 'jlink device name' , required = True )
308318 required_erase .add_argument ('-p' ,'--port' , type = str , help = 'serial port' , required = True )
319+ parser_erase .add_argument ('--no-jlink-update' , dest = 'jlink_update' , action = 'store_false' , help = 'Disable JLink firmware update (default: enabled)' )
320+ parser_erase .set_defaults (jlink_update = True )
309321 parser_erase .set_defaults (func = parser_erase_func )
310322
311323 # debug_parser.
0 commit comments