stm32f4: allow selection of flash programming parallelism

This commit is contained in:
Nicolas Schodet 2017-06-16 14:39:57 +02:00
parent 1ee1f441d5
commit 3846ea4708

View File

@ -37,10 +37,12 @@
static bool stm32f4_cmd_erase_mass(target *t); static bool stm32f4_cmd_erase_mass(target *t);
static bool stm32f4_cmd_option(target *t, int argc, char *argv[]); static bool stm32f4_cmd_option(target *t, int argc, char *argv[]);
static bool stm32f4_cmd_psize(target *t, int argc, char *argv[]);
const struct command_s stm32f4_cmd_list[] = { const struct command_s stm32f4_cmd_list[] = {
{"erase_mass", (cmd_handler)stm32f4_cmd_erase_mass, "Erase entire flash memory"}, {"erase_mass", (cmd_handler)stm32f4_cmd_erase_mass, "Erase entire flash memory"},
{"option", (cmd_handler)stm32f4_cmd_option, "Manipulate option bytes"}, {"option", (cmd_handler)stm32f4_cmd_option, "Manipulate option bytes"},
{"psize", (cmd_handler)stm32f4_cmd_psize, "Configure flash write parallelism: (x8|x32)"},
{NULL, NULL, NULL} {NULL, NULL, NULL}
}; };
@ -123,6 +125,7 @@ static const uint16_t stm32f4_flash_write_x8_stub[] = {
struct stm32f4_flash { struct stm32f4_flash {
struct target_flash f; struct target_flash f;
uint8_t base_sector; uint8_t base_sector;
uint8_t psize;
}; };
static void stm32f4_add_flash(target *t, static void stm32f4_add_flash(target *t,
@ -139,6 +142,7 @@ static void stm32f4_add_flash(target *t,
f->align = 4; f->align = 4;
f->erased = 0xff; f->erased = 0xff;
sf->base_sector = base_sector; sf->base_sector = base_sector;
sf->psize = 32;
target_add_flash(t, f); target_add_flash(t, f);
} }
@ -273,6 +277,10 @@ static int stm32f4_flash_write(struct target_flash *f,
} }
/* Write buffer to target ram call stub */ /* Write buffer to target ram call stub */
if (((struct stm32f4_flash *)f)->psize == 32)
target_mem_write(f->t, SRAM_BASE, stm32f4_flash_write_x32_stub,
sizeof(stm32f4_flash_write_x32_stub));
else
target_mem_write(f->t, SRAM_BASE, stm32f4_flash_write_x8_stub, target_mem_write(f->t, SRAM_BASE, stm32f4_flash_write_x8_stub,
sizeof(stm32f4_flash_write_x8_stub)); sizeof(stm32f4_flash_write_x8_stub));
target_mem_write(f->t, STUB_BUFFER_BASE, src, len); target_mem_write(f->t, STUB_BUFFER_BASE, src, len);
@ -362,3 +370,33 @@ static bool stm32f4_cmd_option(target *t, int argc, char *argv[])
} }
return true; return true;
} }
static bool stm32f4_cmd_psize(target *t, int argc, char *argv[])
{
if (argc == 1) {
uint8_t psize = 8;
for (struct target_flash *f = t->flash; f; f = f->next) {
if (f->write == stm32f4_flash_write) {
psize = ((struct stm32f4_flash *)f)->psize;
}
}
tc_printf(t, "Flash write parallelism: %s\n",
psize == 32 ? "x32" : "x8");
} else {
uint8_t psize;
if (!strcmp(argv[1], "x8")) {
psize = 8;
} else if (!strcmp(argv[1], "x32")) {
psize = 32;
} else {
tc_printf(t, "usage: monitor psize (x8|x32)\n");
return false;
}
for (struct target_flash *f = t->flash; f; f = f->next) {
if (f->write == stm32f4_flash_write) {
((struct stm32f4_flash *)f)->psize = psize;
}
}
}
return true;
}