]> git.sur5r.net Git - openocd/blobdiff - src/target/target.c
- Added support for ARM926EJ-S based cores
[openocd] / src / target / target.c
index 34dc60a70a799331b8098a3bc87532d33902ba71..e2e0530f7e37aee4e6ad2e2d2db6ae54c2830107 100644 (file)
  *   Free Software Foundation, Inc.,                                       *
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
+#ifdef HAVE_CONFIG_H
 #include "config.h"
+#endif
+
+#include "replacements.h"
 #include "target.h"
 
 #include "log.h"
@@ -71,6 +75,8 @@ extern target_type_t arm7tdmi_target;
 extern target_type_t arm720t_target;
 extern target_type_t arm9tdmi_target;
 extern target_type_t arm920t_target;
+extern target_type_t arm966e_target;
+extern target_type_t arm926ejs_target;
 
 target_type_t *target_types[] =
 {
@@ -78,6 +84,8 @@ target_type_t *target_types[] =
        &arm9tdmi_target,
        &arm920t_target,
        &arm720t_target,
+       &arm966e_target,
+       &arm926ejs_target,
        NULL,
 };
 
@@ -203,6 +211,8 @@ int target_init_handler(struct target_s *target, enum target_event event, void *
        
        if ((event == TARGET_EVENT_HALTED) && (target->reset_script))
        {
+               target_unregister_event_callback(target_init_handler, priv);
+
                script = fopen(target->reset_script, "r");
                if (!script)
                {
@@ -215,8 +225,6 @@ int target_init_handler(struct target_s *target, enum target_event event, void *
                fclose(script);
 
                jtag_execute_queue();
-
-               target_unregister_event_callback(target_init_handler, priv);
        }
        
        return ERROR_OK;
@@ -689,6 +697,7 @@ int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffe
                if ((retval = target->type->read_memory(target, address, 1, unaligned, buffer)) != ERROR_OK)
                        return retval;
                
+               buffer += unaligned;
                address += unaligned;
                size -= unaligned;
        }
@@ -701,6 +710,7 @@ int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffe
                if ((retval = target->type->read_memory(target, address, 4, aligned / 4, buffer)) != ERROR_OK)
                        return retval;
                
+               buffer += aligned;
                address += aligned;
                size -= aligned;
        }
@@ -715,6 +725,50 @@ int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffe
        return ERROR_OK;
 }
 
+void target_read_u32(struct target_s *target, u32 address, u32 *value)
+{
+       u8 value_buf[4];
+       
+       target->type->read_memory(target, address, 4, 1, value_buf);
+       
+       *value = target_buffer_get_u32(target, value_buf);
+}
+
+void target_read_u16(struct target_s *target, u32 address, u16 *value)
+{
+       u8 value_buf[2];
+       
+       target->type->read_memory(target, address, 2, 1, value_buf);
+       
+       *value = target_buffer_get_u16(target, value_buf);
+}
+
+void target_read_u8(struct target_s *target, u32 address, u8 *value)
+{
+       target->type->read_memory(target, address, 1, 1, value);
+}
+
+void target_write_u32(struct target_s *target, u32 address, u32 value)
+{
+       u8 value_buf[4];
+
+       target_buffer_set_u32(target, value_buf, value);        
+       target->type->write_memory(target, address, 4, 1, value_buf);
+}
+
+void target_write_u16(struct target_s *target, u32 address, u16 value)
+{
+       u8 value_buf[2];
+       
+       target_buffer_set_u16(target, value_buf, value);        
+       target->type->write_memory(target, address, 2, 1, value_buf);
+}
+
+void target_write_u8(struct target_s *target, u32 address, u8 value)
+{
+       target->type->read_memory(target, address, 1, 1, &value);
+}
+
 int target_register_user_commands(struct command_context_s *cmd_ctx)
 {
        register_command(cmd_ctx,  NULL, "reg", handle_reg_command, COMMAND_EXEC, NULL);
@@ -852,7 +906,6 @@ int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **a
                                (*last_target_p)->working_areas = NULL;
                                (*last_target_p)->backup_working_area = 0;
                                
-                               (*last_target_p)->endianness = TARGET_LITTLE_ENDIAN;
                                (*last_target_p)->state = TARGET_UNKNOWN;
                                (*last_target_p)->reg_cache = NULL;
                                (*last_target_p)->breakpoints = NULL;
@@ -1033,7 +1086,7 @@ int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args
                        int i;
                        for (i = 0; i < cache->num_regs; i++)
                        {
-                               value = buf_to_char(cache->reg_list[i].value, cache->reg_list[i].size);
+                               value = buf_to_str(cache->reg_list[i].value, cache->reg_list[i].size, 16);
                                command_print(cmd_ctx, "(%i) %s (/%i): 0x%s (dirty: %i, valid: %i)", count++, cache->reg_list[i].name, cache->reg_list[i].size, value, cache->reg_list[i].dirty, cache->reg_list[i].valid);
                                free(value);
                        }
@@ -1098,7 +1151,7 @@ int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args
                        }
                        arch_type->get(reg);
                }
