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>
This commit is contained in:
parent
17634b3760
commit
8902789f0d
|
@ -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
|
* sectors will be added to the range, and that reason string is used when
|
||||||
* warning about those additions.
|
* 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,
|
char *pad_reason, uint32_t addr, uint32_t length,
|
||||||
int (*callback)(struct flash_bank *bank, int first, int last))
|
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);
|
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,
|
int flash_erase_address_range(struct target *target,
|
||||||
bool pad, uint32_t addr, uint32_t length)
|
bool pad, uint32_t addr, uint32_t length)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue