diff options
author | mifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2008-01-27 14:05:59 +0000 |
---|---|---|
committer | mifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2008-01-27 14:05:59 +0000 |
commit | c882cb089477050eb46f5f9fba90ff52179acd71 (patch) | |
tree | bd76561bffd5afd45beaf8a29d06ea33f688c6ab /src/flash/flash.c | |
parent | 8d6292d9a070e87bf49d7d2894cd933795b9e3a8 (diff) |
- added autoprobe functionality
- corrected blocksize handling from GDB "info mem" command
(thanks to Øyvind and Spen for these patches)
git-svn-id: svn://svn.berlios.de/openocd/trunk@278 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/flash/flash.c')
-rw-r--r-- | src/flash/flash.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/src/flash/flash.c b/src/flash/flash.c index 2e7cc453..9d82e09a 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -127,7 +127,7 @@ int flash_init_drivers(struct command_context_s *cmd_ctx) return ERROR_OK; } -flash_bank_t *get_flash_bank_by_num(int num) +flash_bank_t *get_flash_bank_by_num_noprobe(int num) { flash_bank_t *p; int i = 0; @@ -143,6 +143,24 @@ flash_bank_t *get_flash_bank_by_num(int num) return NULL; } +flash_bank_t *get_flash_bank_by_num(int num) +{ + flash_bank_t *p = get_flash_bank_by_num_noprobe(num); + int retval; + + if (p == NULL) + return NULL; + + retval = p->driver->auto_probe(p); + + if (retval != ERROR_OK) + { + ERROR("auto_probe failed %d\n", retval); + return NULL; + } + return p; +} + /* flash_bank <driver> <base> <size> <chip_width> <bus_width> <target> [driver_options ...] */ int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) @@ -305,7 +323,7 @@ int handle_flash_probe_command(struct command_context_s *cmd_ctx, char *cmd, cha return ERROR_OK; } - p = get_flash_bank_by_num(strtoul(args[0], NULL, 0)); + p = get_flash_bank_by_num_noprobe(strtoul(args[0], NULL, 0)); if (p) { if ((retval = p->driver->probe(p)) == ERROR_OK) @@ -794,6 +812,14 @@ flash_bank_t *get_flash_bank_by_addr(target_t *target, u32 addr) /* cycle through bank list */ for (c = flash_banks; c; c = c->next) { + int retval; + retval = c->driver->auto_probe(c); + + if (retval != ERROR_OK) + { + ERROR("auto_probe failed %d\n", retval); + return NULL; + } /* check whether address belongs to this flash bank */ if ((addr >= c->base) && (addr < c->base + c->size) && target == c->target) return c; |