diff --git a/tools/export/uvision/__init__.py b/tools/export/uvision/__init__.py index 00da37cf27..3b5f197483 100644 --- a/tools/export/uvision/__init__.py +++ b/tools/export/uvision/__init__.py @@ -2,7 +2,7 @@ from __future__ import print_function, absolute_import from builtins import str import os -from os.path import sep, normpath, join, exists, dirname +from os.path import normpath, exists, dirname import ntpath import copy from collections import namedtuple @@ -11,11 +11,11 @@ from subprocess import Popen, PIPE import re from tools.resources import FileType -from tools.arm_pack_manager import Cache from tools.targets import TARGET_MAP -from tools.export.exporters import Exporter, apply_supported_whitelist +from tools.export.exporters import Exporter from tools.export.cmsis import DeviceCMSIS + class DeviceUvision(DeviceCMSIS): """Uvision Device class, inherits CMSIS Device class @@ -32,7 +32,7 @@ class DeviceUvision(DeviceCMSIS): def uv_debug(self): """Return a namedtuple of information about uvision debug settings""" - UVDebug = namedtuple('UVDebug',['bin_loc','core_flag', 'key']) + UVDebug = namedtuple('UVDebug', ['bin_loc', 'core_flag', 'key']) # CortexMXn => pCMX cpu = self.core.replace("Cortex-", "C") @@ -42,10 +42,13 @@ class DeviceUvision(DeviceCMSIS): cpu_flag = "p"+cpu # Locations found in Keil_v5/TOOLS.INI - debuggers = {"st-link": ('STLink\\ST-LINKIII-KEIL_SWO.dll', 'ST-LINKIII-KEIL_SWO'), - "j-link":('Segger\\JL2CM3.dll', 'JL2CM3'), - "cmsis-dap":('BIN\\CMSIS_AGDI.dll', 'CMSIS_AGDI'), - "nulink":('NULink\\Nu_Link.dll','Nu_Link')} + debuggers = { + "st-link": ('STLink\\ST-LINKIII-KEIL_SWO.dll', + 'ST-LINKIII-KEIL_SWO'), + "j-link": ('Segger\\JL2CM3.dll', 'JL2CM3'), + "cmsis-dap": ('BIN\\CMSIS_AGDI.dll', 'CMSIS_AGDI'), + "nulink": ('NULink\\Nu_Link.dll', 'Nu_Link') + } res = debuggers[self.debug.lower()] binary = res[0] key = res[1] @@ -57,7 +60,7 @@ class DeviceUvision(DeviceCMSIS): S = SW/JTAG Clock ID C = CPU index in JTAG chain P = Access Port - For the Options for Target -> Debug tab -> settings -> "Flash" tab in the dialog: + For the Options for Target -> Debug -> settings -> "Flash" dialog: FD = RAM Start for Flash Functions FC = RAM Size for Flash Functions FN = Number of Flash types @@ -66,44 +69,55 @@ class DeviceUvision(DeviceCMSIS): FL = Size of the Flash Device FP = Full path to the Device algorithm (RTE) - Necessary to flash some targets. Info gathered from algorithms field of pdsc file. + Necessary to flash some targets. ''' fl_count = 0 + def get_mem_no_x(mem_str): mem_reg = "\dx(\w+)" m = re.search(mem_reg, mem_str) return m.group(1) if m else None - RAMS = [(get_mem_no_x(info["start"]), get_mem_no_x(info["size"])) - for mem, info in self.target_info["memory"].items() if "RAM" in mem] - format_str = "UL2CM3(-S0 -C0 -P0 -FD{ramstart}"+" -FC{ramsize} "+"-FN{num_algos} {extra_flags})" + RAMS = [ + (get_mem_no_x(info["start"]), get_mem_no_x(info["size"])) + for mem, info in self.target_info["memory"].items() if "RAM" in mem + ] + format_str = ( + "UL2CM3(-S0 -C0 -P0 -FD{ramstart}" + " -FC{ramsize} -FN{num_algos} {extra_flags})" + ) ramstart = '' - #Default according to Keil developer + # Default according to Keil developer ramsize = '1000' - if len(RAMS)>=1: + if len(RAMS) >= 1: ramstart = RAMS[0][0] extra_flags = [] for name, info in self.target_info["algorithm"].items(): if not name or not info: continue - if int(info["default"])==0: + if int(info["default"]) == 0: continue name_reg = "\w*/([\w_]+)\.flm" m = re.search(name_reg, name.lower()) fl_name = m.group(1) if m else None name_flag = "-FF" + str(fl_count) + fl_name - start, size = get_mem_no_x(info["start"]), get_mem_no_x(info["size"]) - rom_start_flag = "-FS"+str(fl_count)+str(start) + start = get_mem_no_x(info["start"]) + size = get_mem_no_x(info["size"]) + rom_start_flag = "-FS" + str(fl_count) + str(start) rom_size_flag = "-FL" + str(fl_count) + str(size) if info["ramstart"] is not None and info["ramsize"] is not None: ramstart = get_mem_no_x(info["ramstart"]) ramsize = get_mem_no_x(info["ramsize"]) - path_flag = "-FP" + str(fl_count) + "($$Device:"+self.dname+"$"+name+")" + path_flag = "-FP{}($$Device:{}${})".format( + str(fl_count), self.dname, name + ) - extra_flags.extend([name_flag, rom_start_flag, rom_size_flag, path_flag]) + extra_flags.extend([ + name_flag, rom_start_flag, rom_size_flag, path_flag + ]) fl_count += 1 extra = " ".join(extra_flags) @@ -130,8 +144,7 @@ class Uvision(Exporter): "NCS36510TargetCode.ncs36510_addfib" ]) - - #File associations within .uvprojx file + # File associations within .uvprojx file file_types = {'.cpp': 8, '.c': 1, '.s': 2, '.obj': 3, '.o': 3, '.lib': 4, '.ar': 4, '.h': 5, '.hpp': 5, '.sct': 4} @@ -149,8 +162,8 @@ class Uvision(Exporter): """ for loc in files: - #Encapsulates the information necessary for template entry above - UVFile = namedtuple('UVFile', ['type','loc','name']) + # Encapsulates the information necessary for template entry above + UVFile = namedtuple('UVFile', ['type', 'loc', 'name']) _, ext = os.path.splitext(loc) if ext.lower() in self.file_types: type = self.file_types[ext.lower()] @@ -212,11 +225,11 @@ class Uvision(Exporter): def generate(self): """Generate the .uvproj file""" - cache = Cache(True, False) - - srcs = self.resources.headers + self.resources.s_sources + \ - self.resources.c_sources + self.resources.cpp_sources + \ - self.resources.objects + self.libraries + srcs = ( + self.resources.headers + self.resources.s_sources + + self.resources.c_sources + self.resources.cpp_sources + + self.resources.objects + self.libraries + ) ctx = { 'name': self.project_name, # project_files => dict of generators - file group to generator of @@ -227,7 +240,8 @@ class Uvision(Exporter): self.resources.inc_dirs).encode('utf-8'), 'device': DeviceUvision(self.target), } - sct_name, sct_path = self.resources.get_file_refs(FileType.LD_SCRIPT)[0] + sct_name, sct_path = self.resources.get_file_refs( + FileType.LD_SCRIPT)[0] ctx['linker_script'] = self.toolchain.correct_scatter_shebang( sct_path, dirname(sct_name)) if ctx['linker_script'] != sct_path: @@ -243,8 +257,12 @@ class Uvision(Exporter): ctx['armc6'] = int(self.TOOLCHAIN is 'ARMC6') ctx['toolchain_name'] = self.TOOLCHAIN_NAME ctx.update(self.format_flags()) - self.gen_file('uvision/uvision.tmpl', ctx, self.project_name+".uvprojx") - self.gen_file('uvision/uvision_debug.tmpl', ctx, self.project_name + ".uvoptx") + self.gen_file( + 'uvision/uvision.tmpl', ctx, self.project_name + ".uvprojx" + ) + self.gen_file( + 'uvision/uvision_debug.tmpl', ctx, self.project_name + ".uvoptx" + ) @staticmethod def clean(project_name): @@ -284,6 +302,7 @@ class Uvision(Exporter): else: return 0 + class UvisionArmc5(Uvision): NAME = 'uvision5-armc5' TOOLCHAIN = 'ARM' @@ -306,12 +325,6 @@ class UvisionArmc5(Uvision): else: return False - @classmethod - def is_target_supported(cls, target_name): - target = TARGET_MAP[target_name] - return apply_supported_whitelist( - cls.TOOLCHAIN, cls.POST_BINARY_WHITELIST, target) and\ - DeviceCMSIS.check_supported(target_name) class UvisionArmc6(Uvision): NAME = 'uvision5-armc6'