/** * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include "pico/stdlib.h" #include "hardware/flash.h" // We're going to erase and reprogram a region 256k from the start of flash. // Once done, we can access this at XIP_BASE + 256k. #define FLASH_TARGET_OFFSET (256 * 1024) const uint8_t *flash_target_contents = (const uint8_t *) (XIP_BASE + FLASH_TARGET_OFFSET); void print_buf(const uint8_t *buf, size_t len) { for (size_t i = 0; i < len; ++i) { printf("%02x", buf[i]); if (i % 16 == 15) printf("\n"); else printf(" "); } } int main() { stdio_init_all(); uint8_t random_data[FLASH_PAGE_SIZE]; for (int i = 0; i < FLASH_PAGE_SIZE; ++i) random_data[i] = rand() >> 16; printf("Generated random data:\n"); print_buf(random_data, FLASH_PAGE_SIZE); // Note that a whole number of sectors must be erased at a time. printf("\nErasing target region...\n"); flash_range_erase(FLASH_TARGET_OFFSET, FLASH_SECTOR_SIZE); printf("Done. Read back target region:\n"); print_buf(flash_target_contents, FLASH_PAGE_SIZE); printf("\nProgramming target region...\n"); flash_range_program(FLASH_TARGET_OFFSET, random_data, FLASH_PAGE_SIZE); printf("Done. Read back target region:\n"); print_buf(flash_target_contents, FLASH_PAGE_SIZE); bool mismatch = false; for (int i = 0; i < FLASH_PAGE_SIZE; ++i) { if (random_data[i] != flash_target_contents[i]) mismatch = true; } if (mismatch) printf("Programming failed!\n"); else printf("Programming successful!\n"); }