Skip to content

Commit fd86fef

Browse files
committed
[uvision] Flash DLL string/debug
Versioning for arm-pack-manager
1 parent 2a907d2 commit fd86fef

File tree

5 files changed

+123
-55
lines changed

5 files changed

+123
-55
lines changed

tools/arm_pack_manager/__init__.py

Lines changed: 17 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,22 @@ def _extract_dict(self, device, filename, pack) :
162162
size=m["size"]))
163163
for m in device("memory")])
164164
except (KeyError, TypeError, IndexError) as e : pass
165-
try: to_ret["algorithm"] = dict(name=device.algorithm["name"].replace('\\','/'),
166-
start=device.algorithm["start"],
167-
size=device.algorithm["size"],
168-
RAMstart=device.algorithm.get("ramstart",None),
169-
RAMsize=device.algorithm.get("ramsize",None))
170-
171-
172-
except (KeyError, TypeError, IndexError) as e : pass
165+
try: algorithms = device("algorithm")
166+
except:
167+
try: algorithms = device.parent("algorithm")
168+
except: pass
169+
else:
170+
if not algorithms:
171+
try: algorithms = device.parent("algorithm")
172+
except: pass
173+
try : to_ret["algorithm"] = dict([(algo.get("name").replace('\\','/'),
174+
dict(start=algo["start"],
175+
size=algo["size"],
176+
ramstart=algo.get("ramstart",None),
177+
ramsize=algo.get("ramsize",None),
178+
default=algo.get("default",1)))
179+
for algo in algorithms])
180+
except (KeyError, TypeError, IndexError) as e: pass
173181
try: to_ret["debug"] = device.parent.parent.debug["svd"]
174182
except (KeyError, TypeError, IndexError) as e : pass
175183
try: to_ret["debug"] = device.parent.debug["svd"]
@@ -225,48 +233,11 @@ def _extract_dict(self, device, filename, pack) :
225233

226234
return to_ret
227235

228-
def _apply_device_debug(self, device, debug):
229-
if device:
230-
self._index[device].setdefault('debug-interface', [])
231-
if "JTAG" not in debug and \
232-
debug not in self._index[device]['debug-interface']:
233-
self._index[device]['debug-interface'].append(debug)
234-
235-
def _apply_group_debug(self, key, search_val, pdsc, debug):
236-
for fam in pdsc.findAll(key, {'d'+key: search_val}):
237-
for dev in fam.findAll("device"):
238-
self._apply_device_debug(dev("dname"), debug)
239-
240-
def _update_debug(self, d):
241-
try:
242-
pdsc = self.pdsc_from_cache(d)
243-
for dev in pdsc("board"):
244-
try:
245-
debug = dev.debuginterface['adapter']
246-
except:
247-
try:
248-
odbg = dev.find("feature",{"type":"ODbg"})
249-
debug = odbg["name"]
250-
except:
251-
continue
252-
for device in dev("compatibledevice") + dev("mounteddevice"):
253-
self._apply_group_debug("family",
254-
device.get("dfamily",None),
255-
pdsc, debug)
256-
self._apply_group_debug("subfamily",
257-
device.get("dsubfamily", None),
258-
pdsc, debug)
259-
self._apply_device_debug(device.get("dname", None), debug)
260-
except (KeyError, TypeError, IndexError) as e:
261-
stderr.write("[ ERROR ] file {}\n".format(d))
262-
print(e)
263-
264236
def _generate_index_helper(self, d) :
265237
try :
266238
pack = self.pdsc_to_pack(d)
267239
self._index.update(dict([(dev['dname'], self._extract_dict(dev, d, pack)) for dev in
268240
(self.pdsc_from_cache(d)("device"))]))
269-
self._update_debug(d)
270241
except AttributeError as e :
271242
stderr.write("[ ERROR ] file {}\n".format(d))
272243
print(e)
@@ -318,6 +289,7 @@ def generate_index(self) :
318289
self.counter = 0
319290
do_queue(Reader, self._generate_index_helper, self.get_urls())
320291
with open(join(save_data_path('arm-pack-manager'), "index.json"), "wb+") as out:
292+
self._index["version"] = "0.1.0"
321293
dump(self._index, out)
322294
stdout.write("\n")
323295

tools/export/cmsis/__init__.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from xml.etree.ElementTree import Element, tostring
55
import ntpath
66
import re
7+
import json
78

89
from xdg.BaseDirectory import save_data_path
910

@@ -34,7 +35,7 @@ class DeviceCMSIS():
3435
def __init__(self, target):
3536
cache = Cache(True, False)
3637
data_path = join(save_data_path('arm-pack-manager'), "index.json")
37-
if not exists(data_path):
38+
if not exists(data_path) or not self.check_version(data_path):
3839
cache.cache_descriptors()
3940

4041
t = TARGET_MAP[target]
@@ -51,15 +52,22 @@ def __init__(self, target):
5152
except:
5253
raise TargetNotSupportedException("Target not in CMSIS packs")
5354

55+
self.target_info = target_info
56+
5457
self.url = target_info['pdsc_file']
5558
self.pack_url, self.pack_id = ntpath.split(self.url)
5659
self.dname = cpu_name
5760
self.dfpu = target_info['processor']['fpu']
58-
self.debug_interface, self.dvendor = self.vendor_debug(target_info['vendor'])
61+
self.debug, self.dvendor = self.vendor_debug(target_info['vendor'])
5962
self.dendian = target_info['processor'].get('endianness','Little-endian')
6063
self.debug_svd = target_info.get('debug', '')
6164
self.compile_header = target_info['compile']['header']
6265

66+
def check_version(self, filename):
67+
with open(filename) as data_file:
68+
data = json.load(data_file)
69+
return data.get("version", "0") == "0.1.0"
70+
6371
def vendor_debug(self, vendor):
6472
reg = "([\w\s]+):?\d*?"
6573
m = re.search(reg, vendor)
@@ -79,6 +87,7 @@ def cpu_cmsis(self):
7987
cpu = cpu.replace("F","_FP")
8088
return cpu
8189

90+
8291
class CMSIS(Exporter):
8392
NAME = 'cmsis'
8493
TOOLCHAIN = 'ARM'

tools/export/iar/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def generate(self):
108108
'include_paths': [self.format_file(src) for src in self.resources.inc_dirs],
109109
'device': self.iar_device(),
110110
'ewp': sep+self.project_name + ".ewp",
111-
'debugger': DeviceCMSIS(self.target).debug_interface.replace('-','').upper()
111+
'debugger': DeviceCMSIS(self.target).debug.replace('-','').upper()
112112
}
113113
ctx.update(flags)
114114

tools/export/uvision/__init__.py

Lines changed: 70 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from collections import namedtuple
66
from distutils.spawn import find_executable
77
import subprocess
8+
import re
89

910
from tools.arm_pack_manager import Cache
1011
from tools.targets import TARGET_MAP
@@ -26,10 +27,11 @@ def __init__(self, target):
2627
self.svd = dev_format.format(self.dname, self.debug_svd)
2728
self.reg_file = dev_format.format(self.dname, self.compile_header)
2829
self.debug_interface = self.uv_debug()
30+
self.flash_dll = self.generate_flash_dll()
2931

3032
def uv_debug(self):
3133
"""Return a namedtuple of information about uvision debug settings"""
32-
UVDebug = namedtuple('UVDebug',['bin_loc','core_flag'])
34+
UVDebug = namedtuple('UVDebug',['bin_loc','core_flag', 'key'])
3335

3436
# CortexMXn => pCMX
3537
cpu = self.core.replace("Cortex-", "C")
@@ -38,12 +40,72 @@ def uv_debug(self):
3840
cpu_flag = "p"+cpu
3941

