Skip to content

Commit b5d87bf

Browse files
committed
tools/: Fix Jlink auto update issue in xmc-flasher.
Signed-off-by: zhanglinjing <Linjing.Zhang@infineon.com>
1 parent d46d2a5 commit b5d87bf

1 file changed

Lines changed: 41 additions & 29 deletions

File tree

tools/xmc-flasher.py

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

7884
def remove_jlink_command_file(cmd_file):
@@ -94,7 +100,7 @@ def remove_backspaces(input_str):
94100
return ''.join(result)
95101

96102
def 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

Comments
 (0)