- reverted some of the changes that possibly broke arm926ejs. Waiting
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Fri, 4 Apr 2008 13:47:38 +0000 (13:47 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Fri, 4 Apr 2008 13:47:38 +0000 (13:47 +0000)
for a bit more info before I can tell with confidence whether or not
this would have any effect.
- worked on error propagation and output for flash

git-svn-id: svn://svn.berlios.de/openocd/trunk@539 b42882b7-edfa-0310-969c-e2dbd0fdcd60

13 files changed:
src/flash/ecos.c
src/flash/flash.c
src/helper/command.c
src/helper/command.h
src/target/Makefile.am
src/target/arm11.c
src/target/arm7_9_common.c
src/target/cortex_m3.c
src/target/ecos/at91eb40a.elf [new file with mode: 0644]
src/target/target.c
src/target/target/at91eb40a.cfg
src/target/target/zy1000.cfg
src/target/xscale.c

index f467b74d8c4b17547bd14a4b8f80f413630549b8..8b64b2d71346524881f716320e0ff430a9ba487d 100644 (file)
@@ -211,10 +211,9 @@ int loadDriver(ecosflash_flash_bank_t *info)
                int retval;
                if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
                {
-                       LOG_ERROR("image_read_section failed with error code: %i", retval);
                        free(buffer);
                        image_close(&image);
-                       return ERROR_FLASH_BANK_INVALID;
+                       return retval;
                }
                target_write_buffer(target, image.sections[i].base_address, buf_cnt, buffer);
                image_size += buf_cnt;
@@ -303,7 +302,7 @@ int eCosBoard_erase(ecosflash_flash_bank_t *info, u32 address, u32 len)
        if (flashErr != 0x0)
        {
                LOG_ERROR("Flash erase failed with %d (%s)\n", flashErr, flash_errmsg(flashErr));
-               return ERROR_JTAG_DEVICE_ERROR;
+               return ERROR_FAIL;
        }
 
        return ERROR_OK;
@@ -362,7 +361,7 @@ int eCosBoard_flash(ecosflash_flash_bank_t *info, void *data, u32 address, u32 l
                if (flashErr != 0x0)
                {
                        LOG_ERROR("Flash prog failed with %d (%s)\n", flashErr, flash_errmsg(flashErr));
-                       return ERROR_JTAG_DEVICE_ERROR;
+                       return ERROR_FAIL;
                }
     }
        return ERROR_OK;
index 9607725834692a6702e8ef7eebd6f0b3cba8cc2a..850dcd4cb50b1f5579a044ecf7fd28c9c6b2d616 100644 (file)
@@ -618,13 +618,12 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm
        if (argc < 1)
        {
                return ERROR_COMMAND_SYNTAX_ERROR;
-
        }
 
        if (!target)
        {
                LOG_ERROR("no target selected");
-               return ERROR_OK;
+               return ERROR_FAIL;
        }
 
        duration_start_measure(&duration);
@@ -649,7 +648,6 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm
        }
 
        retval = flash_write(target, &image, &written, auto_erase);
-
        if (retval != ERROR_OK)
        {
                image_close(&image);
@@ -659,9 +657,9 @@ int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cm
        duration_stop_measure(&duration, &duration_text);
        if (retval == ERROR_OK)
        {
-       command_print(cmd_ctx, "wrote %u byte from file %s in %s (%f kb/s)",
-               written, args[0], duration_text,
-               (float)written / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0)));
+               command_print(cmd_ctx, "wrote %u byte from file %s in %s (%f kb/s)",
+                               written, args[0], duration_text,
+                               (float)written / 1024.0 / ((float)duration.duration.tv_sec + ((float)duration.duration.tv_usec / 1000000.0)));
        }
        free(duration_text);
 
