Loading...
Searching...
No Matches
flash.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef _HARDWARE_FLASH_H
8#define _HARDWARE_FLASH_H
9
10#include "pico.h"
11
36
37// PICO_CONFIG: PARAM_ASSERTIONS_ENABLED_HARDWARE_FLASH, Enable/disable assertions in the hardware_flash module, type=bool, default=0, group=hardware_flash
38#ifndef PARAM_ASSERTIONS_ENABLED_HARDWARE_FLASH
39#ifdef PARAM_ASSERTIONS_ENABLED_FLASH // backwards compatibility with SDK < 2.0.0
40#define PARAM_ASSERTIONS_ENABLED_HARDWARE_FLASH PARAM_ASSERTIONS_ENABLED_FLASH
41#else
42#define PARAM_ASSERTIONS_ENABLED_HARDWARE_FLASH 0
43#endif
44#endif
45#define FLASH_PAGE_SIZE (1u << 8)
46#define FLASH_SECTOR_SIZE (1u << 12)
47#define FLASH_BLOCK_SIZE (1u << 16)
48
49#ifndef FLASH_UNIQUE_ID_SIZE_BYTES
50#define FLASH_UNIQUE_ID_SIZE_BYTES 8
51#endif
52
53// PICO_CONFIG: PICO_FLASH_SIZE_BYTES, size of primary flash in bytes, type=int, default=Usually provided via board header, group=hardware_flash
54
55// PICO_CONFIG: PICO_ALWAYS_INCLUDE_FLASH_ID_FUNCTIONS, Force inclusion of flash unique id functionality in PICO_NO_FLASH binaries, type=bool, default=0, group=hardware_flash
56#ifndef PICO_ALWAYS_INCLUDE_FLASH_ID_FUNCTIONS
57#define PICO_ALWAYS_INCLUDE_FLASH_ID_FUNCTIONS 0
58#endif
59
60#ifdef __cplusplus
61extern "C" {
62#endif
63
87void flash_start_xip(void);
88
89
100void flash_range_erase(uint32_t flash_offs, size_t count);
101
113
114void flash_range_program(uint32_t flash_offs, const uint8_t *data, size_t count);
115
126void flash_get_unique_id(uint8_t *id_out);
127
155void flash_do_cmd_cs(const uint8_t *txbuf, uint8_t *rxbuf, size_t count, uint cs);
156
166static inline void flash_do_cmd(const uint8_t *txbuf, uint8_t *rxbuf, size_t count) {
167 flash_do_cmd_cs(txbuf, rxbuf, count, 0);
168}
169
170void flash_flush_cache(void);
171
172#if !PICO_RP2040 || PICO_COMBINED_DOCS
173typedef void (*qmi_setup_function_t)(void);
174
181bool flash_set_qmi_cs1_setup_function(qmi_setup_function_t function);
182
183typedef enum {
184 FLASH_DEVINFO_SIZE_NONE = 0x0,
185 FLASH_DEVINFO_SIZE_8K = 0x1,
186 FLASH_DEVINFO_SIZE_16K = 0x2,
187 FLASH_DEVINFO_SIZE_32K = 0x3,
188 FLASH_DEVINFO_SIZE_64K = 0x4,
189 FLASH_DEVINFO_SIZE_128K = 0x5,
190 FLASH_DEVINFO_SIZE_256K = 0x6,
191 FLASH_DEVINFO_SIZE_512K = 0x7,
192 FLASH_DEVINFO_SIZE_1M = 0x8,
193 FLASH_DEVINFO_SIZE_2M = 0x9,
194 FLASH_DEVINFO_SIZE_4M = 0xa,
195 FLASH_DEVINFO_SIZE_8M = 0xb,
196 FLASH_DEVINFO_SIZE_16M = 0xc,
197 FLASH_DEVINFO_SIZE_MAX = 0xc
198} flash_devinfo_size_t;
199
203static inline uint32_t flash_devinfo_size_to_bytes(flash_devinfo_size_t size) {
204 if (size == FLASH_DEVINFO_SIZE_NONE) {
205 return 0;
206 } else {
207 return 4096u << (uint)size;
208 }
209}
210
215static inline flash_devinfo_size_t flash_devinfo_bytes_to_size(uint32_t bytes) {
216 // Must be zero or a power of two
217 valid_params_if(HARDWARE_FLASH, (bytes & (bytes - 1)) == 0u);
218 uint sectors = bytes / 4096u;
219 if (sectors <= 1u) {
220 return FLASH_DEVINFO_SIZE_NONE;
221 } else {
222 return (flash_devinfo_size_t) __builtin_ctz(sectors);
223 }
224}
225
244flash_devinfo_size_t flash_devinfo_get_cs_size(uint cs);
245
264void flash_devinfo_set_cs_size(uint cs, flash_devinfo_size_t size);
265
279
288void flash_devinfo_set_d8h_erase_supported(bool supported);
289
295uint flash_devinfo_get_cs_gpio(uint cs);
296
304void flash_devinfo_set_cs_gpio(uint cs, uint gpio);
305
306#endif // !PICO_RP2040 || PICO_COMBINED_DOCS
307
308#ifdef __cplusplus
309}
310#endif
311
312#endif
static uint32_t flash_devinfo_size_to_bytes(flash_devinfo_size_t size)
Convert a flash/PSRAM size enum to an integer size in bytes.
Definition flash.h:203
void flash_do_cmd_cs(const uint8_t *txbuf, uint8_t *rxbuf, size_t count, uint cs)
Execute bidirectional QSPI command.
Definition flash.c:296
flash_devinfo_size_t flash_devinfo_get_cs_size(uint cs)
Get the size of the QSPI device attached to chip select cs, according to FLASH_DEVINFO.
Definition flash.c:396
void flash_devinfo_set_cs_size(uint cs, flash_devinfo_size_t size)
Update the size of the QSPI device attached to chip select cs in the runtime copy of FLASH_DEVINFO.
Definition flash.c:423
static flash_devinfo_size_t flash_devinfo_bytes_to_size(uint32_t bytes)
Convert an integer flash/PSRAM size in bytes to a size enum, as stored in OTP and used by the ROM.
Definition flash.h:215
void flash_range_program(uint32_t flash_offs, const uint8_t *data, size_t count)
Program flash.
Definition flash.c:245
void flash_range_erase(uint32_t flash_offs, size_t count)
Erase areas of flash.
Definition flash.c:214
void flash_get_unique_id(uint8_t *id_out)
Get flash unique 64 bit identifier.
Definition flash.c:359
void flash_devinfo_set_d8h_erase_supported(bool supported)
Specify whether all attached devices support D8h block erase with 64k size, in the runtime copy of FL...
Definition flash.c:438
uint flash_devinfo_get_cs_gpio(uint cs)
Check the GPIO allocated for each chip select, according to FLASH_DEVINFO.
Definition flash.c:445
bool flash_set_qmi_cs1_setup_function(qmi_setup_function_t function)
Set the function to be called to setup the QMI CS1 configuration.
Definition flash.c:98
static void flash_do_cmd(const uint8_t *txbuf, uint8_t *rxbuf, size_t count)
Execute bidirectional flash command on chip select 0.
Definition flash.h:166
void flash_devinfo_set_cs_gpio(uint cs, uint gpio)
Update the GPIO allocated for each chip select in the runtime copy of FLASH_DEVINFO.
Definition flash.c:451
bool flash_devinfo_get_d8h_erase_supported(void)
Check whether all attached devices support D8h block erase with 64k size, according to FLASH_DEVINFO.
Definition flash.c:434
void flash_start_xip(void)
Initialise QSPI interface and external QSPI devices for execute-in-place.
Definition flash.c:183