Add new functions to wrap flash driver erase/write/done operations.
This commit is contained in:
parent
691d21989a
commit
7202db5860
@ -95,14 +95,10 @@ target *target_attach(target *t, target_destroy_callback destroy_cb);
|
|||||||
|
|
||||||
|
|
||||||
/* Flash memory access functions */
|
/* Flash memory access functions */
|
||||||
#define target_flash_erase(target, addr, len) \
|
int target_flash_erase(target *t, uint32_t addr, size_t len);
|
||||||
(target)->flash_erase((target), (addr), (len))
|
int target_flash_write(target *t,
|
||||||
|
uint32_t dest, const void *src, size_t len);
|
||||||
#define target_flash_write(target, dest, src, len) \
|
int target_flash_done(target *t);
|
||||||
(target)->flash_write((target), (dest), (src), (len))
|
|
||||||
|
|
||||||
#define target_flash_done(target) \
|
|
||||||
((target)->flash_done ? (target)->flash_done(target) : 0)
|
|
||||||
|
|
||||||
/* Host I/O */
|
/* Host I/O */
|
||||||
#define target_hostio_reply(target, recode, errcode) \
|
#define target_hostio_reply(target, recode, errcode) \
|
||||||
|
54
src/target.c
54
src/target.c
@ -154,3 +154,57 @@ const char *target_mem_map(target *t)
|
|||||||
return t->dyn_mem_map;
|
return t->dyn_mem_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct target_flash *flash_for_addr(target *t, uint32_t addr)
|
||||||
|
{
|
||||||
|
for (struct target_flash *f = t->flash; f; f = f->next)
|
||||||
|
if ((f->start <= addr) &&
|
||||||
|
(addr < (f->start + f->length)))
|
||||||
|
return f;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int target_flash_erase(target *t, uint32_t addr, size_t len)
|
||||||
|
{
|
||||||
|
if (t->flash_write)
|
||||||
|
return t->flash_erase(t, addr, len);
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
while (len) {
|
||||||
|
struct target_flash *f = flash_for_addr(t, addr);
|
||||||
|
size_t tmplen = MIN(len, f->length - (addr % f->length));
|
||||||
|
ret |= f->erase(f, addr, tmplen);
|
||||||
|
addr += tmplen;
|
||||||
|
len -= tmplen;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int target_flash_write(target *t,
|
||||||
|
uint32_t dest, const void *src, size_t len)
|
||||||
|
{
|
||||||
|
if (t->flash_write)
|
||||||
|
return t->flash_write(t, dest, src, len);
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
while (len) {
|
||||||
|
struct target_flash *f = flash_for_addr(t, dest);
|
||||||
|
size_t tmplen = MIN(len, f->length - (dest % f->length));
|
||||||
|
ret |= f->write(f, dest, src, tmplen);
|
||||||
|
src += tmplen;
|
||||||
|
len -= tmplen;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int target_flash_done(target *t)
|
||||||
|
{
|
||||||
|
for (struct target_flash *f = t->flash; f; f = f->next) {
|
||||||
|
if (f->done) {
|
||||||
|
int tmp = f->done(f);
|
||||||
|
if (tmp)
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user