Browse Source

flash: iterating over an address range now handles multiple banks

e.g. flash erase_address now works across an address
range that spans multiple flash chips.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
tags/v0.5.0-rc1
Øyvind Harboe 13 years ago
parent
commit
8902789f0d
1 changed files with 38 additions and 1 deletions
  1. +38
    -1
      src/flash/nor/core.c

+ 38
- 1
src/flash/nor/core.c View File

@@ -379,7 +379,7 @@ int default_flash_blank_check(struct flash_bank *bank)
* sectors will be added to the range, and that reason string is used when
* warning about those additions.
*/
static int flash_iterate_address_range(struct target *target,
static int flash_iterate_address_range_inner(struct target *target,
char *pad_reason, uint32_t addr, uint32_t length,
int (*callback)(struct flash_bank *bank, int first, int last))
{
@@ -498,6 +498,43 @@ static int flash_iterate_address_range(struct target *target,
return callback(c, first, last);
}

/* The inner fn only handles a single bank, we could be spanning
* multiple chips.
*/
static int flash_iterate_address_range(struct target *target,
char *pad_reason, uint32_t addr, uint32_t length,
int (*callback)(struct flash_bank *bank, int first, int last))
{
struct flash_bank *c;
int retval = ERROR_OK;

/* Danger! zero-length iterations means entire bank! */
do
{
retval = get_flash_bank_by_addr(target, addr, true, &c);
if (retval != ERROR_OK)
return retval;

uint32_t cur_length = length;
/* check whether it all fits in this bank */
if (addr + length - 1 > c->base + c->size - 1)
{
LOG_DEBUG("iterating over more than one flash bank.");
cur_length = c->base + c->size - addr;
}
retval = flash_iterate_address_range_inner(target,
pad_reason, addr, cur_length,
callback);
if (retval != ERROR_OK)
break;

length -= cur_length;
addr += cur_length;
} while (length > 0);

return retval;
}

int flash_erase_address_range(struct target *target,
bool pad, uint32_t addr, uint32_t length)
{


Loading…
Cancel
Save