mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

UserRevisionLine numberNew contents of line
be_bryan 0:b74591d5ab33 1 import os
be_bryan 0:b74591d5ab33 2 from os.path import sep, join, exists
be_bryan 0:b74591d5ab33 3 from itertools import groupby
be_bryan 0:b74591d5ab33 4 from xml.etree.ElementTree import Element, tostring
be_bryan 0:b74591d5ab33 5 import ntpath
be_bryan 0:b74591d5ab33 6 import re
be_bryan 0:b74591d5ab33 7 import json
be_bryan 0:b74591d5ab33 8
be_bryan 0:b74591d5ab33 9 from tools.arm_pack_manager import Cache
be_bryan 0:b74591d5ab33 10 from tools.targets import TARGET_MAP
be_bryan 0:b74591d5ab33 11 from tools.export.exporters import Exporter, TargetNotSupportedException
be_bryan 0:b74591d5ab33 12
be_bryan 0:b74591d5ab33 13 class fileCMSIS():
be_bryan 0:b74591d5ab33 14 """CMSIS file class.
be_bryan 0:b74591d5ab33 15
be_bryan 0:b74591d5ab33 16 Encapsulates information necessary for files in cpdsc project file"""
be_bryan 0:b74591d5ab33 17 file_types = {'.cpp': 'sourceCpp', '.c': 'sourceC', '.s': 'sourceAsm',
be_bryan 0:b74591d5ab33 18 '.obj': 'object', '.o': 'object', '.lib': 'library',
be_bryan 0:b74591d5ab33 19 '.ar': 'linkerScript', '.h': 'header', '.sct': 'linkerScript'}
be_bryan 0:b74591d5ab33 20
be_bryan 0:b74591d5ab33 21 def __init__(self, loc, name):
be_bryan 0:b74591d5ab33 22 #print loc
be_bryan 0:b74591d5ab33 23 _, ext = os.path.splitext(loc)
be_bryan 0:b74591d5ab33 24 self.type = self.file_types[ext.lower()]
be_bryan 0:b74591d5ab33 25 self.loc = loc
be_bryan 0:b74591d5ab33 26 self.name = name
be_bryan 0:b74591d5ab33 27
be_bryan 0:b74591d5ab33 28
be_bryan 0:b74591d5ab33 29 class DeviceCMSIS():
be_bryan 0:b74591d5ab33 30 """CMSIS Device class
be_bryan 0:b74591d5ab33 31
be_bryan 0:b74591d5ab33 32 Encapsulates target information retrieved by arm-pack-manager"""
be_bryan 0:b74591d5ab33 33
be_bryan 0:b74591d5ab33 34 CACHE = Cache(True, False)
be_bryan 0:b74591d5ab33 35 def __init__(self, target):
be_bryan 0:b74591d5ab33 36 target_info = self.check_supported(target)
be_bryan 0:b74591d5ab33 37 if not target_info:
be_bryan 0:b74591d5ab33 38 raise TargetNotSupportedException("Target not supported in CMSIS pack")
be_bryan 0:b74591d5ab33 39 self.url = target_info['pdsc_file']
be_bryan 0:b74591d5ab33 40 self.pack_url, self.pack_id = ntpath.split(self.url)
be_bryan 0:b74591d5ab33 41 self.dname = target_info["_cpu_name"]
be_bryan 0:b74591d5ab33 42 self.core = target_info["_core"]
be_bryan 0:b74591d5ab33 43 self.dfpu = target_info['processor']['fpu']
be_bryan 0:b74591d5ab33 44 self.debug, self.dvendor = self.vendor_debug(target_info['vendor'])
be_bryan 0:b74591d5ab33 45 self.dendian = target_info['processor'].get('endianness','Little-endian')
be_bryan 0:b74591d5ab33 46 self.debug_svd = target_info.get('debug', '')
be_bryan 0:b74591d5ab33 47 self.compile_header = target_info['compile']['header']
be_bryan 0:b74591d5ab33 48 self.target_info = target_info
be_bryan 0:b74591d5ab33 49
be_bryan 0:b74591d5ab33 50 @staticmethod
be_bryan 0:b74591d5ab33 51 def check_supported(target):
be_bryan 0:b74591d5ab33 52 t = TARGET_MAP[target]
be_bryan 0:b74591d5ab33 53 try:
be_bryan 0:b74591d5ab33 54 cpu_name = t.device_name
be_bryan 0:b74591d5ab33 55 target_info = DeviceCMSIS.CACHE.index[cpu_name]
be_bryan 0:b74591d5ab33 56 # Target does not have device name or pdsc file
be_bryan 0:b74591d5ab33 57 except:
be_bryan 0:b74591d5ab33 58 try:
be_bryan 0:b74591d5ab33 59 # Try to find the core as a generic CMSIS target
be_bryan 0:b74591d5ab33 60 cpu_name = DeviceCMSIS.cpu_cmsis(t.core)
be_bryan 0:b74591d5ab33 61 target_info = DeviceCMSIS.CACHE.index[cpu_name]
be_bryan 0:b74591d5ab33 62 except:
be_bryan 0:b74591d5ab33 63 return False
be_bryan 0:b74591d5ab33 64 target_info["_cpu_name"] = cpu_name
be_bryan 0:b74591d5ab33 65 target_info["_core"] = t.core
be_bryan 0:b74591d5ab33 66 return target_info
be_bryan 0:b74591d5ab33 67
be_bryan 0:b74591d5ab33 68 def vendor_debug(self, vendor):
be_bryan 0:b74591d5ab33 69 """Reads the vendor from a PDSC <dvendor> tag.
be_bryan 0:b74591d5ab33 70 This tag contains some additional numeric information that is meaningless
be_bryan 0:b74591d5ab33 71 for our purposes, so we use a regex to filter.
be_bryan 0:b74591d5ab33 72
be_bryan 0:b74591d5ab33 73 Positional arguments:
be_bryan 0:b74591d5ab33 74 Vendor - information in <dvendor> tag scraped from ArmPackManager
be_bryan 0:b74591d5ab33 75
be_bryan 0:b74591d5ab33 76 Returns a tuple of (debugger, vendor)
be_bryan 0:b74591d5ab33 77 """
be_bryan 0:b74591d5ab33 78 reg = "([\w\s]+):?\d*?"
be_bryan 0:b74591d5ab33 79 m = re.search(reg, vendor)
be_bryan 0:b74591d5ab33 80 vendor_match = m.group(1) if m else None
be_bryan 0:b74591d5ab33 81 debug_map ={
be_bryan 0:b74591d5ab33 82 'STMicroelectronics':'ST-Link',
be_bryan 0:b74591d5ab33 83 'Silicon Labs':'J-LINK',
be_bryan 0:b74591d5ab33 84 'Nuvoton':'NULink'
be_bryan 0:b74591d5ab33 85 }
be_bryan 0:b74591d5ab33 86 return debug_map.get(vendor_match, "CMSIS-DAP"), vendor_match
be_bryan 0:b74591d5ab33 87
be_bryan 0:b74591d5ab33 88 @staticmethod
be_bryan 0:b74591d5ab33 89 def cpu_cmsis(cpu):
be_bryan 0:b74591d5ab33 90 """
be_bryan 0:b74591d5ab33 91 Transforms information from targets.json to the way the generic cores are named
be_bryan 0:b74591d5ab33 92 in CMSIS PDSC files.
be_bryan 0:b74591d5ab33 93 Ex:
be_bryan 0:b74591d5ab33 94 Cortex-M4F => ARMCM4_FP, Cortex-M0+ => ARMCM0P
be_bryan 0:b74591d5ab33 95 Returns formatted CPU
be_bryan 0:b74591d5ab33 96 """
be_bryan 0:b74591d5ab33 97 cpu = cpu.replace("Cortex-","ARMC")
be_bryan 0:b74591d5ab33 98 cpu = cpu.replace("+","P")
be_bryan 0:b74591d5ab33 99 cpu = cpu.replace("F","_FP")
be_bryan 0:b74591d5ab33 100 return cpu
be_bryan 0:b74591d5ab33 101
be_bryan 0:b74591d5ab33 102
be_bryan 0:b74591d5ab33 103 class CMSIS(Exporter):
be_bryan 0:b74591d5ab33 104 NAME = 'cmsis'
be_bryan 0:b74591d5ab33 105 TOOLCHAIN = 'ARM'
be_bryan 0:b74591d5ab33 106
be_bryan 0:b74591d5ab33 107 @classmethod
be_bryan 0:b74591d5ab33 108 def is_target_supported(cls, target_name):
be_bryan 0:b74591d5ab33 109 target = TARGET_MAP[target_name]
be_bryan 0:b74591d5ab33 110 return cls.TOOLCHAIN in target.supported_toolchains
be_bryan 0:b74591d5ab33 111
be_bryan 0:b74591d5ab33 112 def make_key(self, src):
be_bryan 0:b74591d5ab33 113 """turn a source file into its group name"""
be_bryan 0:b74591d5ab33 114 key = src.name.split(sep)[0]
be_bryan 0:b74591d5ab33 115 if key == ".":
be_bryan 0:b74591d5ab33 116 key = os.path.basename(os.path.realpath(self.export_dir))
be_bryan 0:b74591d5ab33 117 return key
be_bryan 0:b74591d5ab33 118
be_bryan 0:b74591d5ab33 119 def group_project_files(self, sources, root_element):
be_bryan 0:b74591d5ab33 120 """Recursively group the source files by their encompassing directory"""
be_bryan 0:b74591d5ab33 121
be_bryan 0:b74591d5ab33 122 data = sorted(sources, key=self.make_key)
be_bryan 0:b74591d5ab33 123 for group, files in groupby(data, self.make_key):
be_bryan 0:b74591d5ab33 124 new_srcs = []
be_bryan 0:b74591d5ab33 125 for f in list(files):
be_bryan 0:b74591d5ab33 126 spl = f.name.split(sep)
be_bryan 0:b74591d5ab33 127 if len(spl) <= 2:
be_bryan 0:b74591d5ab33 128 file_element = Element('file',
be_bryan 0:b74591d5ab33 129 attrib={
be_bryan 0:b74591d5ab33 130 'category':f.type,
be_bryan 0:b74591d5ab33 131 'name': f.loc})
be_bryan 0:b74591d5ab33 132 root_element.append(file_element)
be_bryan 0:b74591d5ab33 133 else:
be_bryan 0:b74591d5ab33 134 f.name = os.path.join(*spl[1:])
be_bryan 0:b74591d5ab33 135 new_srcs.append(f)
be_bryan 0:b74591d5ab33 136 if new_srcs:
be_bryan 0:b74591d5ab33 137 group_element = Element('group',attrib={'name':group})
be_bryan 0:b74591d5ab33 138 root_element.append(self.group_project_files(new_srcs,
be_bryan 0:b74591d5ab33 139 group_element))
be_bryan 0:b74591d5ab33 140 return root_element
be_bryan 0:b74591d5ab33 141
be_bryan 0:b74591d5ab33 142 def generate(self):
be_bryan 0:b74591d5ab33 143 srcs = self.resources.headers + self.resources.s_sources + \
be_bryan 0:b74591d5ab33 144 self.resources.c_sources + self.resources.cpp_sources + \
be_bryan 0:b74591d5ab33 145 self.resources.objects + self.resources.libraries + \
be_bryan 0:b74591d5ab33 146 [self.resources.linker_script]
be_bryan 0:b74591d5ab33 147 srcs = [fileCMSIS(src, src) for src in srcs if src]
be_bryan 0:b74591d5ab33 148 ctx = {
be_bryan 0:b74591d5ab33 149 'name': self.project_name,
be_bryan 0:b74591d5ab33 150 'project_files': tostring(self.group_project_files(srcs, Element('files'))),
be_bryan 0:b74591d5ab33 151 'device': DeviceCMSIS(self.target),
be_bryan 0:b74591d5ab33 152 'date': ''
be_bryan 0:b74591d5ab33 153 }
be_bryan 0:b74591d5ab33 154 self.gen_file('cmsis/cpdsc.tmpl', ctx, 'project.cpdsc')