Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
185 changes: 156 additions & 29 deletions project_generator/tools/uvision.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,49 +37,128 @@ class uVisionDefinitions():

uvmpw_file = OrderedDict([(u'ProjectWorkspace', OrderedDict([(u'@xmlns:xsi', u'http://www.w3.org/2001/XMLSchema-instance'), (u'@xsi:noNamespaceSchemaLocation', u'project_mpw.xsd'), (u'SchemaVersion', u'1.0'), (u'Header', u'### uVision Project, (C) Keil Software'), (u'WorkspaceName', u'WorkSpace'), (u'project', OrderedDict([(u'PathAndName', None)]))]))])

uvoptx_file = OrderedDict([(u'ProjectOpt', OrderedDict( [(u'@xmlns:xsi', u'http://www.w3.org/2001/XMLSchema-instance'), (u'@xsi:noNamespaceSchemaLocation', u'project_optx.xsd'), (u'SchemaVersion', u'1.0'), (u'Target', OrderedDict( [(u'TargetName', u''), (u'ToolsetNumber', u'0x4'), (u'ToolsetName', u'ARM-ADS'), (u'TargetOption', OrderedDict( [(u'DebugOpt', OrderedDict([(u'uSim', u'0'), (u'uTrg', u'1'), (u'nTsel', u''), (u'pMon', u'')])), (u'TargetDriverDllRegistry', OrderedDict( [(u'SetRegEntry', OrderedDict( [(u'Number', u'0'), (u'Key', u''), (u'Name', u'') ])) ])) ])) ])) ]))])

debuggers = {
'ulink2-me': {
'uvproj': {
'TargetDlls': {
'Driver': 'BIN\\UL2CM3.dll',
},
'Utilities': {
'Flash2': 'BIN\\UL2CM3.DLL',
},
},
'uvoptx' : {
'DebugOpt' : {
'nTsel' : '1',
'pMon': 'BIN\\UL2CM3.DLL',
},
'SetRegEntry' : {
'Key' : 'UL2CM3',
},
},
},
'cmsis-dap': {
'TargetDlls': {
'Driver': 'BIN\\CMSIS_AGDI.dll',
'uvproj': {
'TargetDlls': {
'Driver': 'BIN\\CMSIS_AGDI.dll',
},
'Utilities': {
'Flash2': 'BIN\\CMSIS_AGDI.dll',
},
},
'Utilities': {
'Flash2': 'BIN\\CMSIS_AGDI.dll',
'uvoptx' : {
'DebugOpt' : {
'nTsel' : '12',
'pMon': 'BIN\\CMSIS_AGDI.dll',
},
'SetRegEntry' : {
'Key' : 'CMSIS_AGDI',
},
},
},
'j-link': {
'TargetDlls': {
'Driver': 'Segger\\JL2CM3.dll',
'uvproj': {
'TargetDlls': {
'Driver': 'Segger\\JL2CM3.dll',
},
'Utilities': {
'Flash2': 'Segger\\JL2CM3.dll',
},
},
'Utilities': {
'Flash2': 'Segger\\JL2CM3.dll',
'uvoptx' : {
'DebugOpt' : {
'nTsel' : '6',
'pMon': 'Segger\\JL2CM3.dll',
},
'SetRegEntry' : {
'Key' : 'JL2CM3',
},
},
},
'ulink-pro': {
'TargetDlls': {
'Driver': 'BIN\\ULP2CM3.dll',
'uvproj': {
'TargetDlls': {
'Driver': 'BIN\\ULP2CM3.dll',
},
'Utilities': {
'Flash2': 'BIN\\ULP2CM3.dll',
},
},
'Utilities': {
'Flash2': 'BIN\\ULP2CM3.dll',
'uvoptx' : {
'DebugOpt' : {
'nTsel' : '7',
'pMon': 'BIN\\ULP2CM3.DLL',
},
'SetRegEntry' : {
'Key' : 'ULP2CM3',
},
},
},
'st-link': {
'TargetDlls': {
'Driver': 'STLink\\ST-LINKIII-KEIL_SWO.dll',
'uvproj': {
'TargetDlls': {
'Driver': 'STLink\\ST-LINKIII-KEIL_SWO.dll',
},
'Utilities': {
'Flash2': 'STLink\\ST-LINKIII-KEIL_SWO.dll',
},
},
'Utilities': {
'Flash2': 'STLink\\ST-LINKIII-KEIL_SWO.dll',
'uvoptx' : {
'DebugOpt' : {
'nTsel' : '11',
'pMon': 'STLink\\ST-LINKIII-KEIL_SWO.dll',
},
'SetRegEntry' : {
'Key' : 'ST-LINKIII-KEIL_SWO',
},
},
},
'nu-link': {
'TargetDlls': {
'Driver': 'BIN\\Nu_Link.dll',
'uvproj': {
'TargetDlls': {
'Driver': 'BIN\\Nu_Link.dll',
},
'Utilities': {
'Flash2': 'BIN\\Nu_Link.dll',
},
},
'Utilities': {
'Flash2': 'BIN\\Nu_Link.dll',
'uvoptx' : {
'DebugOpt' : {
'nTsel' : '9',
'pMon': 'NULink\\Nu_Link.dll',
},
'SetRegEntry' : {
'Key' : 'Nu_Link',
},
},
},
}

# use cmsis-dap debugger as default
debuggers_default = 'cmsis-dap'


class Uvision(Tool, Builder, Exporter):

Expand Down Expand Up @@ -257,8 +336,8 @@ def _set_target(self, expanded_dic, uvproj_dic, tool_name):
# later progen can overwrite this if debugger is set in project data
try:
debugger_name = pro_def.get_debugger(expanded_dic['target'])['name']
uvproj_dic['Project']['Targets']['Target']['TargetOption']['DebugOption']['TargetDlls']['Driver'] = self.definitions.debuggers[debugger_name]['TargetDlls']['Driver']
uvproj_dic['Project']['Targets']['Target']['TargetOption']['Utilities']['Flash2'] = self.definitions.debuggers[debugger_name]['Utilities']['Flash2']
uvproj_dic['Project']['Targets']['Target']['TargetOption']['DebugOption']['TargetDlls']['Driver'] = self.definitions.debuggers[debugger_name]['uvproj']['TargetDlls']['Driver']
uvproj_dic['Project']['Targets']['Target']['TargetOption']['Utilities']['Flash2'] = self.definitions.debuggers[debugger_name]['uvproj']['Utilities']['Flash2']
except (TypeError, KeyError) as err:
pass
# Support new device packs
Expand All @@ -268,6 +347,36 @@ def _set_target(self, expanded_dic, uvproj_dic, tool_name):
logger.info("The target might not be supported in %s, requires uvision5" % tool_name)
uvproj_dic['Project']['Targets']['Target']['TargetOption']['TargetCommonOption']['PackID'] = mcu_def_dic['TargetOption']['PackID'][0]

def _uvoptx_set_debugger(self, expanded_dic, uvoptx_dic, tool_name):
pro_def = ProGenDef(tool_name)
if not pro_def.is_supported(expanded_dic['target'].lower()):
raise RuntimeError("Target %s is not supported. Please add them to https://github.com/project-generator/project_generator_definitions" % expanded_dic['target'].lower())
mcu_def_dic = pro_def.get_tool_definition(expanded_dic['target'].lower())
if not mcu_def_dic:
raise RuntimeError(
"Target definitions were not found for %s. Please add them to https://github.com/project-generator/project_generator_definitions" % expanded_dic['target'].lower())
logger.debug("Mcu definitions: %s" % mcu_def_dic)

# set the same target name FlashDriverDll config as in uvprojx file
try:
uvoptx_dic['ProjectOpt']['Target']['TargetName'] = expanded_dic['name']
uvoptx_dic['ProjectOpt']['Target']['TargetOption']['TargetDriverDllRegistry']['SetRegEntry']['Name'] = str(mcu_def_dic['TargetOption']['FlashDriverDll'][0]).encode('utf-8')
except KeyError:
return

# load debugger from target dictionary or use default debugger
try:
debugger_dic = pro_def.get_debugger(expanded_dic['target'])
if debugger_dic is None:
debugger_name = self.definitions.debuggers_default
else:
debugger_name = debugger_dic['name']
uvoptx_dic['ProjectOpt']['Target']['TargetOption']['DebugOpt']['nTsel'] = self.definitions.debuggers[debugger_name]['uvoptx']['DebugOpt']['nTsel']
uvoptx_dic['ProjectOpt']['Target']['TargetOption']['DebugOpt']['pMon'] = self.definitions.debuggers[debugger_name]['uvoptx']['DebugOpt']['pMon']
uvoptx_dic['ProjectOpt']['Target']['TargetOption']['TargetDriverDllRegistry']['SetRegEntry']['Key'] = self.definitions.debuggers[debugger_name]['uvoptx']['SetRegEntry']['Key']
except KeyError:
raise RuntimeError("Debugger %s is not supported" % expanded_dic['debugger'])

def _export_single_project(self, tool_name):
expanded_dic = self.workspace.copy()

Expand Down Expand Up @@ -345,15 +454,31 @@ def _export_single_project(self, tool_name):
# load debugger
if expanded_dic['debugger']:
try:
uvproj_dic['Project']['Targets']['Target']['TargetOption']['DebugOption']['TargetDlls']['Driver'] = self.definitions.debuggers[expanded_dic['debugger']]['TargetDlls']['Driver']
uvproj_dic['Project']['Targets']['Target']['TargetOption']['Utilities']['Flash2'] = self.definitions.debuggers[expanded_dic['debugger']]['Utilities']['Flash2']
uvproj_dic['Project']['Targets']['Target']['TargetOption']['DebugOption']['TargetDlls']['Driver'] = self.definitions.debuggers[expanded_dic['debugger']]['uvproj']['TargetDlls']['Driver']
uvproj_dic['Project']['Targets']['Target']['TargetOption']['Utilities']['Flash2'] = self.definitions.debuggers[expanded_dic['debugger']]['uvproj']['Utilities']['Flash2']
except KeyError:
raise RuntimeError("Debugger %s is not supported" % expanded_dic['debugger'])

# Project file
uvproj_xml = xmltodict.unparse(uvproj_dic, pretty=True)
path, files = self.gen_file_raw(uvproj_xml, '%s.%s' % (expanded_dic['name'], extension), expanded_dic['output_dir']['path'])
return path, files
project_path, uvproj = self.gen_file_raw(uvproj_xml, '%s.%s' % (expanded_dic['name'], extension), expanded_dic['output_dir']['path'])

uvoptx = None
if tool_name == 'uvision5':

# generic tool template specified
uvoptx_dic = self.definitions.uvoptx_file

self._uvoptx_set_debugger(expanded_dic, uvoptx_dic, tool_name)

# set target only if defined, otherwise use from template/default one
extension = 'uvoptx'

# Project file
uvoptx_xml = xmltodict.unparse(uvoptx_dic, pretty=True)
project_path, uvoptx = self.gen_file_raw(uvoptx_xml, '%s.%s' % (expanded_dic['name'], extension), expanded_dic['output_dir']['path'])

return project_path, [uvproj, uvoptx]

def export_workspace(self):
path, workspace = self._generate_uvmpw_file()
Expand All @@ -363,7 +488,7 @@ def export_project(self):
path, files = self._export_single_project('uvision') #todo: uvision will switch to uv4
generated_projects = copy.deepcopy(self.generated_project)
generated_projects['path'] = path
generated_projects['files']['uvproj'] = files
generated_projects['files']['uvproj'] = files[0]
return generated_projects

def get_generated_project_files(self):
Expand Down Expand Up @@ -409,6 +534,7 @@ class Uvision5(Uvision):
'path': '',
'files': {
'uvprojx': '',
'uvoptx': '',
}
}

Expand All @@ -423,11 +549,12 @@ def export_project(self):
path, files = self._export_single_project('uvision5')
generated_projects = copy.deepcopy(self.generated_project)
generated_projects['path'] = path
generated_projects['files']['uvprojx'] = files
generated_projects['files']['uvprojx'] = files[0]
generated_projects['files']['uvoptx'] = files[1]
return generated_projects

def get_generated_project_files(self):
return {'path': self.workspace['path'], 'files': [self.workspace['files']['uvprojx']]}
return {'path': self.workspace['path'], 'files': [self.workspace['files']['uvprojx'], self.workspace['files']['uvoptx']]}

def build_project(self):
# tool_name uvision as uv4 is still used in uv5
Expand Down