4042
# Locations found in Keil_v5/TOOLS.INI
41-
debuggers = {"st-link":'STLink\\ST-LINKIII-KEIL_SWO.dll',
42-
"j-link":'Segger\\JL2CM3.dll',
43-
"cmsis-dap":'BIN\\CMSIS_AGDI.dll',
44-
"nulink":'NULink\\Nu_Link.dll'}
45-
binary = debuggers[self.debug_interface.lower()]
46-
return UVDebug(binary, cpu_flag)
43+
debuggers = {"st-link": ('STLink\\ST-LINKIII-KEIL_SWO.dll', 'ST-LINKIII-KEIL_SWO'),
44+
"j-link":('Segger\\JL2CM3.dll', 'JL2CM3'),
45+
"cmsis-dap":('BIN\\CMSIS_AGDI.dll', 'CMSIS_AGDI'),
46+
"nulink":('NULink\\Nu_Link.dll','Nu_Link')}
47+
res = debuggers[self.debug.lower()]
48+
binary = res[0]
49+
key = res[1]
50+
51+
return UVDebug(binary, cpu_flag, key)
52+
53+
def generate_flash_dll(self):
54+
'''Flash DLL string from uvision
55+
S = SW/JTAG Clock ID
56+
C = CPU index in JTAG chain
57+
P = Access Port
58+
For the Options for Target -> Debug tab -> settings -> "Flash" tab in the dialog:
59+
FD = RAM Start for Flash Functions
60+
FC = RAM Size for Flash Functions
61+
FN = Number of Flash types
62+
FF = Flash File Name (without an extension)
63+
FS = Start Address of the Flash Device
64+
FL = Size of the Flash Device
65+
FP = Full path to the Device algorithm (RTE)
66+
67+
Necessary to flash some targets. Info gathered from algorithms field of pdsc file.
68+
'''
69+
fl_count = 0
70+
def get_mem_no_x(mem_str):
71+
mem_reg = "\dx(\w+)"
72+
m = re.search(mem_reg, mem_str)
73+
return m.group(1) if m else None
74+
75+
RAMS = [(get_mem_no_x(info["start"]), get_mem_no_x(info["size"]))
76+
for mem, info in self.target_info["memory"].items() if "RAM" in mem]
77+
format_str = "UL2CM3(-S0 -C0 -P0 -FD{ramstart}"+" -FC{ramsize} "+"-FN{num_algos} {extra_flags})"
78+
ramstart = ''
79+
#Default according to Keil developer
80+
ramsize = '1000'
81+
if len(RAMS)>=1:
82+
ramstart = RAMS[0][0]
83+
extra_flags = []
84+
for name, info in self.target_info["algorithm"].items():
85+
if int(info["default"])==0:
86+
continue
87+
name_reg = "\w*/([\w_]+)\.flm"
88+
m = re.search(name_reg, name.lower())
89+
fl_name = m.group(1) if m else None
90+
name_flag = "-FF" + str(fl_count) + fl_name
91+
92+
start, size = get_mem_no_x(info["start"]), get_mem_no_x(info["size"])
93+
rom_start_flag = "-FS"+str(fl_count)+str(start)
94+
rom_size_flag = "-FL" + str(fl_count) + str(size)
95+
96+
if info["ramstart"] is not None and info["ramsize"] is not None:
97+
ramstart = get_mem_no_x(info["ramstart"])
98+
ramsize = get_mem_no_x(info["ramsize"])
99+
100+
path_flag = "-FP" + str(fl_count) + "($$Device:"+self.dname+"$"+name+")"
101+
102+
extra_flags.extend([name_flag, rom_start_flag, rom_size_flag, path_flag])
103+
fl_count += 1
104+
105+
extra = " ".join(extra_flags)
106+
return format_str.format(ramstart=ramstart,
107+
ramsize=ramsize,
108+
extra_flags=extra, num_algos=fl_count)
47109

48110

49111
class Uvision(Exporter):
@@ -134,6 +196,7 @@ def generate(self):
134196
or 'd' in ctx['device'].core.lower() else 2
135197
ctx.update(self.format_flags())
136198
self.gen_file('uvision/uvision.tmpl', ctx, self.project_name+".uvprojx")
199+
self.gen_file('uvision/uvision_debug.tmpl', ctx, self.project_name + ".uvoptx")
137200

138201
def build(self):
139202
ERRORLEVEL = {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
3+
<SchemaVersion>1.0</SchemaVersion>
4+
<Target>
5+
<TargetName>{{name}}</TargetName>
6+
<ToolsetNumber>0x4</ToolsetNumber>
7+
<ToolsetName>ARM-ADS</ToolsetName>
8+
<TargetOption>
9+
<DebugOpt>
10+
<uSim>0</uSim>
11+
<uTrg>1</uTrg>
12+
<nTsel>11</nTsel>
13+
<pMon>{{device.debug_interface.bin_loc}}</pMon>
14+
</DebugOpt>
15+
<TargetDriverDllRegistry>
16+
<SetRegEntry>
17+
<Number>0</Number>
18+
<Key>{{device.debug_interface.key}}</Key>
19+
<Name>{{device.flash_dll}}</Name>
20+
</SetRegEntry>
21+
</TargetDriverDllRegistry>
22+
</TargetOption>
23+
</Target>
24+
</ProjectOpt>

0 commit comments

Comments
 (0)