1 /*
2  * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef __BOOTLOADER_FLASH_H
7 #define __BOOTLOADER_FLASH_H
8 
9 #include <stddef.h>
10 #include <stdbool.h>
11 #include <stdint.h>
12 #include <esp_err.h>
13 #include <spi_flash_mmap.h> /* including in bootloader for error values */
14 #include "sdkconfig.h"
15 #include "bootloader_flash.h"
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 #define FLASH_SECTOR_SIZE 0x1000
22 #define FLASH_BLOCK_SIZE 	0x10000
23 #define MMAP_ALIGNED_MASK 	(SPI_FLASH_MMU_PAGE_SIZE - 1)
24 #define MMU_FLASH_MASK    (~(SPI_FLASH_MMU_PAGE_SIZE - 1))
25 
26 /**
27  * MMU mapping must always be in the unit of a SPI_FLASH_MMU_PAGE_SIZE
28  * This macro is a helper for you to get needed page nums to be mapped. e.g.:
29  * Let's say SPI_FLASH_MMU_PAGE_SIZE is 64KB.
30  * - v_start = 0x4200_0004
31  * - size = 4 * 64KB
32  *
33  * You should map from 0x4200_0000, then map 5 pages.
34  */
35 #define GET_REQUIRED_MMU_PAGES(size, v_start)    ((size + (v_start - (v_start & MMU_FLASH_MASK)) + SPI_FLASH_MMU_PAGE_SIZE - 1) / SPI_FLASH_MMU_PAGE_SIZE)
36 
37 /* SPI commands (actual on-wire commands not SPI controller bitmasks)
38    Suitable for use with the bootloader_execute_flash_command static function.
39 */
40 #define CMD_RDID       0x9F
41 #define CMD_WRSR       0x01
42 #define CMD_WRSR2      0x31 /* Not all SPI flash uses this command */
43 #define CMD_WRSR3      0x11 /* Not all SPI flash uses this command */
44 #define CMD_WREN       0x06
45 #define CMD_WRENVSR    0x50 /* Flash write enable for volatile SR bits */
46 #define CMD_WRDI       0x04
47 #define CMD_RDSR       0x05
48 #define CMD_RDSR2      0x35 /* Not all SPI flash uses this command */
49 #define CMD_RDSR3      0x15 /* Not all SPI flash uses this command */
50 #define CMD_OTPEN      0x3A /* Enable OTP mode, not all SPI flash uses this command */
51 #define CMD_RDSFDP     0x5A /* Read the SFDP of the flash */
52 #define CMD_RESUME     0x7A /* Resume command to clear flash suspend bit */
53 #define CMD_RESETEN    0x66
54 #define CMD_RESET      0x99
55 
56 
57 /* Provide a Flash API for bootloader_support code,
58    that can be used from bootloader or app code.
59 
60    This header is available to source code in the bootloader &
61    bootloader_support components only.
62 */
63 
64 /**
65  * @brief Get number of free pages
66  *
67  * @return Number of free pages
68  */
69 uint32_t bootloader_mmap_get_free_pages(void);
70 
71 /**
72  * @brief Map a region of flash to data memory
73  *
74  * @important In bootloader code, only one region can be bootloader_mmaped at once. The previous region must be bootloader_munmapped before another region is mapped.
75  *
76  * @important In app code, these functions are not thread safe.
77  *
78  * Call bootloader_munmap once for each successful call to bootloader_mmap.
79  *
80  * In esp-idf app, this function maps directly to spi_flash_mmap.
81  *
82  * @param offset - Starting flash offset to map to memory.
83  * @param length - Length of data to map.
84  *
85  * @return Pointer to mapped data memory (at src_addr), or NULL
86  * if an allocation error occured.
87  */
88 const void *bootloader_mmap(uint32_t src_addr, uint32_t size);
89 
90 
91 /**
92  * @brief Unmap a previously mapped region of flash
93  *
94  * Call bootloader_munmap once for each successful call to bootloader_mmap.
95  */
96 void bootloader_munmap(const void *mapping);
97 
98 /**
99  * @brief  Read data from Flash.
100  *
101  *
102  * @note All of src, dest and size have to be 4-byte aligned.
103  *
104  * @param  src   source address of the data in Flash.
105  * @param  dest  pointer to the destination buffer
106  * @param  size  length of data
107  * @param  allow_decrypt If true and flash encryption is enabled, data on flash
108  *         will be decrypted transparently as part of the read.
109  *
110  * @return ESP_OK on success, ESP_ERR_FLASH_OP_FAIL on SPI failure,
111  * ESP_ERR_FLASH_OP_TIMEOUT on SPI timeout.
112  */
113 esp_err_t bootloader_flash_read(size_t src_addr, void *dest, size_t size, bool allow_decrypt);
114 
115 
116 /**
117  * @brief  Write data to Flash.
118  *
119  * @note All of dest_addr, src and size have to be 4-byte aligned. If write_encrypted is set, dest_addr and size must be 32-byte aligned.
120  *
121  * Note: In bootloader, when write_encrypted == true, the src buffer is encrypted in place.
122  *
123  * @param  dest_addr Destination address to write in Flash.
124  * @param  src Pointer to the data to write to flash
125  * @param  size Length of data in bytes.
126  * @param  write_encrypted If true, data will be written encrypted on flash.
127  *
128  * @return ESP_OK on success, ESP_ERR_FLASH_OP_FAIL on SPI failure,
129  * ESP_ERR_FLASH_OP_TIMEOUT on SPI timeout.
130  */
131 esp_err_t bootloader_flash_write(size_t dest_addr, void *src, size_t size, bool write_encrypted);
132 
133 /**
134  * @brief  Erase the Flash sector.
135  *
136  * @param  sector  Sector number, the count starts at sector 0, 4KB per sector.
137  *
138  * @return esp_err_t
139  */
140 esp_err_t bootloader_flash_erase_sector(size_t sector);
141 
142 /**
143  * @brief  Erase the Flash range.
144  *
145  * @param  start_addr start address of flash offset
146  * @param  size       sector aligned size to be erased
147  *
148  * @return esp_err_t
149  */
150 esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size);
151 
152 /**
153  * @brief Execute a user command on the flash
154  *
155  * @param command The command value to execute.
156  * @param mosi_data MOSI data to send
157  * @param mosi_len Length of MOSI data, in bits
158  * @param miso_len Length of MISO data to receive, in bits
159  * @return Received MISO data
160  */
161 uint32_t bootloader_execute_flash_command(uint8_t command, uint32_t mosi_data, uint8_t mosi_len, uint8_t miso_len);
162 
163 /**
164  * @brief Read the SFDP of the flash
165  *
166  * @param sfdp_addr Address of the parameter to read
167  * @param miso_byte_num Bytes to read
168  * @return The read SFDP, little endian, 4 bytes at most
169  */
170 uint32_t bootloader_flash_read_sfdp(uint32_t sfdp_addr, unsigned int miso_byte_num);
171 
172 /**
173  * @brief Enable the flash write protect (WEL bit).
174  */
175 void bootloader_enable_wp(void);
176 
177 /**
178  * @brief Once this function is called,
179  * any on-going internal operations will be terminated and the device will return to its default power-on
180  * state and lose all the current volatile settings, such as Volatile Status Register bits, Write Enable Latch
181  * (WEL) status, Program/Erase Suspend status, etc.
182  */
183 void bootloader_spi_flash_reset(void);
184 
185 #ifdef __cplusplus
186 }
187 #endif
188 
189 #endif
190