aboutsummaryrefslogtreecommitdiff
path: root/src/flash/flash.c
diff options
context:
space:
mode:
authormifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-01-27 14:05:59 +0000
committermifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-01-27 14:05:59 +0000
commitc882cb089477050eb46f5f9fba90ff52179acd71 (patch)
treebd76561bffd5afd45beaf8a29d06ea33f688c6ab /src/flash/flash.c
parent8d6292d9a070e87bf49d7d2894cd933795b9e3a8 (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.c30
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;