#include "boot_image.h" #include "boot_writer.h" #include #include 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; }