@@ -923,7 +921,7 @@ int flash_erase_address_range(target_t *target, u32 addr, u32 length)
 /* write (optional verify) an image to flash memory of the given target */
 int flash_write(target_t *target, image_t *image, u32 *written, int erase)
 {
-       int retval;
+       int retval=ERROR_OK;
 
        int section;
        u32 section_offset;
@@ -1039,14 +1037,14 @@ int flash_write(target_t *target, image_t *image, u32 *written, int erase)
 
                if (retval != ERROR_OK)
                {
-                               return retval; /* abort operation */
-                       }
+                       return retval; /* abort operation */
+               }
 
                if (written != NULL)
                        *written += run_size; /* add run size to total written counter */
        }
 
-       return ERROR_OK;
+       return retval;
 }
 
 int handle_flash_auto_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
index 7d24d81d9e875ee4011bac9b251b4d57bcd8a63b..ef5673336f026746880f1302e4feb6e1f7acb864 100644 (file)
@@ -298,6 +298,7 @@ void command_print(command_context_t *context, char *format, ...)
 int find_and_run_command(command_context_t *context, command_t *commands, char *words[], int num_words, int start_word)
 {
        command_t *c;
+       int retval = ERROR_COMMAND_SYNTAX_ERROR;
        
        if (unique_length_dirty)
        {
@@ -321,6 +322,7 @@ int find_and_run_command(command_context_t *context, command_t *commands, char *
                                if (!c->handler)
                                {
                                        command_print(context, "No handler for command");
+                                       retval = ERROR_COMMAND_SYNTAX_ERROR;
                                        break;
                                }
                                else
@@ -330,6 +332,12 @@ int find_and_run_command(command_context_t *context, command_t *commands, char *
                                        {
                                                command_print(context, "Syntax error:");
                                                command_print_help_line(context, c, 0);
+                                       } else if (retval != ERROR_OK)
+                                       {
+                                               /* we do not print out an error message because the command *should*
+                                                * have printed out an error
+                                                */
+                                               LOG_DEBUG("Command failed with error code %d", retval); 
                                        }
                                        return retval; 
                                }
@@ -347,7 +355,7 @@ int find_and_run_command(command_context_t *context, command_t *commands, char *
        }
        
        command_print(context, "Command %s not found", words[start_word]);
-       return ERROR_OK;
+       return retval;
 }
 
 int command_run_line(command_context_t *context, char *line)
index 3acb8b1821b72eec8bd91aaf015987145fd80439..6e6af75eb8b0ed0194ba1b23eef3b4a2171d9f9e 100644 (file)
@@ -34,6 +34,20 @@ typedef struct command_context_s
        enum command_mode mode;
        struct command_s *commands;
        int current_target;
+       /* Execute a command.
+        * 
+        * If the command fails, it *MUST* return a value != ERROR_OK
+        * (many commands break this rule, patches welcome!)
+        * 
+        * This is *especially* important for commands such as writing
+        * to flash or verifying memory. The reason is that those commands
+        * can be used by programs to determine if the operation succeded
+        * or not. If the operation failed, then a program can try
+        * an alternative approach.
+        * 
+        * Returning ERROR_COMMAND_SYNTAX_ERROR will have the effect of
+        * printing out the syntax of the command.
+        */
        int (*output_handler)(struct command_context_s *context, char* line);
        void *output_handler_priv;
 } command_context_t;
index 83379381c3d968b2a213c2773f765a080a37286e..3f00352582c53505e36b05bff93731dc8a15bb53 100644 (file)
@@ -23,7 +23,8 @@ nobase_dist_pkglib_DATA = xscale/debug_handler.bin event/at91eb40a_reset.script
        target/at91r40008.cfg target/lpc2148.cfg target/lpc2294.cfg target/sam7s256.cfg \
        target/sam7x256.cfg target/str710.cfg target/str912.cfg target/nslu2.cfg target/pxa255_sst.cfg \
        target/pxa255.cfg  target/zy1000.cfg event/zy1000_reset.script event/at91sam9260_reset.script target/at91sam9260.cfg \
-       target/wi-9c.cfg event/wi-9c_reset.script event/pxa255_reset.script target/stm32.cfg target/xba_revA3.cfg event/xba_revA3.script
+       target/wi-9c.cfg event/wi-9c_reset.script event/pxa255_reset.script target/stm32.cfg  target/xba_revA3.cfg event/xba_revA3.script \
+       ecos/at91eb40a.elf
        
 
 
index adcbe74912efba7b083b11c2b23a5fce1aa0adf6..ea88d5c0b7333f60ee91265afc9ae3540c219540 100644 (file)
@@ -732,8 +732,8 @@ int arm11_halt(struct target_s *target)
 
     if (target->state == TARGET_HALTED)
     {
-       LOG_WARNING("target was already halted");
-       return ERROR_OK;
+               LOG_DEBUG("target was already halted");
+               return ERROR_OK;
     }
 
     if (arm11->trst_active)
index 63767ae307bdb149d78d9a1df4d2e598409b15a8..4e14497de0acd3bfab4c3e0b9fe7388a8eac5fa7 100644 (file)
@@ -733,8 +733,18 @@ int arm7_9_poll(target_t *target)
        return ERROR_OK;
 }
 
