diff --git a/src/ecosboard.c b/src/ecosboard.c index 34bb55898..6326b9873 100644 --- a/src/ecosboard.c +++ b/src/ecosboard.c @@ -121,196 +121,6 @@ static bool writeLog = true; char hwaddr[512]; -struct FastLoad -{ - u32 address; - u8 *data; - int length; - -}; - -static int fastload_num; -static struct FastLoad *fastload; - -static void free_fastload() -{ - if (fastload!=NULL) - { - int i; - for (i=0; i 5)) - { - return ERROR_COMMAND_SYNTAX_ERROR; - } - - /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */ - if (argc >= 2) - { - image.base_address_set = 1; - image.base_address = strtoul(args[1], NULL, 0); - } - else - { - image.base_address_set = 0; - } - - - image.start_address_set = 0; - - if (argc>=4) - { - min_address=strtoul(args[3], NULL, 0); - } - if (argc>=5) - { - max_address=strtoul(args[4], NULL, 0)+min_address; - } - - if (min_address>max_address) - { - return ERROR_COMMAND_SYNTAX_ERROR; - } - - duration_start_measure(&duration); - - if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK) - { - return ERROR_OK; - } - - image_size = 0x0; - retval = ERROR_OK; - fastload_num=image.num_sections; - fastload=(struct FastLoad *)malloc(sizeof(struct FastLoad)*image.num_sections); - if (fastload==NULL) - { - image_close(&image); - return ERROR_FAIL; - } - memset(fastload, 0, sizeof(struct FastLoad)*image.num_sections); - for (i = 0; i < image.num_sections; i++) - { - buffer = malloc(image.sections[i].size); - if (buffer == NULL) - { - command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size); - break; - } - - if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK) - { - free(buffer); - break; - } - - u32 offset=0; - u32 length=buf_cnt; - - - /* DANGER!!! beware of unsigned comparision here!!! */ - - if ((image.sections[i].base_address+buf_cnt>=min_address)&& - (image.sections[i].base_addressmax_address) - { - length-=(image.sections[i].base_address+buf_cnt)-max_address; - } - - fastload[i].address=image.sections[i].base_address+offset; - fastload[i].data=malloc(length); - if (fastload[i].data==NULL) - { - free(buffer); - break; - } - memcpy(fastload[i].data, buffer+offset, length); - fastload[i].length=length; - - image_size += length; - command_print(cmd_ctx, "%u byte written at address 0x%8.8x", length, image.sections[i].base_address+offset); - } - - free(buffer); - } - - duration_stop_measure(&duration, &duration_text); - if (retval==ERROR_OK) - { - command_print(cmd_ctx, "Loaded %u bytes in %s", image_size, duration_text); - command_print(cmd_ctx, "NB!!! image has not been loaded to target, issue a subsequent 'fast_load' to do so."); - } - free(duration_text); - - image_close(&image); - - if (retval!=ERROR_OK) - { - free_fastload(); - } - - return retval; -} - -int handle_fast_load_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) -{ - if (argc>0) - return ERROR_COMMAND_SYNTAX_ERROR; - if (fastload==NULL) - { - LOG_ERROR("No image in memory"); - return ERROR_FAIL; - } - int i; - int ms=timeval_ms(); - int size=0; - for (i=0; ivariant) target->variant = strdup(""); - + /* create the target specific commands */ if( target->type->register_commands ){ (*(target->type->register_commands))( cmd_ctx ); @@ -3993,3 +4004,196 @@ static int jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv ) return JIM_ERR; } + + +struct FastLoad +{ + u32 address; + u8 *data; + int length; + +}; + +static int fastload_num; +static struct FastLoad *fastload; + +static void free_fastload() +{ + if (fastload!=NULL) + { + int i; + for (i=0; i 5)) + { + return ERROR_COMMAND_SYNTAX_ERROR; + } + + /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */ + if (argc >= 2) + { + image.base_address_set = 1; + image.base_address = strtoul(args[1], NULL, 0); + } + else + { + image.base_address_set = 0; + } + + + image.start_address_set = 0; + + if (argc>=4) + { + min_address=strtoul(args[3], NULL, 0); + } + if (argc>=5) + { + max_address=strtoul(args[4], NULL, 0)+min_address; + } + + if (min_address>max_address) + { + return ERROR_COMMAND_SYNTAX_ERROR; + } + + duration_start_measure(&duration); + + if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK) + { + return ERROR_OK; + } + + image_size = 0x0; + retval = ERROR_OK; + fastload_num=image.num_sections; + fastload=(struct FastLoad *)malloc(sizeof(struct FastLoad)*image.num_sections); + if (fastload==NULL) + { + image_close(&image); + return ERROR_FAIL; + } + memset(fastload, 0, sizeof(struct FastLoad)*image.num_sections); + for (i = 0; i < image.num_sections; i++) + { + buffer = malloc(image.sections[i].size); + if (buffer == NULL) + { + command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size); + break; + } + + if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK) + { + free(buffer); + break; + } + + u32 offset=0; + u32 length=buf_cnt; + + + /* DANGER!!! beware of unsigned comparision here!!! */ + + if ((image.sections[i].base_address+buf_cnt>=min_address)&& + (image.sections[i].base_addressmax_address) + { + length-=(image.sections[i].base_address+buf_cnt)-max_address; + } + + fastload[i].address=image.sections[i].base_address+offset; + fastload[i].data=malloc(length); + if (fastload[i].data==NULL) + { + free(buffer); + break; + } + memcpy(fastload[i].data, buffer+offset, length); + fastload[i].length=length; + + image_size += length; + command_print(cmd_ctx, "%u byte written at address 0x%8.8x", length, image.sections[i].base_address+offset); + } + + free(buffer); + } + + duration_stop_measure(&duration, &duration_text); + if (retval==ERROR_OK) + { + command_print(cmd_ctx, "Loaded %u bytes in %s", image_size, duration_text); + command_print(cmd_ctx, "NB!!! image has not been loaded to target, issue a subsequent 'fast_load' to do so."); + } + free(duration_text); + + image_close(&image); + + if (retval!=ERROR_OK) + { + free_fastload(); + } + + return retval; +} + +int handle_fast_load_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + if (argc>0) + return ERROR_COMMAND_SYNTAX_ERROR; + if (fastload==NULL) + { + LOG_ERROR("No image in memory"); + return ERROR_FAIL; + } + int i; + int ms=timeval_ms(); + int size=0; + for (i=0; i