Files
templates/c/set-protocol/ports/stm32g474-usb-boot/test_boot_port.c

98 lines
4.2 KiB
C

#include "boot_image.h"
#include "boot_writer.h"
#include <assert.h>
#include <stdio.h>
static uint8_t flash[1024];
static bool touched[128];
static bool fail_write;
static bool program(void *user, uint32_t offset, uint64_t word)
{
(void)user;
assert(!(offset & 7U)); assert(offset <= sizeof(flash) - 8);
assert(!touched[offset / 8]);
if (fail_write) return false;
touched[offset / 8] = true;
memcpy(flash + offset, &word, 8); return true;
}
static void test_writer(void)
{
uint8_t image[521];
uint32_t block, size, i;
for (i = 0; i < sizeof(image); ++i) image[i] = (uint8_t)(i * 19U);
/* Every block size, all possible final-word tails, including all-FF words. */
memset(image + 128, 0xff, 32);
for (block = 1; block <= 256; ++block) {
for (size = 512; size <= sizeof(image); ++size) {
g474_writer w;
memset(flash, 0xff, sizeof(flash)); memset(touched, 0, sizeof(touched));
g474_writer_init(&w, size);
for (i = 0; i < size;) {
uint16_t n = (uint16_t)(size - i < block ? size - i : block);
assert(g474_writer_write(&w, i, image + i, n, program, 0)); i += n;
}
assert(!w.failed && !w.used && w.received == size);
assert(!memcmp(flash, image, size));
for (i = size; i < sizeof(flash); ++i) assert(flash[i] == 0xff);
assert(!g474_writer_write(&w, size, image, 1, program, 0));
}
}
{
g474_writer w;
g474_writer_init(&w, 9);
assert(!g474_writer_write(&w, 1, image, 1, program, 0));
assert(!g474_writer_write(&w, 0, image, 10, program, 0));
assert(!g474_writer_write(&w, 0, image, 0, program, 0));
assert(w.received == 0);
memset(touched, 0, sizeof(touched)); fail_write = true;
assert(!g474_writer_write(&w, 0, image, 8, program, 0));
assert(w.failed);
fail_write = false;
assert(!g474_writer_write(&w, w.received, image, 1, program, 0));
g474_writer_init(&w, 9);
assert(g474_writer_write(&w, 0, image, 9, program, 0));
}
}
static void check_page(uint32_t address, bool dual, uint32_t bank, uint32_t page)
{
uint32_t b, p;
assert(g474_flash_page(address, dual, &b, &p));
assert(b == bank && p == page);
}
int main(void)
{
uint32_t vectors[2] = {0x20018000UL, G474_APP_BASE + 9};
uint32_t b, p;
const uint8_t *image = (const uint8_t *)vectors;
assert(g474_geometry_supported(128, false, false));
assert(!g474_geometry_supported(128, true, false));
assert(!g474_geometry_supported(128, false, true));
assert(!g474_geometry_supported(512, false, false));
assert(!g474_geometry_supported(256, false, false));
assert(!g474_geometry_supported(0xffff, false, false));
check_page(G474_META_BASE, false, 1, 15);
check_page(G474_APP_BASE, false, 1, 16);
check_page(0x0801ffffUL, false, 1, 31);
assert(!g474_flash_page(G474_META_BASE - 1, false, &b, &p));
assert(!g474_flash_page(0x08020000UL, false, &b, &p));
assert(!g474_flash_page(0x08040000UL, false, &b, &p));
assert(!g474_flash_page(G474_META_BASE, true, &b, &p));
assert(!g474_flash_page(G474_APP_BASE, true, &b, &p));
assert(g474_vectors_valid(image, G474_APP_SIZE));
vectors[0] = 0x10008000UL; assert(g474_vectors_valid(image, 16));
vectors[0] = 0x20020000UL; assert(g474_vectors_valid(image, 16));
vectors[0] = 0x20020008UL; assert(!g474_vectors_valid(image, 16));
vectors[0] = 0x10008008UL; assert(!g474_vectors_valid(image, 16));
vectors[0] = 0x20000000UL; assert(!g474_vectors_valid(image, 16));
vectors[0] = 0x20017fffUL; assert(!g474_vectors_valid(image, 16));
vectors[0] = 0x20018000UL;
vectors[1] = G474_APP_BASE + 8; assert(!g474_vectors_valid(image, 16));
vectors[1] = G474_APP_BASE - 1; assert(!g474_vectors_valid(image, 16));
vectors[1] = G474_APP_BASE + 17; assert(!g474_vectors_valid(image, 16));
vectors[1] = G474_APP_BASE + 9;
assert(!g474_vectors_valid(image, 7));
assert(!g474_vectors_valid(image, G474_APP_SIZE + 1));
test_writer();
puts("G474: bank/page boundaries, vectors, all block sizes and ECC word tails passed");
return 0;
}