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");
 | |
| }
 |