Skip to content

Commit

Permalink
Replaced xmcflasher java tool by xmc-flasher python.
Browse files Browse the repository at this point in the history
  • Loading branch information
jaenrig-ifx committed May 25, 2023
1 parent 70b950a commit 20bf8f3
Show file tree
Hide file tree
Showing 3 changed files with 150 additions and 25 deletions.
28 changes: 14 additions & 14 deletions boards.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ menu.LIB=Additional Libraries

####################################################
XMC1100_Boot_Kit.name=XMC1100 Boot Kit
XMC1100_Boot_Kit.upload.tool=xmcprog
XMC1100_Boot_Kit.upload.tool=xmcflasher
XMC1100_Boot_Kit.upload.speed=115200
XMC1100_Boot_Kit.upload.resetmethod=ck
XMC1100_Boot_Kit.upload.maximum_size=65536
Expand All @@ -13,7 +13,7 @@ XMC1100_Boot_Kit.upload.wait_for_upload_port=true
XMC1100_Boot_Kit.communication=usb
XMC1100_Boot_Kit.protocol=dragon_isp
XMC1100_Boot_Kit.program.protocol=dragon_isp
XMC1100_Boot_Kit.program.tool=xmcprog
XMC1100_Boot_Kit.program.tool=xmcflasher
XMC1100_Boot_Kit.program.extra_params=-Pusb

XMC1100_Boot_Kit.serial.disableDTR=true
Expand Down Expand Up @@ -48,7 +48,7 @@ XMC1100_Boot_Kit.menu.LIB.DSPNN.library.selected=-DARM_LIB_CMSIS_DSP -DARM_LIB_C

####################################################
XMC1100_XMC2GO.name=XMC1100 XMC2Go
XMC1100_XMC2GO.upload.tool=xmcprog
XMC1100_XMC2GO.upload.tool=xmcflasher
XMC1100_XMC2GO.upload.speed=115200
XMC1100_XMC2GO.upload.resetmethod=ck
XMC1100_XMC2GO.upload.maximum_size=65536
Expand All @@ -57,7 +57,7 @@ XMC1100_XMC2GO.upload.wait_for_upload_port=true
XMC1100_XMC2GO.communication=usb
XMC1100_XMC2GO.protocol=dragon_isp
XMC1100_XMC2GO.program.protocol=dragon_isp
XMC1100_XMC2GO.program.tool=xmcprog
XMC1100_XMC2GO.program.tool=xmcflasher
XMC1100_XMC2GO.program.extra_params=-Pusb

XMC1100_XMC2GO.serial.disableDTR=true
Expand Down Expand Up @@ -92,7 +92,7 @@ XMC1100_XMC2GO.menu.LIB.DSPNN.library.selected=-DARM_LIB_CMSIS_DSP -DARM_LIB_CMS

####################################################
XMC1300_Boot_Kit.name=XMC1300 Boot Kit
XMC1300_Boot_Kit.upload.tool=xmcprog
XMC1300_Boot_Kit.upload.tool=xmcflasher
XMC1300_Boot_Kit.upload.speed=115200
XMC1300_Boot_Kit.upload.resetmethod=ck
XMC1300_Boot_Kit.upload.maximum_size=204800
Expand All @@ -101,7 +101,7 @@ XMC1300_Boot_Kit.upload.wait_for_upload_port=true
XMC1300_Boot_Kit.communication=usb
XMC1300_Boot_Kit.protocol=dragon_isp
XMC1300_Boot_Kit.program.protocol=dragon_isp
XMC1300_Boot_Kit.program.tool=xmcprog
XMC1300_Boot_Kit.program.tool=xmcflasher
XMC1300_Boot_Kit.program.extra_params=-Pusb

XMC1300_Boot_Kit.serial.disableDTR=true
Expand Down Expand Up @@ -136,7 +136,7 @@ XMC1300_Boot_Kit.menu.LIB.DSPNN.library.selected=-DARM_LIB_CMSIS_DSP -DARM_LIB_C

####################################################
XMC1400_Arduino_Kit.name=XMC1400 Kit for Arduino
XMC1400_Arduino_Kit.upload.tool=xmcprog
XMC1400_Arduino_Kit.upload.tool=xmcflasher
XMC1400_Arduino_Kit.upload.speed=115200
XMC1400_Arduino_Kit.upload.resetmethod=ck
XMC1400_Arduino_Kit.upload.maximum_size=204800
Expand All @@ -145,7 +145,7 @@ XMC1400_Arduino_Kit.upload.wait_for_upload_port=true
XMC1400_Arduino_Kit.communication=usb
XMC1400_Arduino_Kit.protocol=dragon_isp
XMC1400_Arduino_Kit.program.protocol=dragon_isp
XMC1400_Arduino_Kit.program.tool=xmcprog
XMC1400_Arduino_Kit.program.tool=xmcflasher
XMC1400_Arduino_Kit.program.extra_params=-Pusb

