59 lines
1.7 KiB
C
59 lines
1.7 KiB
C
/**
|
|
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#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");
|
|
}
|