rp: Cleaned up and rewrote the ROM function table readout code to be more understandable and transparent
This saves 20 bytes of Flash
This commit is contained in:
parent
a372cfd787
commit
2058725dd8
|
@ -104,7 +104,7 @@ const struct command_s rp_cmd_list[] = {
|
||||||
static int rp_flash_erase(struct target_flash *f, target_addr addr, size_t len);
|
static int rp_flash_erase(struct target_flash *f, target_addr addr, size_t len);
|
||||||
static int rp_flash_write(struct target_flash *f, target_addr dest, const void *src, size_t len);
|
static int rp_flash_write(struct target_flash *f, target_addr dest, const void *src, size_t len);
|
||||||
|
|
||||||
static bool rp_fill_table(struct rp_priv_s *priv, uint16_t *table, int max);
|
static bool rp_read_rom_func_table(target *t);
|
||||||
static bool rp_attach(target *t);
|
static bool rp_attach(target *t);
|
||||||
static uint32_t rp_get_flash_length(target *t);
|
static uint32_t rp_get_flash_length(target *t);
|
||||||
static bool rp_mass_erase(target *t);
|
static bool rp_mass_erase(target *t);
|
||||||
|
@ -158,15 +158,7 @@ bool rp_probe(target *t)
|
||||||
|
|
||||||
static bool rp_attach(target *t)
|
static bool rp_attach(target *t)
|
||||||
{
|
{
|
||||||
if (!cortexm_attach(t))
|
if (!cortexm_attach(t) || !rp_read_rom_func_table(t))
|
||||||
return false;
|
|
||||||
|
|
||||||
rp_priv_s *ps = (rp_priv_s*)t->target_storage;
|
|
||||||
uint16_t table[RP_MAX_TABLE_SIZE];
|
|
||||||
/* We have to do a 32-bit read here but the pointer contained is only 16-bit. */
|
|
||||||
uint16_t table_offset = target_mem_read32(t, BOOTROM_FUNC_TABLE_ADDR) & 0x0000ffffU;
|
|
||||||
if (target_mem_read(t, table, table_offset, RP_MAX_TABLE_SIZE) ||
|
|
||||||
rp_fill_table(ps, table, RP_MAX_TABLE_SIZE))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* Free previously loaded memory map */
|
/* Free previously loaded memory map */
|
||||||
|
@ -181,14 +173,25 @@ static bool rp_attach(target *t)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool rp_fill_table(rp_priv_s *priv, uint16_t *table, int max)
|
/*
|
||||||
|
* Parse out the ROM function table for routines we need.
|
||||||
|
* Entries in the table are in pairs of 16-bit integers:
|
||||||
|
* * A two character tag for the routine (see section 2.8.3 of the datasheet)
|
||||||
|
* * The 16-bit pointer associated with that routine
|
||||||
|
*/
|
||||||
|
static bool rp_read_rom_func_table(target *const t)
|
||||||
{
|
{
|
||||||
uint16_t tag = *table++;
|
rp_priv_s *const priv = (rp_priv_s *)t->target_storage;
|
||||||
int check = 0;
|
/* We have to do a 32-bit read here but the pointer contained is only 16-bit. */
|
||||||
while ((tag != 0) && max) {
|
const uint16_t table_offset = target_mem_read32(t, BOOTROM_FUNC_TABLE_ADDR) & 0x0000ffffU;
|
||||||
uint16_t data = *table++;
|
uint16_t table[RP_MAX_TABLE_SIZE];
|
||||||
check++;
|
if (target_mem_read(t, table, table_offset, RP_MAX_TABLE_SIZE))
|
||||||
max -= 2;
|
return false;
|
||||||
|
|
||||||
|
size_t check = 0;
|
||||||
|
for (size_t i = 0; i < RP_MAX_TABLE_SIZE; i += 2) {
|
||||||
|
const uint16_t tag = table[i];
|
||||||
|
const uint16_t data = table[i + 1];
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
case BOOTROM_FUNC_TABLE_TAG('D', 'T'):
|
case BOOTROM_FUNC_TABLE_TAG('D', 'T'):
|
||||||
priv->rom_debug_trampoline_begin = data;
|
priv->rom_debug_trampoline_begin = data;
|
||||||
|
@ -218,13 +221,13 @@ static bool rp_fill_table(rp_priv_s *priv, uint16_t *table, int max)
|
||||||
priv->rom_reset_usb_boot = data;
|
priv->rom_reset_usb_boot = data;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
check--;
|
continue;
|
||||||
}
|
}
|
||||||
tag = *table++;
|
++check;
|
||||||
}
|
}
|
||||||
DEBUG_TARGET("connect %04x debug_trampoline %04x end %04x\n", priv->rom_connect_internal_flash,
|
DEBUG_TARGET("connect %04x debug_trampoline %04x end %04x\n", priv->rom_connect_internal_flash,
|
||||||
priv->rom_debug_trampoline_begin, priv->rom_debug_trampoline_end);
|
priv->rom_debug_trampoline_begin, priv->rom_debug_trampoline_end);
|
||||||
return (check != 9);
|
return check == 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* RP ROM functions calls
|
/* RP ROM functions calls
|
||||||
|
|
Loading…
Reference in New Issue