Clone of official tools
Diff: targets/__init__.py
- Revision:
- 43:2a7da56ebd24
- Parent:
- 40:7d3fa6b99b2b
--- a/targets/__init__.py Mon Nov 06 13:17:14 2017 -0600 +++ b/targets/__init__.py Tue Sep 25 13:43:09 2018 -0500 @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. """ +from __future__ import print_function import os import binascii @@ -29,24 +30,41 @@ from tools.utils import json_file_to_dict __all__ = ["target", "TARGETS", "TARGET_MAP", "TARGET_NAMES", "CORE_LABELS", - "HookError", "generate_py_target", "Target", + "CORE_ARCH", "HookError", "generate_py_target", "Target", "CUMULATIVE_ATTRIBUTES", "get_resolution_order"] CORE_LABELS = { - "Cortex-M0" : ["M0", "CORTEX_M", "LIKE_CORTEX_M0", "CORTEX"], - "Cortex-M0+": ["M0P", "CORTEX_M", "LIKE_CORTEX_M0", "CORTEX"], - "Cortex-M1" : ["M1", "CORTEX_M", "LIKE_CORTEX_M1", "CORTEX"], - "Cortex-M3" : ["M3", "CORTEX_M", "LIKE_CORTEX_M3", "CORTEX"], - "Cortex-M4" : ["M4", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M4", "CORTEX"], - "Cortex-M4F" : ["M4", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M4", "CORTEX"], - "Cortex-M7" : ["M7", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M7", "CORTEX"], - "Cortex-M7F" : ["M7", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M7", "CORTEX"], - "Cortex-M7FD" : ["M7", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M7", "CORTEX"], - "Cortex-A9" : ["A9", "CORTEX_A", "LIKE_CORTEX_A9", "CORTEX"], + "Cortex-M0": ["M0", "CORTEX_M", "LIKE_CORTEX_M0", "CORTEX"], + "Cortex-M0+": ["M0P", "CORTEX_M", "LIKE_CORTEX_M0", "CORTEX"], + "Cortex-M1": ["M1", "CORTEX_M", "LIKE_CORTEX_M1", "CORTEX"], + "Cortex-M3": ["M3", "CORTEX_M", "LIKE_CORTEX_M3", "CORTEX"], + "Cortex-M4": ["M4", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M4", "CORTEX"], + "Cortex-M4F": ["M4", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M4", "CORTEX"], + "Cortex-M7": ["M7", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M7", "CORTEX"], + "Cortex-M7F": ["M7", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M7", "CORTEX"], + "Cortex-M7FD": ["M7", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M7", "CORTEX"], + "Cortex-A9": ["A9", "CORTEX_A", "LIKE_CORTEX_A9", "CORTEX"], "Cortex-M23": ["M23", "CORTEX_M", "LIKE_CORTEX_M23", "CORTEX"], - "Cortex-M23-NS": ["M23", "CORTEX_M", "LIKE_CORTEX_M23", "CORTEX"], + "Cortex-M23-NS": ["M23", "M23_NS", "CORTEX_M", "LIKE_CORTEX_M23", "CORTEX"], "Cortex-M33": ["M33", "CORTEX_M", "LIKE_CORTEX_M33", "CORTEX"], - "Cortex-M33-NS": ["M33", "CORTEX_M", "LIKE_CORTEX_M33", "CORTEX"] + "Cortex-M33-NS": ["M33", "M33_NS", "CORTEX_M", "LIKE_CORTEX_M33", "CORTEX"] +} + +CORE_ARCH = { + "Cortex-M0": 6, + "Cortex-M0+": 6, + "Cortex-M1": 6, + "Cortex-M3": 7, + "Cortex-M4": 7, + "Cortex-M4F": 7, + "Cortex-M7": 7, + "Cortex-M7F": 7, + "Cortex-M7FD": 7, + "Cortex-A9": 7, + "Cortex-M23": 8, + "Cortex-M23-NS": 8, + "Cortex-M33": 8, + "Cortex-M33-NS": 8, } ################################################################################ @@ -65,7 +83,7 @@ """ def wrapper(*args, **kwargs): """The wrapped function itself""" - if not CACHES.has_key((func.__name__, args)): + if (func.__name__, args) not in CACHES: CACHES[(func.__name__, args)] = func(*args, **kwargs) return CACHES[(func.__name__, args)] return wrapper @@ -73,7 +91,7 @@ # Cumulative attributes can have values appended to them, so they # need to be computed differently than regular attributes -CUMULATIVE_ATTRIBUTES = ['extra_labels', 'macros', 'device_has', 'features'] +CUMULATIVE_ATTRIBUTES = ['extra_labels', 'macros', 'device_has', 'features', 'components'] def get_resolution_order(json_data, target_name, order, level=0): @@ -141,9 +159,10 @@ Target.__targets_json_location_default) for extra_target in Target.__extra_target_json_files: - for k, v in json_file_to_dict(extra_target).iteritems(): + for k, v in json_file_to_dict(extra_target).items(): if k in targets: - print 'WARNING: Custom target "%s" cannot replace existing target.' % k + print('WARNING: Custom target "%s" cannot replace existing ' + 'target.' % k) else: targets[k] = v @@ -203,8 +222,7 @@ def_idx = idx break else: - raise AttributeError("Attribute '%s' not found in target '%s'" - % (attrname, self.name)) + return [] # Get the starting value of the attribute starting_value = (tdata[self.resolution_order[def_idx][0]][attrname] or [])[:] @@ -212,16 +230,16 @@ # inheritance level, left to right order to figure out all the # other classes that change the definition by adding or removing # elements - for idx in xrange(self.resolution_order[def_idx][1] - 1, -1, -1): + for idx in range(self.resolution_order[def_idx][1] - 1, -1, -1): same_level_targets = [tar[0] for tar in self.resolution_order if tar[1] == idx] for tar in same_level_targets: data = tdata[tar] # Do we have anything to add ? - if data.has_key(attrname + "_add"): + if (attrname + "_add") in data: starting_value.extend(data[attrname + "_add"]) # Do we have anything to remove ? - if data.has_key(attrname + "_remove"): + if (attrname + "_remove") in data: # Macros can be defined either without a value (MACRO) # or with a value (MACRO=10). When removing, we specify # only the name of the macro, without the value. So we @@ -258,19 +276,14 @@ starting_value = None for tgt in self.resolution_order: data = tdata[tgt[0]] - if data.has_key(attrname): - starting_value = data[attrname] - break + try: + return data[attrname] + except KeyError: + pass else: # Attribute not found raise AttributeError( "Attribute '%s' not found in target '%s'" % (attrname, self.name)) - # 'progen' needs the full path to the template (the path in JSON is - # relative to tools/export) - if attrname == "progen": - return self.__add_paths_to_progen(starting_value) - else: - return starting_value def __getattr__(self, attrname): """ Return the value of an attribute. This function only computes the @@ -305,10 +318,6 @@ if "Target" in names: names.remove("Target") labels = (names + CORE_LABELS[self.core] + self.extra_labels) - # Automatically define UVISOR_UNSUPPORTED if the target doesn't - # specifically define UVISOR_SUPPORTED - if "UVISOR_SUPPORTED" not in labels: - labels.append("UVISOR_UNSUPPORTED") return labels def init_hooks(self, hook, toolchain): @@ -338,7 +347,7 @@ # "class_name" must refer to a class in this file, so check if the # class exists mdata = self.get_module_data() - if not mdata.has_key(class_name) or \ + if class_name not in mdata or \ not inspect.isclass(mdata[class_name]): raise HookError( ("Class '%s' required by '%s' in target '%s'" @@ -373,7 +382,7 @@ @staticmethod def lpc_patch(t_self, resources, elf, binf): """Patch an elf file""" - t_self.debug("LPC Patch: %s" % os.path.split(binf)[1]) + t_self.notify.debug("LPC Patch: %s" % os.path.split(binf)[1]) patch(binf) class LPC4088Code(object): @@ -407,7 +416,7 @@ # file to 'binf' shutil.rmtree(binf, True) os.rename(binf + '.temp', binf) - t_self.debug("Generated custom binary file (internal flash + SPIFI)") + t_self.notify.debug("Generated custom binary file (internal flash + SPIFI)") LPCTargetCode.lpc_patch(t_self, resources, elf, binf) class TEENSY3_1Code(object): @@ -427,7 +436,7 @@ loader = os.path.join(TOOLS_BOOTLOADERS, target_name, "bootloader.bin") target = binf + ".tmp" if not os.path.exists(loader): - print "Can't find bootloader binary: " + loader + print("Can't find bootloader binary: " + loader) return outbin = open(target, 'w+b') part = open(loader, 'rb') @@ -458,6 +467,11 @@ """A hoof for the MTS Dragonfly""" MTSCode._combine_bins_helper("MTS_DRAGONFLY_F411RE", binf) + @staticmethod + def combine_bins_mtb_mts_dragonfly(t_self, resources, elf, binf): + """A hook for the MTB MTS Dragonfly""" + MTSCode._combine_bins_helper("MTB_MTS_DRAGONFLY", binf) + class MCU_NRF51Code(object): """NRF51 Hooks""" @staticmethod @@ -469,8 +483,8 @@ in t_self.target.EXPECTED_SOFTDEVICES_WITH_OFFSETS: for hexf in resources.hex_files: if hexf.find(softdevice_and_offset_entry['name']) != -1: - t_self.debug("SoftDevice file found %s." - % softdevice_and_offset_entry['name']) + t_self.notify.debug("SoftDevice file found %s." + % softdevice_and_offset_entry['name']) sdf = hexf if sdf is not None: @@ -479,7 +493,7 @@ break if sdf is None: - t_self.debug("Hex file not found. Aborting.") + t_self.notify.debug("Hex file not found. Aborting.") return # Look for bootloader file that matches this soft device or bootloader @@ -488,13 +502,13 @@ if t_self.target.MERGE_BOOTLOADER is True: for hexf in resources.hex_files: if hexf.find(t_self.target.OVERRIDE_BOOTLOADER_FILENAME) != -1: - t_self.debug("Bootloader file found %s." - % t_self.target.OVERRIDE_BOOTLOADER_FILENAME) + t_self.notify.debug("Bootloader file found %s." + % t_self.target.OVERRIDE_BOOTLOADER_FILENAME) blf = hexf break elif hexf.find(softdevice_and_offset_entry['boot']) != -1: - t_self.debug("Bootloader file found %s." - % softdevice_and_offset_entry['boot']) + t_self.notify.debug("Bootloader file found %s." + % softdevice_and_offset_entry['boot']) blf = hexf break @@ -508,14 +522,16 @@ binh.loadbin(binf, softdevice_and_offset_entry['offset']) if t_self.target.MERGE_SOFT_DEVICE is True: - t_self.debug("Merge SoftDevice file %s" - % softdevice_and_offset_entry['name']) + t_self.notify.debug("Merge SoftDevice file %s" + % softdevice_and_offset_entry['name']) sdh = IntelHex(sdf) + sdh.start_addr = None binh.merge(sdh) if t_self.target.MERGE_BOOTLOADER is True and blf is not None: - t_self.debug("Merge BootLoader file %s" % blf) + t_self.notify.debug("Merge BootLoader file %s" % blf) blh = IntelHex(blf) + blh.start_addr = None binh.merge(blh) with open(binf.replace(".bin", ".hex"), "w") as fileout: