diff options
author | drath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2007-03-15 13:36:44 +0000 |
---|---|---|
committer | drath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2007-03-15 13:36:44 +0000 |
commit | cb582796539d35920e918bec2d0118eb3736d40e (patch) | |
tree | 0c46f343c31094c65d196c66cc821e0a6d43bf49 /src/flash/flash.c | |
parent | e0c2e30660bef422744e885ab32c26c58978a8a1 (diff) |
- reworked file i/o. every fileaccess (target, flash, nand, in future configuration, too) should now go through the fileio subsystem
- added support for reading IHEX files (through fileio)
- load/dump_binary renamed to the more generic load/dump_image <file> <address> ['bin'|'ihex']
- added NAND framework (preliminary)
- added support for the LPC3180 SLC and MLC NAND controllers (preliminary)
- fix initialization for parport
- gw16012 fixes/cleanups
- added EmbeddedICE version 7 (preliminary, reported on two LPC23xx devices so far)
- added 'arm7_9 etm <target#>' configuration command to enable access to the ETM registers
git-svn-id: svn://svn.berlios.de/openocd/trunk@132 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/flash/flash.c')
-rw-r--r-- | src/flash/flash.c | 64 |
1 files changed, 29 insertions, 35 deletions
diff --git a/src/flash/flash.c b/src/flash/flash.c index 0a679646..f5c83f80 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -34,6 +34,8 @@ #include <sys/stat.h> #include <errno.h> +#include <fileio.h> + /* command handlers */ int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_flash_banks_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); @@ -486,24 +488,31 @@ int handle_flash_protect_command(struct command_context_s *cmd_ctx, char *cmd, c int handle_flash_write_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - FILE *binary; u32 offset; - struct stat binary_stat; u32 binary_size; u8 *buffer; u32 buf_cnt; + + fileio_t file; + fileio_image_t image_info; + enum fileio_sec_type sec_type; + + duration_t duration; + char *duration_text; + int retval; flash_bank_t *p; - struct timeval start, end, duration; - gettimeofday(&start, NULL); - if (argc < 3) { - command_print(cmd_ctx, "usage: flash write <bank> <file> <offset>"); + command_print(cmd_ctx, "usage: flash write <bank> <file> <offset> [type]"); return ERROR_OK; } + duration_start_measure(&duration); + + fileio_identify_image_type(&sec_type, (argc == 4) ? args[3] : NULL); + offset = strtoul(args[2], NULL, 0); p = get_flash_bank_by_num(strtoul(args[0], NULL, 0)); if (!p) @@ -512,36 +521,21 @@ int handle_flash_write_command(struct command_context_s *cmd_ctx, char *cmd, cha return ERROR_OK; } - if (stat(args[1], &binary_stat) == -1) - { - ERROR("couldn't stat() %s: %s", args[1], strerror(errno)); - return ERROR_OK; - } + image_info.base_address = strtoul(args[2], NULL, 0); + image_info.has_start_address = 0; - if (S_ISDIR(binary_stat.st_mode)) + if (fileio_open(&file, args[1], FILEIO_READ, + FILEIO_IMAGE, &image_info, sec_type) != ERROR_OK) { - ERROR("%s is a directory", args[1]); - command_print(cmd_ctx,"%s is a directory", args[1]); + command_print(cmd_ctx, "flash write error: %s", file.error_str); return ERROR_OK; } - - if (binary_stat.st_size == 0){ - ERROR("Empty file %s", args[1]); - command_print(cmd_ctx,"Empty file %s", args[1]); - return ERROR_OK; - } - - if (!(binary = fopen(args[1], "rb"))) - { - ERROR("couldn't open %s: %s", args[1], strerror(errno)); - command_print(cmd_ctx, "couldn't open %s", args[1]); - return ERROR_OK; - } - - binary_size = binary_stat.st_size; + + binary_size = file.size; buffer = malloc(binary_size); - buf_cnt = fread(buffer, 1, binary_size, binary); + fileio_read(&file, binary_size, buffer, &buf_cnt); + if ((retval = p->driver->write(p, buffer, offset, buf_cnt)) != ERROR_OK) { command_print(cmd_ctx, "failed writing file %s to flash bank %i at offset 0x%8.8x", @@ -575,14 +569,14 @@ int handle_flash_write_command(struct command_context_s *cmd_ctx, char *cmd, cha } else { - gettimeofday(&end, NULL); - timeval_subtract(&duration, &end, &start); - - command_print(cmd_ctx, "wrote file %s to flash bank %i at offset 0x%8.8x in %is %ius", args[1], strtoul(args[0], NULL, 0), strtoul(args[2], NULL, 0), duration.tv_sec, duration.tv_usec); + duration_stop_measure(&duration, &duration_text); + command_print(cmd_ctx, "wrote file %s to flash bank %i at offset 0x%8.8x in %s", + file.url, strtoul(args[0], NULL, 0), offset, duration_text); + free(duration_text); } free(buffer); - fclose(binary); + fileio_close(&file); return ERROR_OK; } |