+/*
+  Some -S targets (ARM966E-S in the STR912 isn't affected, ARM926EJ-S
+  in the LPC3180 and AT91SAM9260 is affected) completely stop the JTAG clock
+  while the core is held in reset. It isn't possible to program the halt
+  condition once reset was asserted, hence a hook that allows the target to set
+  up its reset-halt condition prior to asserting reset.
+*/
+
 int arm7_9_assert_reset(target_t *target)
 {
+       armv4_5_common_t *armv4_5 = target->arch_info;
+       arm7_9_common_t *arm7_9 = armv4_5->arch_info;
        LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
        
        if (!(jtag_reset_config & RESET_HAS_SRST))
@@ -743,10 +753,32 @@ int arm7_9_assert_reset(target_t *target)
                return ERROR_FAIL;
        }
 
+       /*
+        * Some targets do not support communication while TRST is asserted. We need to
+        * set up the reset vector catch here.
+        * 
+        * If TRST is in use, then these settings will be reset anyway, so setting them
+        * here is harmless.  
+        */
+       if (arm7_9->has_vector_catch)
+       {
+               /* program vector catch register to catch reset vector */
+               embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_VEC_CATCH], 0x1);
+       }
+       else
+       {
+               /* program watchpoint unit to match on reset vector address */
+               embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK], 0x3);
+               embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK], 0x0);
+               embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x100);
+               embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK], 0xf7);
+       }
+
        /* we can't know what state the target is in as we might e.g.
         * be resetting after a power dropout, so we need to issue a tms/srst
         */
        
+       
        /* assert SRST and TRST */
        /* system would get ouf sync if we didn't reset test-logic, too */
        jtag_add_reset(1, 1);
@@ -766,10 +798,6 @@ int arm7_9_assert_reset(target_t *target)
        target->state = TARGET_RESET;
        jtag_add_sleep(50000);
 
-       /* at this point we TRST *may* be deasserted */
-       arm7_9_prepare_reset_halt(target);
-
-       
        armv4_5_invalidate_core_regs(target);
 
        return ERROR_OK;
@@ -909,15 +937,6 @@ int arm7_9_soft_reset_halt(struct target_s *target)
        return ERROR_OK;
 }
 
-int arm7_9_prepare_reset_halt(target_t *target)
-{
-       if ((target->reset_mode!=RESET_HALT)&&(target->reset_mode!=RESET_INIT))
-       {
-               return ERROR_OK;
-       }
-       return arm7_9_halt(target);
-}
-
 int arm7_9_halt(target_t *target)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
@@ -928,7 +947,7 @@ int arm7_9_halt(target_t *target)
        
        if (target->state == TARGET_HALTED)
        {
-               LOG_WARNING("target was already halted");
+               LOG_DEBUG("target was already halted");
                return ERROR_OK;
        }
        
