diff options
author | Alena Laskavaia | 2008-05-02 18:14:50 +0000 |
---|---|---|
committer | Alena Laskavaia | 2008-05-02 18:14:50 +0000 |
commit | 8a4f9177cd0d32b8d4b12447b5e186e4318bc746 (patch) | |
tree | 097964a6122061fc003dc32faefd44ea68b204a6 /jtag | |
parent | 749ea1343156dcd1b1af8fc58f5323b853914e4a (diff) | |
download | org.eclipse.cdt-8a4f9177cd0d32b8d4b12447b5e186e4318bc746.tar.gz org.eclipse.cdt-8a4f9177cd0d32b8d4b12447b5e186e4318bc746.tar.xz org.eclipse.cdt-8a4f9177cd0d32b8d4b12447b5e186e4318bc746.zip |
bug 229946 - applied Andy's patch - advanced UI support for hardware lunch
Diffstat (limited to 'jtag')
22 files changed, 1314 insertions, 185 deletions
diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/META-INF/MANIFEST.MF b/jtag/org.eclipse.cdt.debug.gdbjtag.core/META-INF/MANIFEST.MF index ad1363caad6..74cf52d699d 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/META-INF/MANIFEST.MF +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/META-INF/MANIFEST.MF @@ -13,5 +13,6 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.cdt.core, org.eclipse.core.variables Eclipse-LazyStart: true -Export-Package: org.eclipse.cdt.debug.gdbjtag.core +Export-Package: org.eclipse.cdt.debug.gdbjtag.core, + org.eclipse.cdt.debug.gdbjtag.core.jtagdevice Bundle-Vendor: %providerName diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/plugin.properties b/jtag/org.eclipse.cdt.debug.gdbjtag.core/plugin.properties index d5f1755892c..78d4dcc0a69 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/plugin.properties +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/plugin.properties @@ -11,3 +11,5 @@ launchConfig.name=GDB Hardware Debugging pluginName=Eclipse GDB Hardware Debug Core Plug-in providerName=Eclipse.org + +JTagDevice.name=JTAG Device diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/plugin.xml b/jtag/org.eclipse.cdt.debug.gdbjtag.core/plugin.xml index a26dd638b1c..3a4dff0fec8 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/plugin.xml +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/plugin.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.2"?> <plugin> + <extension-point id="JTagDevice" name="%JTagDevice.name" schema="schema/JTagDevice.exsd"/> <extension point="org.eclipse.debug.core.launchConfigurationTypes"> <launchConfigurationType diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/schema/JTagDevice.exsd b/jtag/org.eclipse.cdt.debug.gdbjtag.core/schema/JTagDevice.exsd new file mode 100644 index 00000000000..b4b24b6b732 --- /dev/null +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/schema/JTagDevice.exsd @@ -0,0 +1,116 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Schema file written by PDE --> +<schema targetNamespace="org.eclipse.cdt.debug.gdbjtag.core"> +<annotation> + <appInfo> + <meta.schema plugin="org.eclipse.cdt.debug.gdbjtag.core" id="JTagDevice" name="%JTagDevice.name"/> + </appInfo> + <documentation> + [Enter description of this extension point.] + </documentation> + </annotation> + + <element name="extension"> + <complexType> + <sequence> + <element ref="device" minOccurs="1" maxOccurs="unbounded"/> + </sequence> + <attribute name="point" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="id" type="string"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="name" type="string"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + </complexType> + </element> + + <element name="device"> + <complexType> + <attribute name="id" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="name" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="class" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + <appInfo> + <meta.attribute kind="java" basedOn=":org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice"/> + </appInfo> + </annotation> + </attribute> + </complexType> + </element> + + <annotation> + <appInfo> + <meta.section type="since"/> + </appInfo> + <documentation> + [Enter the first release in which this extension point appears.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="examples"/> + </appInfo> + <documentation> + [Enter extension point usage example here.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="apiInfo"/> + </appInfo> + <documentation> + [Enter API information here.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="implementation"/> + </appInfo> + <documentation> + [Enter information about supplied implementation of this extension point.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="copyright"/> + </appInfo> + <documentation> + + </documentation> + </annotation> + +</schema> diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/Activator.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/Activator.java index 2db3a79967d..fdad83e91be 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/Activator.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/Activator.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 QNX Software Systems and others + * Copyright (c) 2008 QNX Software Systems 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 @@ -7,9 +7,11 @@ * * Contributors: * QNX Software Systems - initial API and implementation + * Andy Jin - Hardware debugging UI improvements, bug 229946 *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.core; +import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Plugin; import org.osgi.framework.BundleContext; @@ -19,7 +21,7 @@ import org.osgi.framework.BundleContext; public class Activator extends Plugin { // The plug-in ID - public static final String PLUGIN_ID = "org.eclipse.cdt.debug.gdbremote.core"; + public static final String PLUGIN_ID = "org.eclipse.cdt.debug.gdbjtag.core"; // The shared instance private static Activator plugin; @@ -57,4 +59,20 @@ public class Activator extends Plugin { return plugin; } + /** + * Convenience method which returns the unique identifier of this plugin. + */ + public static String getUniqueIdentifier() { + return PLUGIN_ID; + } + + /** + * Logs the specified status with this plug-in's log. + * + * @param status status to log + */ + public static void log( IStatus status ) { + getDefault().getLog().log( status ); + } + } diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/GDBJtagDebugger.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/GDBJtagDebugger.java index d79886f2d58..d3707479bb0 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/GDBJtagDebugger.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/GDBJtagDebugger.java @@ -1,23 +1,30 @@ -/********************************************************************** - * Copyright (c) 2007 QNX Software Systems and others. +/******************************************************************************* + * Copyright (c) 2007 - 2008 QNX Software Systems 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: + * + * Contributors: * QNX Software Systems - Initial API and implementation - **********************************************************************/ + * Andy Jin - Hardware debugging UI improvements, bug 229946 + *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.core; import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; import org.eclipse.cdt.core.IBinaryParser.IBinaryObject; import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.debug.core.cdi.ICDISession; import org.eclipse.cdt.debug.core.cdi.model.ICDITarget; +import org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.GDBJtagDeviceContribution; +import org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.GDBJtagDeviceContributionFactory; +import org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice; import org.eclipse.cdt.debug.mi.core.AbstractGDBCDIDebugger; import org.eclipse.cdt.debug.mi.core.MIException; import org.eclipse.cdt.debug.mi.core.MIPlugin; @@ -27,8 +34,6 @@ import org.eclipse.cdt.debug.mi.core.cdi.model.Target; import org.eclipse.cdt.debug.mi.core.command.CLICommand; import org.eclipse.cdt.debug.mi.core.command.CommandFactory; import org.eclipse.cdt.debug.mi.core.command.MIGDBSetNewConsole; -import org.eclipse.cdt.debug.mi.core.command.MITargetDownload; -import org.eclipse.cdt.debug.mi.core.command.MITargetSelect; import org.eclipse.cdt.debug.mi.core.output.MIInfo; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -36,11 +41,12 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.variables.VariablesPlugin; +import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; /** - * @author Doug Schaefer + * @author Doug Schaefer, Adrian Petrescu * */ public class GDBJtagDebugger extends AbstractGDBCDIDebugger { @@ -64,10 +70,12 @@ public class GDBJtagDebugger extends AbstractGDBCDIDebugger { protected void doStartSession(ILaunch launch, Session session, IProgressMonitor monitor) throws CoreException { ILaunchConfiguration config = launch.getLaunchConfiguration(); ICDITarget[] targets = session.getTargets(); - if (targets.length == 0 || !(targets[0] instanceof Target)) - return ; // TODO should raise an exception + if (targets.length == 0 || !(targets[0] instanceof Target)) { + Activator.log(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), + DebugPlugin.INTERNAL_ERROR, "Error getting debug target", null)); + return; + } MISession miSession = ((Target)targets[0]).getMISession(); - getMISession(session); CommandFactory factory = miSession.getCommandFactory(); try { MIGDBSetNewConsole newConsole = factory.createMIGDBSetNewConsole(); @@ -82,55 +90,68 @@ public class GDBJtagDebugger extends AbstractGDBCDIDebugger { // on GNU/Linux the new-console is an error. } + IGDBJtagDevice gdbJtagDevice; + try { + gdbJtagDevice = getGDBJtagDevice(config); + } catch (NullPointerException e) { + return; + } + + ArrayList commands = new ArrayList(); + // hook up to remote target boolean useRemote = config.getAttribute(IGDBJtagConstants.ATTR_USE_REMOTE_TARGET, IGDBJtagConstants.DEFAULT_USE_REMOTE_TARGET); if (useRemote) { - try { - monitor.beginTask("Connecting to remote", 1); - String ipAddress = config.getAttribute(IGDBJtagConstants.ATTR_IP_ADDRESS, IGDBJtagConstants.DEFAULT_IP_ADDRESS); - int portNumber = config.getAttribute(IGDBJtagConstants.ATTR_PORT_NUMBER, IGDBJtagConstants.DEFAULT_PORT_NUMBER); - String address = ipAddress + ":" + String.valueOf(portNumber); - MITargetSelect targetSelect = factory.createMITargetSelect(new String[] { "remote", address }); - miSession.postCommand(targetSelect); - MIInfo info = targetSelect.getMIInfo(); - if (info == null) { - throw new MIException(MIPlugin.getResourceString("src.common.No_answer")); //$NON-NLS-1$ - } - } catch (MIException e) { - // TODO dunno... - } + monitor.beginTask("Connecting to remote", 1); + String ipAddress = config.getAttribute(IGDBJtagConstants.ATTR_IP_ADDRESS, IGDBJtagConstants.DEFAULT_IP_ADDRESS); + int portNumber = config.getAttribute(IGDBJtagConstants.ATTR_PORT_NUMBER, IGDBJtagConstants.DEFAULT_PORT_NUMBER); + gdbJtagDevice.doRemote(ipAddress, portNumber, commands); + executeGDBScript(getGDBScript(commands), miSession); } // execute init script monitor.beginTask("Executing init commands", 1); + + // Run device-specific code to reset the board + if (config.getAttribute(IGDBJtagConstants.ATTR_DO_RESET, true)) { + commands = new ArrayList(); + gdbJtagDevice.doReset(commands); + int defaultDelay = gdbJtagDevice.getDefaultDelay(); + gdbJtagDevice.doDelay(config.getAttribute(IGDBJtagConstants.ATTR_DELAY, defaultDelay), commands); + gdbJtagDevice.doHalt(commands); + executeGDBScript(getGDBScript(commands), miSession); + } + // execute any user defined init command executeGDBScript(config, IGDBJtagConstants.ATTR_INIT_COMMANDS, miSession); // execute load - boolean doLoad = config.getAttribute(IGDBJtagConstants.ATTR_LOAD_IMAGE, IGDBJtagConstants.DEFAULT_LOAD_IMAGE); + boolean doLoad = config.getAttribute(IGDBJtagConstants.ATTR_LOAD_IMAGE, IGDBJtagConstants.DEFAULT_LOAD_IMAGE); if (doLoad) { + // Escape windows path separator characters TWICE, once for Java and once for GDB. String imageFileName = config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, ""); if (imageFileName.length() > 0) { - try { - monitor.beginTask("Loading image", 1); - imageFileName = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(imageFileName); - MITargetDownload download = factory.createMITargetDownload(imageFileName); - miSession.postCommand(download, MISession.FOREVER); - MIInfo info = download.getMIInfo(); - if (info == null) { - throw new MIException(MIPlugin.getResourceString("src.common.No_answer")); //$NON-NLS-1$ - } - } catch (MIException e) { - // TODO dunno... - } + monitor.beginTask("Loading image", 1); + imageFileName = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(imageFileName).replace("\\", "\\\\"); + String imageOffset = (imageFileName.endsWith(".elf")) ? "" : "0x" + config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, ""); + commands = new ArrayList(); + gdbJtagDevice.doLoadImage(imageFileName, imageOffset, commands); + executeGDBScript(getGDBScript(commands), miSession); + + } + } + + // execute symbol load + boolean doLoadSymbols = config.getAttribute(IGDBJtagConstants.ATTR_LOAD_SYMBOLS, IGDBJtagConstants.DEFAULT_LOAD_SYMBOLS); + if (doLoadSymbols) { + String symbolsFileName = config.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_FILE_NAME, ""); + if (symbolsFileName.length() > 0) { + symbolsFileName = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(symbolsFileName).replace("\\", "\\\\"); + String symbolsOffset = "0x" + config.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_OFFSET, ""); + commands = new ArrayList(); + gdbJtagDevice.doLoadSymbol(symbolsFileName, symbolsOffset, commands); + executeGDBScript(getGDBScript(commands), miSession); } } - } - - protected MISession getMISession(Session session) { - ICDITarget[] targets = session.getTargets(); - if (targets.length == 0 || !(targets[0] instanceof Target)) - return null; - return ((Target)targets[0]).getMISession(); } public void doRunSession(ILaunch launch, ICDISession session, IProgressMonitor monitor) throws CoreException { @@ -139,16 +160,44 @@ public class GDBJtagDebugger extends AbstractGDBCDIDebugger { if ( targets.length == 0 || !(targets[0] instanceof Target) ) return; MISession miSession = ((Target)targets[0]).getMISession(); - + + IGDBJtagDevice gdbJtagDevice; + try { + gdbJtagDevice = getGDBJtagDevice(config); + } catch (NullPointerException e) { + return; + } + + ArrayList commands = new ArrayList(); + // Set program counter + String pcRegister = config.getAttribute(IGDBJtagConstants.ATTR_PC_REGISTER, config.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, "")); + gdbJtagDevice.doSetPC(pcRegister, commands); + executeGDBScript(getGDBScript(commands), miSession); + // execute run script monitor.beginTask("Executing run commands", 1); + boolean setStopAt = config.getAttribute(IGDBJtagConstants.ATTR_SET_STOP_AT, IGDBJtagConstants.DEFAULT_SET_STOP_AT); + if (setStopAt) { + String stopAt = config.getAttribute(IGDBJtagConstants.ATTR_STOP_AT, ""); + commands = new ArrayList(); + gdbJtagDevice.doStopAt(stopAt, commands); + executeGDBScript(getGDBScript(commands), miSession); + } + + boolean setResume = config.getAttribute(IGDBJtagConstants.ATTR_SET_RESUME, IGDBJtagConstants.DEFAULT_SET_RESUME); + if (setResume) { + commands = new ArrayList(); + gdbJtagDevice.doContinue(commands); + executeGDBScript(getGDBScript(commands), miSession); + } + // Run any user defined command executeGDBScript(config, IGDBJtagConstants.ATTR_RUN_COMMANDS, miSession); } - private void executeGDBScript(ILaunchConfiguration configuration, String attribute, - MISession miSession) throws CoreException { - // Try to execute any extrac comand - String script = configuration.getAttribute(attribute, ""); //$NON-NLS-1$ + private void executeGDBScript(String script, MISession miSession) throws CoreException { + // Try to execute any extra command + if (script == null) + return; script = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(script); String[] commands = script.split("\\r?\\n"); for (int j = 0; j < commands.length; ++j) { @@ -175,5 +224,35 @@ public class GDBJtagDebugger extends AbstractGDBCDIDebugger { } } } + + private void executeGDBScript(ILaunchConfiguration configuration, String attribute, + MISession miSession) throws CoreException { + executeGDBScript(configuration.getAttribute(attribute, ""), miSession); + } + private IGDBJtagDevice getGDBJtagDevice (ILaunchConfiguration config) + throws CoreException, NullPointerException { + IGDBJtagDevice gdbJtagDevice = null; + String jtagDeviceName = config.getAttribute(IGDBJtagConstants.ATTR_JTAG_DEVICE, ""); + GDBJtagDeviceContribution[] availableDevices = GDBJtagDeviceContributionFactory. + getInstance().getGDBJtagDeviceContribution(); + for (int i = 0; i < availableDevices.length; i++) { + if (jtagDeviceName.equals(availableDevices[i].getDeviceName())) { + gdbJtagDevice = availableDevices[i].getDevice(); + break; + } + } + return gdbJtagDevice; + } + + private String getGDBScript(Collection commands) { + if (commands.isEmpty()) + return null; + StringBuffer sb = new StringBuffer(); + Iterator it = commands.iterator(); + while (it.hasNext()) { + sb.append(it.next()); + } + return sb.toString(); + } } diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConstants.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConstants.java index 1be899720d0..870c2d3f137 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConstants.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConstants.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 QNX Software Systems and others. + * Copyright (c) 2007 - 2008 QNX Software Systems 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 @@ -7,6 +7,7 @@ * * Contributors: * QNX Software Systems - Initial API and implementation + * Andy Jin - Hardware debugging UI improvements, bug 229946 *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.core; @@ -23,6 +24,7 @@ public interface IGDBJtagConstants { public static final String ATTR_USE_REMOTE_TARGET = Activator.PLUGIN_ID + ".useRemoteTarget"; //$NON-NLS-1$ public static final String ATTR_IP_ADDRESS = Activator.PLUGIN_ID + ".ipAddress"; //$NON-NLS-1$ public static final String ATTR_PORT_NUMBER = Activator.PLUGIN_ID + ".portNumber"; //$NON-NLS-1$ + public static final String ATTR_JTAG_DEVICE = Activator.PLUGIN_ID + ".jtagDevice"; //$NON-NLS-1$ public static final boolean DEFAULT_USE_REMOTE_TARGET = true; public static final String DEFAULT_IP_ADDRESS = "localhost"; //$NON-NLS-1$ @@ -30,11 +32,28 @@ public interface IGDBJtagConstants { // Startup public static final String ATTR_INIT_COMMANDS = Activator.PLUGIN_ID + ".initCommands"; //$NON-NLS-1$ + public static final String ATTR_DELAY = Activator.PLUGIN_ID + ".delay"; //$NON-NLS-1$ + public static final String ATTR_DO_RESET = Activator.PLUGIN_ID + ".doReset"; //$NON-NLS-1$ public static final String ATTR_LOAD_IMAGE = Activator.PLUGIN_ID + ".loadImage"; //$NON-NLS-1$ + public static final String ATTR_LOAD_SYMBOLS = Activator.PLUGIN_ID + ".loadSymbols"; //$NON-NLS-1$ public static final String ATTR_IMAGE_FILE_NAME = Activator.PLUGIN_ID + ".imageFileName"; //$NON-NLS-1$ + public static final String ATTR_SYMBOLS_FILE_NAME = Activator.PLUGIN_ID + ".symbolsFileName"; //$NON-NLS-1$ + public static final String ATTR_IMAGE_OFFSET = Activator.PLUGIN_ID + ".imageOffset"; //$NON-NLS-1$ + public static final String ATTR_SYMBOLS_OFFSET = Activator.PLUGIN_ID + ".symbolsOffset"; //$NON-NLS-1$ + public static final String ATTR_SET_PC_REGISTER = Activator.PLUGIN_ID + ".setPcRegister"; //$NON-NLS-1$ + public static final String ATTR_PC_REGISTER = Activator.PLUGIN_ID + ".pcRegister"; //$NON-NLS-1$ + public static final String ATTR_SET_STOP_AT = Activator.PLUGIN_ID + ".setStopAt"; //$NON-NLS-1$ + public static final String ATTR_STOP_AT = Activator.PLUGIN_ID + ".stopAt"; //$NON-NLS-1$ + public static final String ATTR_SET_RESUME = Activator.PLUGIN_ID + ".setResume"; //$NON-NLS-1$ public static final String ATTR_RUN_COMMANDS = Activator.PLUGIN_ID + ".runCommands"; //$NON-NLS-1$ - + + public static final boolean DEFAULT_DO_RESET = true; + public static final int DEFAULT_DELAY = 3; public static final boolean DEFAULT_LOAD_IMAGE = false; + public static final boolean DEFAULT_LOAD_SYMBOLS = false; + public static final boolean DEFAULT_SET_PC_REGISTER = false; + public static final boolean DEFAULT_SET_STOP_AT = false; + public static final boolean DEFAULT_SET_RESUME = false; public static final boolean DEFAULT_USE_DEFAULT_RUN = true; - + } diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/AbatronBDI2000.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/AbatronBDI2000.java new file mode 100644 index 00000000000..0e0d091dfa7 --- /dev/null +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/AbatronBDI2000.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2008 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + * Andy Jin - Hardware debugging UI improvements, bug 229946 + *******************************************************************************/ +package org.eclipse.cdt.debug.gdbjtag.core.jtagdevice; + +public class AbatronBDI2000 extends DefaultGDBJtagDeviceImpl { + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.DefaultGDBJtagDeviceImpl#getDefaultIpAddress() + */ + public String getDefaultIpAddress() { + return "bdi2000"; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.DefaultGDBJtagDeviceImpl#getDefaultPortNumber() + */ + public String getDefaultPortNumber() { + return "2001"; + } + +} diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/DefaultGDBJtagDeviceImpl.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/DefaultGDBJtagDeviceImpl.java new file mode 100644 index 00000000000..7b85c33c6da --- /dev/null +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/DefaultGDBJtagDeviceImpl.java @@ -0,0 +1,126 @@ +/******************************************************************************* + * Copyright (c) 2008 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + * Andy Jin - Hardware debugging UI improvements, bug 229946 + *******************************************************************************/ + +package org.eclipse.cdt.debug.gdbjtag.core.jtagdevice; + +import java.util.Collection; + + +/** + * @author ajin + * + */ +public class DefaultGDBJtagDeviceImpl implements IGDBJtagDevice { + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice#doDelay(int, java.util.Collection) + */ + public void doDelay(int delay, Collection commands) { + String cmd = "monitor delay " + String.valueOf( delay * 1000 ); + addCmd(commands, cmd); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice#doReset(java.util.Collection) + */ + public void doReset(Collection commands) { + String cmd = "monitor reset run"; + addCmd(commands, cmd); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice#getDefaultDelay() + */ + public int getDefaultDelay() { + return 0; + } + + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice#doRemote(java.lang.String, int, java.util.Collection) + */ + public void doRemote(String ip, int port, Collection commands) { + String cmd = "target remote " + ip + ":" + String.valueOf(port); + addCmd(commands, cmd); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice#doHalt(java.util.Collection) + */ + public void doHalt(Collection commands) { + String cmd = "monitor halt"; + addCmd(commands, cmd); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice#doContinue(java.util.Collection) + */ + public void doContinue(Collection commands) { + String cmd = "continue"; + addCmd(commands, cmd); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice#doLoadImage(java.lang.String, java.lang.String, java.util.Collection) + */ + public void doLoadImage(String imageFileName, String imageOffset, Collection commands) { + String cmd = "restore " + imageFileName + " " + imageOffset; + addCmd(commands, cmd); + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice#doLoadSymbol(java.lang.String, java.lang.String, java.util.Collection) + */ + public void doLoadSymbol(String symbolFileName, String symbolOffset, Collection commands) { + String cmd = "add-sym " + symbolFileName + " " + symbolOffset; + addCmd(commands, cmd); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice#doSetPC(java.lang.String, java.util.Collection) + */ + public void doSetPC(String pc, Collection commands) { + String cmd = "set $pc=0x" + pc; + addCmd(commands, cmd); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice#doStopAt(java.lang.String, java.util.Collection) + */ + public void doStopAt(String stopAt, Collection commands) { + String cmd = "break " + stopAt; + addCmd(commands, cmd); + } + + /* + * addCmd Utility method to format commands + */ + protected void addCmd (Collection commands, String cmd) { + commands.add(cmd + System.getProperty("line.separator")); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice#getDefaultIpAddress() + */ + public String getDefaultIpAddress() { + return "localhost"; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice#getDefaultPortNumber() + */ + public String getDefaultPortNumber() { + return "10000"; + } + +} diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContribution.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContribution.java new file mode 100644 index 00000000000..6b80fba52f5 --- /dev/null +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContribution.java @@ -0,0 +1,93 @@ +/******************************************************************************* + * Copyright (c) 2008 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + * Andy Jin - Hardware debugging UI improvements, bug 229946 + *******************************************************************************/ +package org.eclipse.cdt.debug.gdbjtag.core.jtagdevice; + +import org.eclipse.cdt.debug.gdbjtag.core.Activator; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.debug.core.DebugPlugin; + +public class GDBJtagDeviceContribution { + + private String deviceId; + private String deviceName; + private String deviceClassName; + private IGDBJtagDevice device; + + /** + * @return the deviceId + */ + public String getDeviceId() { + return this.deviceId; + } + + /** + * @param deviceId the deviceId to set + */ + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + /** + * @return the deviceName + */ + public String getDeviceName() { + return this.deviceName; + } + + /** + * @param deviceName the deviceName to set + */ + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + /** + * @return the deviceClassName + */ + public String getDeviceClassName() { + return this.deviceClassName; + } + + /** + * @param deviceClassName the deviceClassName to set + */ + public void setDeviceClassName(String deviceClassName) { + this.deviceClassName = deviceClassName; + } + + public IGDBJtagDevice getDevice() throws NullPointerException { + if (device != null) + return device; + Object o = null; + try { + o = Class.forName(getDeviceClassName()).newInstance(); + } catch (InstantiationException e) { + Activator.log(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), + DebugPlugin.INTERNAL_ERROR, "Error instantiating " + + getDeviceClassName() + " class", null)); + throw new NullPointerException(); + } catch (IllegalAccessException e) { + Activator.log(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), + DebugPlugin.INTERNAL_ERROR, "Error instantiating " + + getDeviceClassName() + " class", null)); + throw new NullPointerException(); + } catch (ClassNotFoundException e) { + Activator.log(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), + DebugPlugin.INTERNAL_ERROR, "Error instantiating " + + getDeviceClassName() + " class", null)); + throw new NullPointerException(); + } + return device = (IGDBJtagDevice) o; + } + +} diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContributionFactory.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContributionFactory.java new file mode 100644 index 00000000000..a74c0f67a3c --- /dev/null +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContributionFactory.java @@ -0,0 +1,85 @@ +/******************************************************************************* + * Copyright (c) 2008 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + * Andy Jin - Hardware debugging UI improvements, bug 229946 + *******************************************************************************/ +package org.eclipse.cdt.debug.gdbjtag.core.jtagdevice; + +import java.util.ArrayList; + +import org.eclipse.cdt.debug.gdbjtag.core.Activator; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.debug.core.DebugPlugin; + +public class GDBJtagDeviceContributionFactory { + private static final String EXTENSION_POINT_NAME = "JTagDevice"; + private static final String MAIN_ELEMENT = "device"; + + private static GDBJtagDeviceContributionFactory instance; + protected ArrayList contributions; + + private GDBJtagDeviceContributionFactory() { + contributions = new ArrayList(); + loadSubtypeContributions(); + } + + public GDBJtagDeviceContribution[] getGDBJtagDeviceContribution() { + return (GDBJtagDeviceContribution[]) contributions.toArray( + new GDBJtagDeviceContribution[contributions.size()]); + } + + private void loadSubtypeContributions() { + + IExtensionPoint ep = Platform.getExtensionRegistry().getExtensionPoint( + Activator.getUniqueIdentifier(), EXTENSION_POINT_NAME); + if (ep == null) + return; + IConfigurationElement[] elements = ep.getConfigurationElements(); + for (int i = 0; i < elements.length; i++) { + IConfigurationElement configurationElement = elements[i]; + if (configurationElement.getName().equals(MAIN_ELEMENT)) { + String id = getRequired(configurationElement, "id"); + String name = getRequired(configurationElement, "name"); + String className = getRequired(configurationElement, "class"); + GDBJtagDeviceContribution adapter = new GDBJtagDeviceContribution(); + adapter.setDeviceId(id); + adapter.setDeviceName(name); + adapter.setDeviceClassName(className); + addContribution(adapter); + } + } + } + + public void addContribution(GDBJtagDeviceContribution contribution) { + contributions.add(contribution); + + } + + public static GDBJtagDeviceContributionFactory getInstance() { + if (instance == null) { + instance = new GDBJtagDeviceContributionFactory(); + } + return instance; + } + + private static String getRequired(IConfigurationElement configurationElement, String name) { + String elementValue = configurationElement.getAttribute(name); + if (elementValue == null) + Activator.log(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), + DebugPlugin.INTERNAL_ERROR, "Extension " + + configurationElement.getDeclaringExtension().getUniqueIdentifier() + + " missing required attribute: " + name, null)); + return elementValue; + } + +} diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GenericDevice.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GenericDevice.java new file mode 100644 index 00000000000..802b434e129 --- /dev/null +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GenericDevice.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2008 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + * Andy Jin - Hardware debugging UI improvements, bug 229946 + *******************************************************************************/ +package org.eclipse.cdt.debug.gdbjtag.core.jtagdevice; + +import java.util.Collection; + +public class GenericDevice extends DefaultGDBJtagDeviceImpl { + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.DefaultGDBJtagDeviceImpl#doDelay(int, java.util.Collection) + */ + public void doDelay(int delay, Collection commands) { + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.DefaultGDBJtagDeviceImpl#doHalt(java.util.Collection) + */ + public void doHalt(Collection commands) { + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.DefaultGDBJtagDeviceImpl#doReset(java.util.Collection) + */ + public void doReset(Collection commands) { + } + +} diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/IGDBJtagDevice.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/IGDBJtagDevice.java new file mode 100644 index 00000000000..e305c54dd97 --- /dev/null +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/IGDBJtagDevice.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * Copyright (c) 2008 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + * Andy Jin - Hardware debugging UI improvements, bug 229946 + *******************************************************************************/ + +package org.eclipse.cdt.debug.gdbjtag.core.jtagdevice; + +import java.util.Collection; + +/** + * Provides device specific debug commands for different hardware + * JTAG devices. See <code>DefaultGDBJtagDeviceImpl</code> for + * the default implementations. + * + */ +public interface IGDBJtagDevice { + + /** + * Device reset command + * @param commands ommands collection + */ + public void doReset(Collection commands); + + /** + * Default device delay in millisecond + * @return delay in second + */ + public int getDefaultDelay(); + + /** + * Target needs some delay in order to initialize + * @param delay delay in second + * @param commands device specific delay commands + */ + public void doDelay(int delay, Collection commands); + + /** + * Target needs to be in pause mode in order to do + * JTAG debug. This should happen before the target + * MMU takes control + * @param commands device specific pause commands + */ + public void doHalt(Collection commands); + + /** + * Commands to connect to remote JTAG device + * @param ip host name of IP address of JTAG device + * @param port TCP socket port number of JTAG device + * @param commands remote connection commands + */ + public void doRemote(String ip, int port, Collection commands); + + /** + * Commands to download the executable binary to target + * @param imageFileName executable binary file name + * @param imageOffset executable binary memory offset + * @param commands executable binary download commands + */ + public void doLoadImage(String imageFileName, String imageOffset, Collection commands); + + /** + * Commands to download the symbols file to target + * @param symbolFileName symbols file name + * @param symbolOffset symbols file memory offset + * @param commands symbols file download command + */ + public void doLoadSymbol(String symbolFileName, String symbolOffset, Collection commands); + + /** + * Commands to set initial program counter + * @param pc program counter + * @param commands set program counter commands + */ + public void doSetPC(String pc, Collection commands); + + /** + * Commands to set initial breakpoint + * @param stopAt initial breakpoint location + * @param commands set breakpoint commands + */ + public void doStopAt(String stopAt, Collection commands); + + /** + * De-freeze the target in order to start debugging + * @param commands commands to continue the target + */ + public void doContinue(Collection commands); + + /** + * Device specific default hostname of IP address + * @return default hostname of IP address + */ + public String getDefaultIpAddress(); + + /** + * Device specific default port number + * @return default port number + */ + public String getDefaultPortNumber(); + +} diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/MacraigorUsb2Demon.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/MacraigorUsb2Demon.java new file mode 100644 index 00000000000..9ff0c5e96c4 --- /dev/null +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/MacraigorUsb2Demon.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2008 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + * Andy Jin - Hardware debugging UI improvements, bug 229946 + *******************************************************************************/ +package org.eclipse.cdt.debug.gdbjtag.core.jtagdevice; + +import java.util.Collection; + + +/** + * @author ajin + * + */ +public class MacraigorUsb2Demon extends DefaultGDBJtagDeviceImpl { + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.DefaultGDBJtagDeviceImpl#getDefaultPortNumber() + */ + public String getDefaultPortNumber() { + return "8888"; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.DefaultGDBJtagDeviceImpl#doDelay(int, java.util.Collection) + */ + public void doDelay(int delay, Collection commands) { + String cmd = "monitor sleep " + String.valueOf(delay); + super.addCmd(commands, cmd); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.DefaultGDBJtagDeviceImpl#doReset(java.util.Collection) + */ + public void doReset(Collection commands) { + String cmd = "monitor resetrun"; + super.addCmd(commands, cmd); + } + +} diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/META-INF/MANIFEST.MF b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/META-INF/MANIFEST.MF index 6d293661ccb..cf9f44e8cff 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/META-INF/MANIFEST.MF +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/META-INF/MANIFEST.MF @@ -14,6 +14,7 @@ Require-Bundle: org.eclipse.ui, org.eclipse.cdt.debug.mi.core, org.eclipse.cdt.debug.gdbjtag.core, org.eclipse.core.variables, - org.eclipse.cdt.managedbuilder.ui + org.eclipse.cdt.managedbuilder.ui, + org.eclipse.ui.ide Eclipse-LazyStart: true Bundle-Vendor: %providerName diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/plugin.properties b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/plugin.properties index a85b420e46d..54cf88ba378 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/plugin.properties +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/plugin.properties @@ -10,3 +10,7 @@ ############################################################################### pluginName=Eclipse GDB Hardware Debug UI Plug-in providerName=Eclipse.org + +AbatronBDI2000.name=Abatron BDI2000 +MacraigorUsb2Demon.name=Macraigor USB2Demon +Generic.name=Generic diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/plugin.xml b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/plugin.xml index 3a5516563de..e779c1bda02 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/plugin.xml +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/plugin.xml @@ -15,5 +15,29 @@ id="org.eclipse.cdt.debug.gdbjtag.launchConfigurationTabGroup" type="org.eclipse.cdt.debug.gdbjtag.launchConfigurationType"/> </extension> + <extension + point="org.eclipse.cdt.debug.gdbjtag.core.JTagDevice"> + <device + class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.GenericDevice" + id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.genericDevice" + name="%Generic.name"> + </device> + </extension> + <extension + point="org.eclipse.cdt.debug.gdbjtag.core.JTagDevice"> + <device + class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.AbatronBDI2000" + id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.AbatronBDI2000" + name="%AbatronBDI2000.name"> + </device> + </extension> + <extension + point="org.eclipse.cdt.debug.gdbjtag.core.JTagDevice"> + <device + class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.MacraigorUsb2Demon" + id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.MacraigorUsb2Demon" + name="%MacraigorUsb2Demon.name"> + </device> + </extension> </plugin> diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/Activator.java b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/Activator.java index a3c0a477b1a..11f629a7183 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/Activator.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/Activator.java @@ -7,6 +7,7 @@ * * Contributors: * QNX Software Systems - initial API and implementation + * Andy Jin - Hardware debugging UI improvements, bug 229946 *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.ui; @@ -19,7 +20,7 @@ import org.osgi.framework.BundleContext; public class Activator extends AbstractUIPlugin { // The plug-in ID - public static final String PLUGIN_ID = "org.eclipse.cdt.debug.gdbremote.ui"; + public static final String PLUGIN_ID = "org.eclipse.cdt.debug.gdbjtag.ui"; // The shared instance private static Activator plugin; diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/GDBJtagDebuggerTab.java b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/GDBJtagDebuggerTab.java index 1fadcbaad11..b5af4a2d31d 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/GDBJtagDebuggerTab.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/GDBJtagDebuggerTab.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 QNX Software Systems and others. + * Copyright (c) 2007 - 2008 QNX Software Systems 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 @@ -7,13 +7,18 @@ * * Contributors: * QNX Software Systems - Initial API and implementation + * Andy Jin - Hardware debugging UI improvements, bug 229946 *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.ui; import java.io.File; +import org.eclipse.cdt.debug.gdbjtag.core.Activator; import org.eclipse.cdt.debug.gdbjtag.core.IGDBJtagConstants; +import org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.GDBJtagDeviceContribution; +import org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.GDBJtagDeviceContributionFactory; +import org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.IGDBJtagDevice; import org.eclipse.cdt.debug.mi.core.IMILaunchConfigurationConstants; import org.eclipse.cdt.debug.mi.core.MIPlugin; import org.eclipse.cdt.debug.mi.core.command.factories.CommandFactoryDescriptor; @@ -43,24 +48,26 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; /** - * @author Doug Schaefer + * @author Doug Schaefer, Adrian Petrescu * */ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { + private static final String TAB_NAME = "Debugger"; + private CommandFactoryDescriptor[] cfDescs; private Text gdbCommand; - private Text gdbinitFile; private Combo commandFactory; private Combo miProtocol; private Button verboseMode; private Button useRemote; private Text ipAddress; private Text portNumber; + private Combo jtagDevice; public String getName() { - return "Debugger"; + return TAB_NAME; } public Image getImage() { @@ -83,10 +90,9 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { group.setLayout(layout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); group.setLayoutData(gd); - group.setText("GDB Setup"); + group.setText(Messages.getString("GDBJtagDebuggerTab.gdbSetupGroup_Text")); createCommandControl(group); - createInitFileControl(group); createCommandFactoryControl(group); createProtocolControl(group); createVerboseModeControl(group); @@ -122,7 +128,7 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { comp.setLayoutData(gd); Label label = new Label(comp, SWT.NONE); - label.setText("GDB Command:"); + label.setText(Messages.getString("GDBJtagDebuggerTab.gdbCommandLabel")); gd = new GridData(); gd.horizontalSpan = 3; label.setLayoutData(gd); @@ -137,15 +143,15 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { }); Button button = new Button(comp, SWT.NONE); - button.setText("Browse..."); + button.setText(Messages.getString("GDBJtagDebuggerTab.gdbCommandBrowse")); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { - browseButtonSelected("Select gdb", gdbCommand); + browseButtonSelected(Messages.getString("GDBJtagDebuggerTab.gdbCommandBrowse_Title"), gdbCommand); } }); button = new Button(comp, SWT.NONE); - button.setText("Variables..."); + button.setText(Messages.getString("GDBJtagDebuggerTab.gdbCommandVariable")); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { variablesButtonSelected(gdbCommand); @@ -153,53 +159,12 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { }); } - private void createInitFileControl(Composite parent) { - Composite comp = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(); - layout.numColumns = 3; - comp.setLayout(layout); - GridData gd = new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalSpan = 1; - comp.setLayoutData(gd); - - Label label = new Label(comp, SWT.NONE); - label.setText("GDB Init File:"); - gd = new GridData(); - gd.horizontalSpan = 3; - label.setLayoutData(gd); - - gdbinitFile = new Text(comp, SWT.SINGLE | SWT.BORDER); - gd = new GridData(GridData.FILL_HORIZONTAL); - gdbinitFile.setLayoutData(gd); - gdbinitFile.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent e) { - updateLaunchConfigurationDialog(); - } - }); - - Button button = new Button(comp, SWT.NONE); - button.setText("Browse..."); - button.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - browseButtonSelected("Select .gdbinit file", gdbinitFile); - } - }); - - button = new Button(comp, SWT.NONE); - button.setText("Variables..."); - button.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - variablesButtonSelected(gdbinitFile); - } - }); - } - private void createCommandFactoryControl(Composite parent) { Composite comp = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(2, false); comp.setLayout(layout); Label label = new Label(comp, SWT.NONE); - label.setText("Command Set:"); + label.setText(Messages.getString("GDBJtagDebuggerTab.commandFactoryLabel")); commandFactory = new Combo(comp, SWT.READ_ONLY | SWT.DROP_DOWN); @@ -223,7 +188,7 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { GridLayout layout = new GridLayout(2, false); comp.setLayout(layout); Label label = new Label(comp, SWT.NONE); - label.setText("Protocol Version:"); + label.setText(Messages.getString("GDBJtagDebuggerTab.miProtocolLabel")); miProtocol = new Combo(comp, SWT.READ_ONLY | SWT.DROP_DOWN); miProtocol.addModifyListener(new ModifyListener() { @@ -254,7 +219,7 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { private void createVerboseModeControl(Composite parent) { verboseMode = new Button(parent, SWT.CHECK); - verboseMode.setText("Verbose console mode"); + verboseMode.setText(Messages.getString("GDBJtagDebuggerTab.verboseModeLabel")); verboseMode.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { updateLaunchConfigurationDialog(); @@ -268,10 +233,10 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { group.setLayout(layout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); group.setLayoutData(gd); - group.setText("Remote Target"); + group.setText(Messages.getString("GDBJtagDebuggerTab.remoteGroup_Text")); useRemote = new Button(group, SWT.CHECK); - useRemote.setText("Use remote target"); + useRemote.setText(Messages.getString("GDBJtagDebuggerTab.useRemote_Text")); useRemote.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { useRemoteChanged(); @@ -285,7 +250,26 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { comp.setLayout(layout); Label label = new Label(comp, SWT.NONE); - label.setText("Host name or IP address:"); + label.setText(Messages.getString("GDBJtagDebuggerTab.jtagDeviceLabel")); + + jtagDevice = new Combo(comp, SWT.READ_ONLY | SWT.DROP_DOWN); + + GDBJtagDeviceContribution[] availableDevices = GDBJtagDeviceContributionFactory. + getInstance().getGDBJtagDeviceContribution(); + for (int i = 0; i < availableDevices.length; i++) { + jtagDevice.add(availableDevices[i].getDeviceName()); + } + + jtagDevice.select(0); + jtagDevice.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + updateDeviceIpPort(jtagDevice.getText()); + updateLaunchConfigurationDialog(); + } + }); + + label = new Label(comp, SWT.NONE); + label.setText(Messages.getString("GDBJtagDebuggerTab.ipAddressLabel")); ipAddress = new Text(comp, SWT.BORDER); gd = new GridData(); gd.widthHint = 100; @@ -297,7 +281,7 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { }); label = new Label(comp, SWT.NONE); - label.setText("Port number:"); + label.setText(Messages.getString("GDBJtagDebuggerTab.portNumberLabel")); portNumber = new Text(comp, SWT.BORDER); gd = new GridData(); gd.widthHint = 100; @@ -314,8 +298,33 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { }); } + /** + * @param text + */ + protected void updateDeviceIpPort(String selectedDeviceName) { + GDBJtagDeviceContribution[] availableDevices = GDBJtagDeviceContributionFactory. + getInstance().getGDBJtagDeviceContribution(); + IGDBJtagDevice selectedDevice = null; + for (int i = 0; i < availableDevices.length; i++) { + String name = availableDevices[i].getDeviceName(); + if (name.equals(selectedDeviceName)) { + try { + selectedDevice = availableDevices[i].getDevice(); + } catch (NullPointerException e) { + return; + } + break; + } + } + String ip = selectedDevice.getDefaultIpAddress(); + ipAddress.setText(ip); + String port = selectedDevice.getDefaultPortNumber(); + portNumber.setText(port); + } + private void useRemoteChanged() { boolean enabled = useRemote.getSelection(); + jtagDevice.setEnabled(enabled); ipAddress.setEnabled(enabled); portNumber.setEnabled(enabled); } @@ -325,9 +334,6 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { String gdbCommandAttr = configuration.getAttribute(IMILaunchConfigurationConstants.ATTR_DEBUG_NAME, IMILaunchConfigurationConstants.DEBUGGER_DEBUG_NAME_DEFAULT); gdbCommand.setText(gdbCommandAttr); - String gdbinitFileAttr = configuration.getAttribute(IMILaunchConfigurationConstants.ATTR_GDB_INIT, IMILaunchConfigurationConstants.DEBUGGER_GDB_INIT_DEFAULT); - gdbinitFile.setText(gdbinitFileAttr); - CommandFactoryManager cfManager = MIPlugin.getDefault().getCommandFactoryManager(); CommandFactoryDescriptor defDesc = cfManager.getDefaultDescriptor(IGDBJtagConstants.DEBUGGER_ID); String commandFactoryAttr = configuration.getAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_COMMAND_FACTORY, defDesc.getName()); @@ -342,10 +348,11 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { String miProtocolAttr = configuration.getAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_PROTOCOL, defDesc.getMIVersions()[0]); int n = miProtocol.getItemCount(); for (int i = 0; i < n; ++i) { - if (miProtocol.getItem(i).equals(miProtocolAttr)) + if (miProtocol.getItem(i).equals(miProtocolAttr)) { miProtocol.select(i); + } } - + boolean verboseModeAttr = configuration.getAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_VERBOSE_MODE, IMILaunchConfigurationConstants.DEBUGGER_VERBOSE_MODE_DEFAULT); verboseMode.setSelection(verboseModeAttr); @@ -358,6 +365,13 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { int portNumberAttr = configuration.getAttribute(IGDBJtagConstants.ATTR_PORT_NUMBER, IGDBJtagConstants.DEFAULT_PORT_NUMBER); portNumber.setText(String.valueOf(portNumberAttr)); + + String jtagDeviceString = configuration.getAttribute(IGDBJtagConstants.ATTR_JTAG_DEVICE, ""); + for (int i = 0; i < jtagDevice.getItemCount(); i++) { + if (jtagDevice.getItem(i).equals(jtagDeviceString)) { + jtagDevice.select(i); + } + } } catch (CoreException e) { Activator.getDefault().getLog().log(e.getStatus()); } @@ -365,13 +379,10 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { public void performApply(ILaunchConfigurationWorkingCopy configuration) { configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUG_NAME, gdbCommand.getText().trim()); - configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_GDB_INIT, gdbinitFile.getText().trim()); - configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_COMMAND_FACTORY, commandFactory.getText()); configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_PROTOCOL, miProtocol.getText()); - configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_VERBOSE_MODE, verboseMode.getSelection()); - + configuration.setAttribute(IGDBJtagConstants.ATTR_JTAG_DEVICE, jtagDevice.getText()); configuration.setAttribute(IGDBJtagConstants.ATTR_USE_REMOTE_TARGET, useRemote.getSelection()); configuration.setAttribute(IGDBJtagConstants.ATTR_IP_ADDRESS, ipAddress.getText().trim()); try { @@ -383,15 +394,11 @@ public class GDBJtagDebuggerTab extends AbstractLaunchConfigurationTab { public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUG_NAME, IMILaunchConfigurationConstants.DEBUGGER_DEBUG_NAME_DEFAULT); - configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_GDB_INIT, IMILaunchConfigurationConstants.DEBUGGER_GDB_INIT_DEFAULT); - CommandFactoryManager cfManager = MIPlugin.getDefault().getCommandFactoryManager(); CommandFactoryDescriptor defDesc = cfManager.getDefaultDescriptor(IGDBJtagConstants.DEBUGGER_ID); configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_COMMAND_FACTORY, defDesc.getName()); configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_PROTOCOL, defDesc.getMIVersions()[0]); - configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_VERBOSE_MODE, IMILaunchConfigurationConstants.DEBUGGER_VERBOSE_MODE_DEFAULT); - configuration.setAttribute(IGDBJtagConstants.ATTR_USE_REMOTE_TARGET, IGDBJtagConstants.DEFAULT_USE_REMOTE_TARGET); configuration.setAttribute(IGDBJtagConstants.ATTR_IP_ADDRESS, IGDBJtagConstants.DEFAULT_IP_ADDRESS); configuration.setAttribute(IGDBJtagConstants.ATTR_PORT_NUMBER, IGDBJtagConstants.DEFAULT_PORT_NUMBER); diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/GDBJtagStartupTab.java b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/GDBJtagStartupTab.java index 398f9865357..f622c643ac2 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/GDBJtagStartupTab.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/GDBJtagStartupTab.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 QNX Software Systems and others. + * Copyright (c) 2007 - 2008 QNX Software Systems 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 @@ -7,6 +7,7 @@ * * Contributors: * QNX Software Systems - Initial API and implementation + * Andy Jin - Hardware debugging UI improvements, bug 229946 *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.ui; @@ -14,17 +15,22 @@ package org.eclipse.cdt.debug.gdbjtag.ui; import java.io.File; import org.eclipse.cdt.debug.gdbjtag.core.IGDBJtagConstants; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.variables.VariablesPlugin; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; -import org.eclipse.debug.ui.StringVariableSelectionDialog; +import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.VerifyEvent; +import org.eclipse.swt.events.VerifyListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; @@ -34,23 +40,44 @@ import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; +import org.eclipse.ui.model.WorkbenchContentProvider; +import org.eclipse.ui.model.WorkbenchLabelProvider; +import org.eclipse.ui.views.navigator.ResourceComparator; -/** - * @author Doug Schaefer - * - */ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab { + private static final String TAB_NAME = "Startup"; + Text initCommands; + Text delay; + Button doReset; + Button loadImage; Text imageFileName; + Button imageFileBrowseWs; Button imageFileBrowse; - Button imageFileVariables; + Text imageOffset; + + Button loadSymbols; + Text symbolsFileName; + Button symbolsFileBrowseWs; + Button symbolsFileBrowse; + Text symbolsOffset; + + Button setPcRegister; + Text pcRegister; + + Button setStopAt; + Text stopAt; + + Button setResume; + boolean resume = false; + Text runCommands; - Button runCommandVariables; public String getName() { - return "Startup"; + return TAB_NAME; } public Image getImage() { @@ -70,6 +97,7 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab { createInitGroup(comp); createLoadGroup(comp); + createRunOptionGroup(comp); createRunGroup(comp); sc.setMinSize(comp.computeSize(SWT.DEFAULT, SWT.DEFAULT)); @@ -87,10 +115,18 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab { text.setText(str); } - private void variablesButtonSelected(Text text) { - StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell()); - dialog.open(); - text.append(dialog.getVariableExpression()); + private void browseWsButtonSelected(String title, Text text) { + ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider()); + dialog.setTitle(title); + dialog.setMessage(Messages.getString("GDBJtagStartupTab.FileBrowseWs_Message")); + dialog.setInput(ResourcesPlugin.getWorkspace().getRoot()); + dialog.setComparator(new ResourceComparator(ResourceComparator.NAME)); + if (dialog.open() == IDialogConstants.OK_ID) { + IResource resource = (IResource) dialog.getFirstResult(); + String arg = resource.getFullPath().toOSString(); + String fileLoc = VariablesPlugin.getDefault().getStringVariableManager().generateVariableExpression("workspace_loc", arg); //$NON-NLS-1$ + text.setText(fileLoc); + } } public void createInitGroup(Composite parent) { @@ -99,11 +135,42 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab { group.setLayout(layout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); group.setLayoutData(gd); - group.setText("Initialization Commands"); - + group.setText(Messages.getString("GDBJtagStartupTab.initGroup_Text")); + + doReset = new Button(group, SWT.CHECK); + doReset.setText(Messages.getString("GDBJtagStartupTab.doReset_Text")); + doReset.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + doResetChanged(); + updateLaunchConfigurationDialog(); + } + }); + + Composite comp = new Composite(group, SWT.NONE); + layout = new GridLayout(); + layout.numColumns = 2; + comp.setLayout(layout); + + Label delayLabel = new Label(comp, SWT.NONE); + delayLabel.setText(Messages.getString("GDBJtagStartupTab.delayLabel_Text")); + delay = new Text(comp, SWT.BORDER); + gd = new GridData(); + gd.widthHint = 60; + delay.setLayoutData(gd); + delay.addVerifyListener(new VerifyListener() { + public void verifyText(VerifyEvent e) { + e.doit = (Character.isDigit(e.character) || Character.isISOControl(e.character)); + } + }); + delay.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + updateLaunchConfigurationDialog(); + } + }); + initCommands = new Text(group, SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.V_SCROLL); gd = new GridData(GridData.FILL_BOTH); - gd.heightHint = 100; + gd.heightHint = 60; initCommands.setLayoutData(gd); initCommands.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent evt) { @@ -111,31 +178,22 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab { } }); - Button varsButton = new Button(group, SWT.NONE); - gd = new GridData(GridData.HORIZONTAL_ALIGN_END); - varsButton.setLayoutData(gd); - varsButton.setText("Variables..."); - varsButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - variablesButtonSelected(initCommands); - } - }); } private void createLoadGroup(Composite parent) { Group group = new Group(parent, SWT.NONE); GridLayout layout = new GridLayout(); group.setLayout(layout); - layout.numColumns = 3; + layout.numColumns = 4; GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 1; group.setLayoutData(gd); - group.setText("Load Image"); + group.setText(Messages.getString("GDBJtagStartupTab.loadGroup_Text")); loadImage = new Button(group, SWT.CHECK); - loadImage.setText("Automatically load image"); + loadImage.setText(Messages.getString("GDBJtagStartupTab.loadImage_Text")); gd = new GridData(); - gd.horizontalSpan = 3; + gd.horizontalSpan = 4; loadImage.setLayoutData(gd); loadImage.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { @@ -144,43 +202,224 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab { } }); - Label label = new Label(group, SWT.NONE); - gd = new GridData(); - gd.horizontalSpan = 3; - label.setLayoutData(gd); - label.setText("Image file name:"); + Composite comp = new Composite(group, SWT.NONE); + layout = new GridLayout(); + layout.numColumns = 4; + comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + comp.setLayout(layout); - imageFileName = new Text(group, SWT.BORDER); + Label imageLabel = new Label(comp, SWT.NONE); + imageLabel.setText(Messages.getString("GDBJtagStartupTab.imageLabel_Text")); + imageFileName = new Text(comp, SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = 1; imageFileName.setLayoutData(gd); imageFileName.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { updateLaunchConfigurationDialog(); } }); - - imageFileBrowse = new Button(group, SWT.NONE); - imageFileBrowse.setText("Browse..."); + + imageFileBrowseWs = createPushButton(comp, Messages.getString("GDBJtagStartupTab.FileBrowseWs_Label"), null); + imageFileBrowseWs.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + browseWsButtonSelected(Messages.getString("GDBJtagStartupTab.imageFileBrowseWs_Title"), imageFileName); + } + }); + + imageFileBrowse = createPushButton(comp, Messages.getString("GDBJtagStartupTab.FileBrowse_Label"), null); imageFileBrowse.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { - browseButtonSelected("Select image file", imageFileName); + browseButtonSelected(Messages.getString("GDBJtagStartupTab.imageFileBrowse_Title"), imageFileName); + } + }); + + Label imageOffsetLabel = new Label(comp, SWT.NONE); + imageOffsetLabel.setText(Messages.getString("GDBJtagStartupTab.imageOffsetLabel_Text")); + imageOffset = new Text(comp, SWT.BORDER); + gd = new GridData(); + gd.horizontalSpan = 1; + gd.widthHint = 100; + imageOffset.setLayoutData(gd); + imageOffset.addVerifyListener(new VerifyListener() { + public void verifyText(VerifyEvent e) { + e.doit = (Character.isDigit(e.character) || Character.isISOControl(e.character) || "abcdef".contains(String.valueOf(e.character).toLowerCase())); + } + }); + imageOffset.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + updateLaunchConfigurationDialog(); } }); - imageFileVariables = new Button(group, SWT.NONE); - imageFileVariables.setText("Variables..."); - imageFileVariables.addSelectionListener(new SelectionAdapter() { + loadSymbols = new Button(group, SWT.CHECK); + loadSymbols.setText(Messages.getString("GDBJtagStartupTab.loadSymbols_Text")); + gd = new GridData(); + gd.horizontalSpan = 4; + loadSymbols.setLayoutData(gd); + loadSymbols.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { - variablesButtonSelected(imageFileName); + loadSymbolsChanged(); + updateLaunchConfigurationDialog(); } }); + + comp = new Composite(group, SWT.NONE); + layout = new GridLayout(); + layout.numColumns = 4; + comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + comp.setLayout(layout); + + Label symbolLabel = new Label(comp, SWT.NONE); + symbolLabel.setText(Messages.getString("GDBJtagStartupTab.symbolsLabel_Text")); + symbolsFileName = new Text(comp, SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = 1; + symbolsFileName.setLayoutData(gd); + symbolsFileName.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + updateLaunchConfigurationDialog(); + } + }); + + symbolsFileBrowseWs = createPushButton(comp, Messages.getString("GDBJtagStartupTab.FileBrowseWs_Label"), null); + symbolsFileBrowseWs.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + browseWsButtonSelected(Messages.getString("GDBJtagStartupTab.symbolsFileBrowseWs_Title"), symbolsFileName); + } + }); + + symbolsFileBrowse = createPushButton(comp, Messages.getString("GDBJtagStartupTab.FileBrowse_Label"), null); + symbolsFileBrowse.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + browseButtonSelected(Messages.getString("GDBJtagStartupTab.symbolsFileBrowse_Title"), symbolsFileName); + } + }); + + Label symbolsOffsetLabel = new Label(comp, SWT.NONE); + symbolsOffsetLabel.setText(Messages.getString("GDBJtagStartupTab.symbolsOffsetLabel_Text")); + symbolsOffset = new Text(comp, SWT.BORDER); + gd = new GridData(); + gd.horizontalSpan = 1; + gd.widthHint = 100; + symbolsOffset.setLayoutData(gd); + symbolsOffset.addVerifyListener(new VerifyListener() { + public void verifyText(VerifyEvent e) { + e.doit = (Character.isDigit(e.character) || Character.isISOControl(e.character) || "abcdef".contains(String.valueOf(e.character).toLowerCase())); + } + }); + symbolsOffset.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + updateLaunchConfigurationDialog(); + } + }); + } + public void createRunOptionGroup(Composite parent) { + Group group = new Group(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + group.setLayout(layout); + layout.numColumns = 2; + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = 1; + group.setLayoutData(gd); + group.setText(Messages.getString("GDBJtagStartupTab.runOptionGroup_Text")); + + setPcRegister = new Button(group, SWT.CHECK); + setPcRegister.setText(Messages.getString("GDBJtagStartupTab.setPcRegister_Text")); + gd = new GridData(); + gd.horizontalSpan = 1; + setPcRegister.setLayoutData(gd); + setPcRegister.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + pcRegisterChanged(); + updateLaunchConfigurationDialog(); + } + }); + + pcRegister = new Text(group, SWT.BORDER); + gd = new GridData(); + gd.horizontalSpan = 1; + gd.widthHint = 100; + pcRegister.setLayoutData(gd); + pcRegister.addVerifyListener(new VerifyListener() { + public void verifyText(VerifyEvent e) { + e.doit = (Character.isDigit(e.character) || Character.isISOControl(e.character) || "abcdef".contains(String.valueOf(e.character).toLowerCase())); + } + }); + pcRegister.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + updateLaunchConfigurationDialog(); + } + }); + + setStopAt = new Button(group, SWT.CHECK); + setStopAt.setText(Messages.getString("GDBJtagStartupTab.setStopAt_Text")); + gd = new GridData(); + gd.horizontalSpan = 1; + setStopAt.setLayoutData(gd); + setStopAt.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + stopAtChanged(); + updateLaunchConfigurationDialog(); + } + }); + + stopAt = new Text(group, SWT.BORDER); + gd = new GridData(); + gd.horizontalSpan = 1; + gd.widthHint = 100; + stopAt.setLayoutData(gd); + stopAt.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + updateLaunchConfigurationDialog(); + } + }); + + setResume = new Button(group, SWT.CHECK); + setResume.setText(Messages.getString("GDBJtagStartupTab.setResume_Text")); + gd = new GridData(); + gd.horizontalSpan = 1; + setResume.setLayoutData(gd); + setResume.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + resumeChanged(); + updateLaunchConfigurationDialog(); + } + }); + } + + private void doResetChanged() { + delay.setEnabled(doReset.getSelection()); + } + private void loadImageChanged() { boolean enabled = loadImage.getSelection(); imageFileName.setEnabled(enabled); + imageFileBrowseWs.setEnabled(enabled); imageFileBrowse.setEnabled(enabled); - imageFileVariables.setEnabled(enabled); + imageOffset.setEnabled(enabled); + } + + private void loadSymbolsChanged() { + boolean enabled = loadSymbols.getSelection(); + symbolsFileName.setEnabled(enabled); + symbolsFileBrowseWs.setEnabled(enabled); + symbolsFileBrowse.setEnabled(enabled); + symbolsOffset.setEnabled(enabled); + } + + private void pcRegisterChanged() { + pcRegister.setEnabled(setPcRegister.getSelection()); + } + + private void stopAtChanged() { + stopAt.setEnabled(setStopAt.getSelection()); + } + + private void resumeChanged() { + resume = setResume.getSelection(); } public void createRunGroup(Composite parent) { @@ -189,35 +428,41 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab { group.setLayout(layout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); group.setLayoutData(gd); - group.setText("Run Commands"); + group.setText(Messages.getString("GDBJtagStartupTab.runGroup_Text")); runCommands = new Text(group, SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.V_SCROLL); gd = new GridData(GridData.FILL_BOTH); - gd.heightHint = 100; + gd.heightHint = 60; runCommands.setLayoutData(gd); runCommands.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent evt) { updateLaunchConfigurationDialog(); } }); - - runCommandVariables = new Button(group, SWT.NONE); - gd = new GridData(GridData.HORIZONTAL_ALIGN_END); - runCommandVariables.setLayoutData(gd); - runCommandVariables.setText("Variables..."); - runCommandVariables.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - variablesButtonSelected(runCommands); - } - }); } public void initializeFrom(ILaunchConfiguration configuration) { try { initCommands.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_INIT_COMMANDS, "")); //$NON-NLS-1$ + doReset.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_DO_RESET, IGDBJtagConstants.DEFAULT_DO_RESET)); + doResetChanged(); + delay.setText(String.valueOf(configuration.getAttribute(IGDBJtagConstants.ATTR_DELAY, IGDBJtagConstants.DEFAULT_DELAY))); loadImage.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_LOAD_IMAGE, IGDBJtagConstants.DEFAULT_LOAD_IMAGE)); loadImageChanged(); imageFileName.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, "")); //$NON-NLS-1$ + imageOffset.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, "")); //$NON-NLS-1$ + loadSymbols.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_LOAD_SYMBOLS, IGDBJtagConstants.DEFAULT_LOAD_SYMBOLS)); + loadSymbolsChanged(); + symbolsFileName.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_FILE_NAME, "")); //$NON-NLS-1$ + symbolsOffset.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_SYMBOLS_OFFSET, "")); //$NON-NLS-1$ + setPcRegister.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_SET_PC_REGISTER, IGDBJtagConstants.DEFAULT_SET_PC_REGISTER)); + pcRegisterChanged(); + pcRegister.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_PC_REGISTER, "")); //$NON-NLS-1$ + setStopAt.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_SET_STOP_AT, IGDBJtagConstants.DEFAULT_SET_STOP_AT)); + stopAtChanged(); + stopAt.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_STOP_AT, "")); //$NON-NLS-1$ + setResume.setSelection(configuration.getAttribute(IGDBJtagConstants.ATTR_SET_RESUME, IGDBJtagConstants.DEFAULT_SET_RESUME)); + resumeChanged(); runCommands.setText(configuration.getAttribute(IGDBJtagConstants.ATTR_RUN_COMMANDS, "")); //$NON-NLS-1$) } catch (CoreException e) { Activator.getDefault().getLog().log(e.getStatus()); @@ -226,8 +471,19 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab { public void performApply(ILaunchConfigurationWorkingCopy configuration) { configuration.setAttribute(IGDBJtagConstants.ATTR_INIT_COMMANDS, initCommands.getText()); + configuration.setAttribute(IGDBJtagConstants.ATTR_DELAY, Integer.parseInt(delay.getText())); + configuration.setAttribute(IGDBJtagConstants.ATTR_DO_RESET, doReset.getSelection()); configuration.setAttribute(IGDBJtagConstants.ATTR_LOAD_IMAGE, loadImage.getSelection()); configuration.setAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, imageFileName.getText().trim()); + configuration.setAttribute(IGDBJtagConstants.ATTR_IMAGE_OFFSET, imageOffset.getText()); + configuration.setAttribute(IGDBJtagConstants.ATTR_LOAD_SYMBOLS, loadSymbols.getSelection()); + configuration.setAttribute(IGDBJtagConstants.ATTR_SYMBOLS_OFFSET, symbolsOffset.getText()); + configuration.setAttribute(IGDBJtagConstants.ATTR_SYMBOLS_FILE_NAME, symbolsFileName.getText().trim()); + configuration.setAttribute(IGDBJtagConstants.ATTR_SET_PC_REGISTER, setPcRegister.getSelection()); + configuration.setAttribute(IGDBJtagConstants.ATTR_PC_REGISTER, pcRegister.getText()); + configuration.setAttribute(IGDBJtagConstants.ATTR_SET_STOP_AT, setStopAt.getSelection()); + configuration.setAttribute(IGDBJtagConstants.ATTR_STOP_AT, stopAt.getText()); + configuration.setAttribute(IGDBJtagConstants.ATTR_SET_RESUME, setResume.getSelection()); configuration.setAttribute(IGDBJtagConstants.ATTR_RUN_COMMANDS, runCommands.getText()); } @@ -236,6 +492,7 @@ public class GDBJtagStartupTab extends AbstractLaunchConfigurationTab { configuration.setAttribute(IGDBJtagConstants.ATTR_LOAD_IMAGE, IGDBJtagConstants.DEFAULT_LOAD_IMAGE); configuration.setAttribute(IGDBJtagConstants.ATTR_IMAGE_FILE_NAME, ""); //$NON-NLS-1$ configuration.setAttribute(IGDBJtagConstants.ATTR_RUN_COMMANDS, ""); //$NON-NLS-1$ + configuration.setAttribute(IGDBJtagConstants.ATTR_DO_RESET, true); } } diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/JtagUi.properties b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/JtagUi.properties new file mode 100644 index 00000000000..8b979bdc2c6 --- /dev/null +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/JtagUi.properties @@ -0,0 +1,41 @@ + +GDBJtagStartupTab.initGroup_Text=Initialization Commands +GDBJtagStartupTab.doReset_Text=Automatically reset board and halt +GDBJtagStartupTab.delayLabel_Text=Delay (s): + +GDBJtagStartupTab.loadGroup_Text=Load Image and Symbols +GDBJtagStartupTab.loadImage_Text=Automatically load image +GDBJtagStartupTab.imageLabel_Text=Image file name: +GDBJtagStartupTab.imageFileBrowseWs_Title=Select image file +GDBJtagStartupTab.imageFileBrowse_Title=Select image file +GDBJtagStartupTab.imageOffsetLabel_Text=Image offset: +GDBJtagStartupTab.FileBrowseWs_Label=Workspace... +GDBJtagStartupTab.FileBrowseWs_Message=Select a workspace resource +GDBJtagStartupTab.FileBrowse_Label=File System... +GDBJtagStartupTab.FileBrowse_Message=Select a file from file system +GDBJtagStartupTab.loadSymbols_Text=Automatically load symbols +GDBJtagStartupTab.symbolsLabel_Text=Symbol file name: +GDBJtagStartupTab.symbolsFileBrowseWs_Title=Select symbols file +GDBJtagStartupTab.symbolsFileBrowse_Title=Select symbols file +GDBJtagStartupTab.symbolsOffsetLabel_Text=Symbols offset: + +GDBJtagStartupTab.runOptionGroup_Text=Runtime Options +GDBJtagStartupTab.setPcRegister_Text=Automatically set program counter at: +GDBJtagStartupTab.setStopAt_Text=Automatically stop on startup at: +GDBJtagStartupTab.setResume_Text=Automatically resume + +GDBJtagStartupTab.runGroup_Text=Run Commands + +GDBJtagDebuggerTab.gdbSetupGroup_Text=GDB Setup +GDBJtagDebuggerTab.gdbCommandLabel=GDB Command: +GDBJtagDebuggerTab.gdbCommandBrowse=Browse... +GDBJtagDebuggerTab.gdbCommandBrowse_Title=Select GDB Binary +GDBJtagDebuggerTab.gdbCommandVariable=Variables... +GDBJtagDebuggerTab.commandFactoryLabel=Command Set: +GDBJtagDebuggerTab.miProtocolLabel=Protocol Version: +GDBJtagDebuggerTab.verboseModeLabel=Verbose console mode +GDBJtagDebuggerTab.remoteGroup_Text=Remote Target +GDBJtagDebuggerTab.useRemote_Text=Use remote target +GDBJtagDebuggerTab.jtagDeviceLabel=JTAG Device: +GDBJtagDebuggerTab.ipAddressLabel=Host name or IP address: +GDBJtagDebuggerTab.portNumberLabel=Port number: diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/Messages.java b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/Messages.java new file mode 100644 index 00000000000..547be2fcbd8 --- /dev/null +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/Messages.java @@ -0,0 +1,34 @@ +package org.eclipse.cdt.debug.gdbjtag.ui; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + + private static final String BUNDLE_NAME = "org.eclipse.cdt.debug.gdbjtag.ui.JtagUi"; //$NON-NLS-1$ + + private static /* final */ ResourceBundle RESOURCE_BUNDLE; // = ResourceBundle.getBundle(BUNDLE_NAME); + + static { + try { + RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); + } catch (MissingResourceException e) { + System.out.println(e.getMessage()); + } + } + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } + + public static ResourceBundle getResourceBundle() { + return RESOURCE_BUNDLE; + } +} |