-               value = buf_to_char(reg->value, reg->size);
+               value = buf_to_str(reg->value, reg->size, 16);
                command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
                free(value);
                return ERROR_OK;
@@ -1107,7 +1160,9 @@ int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args
        /* set register value */
        if (argc == 2)
        {
-               u32 new_value = strtoul(args[1], NULL, 0);
+               u8 *buf = malloc(CEIL(reg->size, 8));
+               str_to_buf(args[1], strlen(args[1]), buf, reg->size, 0);
+
                reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
                if (arch_type == NULL)
                {
@@ -1115,11 +1170,14 @@ int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args
                        return ERROR_OK;
                }
                
-               arch_type->set(reg, new_value);
-               value = buf_to_char(reg->value, reg->size);
+               arch_type->set(reg, buf);
+               
+               value = buf_to_str(reg->value, reg->size, 16);
                command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
                free(value);
                
+               free(buf);
+               
                return ERROR_OK;
        }
        
@@ -1413,6 +1471,7 @@ int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
                                command_print(cmd_ctx, "error: unknown error");
                                break;
                }
+               return ERROR_OK;
        }
 
        output_len = 0;
@@ -1425,13 +1484,13 @@ int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
                switch (size)
                {
                        case 4:
-                               output_len += snprintf(output + output_len, 128 - output_len, "%8.8x ", ((u32*)buffer)[i]);
+                               output_len += snprintf(output + output_len, 128 - output_len, "%8.8x ", target_buffer_get_u32(target, &buffer[i*4]));
                                break;
                        case 2:
-                               output_len += snprintf(output + output_len, 128 - output_len, "%4.4x ", ((u16*)buffer)[i]);
+                               output_len += snprintf(output + output_len, 128 - output_len, "%4.4x ", target_buffer_get_u16(target, &buffer[i*2]));
                                break;
                        case 1:
-                               output_len += snprintf(output + output_len, 128 - output_len, "%2.2x ", ((u8*)buffer)[i]);
+                               output_len += snprintf(output + output_len, 128 - output_len, "%2.2x ", buffer[i*1]);
                                break;
                }
 
@@ -1453,6 +1512,7 @@ int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
        u32 value = 0;
        int retval;
        target_t *target = get_current_target(cmd_ctx);
+       u8 value_buf[4];
 
        if (argc < 2)
                return ERROR_OK;
