Add shared emulator services, waveform generation and STM32 USB boot ports
This commit is contained in:
97
c/set-protocol/ports/stm32g474-usb-boot/test_boot_port.c
Normal file
97
c/set-protocol/ports/stm32g474-usb-boot/test_boot_port.c
Normal file
@@ -0,0 +1,97 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user