index 406a00af47194652c57b3696ecc0725267c3ecb8..19b0a758bdaad524ac1bc220c934db8853fb5e29 100644 (file)
@@ -429,7 +429,7 @@ int cortex_m3_halt(target_t *target)
        
        if (target->state == TARGET_HALTED)
        {
-               LOG_WARNING("target was already halted");
+               LOG_DEBUG("target was already halted");
                return ERROR_OK;
        }
        
diff --git a/src/target/ecos/at91eb40a.elf b/src/target/ecos/at91eb40a.elf
new file mode 100644 (file)
index 0000000..451657a
Binary files /dev/null and b/src/target/ecos/at91eb40a.elf differ
index f90834d1bd8263c006922ed4e8d843022fa3b041..7673f5d22aaffcc561e1c479346ba5ba4552f109 100644 (file)
@@ -2053,14 +2053,13 @@ int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, ch
        
        if (argc < 1)
        {
-               command_print(cmd_ctx, "usage: verify_image <file> [offset] [type]");
-               return ERROR_OK;
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
        
        if (!target)
        {
                LOG_ERROR("no target selected");
-               return ERROR_OK;
+               return ERROR_FAIL;
        }
        
        duration_start_measure(&duration);
@@ -2078,9 +2077,9 @@ int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, ch
 
        image.start_address_set = 0;
 
-       if (image_open(&image, args[0], (argc == 3) ? args[2] : NULL) != ERROR_OK)
+       if ((retval=image_open(&image, args[0], (argc == 3) ? args[2] : NULL)) != ERROR_OK)
        {
-               return ERROR_OK;
+               return retval;
        }
        
        image_size = 0x0;
index 3d5eb14ee2004610525780233f0b9a825323732a..658c6d0cc58177f601061ed6dcb41ec2f5c1bca4 100644 (file)
@@ -14,7 +14,6 @@ reset_config srst_only srst_pulls_trst
 jtag_device 4 0x1 0xf 0xe
 
 #target configuration
-#target arm7tdmi <endianness> <reset mode> <chainpos> <variant>
 target arm7tdmi little reset_init 0 arm7tdmi-s_r4
 
 # speed up memory downloads
@@ -24,6 +23,9 @@ arm7_9 dcc_downloads enable
 # OpenOCD does not have a flash driver for for AT91FR40162S 
 target_script 0 reset event/at91eb40a_reset.script
 
+#flash driver
+flash bank ecosflash 0x01000000 0x200000 2 2 0 ecos/at91eb40a.elf
+
 # required for usable performance. Used for lots of
 # other things than flash programming.
 working_area 0 0x00000000 0x20000 nobackup
index 5a2fab68211a320df937c2206580ed4368fb5ad6..b082ca240c1e08e9eaf13733af811d4dcbc29f3b 100644 (file)
@@ -14,7 +14,6 @@ reset_config srst_only srst_pulls_trst
 jtag_device 4 0x1 0xf 0xe
 
 #target configuration
-#target arm7tdmi <endianness> <reset mode> <chainpos> <variant>
 target arm7tdmi little reset_init 0 arm7tdmi-s_r4
 
 # at CPU CLK <32kHz this must be disabled
@@ -22,7 +21,7 @@ arm7 fast_memory_access enable
 arm7_9 dcc_downloads enable
 
 
-flash bank ecosflash 0x01000000 0x200000 2 2 0 /rom/at91eb40a.elf
+flash bank ecosflash 0x01000000 0x200000 2 2 0 ecos/at91eb40a.elf
 target_script 0 reset event/zy1000_reset.script
 
 # required for usable performance. Used for lots of
index 1d379f59184879c9fe7a1a297698b5170fbc1878..b9a367ad6d81301aa7371e4448ed81728be82617 100644 (file)
@@ -1263,7 +1263,7 @@ int xscale_halt(target_t *target)
 
        if (target->state == TARGET_HALTED)
        {
-               LOG_WARNING("target was already halted");
+               LOG_DEBUG("target was already halted");
                return ERROR_OK;
        }
        else if (target->state == TARGET_UNKNOWN)