From 90697ca389fb3c6229068734be43efd9a01e0326 Mon Sep 17 00:00:00 2001 From: oharboe Date: Sun, 24 Feb 2008 20:10:48 +0000 Subject: [PATCH 1/1] - added -c option that will execute an openocd command - added at91eb40a target library example. git-svn-id: svn://svn.berlios.de/openocd/trunk@333 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/helper/Makefile.am | 16 +- src/helper/configuration.c | 399 ++++++++++++++------------- src/target/Makefile.am | 45 +-- src/target/event/at91eb40a_reset.cfg | 8 + src/target/target/at91eb40a.cfg | 34 +++ 5 files changed, 273 insertions(+), 229 deletions(-) create mode 100644 src/target/event/at91eb40a_reset.cfg create mode 100644 src/target/target/at91eb40a.cfg diff --git a/src/helper/Makefile.am b/src/helper/Makefile.am index 1e82261ed7..f65a1d2346 100644 --- a/src/helper/Makefile.am +++ b/src/helper/Makefile.am @@ -1,8 +1,8 @@ -INCLUDES = $(all_includes) -METASOURCES = AUTO -AM_CPPFLAGS = -DPKGDATADIR=\"$(pkgdatadir)\" @CPPFLAGS@ -noinst_LIBRARIES = libhelper.a -libhelper_a_SOURCES = binarybuffer.c configuration.c log.c interpreter.c command.c time_support.c \ - replacements.c fileio.c -noinst_HEADERS = binarybuffer.h configuration.h types.h log.h command.h \ - interpreter.h time_support.h replacements.h fileio.h +INCLUDES = $(all_includes) +METASOURCES = AUTO +AM_CPPFLAGS = -DPKGDATADIR=\"$(pkgdatadir)\" -DPKGLIBDIR=\"$(pkglibdir)\" @CPPFLAGS@ +noinst_LIBRARIES = libhelper.a +libhelper_a_SOURCES = binarybuffer.c configuration.c log.c interpreter.c command.c time_support.c \ + replacements.c fileio.c +noinst_HEADERS = binarybuffer.h configuration.h types.h log.h command.h \ + interpreter.h time_support.h replacements.h fileio.h diff --git a/src/helper/configuration.c b/src/helper/configuration.c index 2fbed08bf0..d9300e9dcc 100644 --- a/src/helper/configuration.c +++ b/src/helper/configuration.c @@ -1,199 +1,200 @@ -/*************************************************************************** - * Copyright (C) 2004, 2005 by Dominic Rath * - * Dominic.Rath@gmx.de * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "types.h" -#include "command.h" -#include "configuration.h" -#include "log.h" - -#include -#include -#include -#include - -static size_t num_config_files; -static char** config_file_names; - -static size_t num_script_dirs; -static char** script_search_dirs; - -static int help_flag; - -static struct option long_options[] = -{ - {"help", no_argument, &help_flag, 1}, - - {"debug", optional_argument, 0, 'd'}, - {"file", required_argument, 0, 'f'}, - {"search", required_argument, 0, 's'}, - {"log_output", required_argument, 0, 'l'}, - - {0, 0, 0, 0} -}; - -int configuration_output_handler(struct command_context_s *context, char* line) -{ - INFO(line); - - return ERROR_OK; -} - -void add_script_search_dir (const char *dir) -{ - num_script_dirs++; - script_search_dirs = (char **)realloc(script_search_dirs, (num_script_dirs+1) * sizeof (char *)); - - script_search_dirs[num_script_dirs-1] = strdup(dir); - script_search_dirs[num_script_dirs] = NULL; -} - -void add_config_file_name (const char *cfg) -{ - num_config_files++; - config_file_names = (char **)realloc(config_file_names, (num_config_files+1) * sizeof (char *)); - - config_file_names[num_config_files-1] = strdup(cfg); - config_file_names[num_config_files] = NULL; -} - -int parse_cmdline_args(struct command_context_s *cmd_ctx, int argc, char *argv[]) -{ - int c; - char command_buffer[128]; - - while (1) - { - /* getopt_long stores the option index here. */ - int option_index = 0; - - c = getopt_long(argc, argv, "hd::l:f:s:", long_options, &option_index); - - /* Detect the end of the options. */ - if (c == -1) - break; - - switch (c) - { - case 0: - break; - case 'h': /* --help | -h */ - help_flag = 1; - break; - case 'f': /* --file | -f */ - add_config_file_name(optarg); - break; - case 's': /* --search | -s */ - add_script_search_dir(optarg); - break; - case 'd': /* --debug | -d */ - if (optarg) - snprintf(command_buffer, 128, "debug_level %s", optarg); - else - snprintf(command_buffer, 128, "debug_level 3"); - command_run_line(cmd_ctx, command_buffer); - break; - case 'l': /* --log_output | -l */ - if (optarg) - { - snprintf(command_buffer, 128, "log_output %s", optarg); - command_run_line(cmd_ctx, command_buffer); - } - break; - } - } - - if (help_flag) - { - printf("Open On-Chip Debugger\n(c) 2005 by Dominic Rath\n\n"); - printf("--help | -h\tdisplay this help\n"); - printf("--file | -f\tuse configuration file \n"); - printf("--search | -s\tdir to search for config files and scripts.\n"); - printf("--debug | -d\tset debug level <0-3>\n"); - printf("--log_output | -l\tredirect log output to file \n"); - exit(-1); - } - - /* Add dir for openocd supplied scripts last so that user can over - ride those scripts if desired. */ - add_script_search_dir(PKGDATADIR); - - return ERROR_OK; -} - -FILE *open_file_from_path (command_context_t *cmd_ctx, char *file, char *mode) -{ - FILE *fp = NULL; - char **search_dirs = script_search_dirs; - char *dir; - char full_path[1024]; - - /* Check absolute and relative to current working dir first. - * This keeps full_path reporting belowing working. */ - snprintf(full_path, 1024, "%s", file); - fp = fopen(full_path, mode); - - while (!fp) - { - dir = *search_dirs++; - - if (!dir) - break; - - snprintf(full_path, 1024, "%s/%s", dir, file); - fp = fopen(full_path, mode); - } - - if (fp) - command_print(cmd_ctx, "opened %s", full_path); - - return fp; -} - -int parse_config_file(struct command_context_s *cmd_ctx) -{ - char **cfg; - FILE *config_file; - - if (!config_file_names) - add_config_file_name ("openocd.cfg"); - - cfg = config_file_names; - - while (*cfg) - { - config_file = open_file_from_path(cmd_ctx, *cfg, "r"); - if (!config_file) - { - ERROR("couldn't open config file"); - return ERROR_NO_CONFIG_FILE; - } - - command_run_file(cmd_ctx, config_file, COMMAND_CONFIG); - - fclose(config_file); - - cfg++; - } - - return ERROR_OK; -} +/*************************************************************************** + * Copyright (C) 2004, 2005 by Dominic Rath * + * Dominic.Rath@gmx.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "types.h" +#include "command.h" +#include "configuration.h" +#include "log.h" + +#include +#include +#include +#include + +static size_t num_config_files; +static char** config_file_names; + +static size_t num_script_dirs; +static char** script_search_dirs; + +static int help_flag; + +static struct option long_options[] = +{ + {"help", no_argument, &help_flag, 1}, + + {"debug", optional_argument, 0, 'd'}, + {"file", required_argument, 0, 'f'}, + {"search", required_argument, 0, 's'}, + {"log_output", required_argument, 0, 'l'}, + {"command", required_argument, 0, 'c'}, + + {0, 0, 0, 0} +}; + +int configuration_output_handler(struct command_context_s *context, char* line) +{ + INFO(line); + + return ERROR_OK; +} + +void add_script_search_dir (const char *dir) +{ + num_script_dirs++; + script_search_dirs = (char **)realloc(script_search_dirs, (num_script_dirs+1) * sizeof (char *)); + + script_search_dirs[num_script_dirs-1] = strdup(dir); + script_search_dirs[num_script_dirs] = NULL; +} + +void add_config_file_name (const char *cfg) +{ + num_config_files++; + config_file_names = (char **)realloc(config_file_names, (num_config_files+1) * sizeof (char *)); + + config_file_names[num_config_files-1] = strdup(cfg); + config_file_names[num_config_files] = NULL; +} + +int parse_cmdline_args(struct command_context_s *cmd_ctx, int argc, char *argv[]) +{ + int c; + char command_buffer[128]; + + while (1) + { + /* getopt_long stores the option index here. */ + int option_index = 0; + + c = getopt_long(argc, argv, "hd::l:f:s:c:", long_options, &option_index); + + /* Detect the end of the options. */ + if (c == -1) + break; + + switch (c) + { + case 0: + break; + case 'h': /* --help | -h */ + help_flag = 1; + break; + case 'f': /* --file | -f */ + snprintf(command_buffer, 128, "script %s", optarg); + add_config_file_name(command_buffer); + break; + case 's': /* --search | -s */ + add_script_search_dir(optarg); + break; + case 'd': /* --debug | -d */ + if (optarg) + snprintf(command_buffer, 128, "debug_level %s", optarg); + else + snprintf(command_buffer, 128, "debug_level 3"); + command_run_line(cmd_ctx, command_buffer); + break; + case 'l': /* --log_output | -l */ + if (optarg) + { + snprintf(command_buffer, 128, "log_output %s", optarg); + command_run_line(cmd_ctx, command_buffer); + } + break; + case 'c': /* --command | -c */ + if (optarg) + { + add_config_file_name(optarg); + } + break; + + } + } + + if (help_flag) + { + printf("Open On-Chip Debugger\n(c) 2005 by Dominic Rath\n\n"); + printf("--help | -h\tdisplay this help\n"); + printf("--file | -f\tuse configuration file \n"); + printf("--search | -s\tdir to search for config files and scripts.\n"); + printf("--debug | -d\tset debug level <0-3>\n"); + printf("--log_output | -l\tredirect log output to file \n"); + printf("--command | -c\trun \n"); + exit(-1); + } + + /* Add dir for openocd supplied scripts last so that user can over + ride those scripts if desired. */ + add_script_search_dir(PKGDATADIR); + add_script_search_dir(PKGLIBDIR); + + return ERROR_OK; +} + +FILE *open_file_from_path (command_context_t *cmd_ctx, char *file, char *mode) +{ + FILE *fp = NULL; + char **search_dirs = script_search_dirs; + char *dir; + char full_path[1024]; + + /* Check absolute and relative to current working dir first. + * This keeps full_path reporting belowing working. */ + snprintf(full_path, 1024, "%s", file); + fp = fopen(full_path, mode); + + while (!fp) + { + dir = *search_dirs++; + + if (!dir) + break; + + snprintf(full_path, 1024, "%s/%s", dir, file); + fp = fopen(full_path, mode); + } + + if (fp) + command_print(cmd_ctx, "opened %s", full_path); + + return fp; +} + +int parse_config_file(struct command_context_s *cmd_ctx) +{ + char **cfg; + FILE *config_file; + + if (!config_file_names) + add_config_file_name ("script openocd.cfg"); + + cfg = config_file_names; + + while (*cfg) + { + command_run_line(cmd_ctx, *cfg); + cfg++; + } + + return ERROR_OK; +} diff --git a/src/target/Makefile.am b/src/target/Makefile.am index 252928796a..d2108f0a95 100644 --- a/src/target/Makefile.am +++ b/src/target/Makefile.am @@ -1,22 +1,23 @@ - -if OOCD_TRACE -OOCD_TRACE_FILES = oocd_trace.c -else -OOCD_TRACE_FILES = -endif - -INCLUDES = -I$(top_srcdir)/src/gdb -I$(top_srcdir)/src/helper -I$(top_srcdir)/src/jtag -I$(top_srcdir)/src/xsvf $(all_includes) -METASOURCES = AUTO -AM_CPPFLAGS = -DPKGLIBDIR=\"$(pkglibdir)\" @CPPFLAGS@ -noinst_LIBRARIES = libtarget.a -libtarget_a_SOURCES = target.c register.c breakpoints.c armv4_5.c embeddedice.c etm.c arm7tdmi.c arm9tdmi.c \ - arm_jtag.c arm7_9_common.c algorithm.c arm920t.c arm720t.c armv4_5_mmu.c armv4_5_cache.c arm_disassembler.c \ - arm966e.c arm926ejs.c feroceon.c etb.c xscale.c arm_simulator.c image.c armv7m.c cortex_m3.c cortex_swjdp.c \ - etm_dummy.c $(OOCD_TRACE_FILES) target_request.c trace.c -noinst_HEADERS = target.h trace.h register.h armv4_5.h embeddedice.h etm.h arm7tdmi.h arm9tdmi.h \ - arm_jtag.h arm7_9_common.h arm920t.h arm720t.h armv4_5_mmu.h armv4_5_cache.h breakpoints.h algorithm.h \ - arm_disassembler.h arm966e.h arm926ejs.h etb.h xscale.h arm_simulator.h image.h armv7m.h cortex_m3.h cortex_swjdp.h \ - etm_dummy.h oocd_trace.h target_request.h trace.h - -nobase_dist_pkglib_DATA = xscale/debug_handler.bin - + +if OOCD_TRACE +OOCD_TRACE_FILES = oocd_trace.c +else +OOCD_TRACE_FILES = +endif + +INCLUDES = -I$(top_srcdir)/src/gdb -I$(top_srcdir)/src/helper -I$(top_srcdir)/src/jtag -I$(top_srcdir)/src/xsvf $(all_includes) +METASOURCES = AUTO +AM_CPPFLAGS = -DPKGLIBDIR=\"$(pkglibdir)\" @CPPFLAGS@ +noinst_LIBRARIES = libtarget.a +libtarget_a_SOURCES = target.c register.c breakpoints.c armv4_5.c embeddedice.c etm.c arm7tdmi.c arm9tdmi.c \ + arm_jtag.c arm7_9_common.c algorithm.c arm920t.c arm720t.c armv4_5_mmu.c armv4_5_cache.c arm_disassembler.c \ + arm966e.c arm926ejs.c feroceon.c etb.c xscale.c arm_simulator.c image.c armv7m.c cortex_m3.c cortex_swjdp.c \ + etm_dummy.c $(OOCD_TRACE_FILES) target_request.c trace.c +noinst_HEADERS = target.h trace.h register.h armv4_5.h embeddedice.h etm.h arm7tdmi.h arm9tdmi.h \ + arm_jtag.h arm7_9_common.h arm920t.h arm720t.h armv4_5_mmu.h armv4_5_cache.h breakpoints.h algorithm.h \ + arm_disassembler.h arm966e.h arm926ejs.h etb.h xscale.h arm_simulator.h image.h armv7m.h cortex_m3.h cortex_swjdp.h \ + etm_dummy.h oocd_trace.h target_request.h trace.h + +nobase_dist_pkglib_DATA = xscale/debug_handler.bin event/at91eb40a_reset.cfg target/at91eb40a.cfg + + diff --git a/src/target/event/at91eb40a_reset.cfg b/src/target/event/at91eb40a_reset.cfg new file mode 100644 index 0000000000..a2d29c6d83 --- /dev/null +++ b/src/target/event/at91eb40a_reset.cfg @@ -0,0 +1,8 @@ +# Reset script for AT91EB40a +reg cpsr 0x000000D3 +mww 0xFFE00020 0x1 +mww 0xFFE00024 0x00000000 +mww 0xFFE00000 0x01002539 +mww 0xFFFFF124 0xFFFFFFFF +mww 0xffff0010 0x100 +mww 0xffff0034 0x100 diff --git a/src/target/target/at91eb40a.cfg b/src/target/target/at91eb40a.cfg new file mode 100644 index 0000000000..0f08f717ee --- /dev/null +++ b/src/target/target/at91eb40a.cfg @@ -0,0 +1,34 @@ +#Script for AT91EB40a + +#Atmel ties SRST & TRST together, at which point it makes +#no sense to use TRST, but use TMS instead. +# +#The annoying thing with tying SRST & TRST together is that +#there is no way to halt the CPU *before and during* the +#SRST reset, which means that the CPU will run a number +#of cycles before it can be halted(as much as milliseconds). +reset_config srst_only srst_pulls_trst + +#jtag scan chain +#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE) +jtag_device 4 0x1 0xf 0xe + +#target configuration +#target arm7tdmi +target arm7tdmi little reset_init 0 arm7tdmi-s_r4 + +# speed up memory downloads +arm7 fast_memory_access enable +arm7_9 dcc_downloads enable + +# OpenOCD does not have a flash driver for for AT91FR40162S +target_script 0 reset event/at91eb40a_reset.cfg + +# required for usable performance. Used for lots of +# other things than flash programming. +working_area 0 0x00000000 0x20000 nobackup + +#force hardware values - we're running out of flash more +#often than not. The user can disable this in his +#subsequent config script. +arm7_9 force_hw_bkpts enable -- 2.30.2