XMC1400_Arduino_Kit.serial.disableDTR=true
Expand Down Expand Up @@ -180,7 +180,7 @@ XMC1400_Arduino_Kit.menu.LIB.DSPNN.library.selected=-DARM_LIB_CMSIS_DSP -DARM_LI

####################################################
XMC4200_Platform2GO.name=XMC4200 Platform 2GO
XMC4200_Platform2GO.upload.tool=xmcprog
XMC4200_Platform2GO.upload.tool=xmcflasher
XMC4200_Platform2GO.upload.speed=115200
XMC4200_Platform2GO.upload.resetmethod=ck
XMC4200_Platform2GO.upload.maximum_size=262144
Expand All @@ -189,7 +189,7 @@ XMC4200_Platform2GO.upload.wait_for_upload_port=true
XMC4200_Platform2GO.communication=usb
XMC4200_Platform2GO.protocol=dragon_isp
XMC4200_Platform2GO.program.protocol=dragon_isp
XMC4200_Platform2GO.program.tool=xmcprog
XMC4200_Platform2GO.program.tool=xmcflasher
XMC4200_Platform2GO.program.extra_params=-Pusb

XMC4200_Platform2GO.serial.disableDTR=true
Expand Down Expand Up @@ -220,7 +220,7 @@ XMC4200_Platform2GO.menu.LIB.DSP.library.selected=-DARM_LIB_CMSIS_DSP

####################################################
XMC4400_Platform2GO.name=XMC4400 Platform 2GO
XMC4400_Platform2GO.upload.tool=xmcprog
XMC4400_Platform2GO.upload.tool=xmcflasher
XMC4400_Platform2GO.upload.speed=115200
XMC4400_Platform2GO.upload.resetmethod=ck
XMC4400_Platform2GO.upload.maximum_size=512000
Expand All @@ -229,7 +229,7 @@ XMC4400_Platform2GO.upload.wait_for_upload_port=true
XMC4400_Platform2GO.communication=usb
XMC4400_Platform2GO.protocol=dragon_isp
XMC4400_Platform2GO.program.protocol=dragon_isp
XMC4400_Platform2GO.program.tool=xmcprog
XMC4400_Platform2GO.program.tool=xmcflasher
XMC4400_Platform2GO.program.extra_params=-Pusb

XMC4400_Platform2GO.serial.disableDTR=true
Expand Down Expand Up @@ -265,7 +265,7 @@ XMC4400_Platform2GO.menu.LIB.DSP.library.selected=-DARM_LIB_CMSIS_DSP

####################################################
XMC4700_Relax_Kit.name=XMC4700 Relax Kit
XMC4700_Relax_Kit.upload.tool=xmcprog
XMC4700_Relax_Kit.upload.tool=xmcflasher
XMC4700_Relax_Kit.upload.speed=115200
XMC4700_Relax_Kit.upload.resetmethod=ck
XMC4700_Relax_Kit.upload.maximum_size=2048000
Expand All @@ -274,7 +274,7 @@ XMC4700_Relax_Kit.upload.wait_for_upload_port=true
XMC4700_Relax_Kit.communication=usb
XMC4700_Relax_Kit.protocol=dragon_isp
XMC4700_Relax_Kit.program.protocol=dragon_isp
XMC4700_Relax_Kit.program.tool=xmcprog
XMC4700_Relax_Kit.program.tool=xmcflasher
XMC4700_Relax_Kit.program.extra_params=-Pusb

XMC4700_Relax_Kit.serial.disableDTR=true
Expand Down
21 changes: 10 additions & 11 deletions platform.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# The information about this Arduino compatible environment
# ---------
name=XMC Family V2.x
version=2.0.0
version=2.2.0