@@ -1463,13 +1523,16 @@ int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
        switch (cmd[2])
        {
                case 'w':
-                       retval = target->type->write_memory(target, address, 4, 1, (u8*)&value);
+                       target_buffer_set_u32(target, value_buf, value);
+                       retval = target->type->write_memory(target, address, 4, 1, value_buf);
                        break;
                case 'h':
-                       retval = target->type->write_memory(target, address, 2, 1, (u8*)&value);
+                       target_buffer_set_u16(target, value_buf, value);
+                       retval = target->type->write_memory(target, address, 2, 1, value_buf);
                        break;
                case 'b':
-                       retval = target->type->write_memory(target, address, 1, 1, (u8*)&value);
+                       value_buf[0] = value;
+                       retval = target->type->write_memory(target, address, 1, 1, value_buf);
                        break;
                default:
                        return ERROR_OK;
@@ -1507,7 +1570,7 @@ int handle_load_binary_command(struct command_context_s *cmd_ctx, char *cmd, cha
        u8 *buffer;
        u32 buf_cnt;
        
-       struct timeval start, end;
+       struct timeval start, end, duration;
                
        target_t *target = get_current_target(cmd_ctx);
 
@@ -1526,7 +1589,7 @@ int handle_load_binary_command(struct command_context_s *cmd_ctx, char *cmd, cha
                return ERROR_OK;
        }
 
-       if (!(binary = fopen(args[0], "r")))
+       if (!(binary = fopen(args[0], "rb")))
        {
                ERROR("couldn't open %s: %s", args[0], strerror(errno));
                command_print(cmd_ctx, "error accessing file %s", args[0]);
@@ -1550,7 +1613,8 @@ int handle_load_binary_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
        free(buffer);
        
-       command_print(cmd_ctx, "downloaded %lli byte in %is %ius", (long long) binary_stat.st_size, end.tv_sec - start.tv_sec, end.tv_usec - start.tv_usec);
+       timeval_subtract(&duration, &end, &start);
+       command_print(cmd_ctx, "downloaded %lli byte in %is %ius", (long long) binary_stat.st_size, duration.tv_sec, duration.tv_usec);
        
        fclose(binary);
 
@@ -1565,6 +1629,8 @@ int handle_dump_binary_command(struct command_context_s *cmd_ctx, char *cmd, cha
        u32 size;
        u8 buffer[560];
        
+       struct timeval start, end, duration;
+       
        target_t *target = get_current_target(cmd_ctx);
 
        if (argc != 3)
@@ -1576,7 +1642,7 @@ int handle_dump_binary_command(struct command_context_s *cmd_ctx, char *cmd, cha
        address = strtoul(args[1], NULL, 0);
        size = strtoul(args[2], NULL, 0);
 
-       if (!(binary = fopen(args[0], "w")))
+       if (!(binary = fopen(args[0], "wb")))
        {
                ERROR("couldn't open %s for writing: %s", args[0], strerror(errno));
                command_print(cmd_ctx, "error accessing file %s", args[0]);
@@ -1589,6 +1655,8 @@ int handle_dump_binary_command(struct command_context_s *cmd_ctx, char *cmd, cha
                return ERROR_OK;
        }
 
+       gettimeofday(&start, NULL);     
+       
        while (size > 0)
        {
                u32 this_run_size = (size > 560) ? 560 : size;
@@ -1600,6 +1668,11 @@ int handle_dump_binary_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
        fclose(binary);
 
+       gettimeofday(&end, NULL);       
+
+       timeval_subtract(&duration, &end, &start);
+       command_print(cmd_ctx, "dumped %i byte in %is %ius", strtoul(args[2], NULL, 0), duration.tv_sec, duration.tv_usec);
+       
        return ERROR_OK;
 
 }
@@ -1617,7 +1690,7 @@ int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
                {
                        if (breakpoint->type == BKPT_SOFT)
                        {
-                               char* buf = buf_to_char(breakpoint->orig_instr, breakpoint->length);
+                               char* buf = buf_to_str(breakpoint->orig_instr, breakpoint->length, 16);
                                command_print(cmd_ctx, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint->address, breakpoint->length, breakpoint->set, buf);
                                free(buf);
                        }
@@ -1654,6 +1727,14 @@ int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
                                        break;
                        }
                }
+               else
+               {
+                       command_print(cmd_ctx, "breakpoint added at address 0x%8.8x", strtoul(args[0], NULL, 0));
+               }
+       }
+       else
+       {
+               command_print(cmd_ctx, "usage: bp <address> <length> ['hw']");
        }
 
        return ERROR_OK;