[update] stlink_{fread,fwrite}

pull/1/head
texane 2011-01-14 10:24:32 -06:00
rodzic 80ec173ad3
commit 8c938d019b
1 zmienionych plików z 164 dodań i 20 usunięć

Wyświetl plik

@ -202,6 +202,18 @@ struct stlink {
stm32_addr_t flash_base;
size_t flash_size;
size_t flash_pgsz;
/* in flash system memory */
#define STM32_SYSTEM_BASE 0x1ffff000
#define STM32_SYSTEM_SIZE (2 * 1024)
stm32_addr_t sys_base;
size_t sys_size;
/* sram settings */
#define STM32_SRAM_BASE 0x20000000
#define STM32_SRAM_SIZE (8 * 1024)
stm32_addr_t sram_base;
size_t sram_size;
};
static void D(struct stlink *sl, char *txt) {
@ -305,11 +317,19 @@ static struct stlink* stlink_open(const char *dev_name, const int verbose) {
sl->q_addr = 0;
clear_buf(sl);
/* initialize the memory map */
/* flash memory settings */
sl->flash_base = STM32_FLASH_BASE;
sl->flash_size = STM32_FLASH_SIZE;
sl->flash_pgsz = STM32_FLASH_PGSZ;
/* system memory */
sl->sys_base = STM32_SYSTEM_BASE;
sl->sys_size = STM32_SYSTEM_SIZE;
/* sram memory settings */
sl->sram_base = STM32_SRAM_BASE;
sl->sram_size = STM32_SRAM_SIZE;
return sl;
}
@ -838,6 +858,17 @@ void stlink_run(struct stlink *sl) {
stlink_stat(sl, "run core");
}
// same as above with entrypoint.
static unsigned int is_core_halted(struct stlink*);
void stlink_run_at(struct stlink *sl, stm32_addr_t addr) {
stlink_write_reg(sl, addr, 15); /* pc register */
stlink_run(sl);
while (is_core_halted(sl) == 0)
usleep(3000000);
}
// Step the arm-core.
void stlink_step(struct stlink *sl) {
D(sl, "\n*** stlink_step ***\n");
@ -1281,13 +1312,10 @@ static int write_loader_to_sram
0x00, 0x20, 0x02, 0x40, /* STM32_FLASH_BASE: .word 0x40022000 */
};
#define LOADER_SRAM_ADDR 0x20000000
#define LOADER_SRAM_SIZE sizeof(loader_code)
memcpy(sl->q_buf, loader_code, sizeof(loader_code));
stlink_write_mem32(sl, sl->sram_base, sizeof(loader_code));
memcpy(sl->q_buf, loader_code, LOADER_SRAM_SIZE);
stlink_write_mem32(sl, LOADER_SRAM_ADDR, LOADER_SRAM_SIZE);
*addr = LOADER_SRAM_ADDR;
*addr = sl->sram_base;
*size = sizeof(loader_code);
/* success */
@ -1448,7 +1476,7 @@ static int check_file
return 0;
}
static int stlink_check_flash
static int stlink_fcheck_flash
(struct stlink* sl, const char* path, stm32_addr_t addr)
{
/* check the contents of path are at addr */
@ -1466,10 +1494,10 @@ static int stlink_check_flash
return res;
}
static int stlink_write_flash
static int stlink_fwrite_flash
(struct stlink* sl, const char* path, stm32_addr_t addr)
{
/* write the binary file in flash at addr */
/* write the file in flash at addr */
int error = -1;
size_t off;
@ -1553,6 +1581,119 @@ static int stlink_write_flash
return error;
}
static int stlink_fwrite_sram
(struct stlink* sl, const char* path, stm32_addr_t addr)
{
/* write the file in sram at addr */
int error = -1;
size_t off;
mapped_file_t mf = MAPPED_FILE_INITIALIZER;
if (map_file(&mf, path) == -1)
{
fprintf(stderr, "map_file() == -1\n");
return -1;
}
/* check addr range is inside the sram */
if (addr < sl->sram_base)
{
fprintf(stderr, "addr too low\n");
goto on_error;
}
else if ((addr + mf.len) < addr)
{
fprintf(stderr, "addr overruns\n");
goto on_error;
}
else if ((addr + mf.len) > (sl->sram_base + sl->sram_size))
{
fprintf(stderr, "addr too high\n");
goto on_error;
}
else if ((addr & 3) || (mf.len & 3))
{
/* todo */
fprintf(stderr, "unaligned addr or size\n");
goto on_error;
}
/* do the copy by 1k blocks */
for (off = 0; off < mf.len; off += 1024)
{
size_t size = 1024;
if ((off + size) > mf.len)
size = mf.len - off;
memcpy(sl->q_buf, mf.base + off, size);
/* round size if needed */
if (size & 3)
size += 2;
stlink_write_mem32(sl, addr + off, size);
}
/* check the file ha been written */
if (check_file(sl, &mf, addr) == -1)
{
fprintf(stderr, "check_file() == -1\n");
goto on_error;
}
/* success */
error = 0;
on_error:
unmap_file(&mf);
return error;
}
static int stlink_fread
(struct stlink* sl, const char* path, stm32_addr_t addr, size_t size)
{
/* read size bytes from addr to file */
int error = -1;
size_t off;
const int fd = open(path, O_RDWR | O_TRUNC | O_CREAT, 00700);
if (fd == -1)
{
fprintf(stderr, "open(%s) == -1\n", path);
return -1;
}
/* do the copy by 1k blocks */
for (off = 0; off < size; off += 1024)
{
size_t read_size = 1024;
if ((off + read_size) > size)
read_size = off + read_size;
/* round size if needed */
if (read_size & 3)
read_size = (read_size + 4) & ~(3);
stlink_read_mem32(sl, addr + off, read_size);
if (write(fd, sl->q_buf, read_size) != (ssize_t)read_size)
{
fprintf(stderr, "write() != read_size\n");
goto on_error;
}
}
/* success */
error = 0;
on_error:
close(fd);
return error;
}
// 1) open a sg device, switch the stlink from dfu to mass mode
// 2) wait 5s until the kernel driver stops reseting the broken device
@ -1697,8 +1838,8 @@ int main(int argc, char *argv[]) {
for (int i = 0; i < 100; i++) {
write_uint32(sl->q_buf, LED_BLUE | LED_GREEN);
stlink_write_mem32(sl, GPIOC_ODR, 4);
//stlink_read_mem32(sl, 0x4001100c, 4);
//fprintf(stderr, "GPIOC_ODR = 0x%08x", read_uint32(sl->q_buf, 0));
/* stlink_read_mem32(sl, 0x4001100c, 4); */
/* fprintf(stderr, "GPIOC_ODR = 0x%08x", read_uint32(sl->q_buf, 0)); */
delay(100);
clear_buf(sl);
@ -1783,28 +1924,31 @@ int main(int argc, char *argv[]) {
stlink_force_debug(sl);
stlink_status(sl);
#endif
#if 0 /* read the system bootloader */
# define SYSMEM_ADDR 0x1ffff000
# define SYSMEM_SIZE (2 * 1024)
#if 1 /* read the system bootloader */
fputs("\n++++++++++ reading bootloader ++++++++++++++++\n\n", stderr);
stlink_read_mem32(sl, SYSMEM_ADDR, SYSMEM_SIZE);
stlink_fread(sl, "/tmp/barfoo", sl->sys_base, sl->sys_size);
#endif
#if 0 /* read the flash memory */
fputs("\n+++++++ read flash memory\n\n", stderr);
/* mark_buf(sl); */
stlink_read_mem32(sl, 0x08000000, 4);
#endif
#if 1 /* flash programming */
#if 0 /* flash programming */
fputs("\n+++++++ program flash memory\n\n", stderr);
stlink_write_flash(sl, "/tmp/foobar", 0x08000000);
stlink_fwrite_flash(sl, "/tmp/foobar", 0x08000000);
#endif
#if 0 /* check file contents */
fputs("\n+++++++ check flash memory\n\n", stderr);
{
const int res = stlink_check_flash(sl, "/tmp/foobar", 0x08000000);
printf("_____ stlink_check_flash() == %d\n", res);
const int res = stlink_fcheck_flash(sl, "/tmp/foobar", 0x08000000);
printf("_____ stlink_fcheck_flash() == %d\n", res);
}
#endif
#if 0
fputs("\n+++++++ sram write and execute\n\n", stderr);
stlink_fwrite_sram(sl, "/tmp/foobar", sl->sram_base);
stlink_run_at(sl, sl->sram_base);
#endif
stlink_run(sl);
stlink_status(sl);