# Build related core definitions
# ---------
Expand Down Expand Up @@ -126,13 +126,12 @@ recipe.size.regex.data=^(?:\.data|\.VENEER_Code|\.ram_code|\.bss|\.no_init|\Stac

# ARM uploader/programmers tools
# ----------------

tools.xmcprog.path={runtime.tools.XMCFlasher.path}
tools.xmcprog.jar_file=XMCFlasher.jar
tools.xmcprog.erase.params = -e -device "XMC{build.board.version}-{build.board.v}"
tools.xmcprog.erase.pattern=java -jar "{path}/{jar_file}" {erase.params}
tools.xmcprog.upload.protocol=
tools.xmcprog.upload.params.verbose=
tools.xmcprog.upload.params.quiet=
tools.xmcprog.upload.params =-p "{build.path}/{build.project_name}.hex" -device "XMC{build.board.version}-{build.board.v}"
tools.xmcprog.upload.pattern=java -jar "{path}/{jar_file}" {upload.params}
tools.xmcflasher.path={runtime.platform.path}/tools
tools.xmcflasher.cmd.path={path}/xmc-flasher.py
tools.xmcflasher.erase.params=-d XMC{build.board.version}-{build.board.v} -p {serial.port}
tools.xmcflasher.erase.pattern=python {cmd.path} erase {upload.params}
tools.xmcflasher.upload.protocol=
tools.xmcflasher.upload.params.verbose=
tools.xmcflasher.upload.params.quiet=
tools.xmcflasher.upload.params=-d XMC{build.board.version}-{build.board.v} -p {serial.port} -f {build.path}/{build.project_name}.hex
tools.xmcflasher.upload.pattern=python {cmd.path} upload {upload.params}
126 changes: 126 additions & 0 deletions tools/xmc-flasher.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
import argparse, serial, subprocess, os, sys
from serial.tools.list_ports import comports

version = '0.1.0'

jlinkexe = ''

def set_environment():
global jlinkexe
if sys.platform == 'linux' or sys.platform == 'linux2':
jlinkexe = 'JLinkExe'
elif sys.platform == 'win32' or sys.platform == 'cygwin':
jlinkexe = 'jlink'
elif sys.platform == 'darwin':
jlinkexe = 'jlink'
print('warning: mac os not validated')
#raise Exception('mac os not supported?')

def discover_devices():
ports = comports()
port_sn_list = []
for p in ports:
port_sn_list.append((p.device, p.serial_number))

return port_sn_list

def get_device_serial_number(port):
port_sn_list = discover_devices()
for device in port_sn_list:
if device[0] == port:
return device[1]

return None

def create_jlink_loadbin_command_file(binfile):
cmd_jlink = 'cmd.jlink'
cmd_load_bin = 'loadbin ' + binfile + ' 0x0\n'
with open(cmd_jlink,'w') as f:
f.writelines(['r\n', 'h\n', cmd_load_bin, 'r\n', 'g\n', 'exit\n'])

return cmd_jlink

def create_jlink_erase_command_file():
cmd_jlink = 'cmd.jlink'
with open(cmd_jlink,'w') as f:
f.writelines(['r\n', 'h\n', 'erase\n', 'exit\n'])

return cmd_jlink

def remove_jlink_command_file(cmd_file):
if os.path.exists(cmd_file):
os.remove(cmd_file)

def jlink_commander(device, serial_num, cmd_file):
jlink_cmd = [jlinkexe, '-autoconnect', '1','-exitonerror', '1', '-nogui', '1', '-device', device, '-selectemubysn', serial_num, '-if', 'swd', '-speed', '4000', '-commandfile', cmd_file]

try:
jlink_proc = subprocess.Popen(jlink_cmd)
jlink_proc.wait()
except:
raise Exception("jlink error")

def upload(device, port, binfile):
serial_num = get_device_serial_number(port)
jlink_cmd_file = create_jlink_loadbin_command_file(binfile)
jlink_commander(device, serial_num, jlink_cmd_file)
remove_jlink_command_file(jlink_cmd_file)

def erase(device, port):
serial_num = get_device_serial_number(port)
jlink_cmd_file = create_jlink_erase_command_file()
jlink_commander(device, serial_num, jlink_cmd_file)
remove_jlink_command_file(jlink_cmd_file)

def debug(device, port, elfile):
pass #TBD

def parser():

def parser_upload_func(args):
upload(args.device, args.port, args.binfile)

def parser_erase_func(args):
erase(args.device, args.port)

class ver_action(argparse.Action):
def __init__(self, option_strings, dest, **kwargs):
return super().__init__(option_strings, dest, nargs=0, default=argparse.SUPPRESS, **kwargs)

def __call__(self, parser, namespace, values, option_string, **kwargs):
print('xmc-upload version: ' + version)
parser.exit()

# General parser
parser = argparse.ArgumentParser(description="xmc-upload tool")

parser.add_argument('-v','--version', action=ver_action, help='xmc-upload version')
subparser = parser.add_subparsers()
# parser.set_defaults(func=main_parser_func)

# Upload parser
parser_upload = subparser.add_parser('upload', description='Upload binary command')
required_upload = parser_upload.add_argument_group('required arguments')
required_upload.add_argument('-d','--device', type=str, help='jlink device name', required=True)
required_upload.add_argument('-p','--port', type=str, help='serial port', required=True)
required_upload.add_argument('-f','--binfile', type=str, help='binary file to upload', required=True)
parser_upload.set_defaults(func=parser_upload_func)

# Debug parser
parser_erase = subparser.add_parser('erase', description='erase command')
required_erase = parser_erase.add_argument_group('required arguments')
required_erase.add_argument('-d','--device', type=str, help='jlink device name', required=True)
required_erase.add_argument('-p','--port', type=str, help='serial port', required=True)
parser_erase.set_defaults(func=parser_erase_func)

# debug_parser.
# TBD in future

# Parser call
args = parser.parse_args()
args.func(args)

if __name__ == "__main__":
set_environment()
parser()

0 comments on commit 20bf8f3

Please sign in to comment.