/******************************************************************************* * Copyright (c) 2015 ARM Ltd. and others * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * ARM Ltd and ARM Germany GmbH - Initial API and implementation *******************************************************************************/ package com.arm.cmsis.pack.data; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import com.arm.cmsis.pack.common.CmsisConstants; import com.arm.cmsis.pack.enums.EDebugProtocolType; /** * Convenience class to access debug/trace device configuration */ public class CpDebugConfiguration extends CpItem implements ICpDebugConfiguration { protected Map<Integer, ICpDebug> debugItems = new HashMap<Integer, ICpDebug>(); protected ICpTrace traceItem = null; protected ICpDebugVars debugVars = null; protected String sdfFileName = CmsisConstants.EMPTY_STRING; protected Map<Long, ICpDebugPort> debugPorts = new HashMap<Long, ICpDebugPort>(); protected Map<String, ICpSequence> sequences = new HashMap<String, ICpSequence>(); protected Map<String, ICpMemory> memoryItems = new HashMap<String, ICpMemory>(); protected ICpMemory defaultMemory; protected ICpMemory startupMemory; protected Map<String, ICpAlgorithm> algorithms = new HashMap<String, ICpAlgorithm>(); public CpDebugConfiguration(ICpItem parent) { super(parent, CmsisConstants.DEBUGCONFIG_TAG); } public CpDebugConfiguration(ICpItem parent, String tag) { super(parent, tag); } @Override public EDebugProtocolType getDefaultProtocolType() { String type = attributes().getAttribute(CmsisConstants.DEFAULT); return EDebugProtocolType.fromString(type); } @Override public boolean isSWJ() { return attributes().getAttributeAsBoolean(CmsisConstants.SWJ, true); } @Override public long getDefaultClock() { return attributes().getAttributeAsLong(CmsisConstants.CLOCK, CmsisConstants.DEFAULT_DEBUG_CLOCK); } @Override public String getSdfFile() { return sdfFileName; } @Override public String getSvdFile() { ICpDebug dbgItem = getDebugItem(); if(dbgItem != null) return dbgItem.getSvdFile(); return CmsisConstants.EMPTY_STRING; } @Override public ICpDebug getDebugItem() { return getDebugItem(0); } @Override public ICpDebug getDebugItem(int punitIndex) { return debugItems.get(punitIndex); } @Override public ICpTrace getTraceItem() { return traceItem; } @Override public boolean isTraceSupported() { ICpTrace ti = getTraceItem(); if(ti != null) return ti.isSupported(); return false; } @Override public ICpDebugVars getDebugVars() { return debugVars; } @Override public Map<Long, ICpDebugPort> getDebugPorts() { return debugPorts; } @Override public ICpDebugPort getDebugPort(long index) { return debugPorts.get(index); } @Override public Map<String, ICpSequence> getSequences() { return sequences; } @Override public ICpSequence getSequence(String name) { return sequences.get(name); } @Override public Collection<ICpAlgorithm> getAlgorithms() { return algorithms.values(); } @Override public Collection<ICpAlgorithm> getDefaultAlgorithms() { List<ICpAlgorithm> defaultAlgos = new LinkedList<ICpAlgorithm>(); for(ICpAlgorithm a : algorithms.values()) { if(a.isDefault()) defaultAlgos.add(a); } return defaultAlgos; } @Override public Map<String, ICpMemory> getMemoryItems() { return memoryItems; } @Override public ICpMemory getMemory(String id) { return memoryItems.get(id); } @Override public ICpMemory getDefaulMemory() { return defaultMemory; } @Override public ICpMemory getStartupMemory() { return startupMemory; } /** * Initializes debug configuration with effective properties * @param effectiveProperties ICpItem containing effective device properties for given processor */ public void init(ICpItem effectiveProperties) { processEffectiveProperties(effectiveProperties); if(debugPorts.isEmpty()) { ICpDebugPort debugPort = createDefaultDebugPort(); debugPorts.put(debugPort.getDP(), debugPort); } } protected void processEffectiveProperties(ICpItem effectiveProperties) { if(effectiveProperties == null) return; Collection<? extends ICpItem> children = effectiveProperties.getChildren(); if(children == null) return; for(ICpItem item : children) { String tag = item.getTag(); if(tag.equals(CmsisConstants.DEBUGCONFIG_TAG)) { attributes().mergeAttributes(item.attributes()); sdfFileName = item.getAbsolutePath(item.getAttribute(CmsisConstants.SDF)); continue; } if(tag.equals(CmsisConstants.SEQUENCES_TAG)) { addSequences(item); continue; } if(item instanceof ICpDebugPort) { ICpDebugPort debugPort = (ICpDebugPort)item; debugPorts.put(debugPort.getDP(), debugPort); continue; } if(item instanceof ICpDebug) { ICpDebug dbgItem = (ICpDebug)item; int punitIndex = dbgItem.getPunitIndex(); debugItems.put(punitIndex, dbgItem); continue; } if(item instanceof ICpTrace) { traceItem = (ICpTrace)item; continue; } if(item instanceof ICpDebugVars) { debugVars = (ICpDebugVars)item; continue; } if(item instanceof ICpMemory) { ICpMemory mem = (ICpMemory)item; String id = mem.getId(); if(memoryItems.containsKey(id)) continue; memoryItems.put(id, mem); if(defaultMemory == null && mem.isDefault()) defaultMemory = mem; if(startupMemory == null && mem.isStartup()) startupMemory = mem; continue; } if(item instanceof ICpAlgorithm) { ICpAlgorithm a = (ICpAlgorithm)item; String fileName = a.getAlgorithmFile(); if(!algorithms.containsKey(fileName)) algorithms.put(fileName, a); continue; } } } protected void addSequences(ICpItem sequencesItem) { Collection<? extends ICpItem> children = sequencesItem.getChildren(); if(children == null) return; String processorName = getProcessorName(); for(ICpItem item : children) { if(item instanceof ICpSequence) { ICpSequence s = (ICpSequence)item; String pname = s.getProcessorName(); if(pname.isEmpty() || pname.equals(processorName)) { String name = s.getName(); if(!sequences.containsKey(name)) sequences.put(name, s); } } } } protected ICpDebugPort createDefaultDebugPort() { CpDebugPort debugPort = new CpDebugPort(null); addChild(new CpDebugProtocol(this, CmsisConstants.SWD)); addChild(new CpDebugProtocol(this, CmsisConstants.JTAG)); addChild(new CpDebugProtocol(this, CmsisConstants.CJTAG)); return debugPort; } }