1 /*
2  * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include "sdkconfig.h"
8 #include "soc/spi_periph.h"
9 #include "esp_rom_spiflash.h"
10 #if CONFIG_IDF_TARGET_ESP32
11 #include "esp32/rom/spi_flash.h"
12 #elif CONFIG_IDF_TARGET_ESP32S2
13 #include "esp32s2/rom/spi_flash.h"
14 #elif CONFIG_IDF_TARGET_ESP32S3
15 #include "esp32s3/rom/spi_flash.h"
16 #include "esp32s3/rom/opi_flash.h"
17 #endif
18 
19 #define SPI_IDX   1
20 
21 #if CONFIG_SPI_FLASH_ROM_DRIVER_PATCH
22 
23 #if CONFIG_IDF_TARGET_ESP32
24 
25 extern esp_rom_spiflash_chip_t g_rom_spiflash_chip;
26 
is_issi_chip(const esp_rom_spiflash_chip_t * chip)27 static inline bool is_issi_chip(const esp_rom_spiflash_chip_t* chip)
28 {
29     return (((chip->device_id >> 16)&0xff) == 0x9D);
30 }
31 
esp_rom_spiflash_wait_idle(esp_rom_spiflash_chip_t * spi)32 esp_rom_spiflash_result_t esp_rom_spiflash_wait_idle(esp_rom_spiflash_chip_t *spi)
33 {
34     uint32_t status;
35     //wait for spi control ready
36     while ((REG_READ(SPI_EXT2_REG(1)) & SPI_ST)) {
37     }
38     while ((REG_READ(SPI_EXT2_REG(0)) & SPI_ST)) {
39     }
40     //wait for flash status ready
41     if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_read_status(spi, &status)) {
42         return ESP_ROM_SPIFLASH_RESULT_ERR;
43     }
44     return  ESP_ROM_SPIFLASH_RESULT_OK;
45 }
46 
47 /* Modified version of esp_rom_spiflash_clear_bp() that replaces version in ROM.
48 
49    This works around a bug where esp_rom_spiflash_clear_bp sometimes reads the wrong
50    high status byte (RDSR2 result) and then copies it back to the
51    flash status, which can cause the CMP bit or Status Register
52    Protect bit to become set.
53 
54    Like other ROM SPI functions, this function is not designed to be
55    called directly from an RTOS environment without taking precautions
56    about interrupts, CPU coordination, flash mapping. However some of
57    the functions in esp_spi_flash.c call it.
58  */
esp_rom_spiflash_clear_bp(void)59 __attribute__((__unused__)) esp_rom_spiflash_result_t esp_rom_spiflash_clear_bp(void)
60 {
61     uint32_t status;
62     uint32_t new_status;
63 
64     esp_rom_spiflash_wait_idle(&g_rom_spiflash_chip);
65 
66     if (is_issi_chip(&g_rom_spiflash_chip)) {
67         // ISSI chips have different QE position
68 
69         if (esp_rom_spiflash_read_status(&g_rom_spiflash_chip, &status) != ESP_ROM_SPIFLASH_RESULT_OK) {
70             return ESP_ROM_SPIFLASH_RESULT_ERR;
71         }
72 
73         /* Clear all bits in the mask.
74         (This is different from ROM esp_rom_spiflash_clear_bp, which keeps all bits as-is.)
75         */
76         new_status = status & (~ESP_ROM_SPIFLASH_BP_MASK_ISSI);
77         // Skip if nothing needs to be cleared. Otherwise will waste time waiting for the flash to clear nothing.
78         if (new_status == status) return ESP_ROM_SPIFLASH_RESULT_OK;
79 
80         CLEAR_PERI_REG_MASK(SPI_CTRL_REG(SPI_IDX), SPI_WRSR_2B);
81     } else {
82         if (esp_rom_spiflash_read_statushigh(&g_rom_spiflash_chip, &status) != ESP_ROM_SPIFLASH_RESULT_OK) {
83             return ESP_ROM_SPIFLASH_RESULT_ERR;
84         }
85 
86         /* Clear all bits except QE, if it is set.
87         (This is different from ROM esp_rom_spiflash_clear_bp, which keeps all bits as-is.)
88         */
89         new_status = status & ESP_ROM_SPIFLASH_QE;
90         SET_PERI_REG_MASK(SPI_CTRL_REG(SPI_IDX), SPI_WRSR_2B);
91     }
92 
93     esp_rom_spiflash_wait_idle(&g_rom_spiflash_chip);
94     REG_WRITE(SPI_CMD_REG(SPI_IDX), SPI_FLASH_WREN);
95     while (REG_READ(SPI_CMD_REG(SPI_IDX)) != 0) {
96     }
97     esp_rom_spiflash_wait_idle(&g_rom_spiflash_chip);
98     esp_rom_spiflash_result_t ret = esp_rom_spiflash_write_status(&g_rom_spiflash_chip, new_status);
99     // WEL bit should be cleared after operations regardless of writing succeed or not.
100     esp_rom_spiflash_wait_idle(&g_rom_spiflash_chip);
101     REG_WRITE(SPI_CMD_REG(SPI_IDX), SPI_FLASH_WRDI);
102     while (REG_READ(SPI_CMD_REG(SPI_IDX)) != 0) {
103     }
104     return ret;
105 }
106 esp_rom_spiflash_result_t esp_rom_spiflash_unlock(void) __attribute__((alias("esp_rom_spiflash_clear_bp")));
107 
108 static esp_rom_spiflash_result_t esp_rom_spiflash_enable_write(esp_rom_spiflash_chip_t *spi);
109 
110 //only support spi1
esp_rom_spiflash_erase_chip_internal(esp_rom_spiflash_chip_t * spi)111 static esp_rom_spiflash_result_t esp_rom_spiflash_erase_chip_internal(esp_rom_spiflash_chip_t *spi)
112 {
113     esp_rom_spiflash_wait_idle(spi);
114 
115     // Chip erase.
116     WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_CE);
117     while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0) {
118     }
119 
120     // check erase is finished.
121     esp_rom_spiflash_wait_idle(spi);
122 
123     return ESP_ROM_SPIFLASH_RESULT_OK;
124 }
125 
126 //only support spi1
esp_rom_spiflash_erase_sector_internal(esp_rom_spiflash_chip_t * spi,uint32_t addr)127 static esp_rom_spiflash_result_t esp_rom_spiflash_erase_sector_internal(esp_rom_spiflash_chip_t *spi, uint32_t addr)
128 {
129     //check if addr is 4k alignment
130     if (0 != (addr & 0xfff)) {
131         return ESP_ROM_SPIFLASH_RESULT_ERR;
132     }
133 
134     esp_rom_spiflash_wait_idle(spi);
135 
136     // sector erase  4Kbytes erase is sector erase.
137     WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, addr & 0xffffff);
138     WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_SE);
139     while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0) {
140     }
141 
142     esp_rom_spiflash_wait_idle(spi);
143 
144     return ESP_ROM_SPIFLASH_RESULT_OK;
145 }
146 
147 //only support spi1
esp_rom_spiflash_erase_block_internal(esp_rom_spiflash_chip_t * spi,uint32_t addr)148 static esp_rom_spiflash_result_t esp_rom_spiflash_erase_block_internal(esp_rom_spiflash_chip_t *spi, uint32_t addr)
149 {
150     esp_rom_spiflash_wait_idle(spi);
151 
152     // sector erase  4Kbytes erase is sector erase.
153     WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, addr & 0xffffff);
154     WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_BE);
155     while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0) {
156     }
157 
158     esp_rom_spiflash_wait_idle(spi);
159 
160     return ESP_ROM_SPIFLASH_RESULT_OK;
161 }
162 
163 //only support spi1
esp_rom_spiflash_program_page_internal(esp_rom_spiflash_chip_t * spi,uint32_t spi_addr,uint32_t * addr_source,int32_t byte_length)164 static esp_rom_spiflash_result_t esp_rom_spiflash_program_page_internal(esp_rom_spiflash_chip_t *spi, uint32_t spi_addr,
165         uint32_t *addr_source, int32_t byte_length)
166 {
167     uint32_t  temp_addr;
168     int32_t  temp_bl;
169     uint8_t   i;
170     uint8_t   remain_word_num;
171 
172     //check 4byte alignment
173     if (0 != (byte_length & 0x3)) {
174         return ESP_ROM_SPIFLASH_RESULT_ERR;
175     }
176 
177     //check if write in one page
178     if ((spi->page_size) < ((spi_addr % (spi->page_size)) + byte_length)) {
179         return ESP_ROM_SPIFLASH_RESULT_ERR;
180     }
181 
182     esp_rom_spiflash_wait_idle(spi);
183 
184     temp_addr = spi_addr;
185     temp_bl = byte_length;
186 
187     while (temp_bl > 0 ) {
188         if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_enable_write(spi)) {
189             return ESP_ROM_SPIFLASH_RESULT_ERR;
190         }
191         if ( temp_bl >= ESP_ROM_SPIFLASH_BUFF_BYTE_WRITE_NUM ) {
192             WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, (temp_addr & 0xffffff) | ( ESP_ROM_SPIFLASH_BUFF_BYTE_WRITE_NUM << ESP_ROM_SPIFLASH_BYTES_LEN )); // 32 byte a block
193 
194             for (i = 0; i < (ESP_ROM_SPIFLASH_BUFF_BYTE_WRITE_NUM >> 2); i++) {
195                 WRITE_PERI_REG(PERIPHS_SPI_FLASH_C0 + i * 4, *addr_source++);
196             }
197             temp_bl = temp_bl - 32;
198             temp_addr = temp_addr + 32;
199         } else {
200             WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, (temp_addr & 0xffffff) | (temp_bl << ESP_ROM_SPIFLASH_BYTES_LEN ));
201 
202             remain_word_num = (0 == (temp_bl & 0x3)) ? (temp_bl >> 2) : (temp_bl >> 2) + 1;
203             for (i = 0; i < remain_word_num; i++) {
204                 WRITE_PERI_REG(PERIPHS_SPI_FLASH_C0 + i * 4, *addr_source++);
205                 temp_bl = temp_bl - 4;
206             }
207             temp_bl = 0;
208         }
209         WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_PP);
210         while ( READ_PERI_REG(PERIPHS_SPI_FLASH_CMD ) != 0 ) {
211         }
212 
213         esp_rom_spiflash_wait_idle(spi);
214     }
215 
216     return ESP_ROM_SPIFLASH_RESULT_OK;
217 }
218 
esp_rom_spiflash_read_status(esp_rom_spiflash_chip_t * spi,uint32_t * status)219 esp_rom_spiflash_result_t esp_rom_spiflash_read_status(esp_rom_spiflash_chip_t *spi, uint32_t *status)
220 {
221     uint32_t status_value = ESP_ROM_SPIFLASH_BUSY_FLAG;
222 
223     if (g_rom_spiflash_dummy_len_plus[1] == 0) {
224         while (ESP_ROM_SPIFLASH_BUSY_FLAG == (status_value & ESP_ROM_SPIFLASH_BUSY_FLAG)) {
225             WRITE_PERI_REG(PERIPHS_SPI_FLASH_STATUS, 0);       // clear regisrter
226             WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_RDSR);
227             while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0) {
228             }
229 
230             status_value = READ_PERI_REG(PERIPHS_SPI_FLASH_STATUS) & (spi->status_mask);
231         }
232     } else {
233         while (ESP_ROM_SPIFLASH_BUSY_FLAG == (status_value & ESP_ROM_SPIFLASH_BUSY_FLAG)) {
234             esp_rom_spiflash_read_user_cmd(&status_value, 0x05);
235         }
236     }
237     *status = status_value;
238 
239     return ESP_ROM_SPIFLASH_RESULT_OK;
240 }
241 
esp_rom_spiflash_read_statushigh(esp_rom_spiflash_chip_t * spi,uint32_t * status)242 esp_rom_spiflash_result_t esp_rom_spiflash_read_statushigh(esp_rom_spiflash_chip_t *spi, uint32_t *status)
243 {
244     esp_rom_spiflash_result_t ret;
245     esp_rom_spiflash_wait_idle(&g_rom_spiflash_chip);
246     ret = esp_rom_spiflash_read_user_cmd(status, 0x35);
247     *status = *status << 8;
248     return ret;
249 }
250 
esp_rom_spiflash_write_status(esp_rom_spiflash_chip_t * spi,uint32_t status_value)251 esp_rom_spiflash_result_t esp_rom_spiflash_write_status(esp_rom_spiflash_chip_t *spi, uint32_t status_value)
252 {
253     esp_rom_spiflash_wait_idle(spi);
254 
255     // update status value by status_value
256     WRITE_PERI_REG(PERIPHS_SPI_FLASH_STATUS, status_value);    // write status regisrter
257     WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_WRSR);
258     while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0) {
259     }
260     esp_rom_spiflash_wait_idle(spi);
261 
262     return ESP_ROM_SPIFLASH_RESULT_OK;
263 }
264 
265 //only support spi1
esp_rom_spiflash_read_data(esp_rom_spiflash_chip_t * spi,uint32_t flash_addr,uint32_t * addr_dest,int32_t byte_length)266 static esp_rom_spiflash_result_t esp_rom_spiflash_read_data(esp_rom_spiflash_chip_t *spi, uint32_t flash_addr,
267         uint32_t *addr_dest, int32_t byte_length)
268 {
269     uint32_t  temp_addr;
270     int32_t  temp_length;
271     uint8_t   i;
272     uint8_t   remain_word_num;
273 
274     //address range check
275     if ((flash_addr + byte_length) > (spi->chip_size)) {
276         return ESP_ROM_SPIFLASH_RESULT_ERR;
277     }
278 
279     temp_addr = flash_addr;
280     temp_length = byte_length;
281 
282     esp_rom_spiflash_wait_idle(spi);
283 
284     while (temp_length > 0) {
285         if (temp_length >= ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM) {
286             //WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, temp_addr |(ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM << ESP_ROM_SPIFLASH_BYTES_LEN));
287             REG_WRITE(SPI_MISO_DLEN_REG(1),  ((ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM << 3) - 1) << SPI_USR_MISO_DBITLEN_S);
288             WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, temp_addr << 8);
289             REG_WRITE(PERIPHS_SPI_FLASH_CMD, SPI_USR);
290             while (REG_READ(PERIPHS_SPI_FLASH_CMD) != 0) {
291             }
292 
293             for (i = 0; i < (ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM >> 2); i++) {
294                 *addr_dest++ = READ_PERI_REG(PERIPHS_SPI_FLASH_C0 + i * 4);
295             }
296             temp_length = temp_length - ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM;
297             temp_addr = temp_addr + ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM;
298         } else {
299             //WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, temp_addr |(temp_length << ESP_ROM_SPIFLASH_BYTES_LEN ));
300             WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, temp_addr << 8);
301             REG_WRITE(SPI_MISO_DLEN_REG(1),  ((ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM << 3) - 1) << SPI_USR_MISO_DBITLEN_S);
302             REG_WRITE(PERIPHS_SPI_FLASH_CMD, SPI_USR);
303             while (REG_READ(PERIPHS_SPI_FLASH_CMD) != 0) {
304             };
305 
306             remain_word_num = (0 == (temp_length & 0x3)) ? (temp_length >> 2) : (temp_length >> 2) + 1;
307             for (i = 0; i < remain_word_num; i++) {
308                 *addr_dest++ = READ_PERI_REG(PERIPHS_SPI_FLASH_C0 + i * 4);
309             }
310             temp_length = 0;
311         }
312     }
313 
314     return ESP_ROM_SPIFLASH_RESULT_OK;
315 }
316 
esp_rom_spiflash_enable_write(esp_rom_spiflash_chip_t * spi)317 static esp_rom_spiflash_result_t esp_rom_spiflash_enable_write(esp_rom_spiflash_chip_t *spi)
318 {
319     uint32_t flash_status = 0;
320 
321     esp_rom_spiflash_wait_idle(spi);
322 
323     //enable write
324     WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_WREN);     // enable write operation
325     while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0) {
326     }
327 
328     // make sure the flash is ready for writing
329     while (ESP_ROM_SPIFLASH_WRENABLE_FLAG != (flash_status & ESP_ROM_SPIFLASH_WRENABLE_FLAG)) {
330         esp_rom_spiflash_read_status(spi, &flash_status);
331     }
332 
333     return ESP_ROM_SPIFLASH_RESULT_OK;
334 }
335 
spi_cache_mode_switch(uint32_t modebit)336 static void spi_cache_mode_switch(uint32_t  modebit)
337 {
338     if ((modebit & SPI_FREAD_QIO) && (modebit & SPI_FASTRD_MODE)) {
339         REG_CLR_BIT(SPI_USER_REG(0), SPI_USR_MOSI);
340         REG_SET_BIT(SPI_USER_REG(0), SPI_USR_MISO | SPI_USR_DUMMY | SPI_USR_ADDR);
341         REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_ADDR_BITLEN, SPI0_R_QIO_ADDR_BITSLEN);
342         REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN, SPI0_R_QIO_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
343         REG_SET_FIELD(SPI_USER2_REG(0), SPI_USR_COMMAND_VALUE, 0xEB);
344     } else if (modebit & SPI_FASTRD_MODE) {
345         REG_CLR_BIT(SPI_USER_REG(0), SPI_USR_MOSI);
346         REG_SET_BIT(SPI_USER_REG(0), SPI_USR_MISO | SPI_USR_DUMMY | SPI_USR_ADDR);
347         REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_ADDR_BITLEN, SPI0_R_FAST_ADDR_BITSLEN);
348         if ((modebit & SPI_FREAD_QUAD)) {
349             REG_SET_FIELD(SPI_USER2_REG(0), SPI_USR_COMMAND_VALUE, 0x6B);
350             REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN, SPI0_R_FAST_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
351         } else if ((modebit & SPI_FREAD_DIO)) {
352             REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_ADDR_BITLEN, SPI0_R_DIO_ADDR_BITSLEN);
353             REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN, SPI0_R_DIO_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
354             REG_SET_FIELD(SPI_USER2_REG(0), SPI_USR_COMMAND_VALUE, 0xBB);
355         } else if ((modebit & SPI_FREAD_DUAL)) {
356             REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN, SPI0_R_FAST_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
357             REG_SET_FIELD(SPI_USER2_REG(0), SPI_USR_COMMAND_VALUE, 0x3B);
358         } else {
359             REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN, SPI0_R_FAST_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
360             REG_SET_FIELD(SPI_USER2_REG(0), SPI_USR_COMMAND_VALUE, 0x0B);
361         }
362     } else {
363         REG_CLR_BIT(SPI_USER_REG(0), SPI_USR_MOSI);
364         if (g_rom_spiflash_dummy_len_plus[0] == 0) {
365             REG_CLR_BIT(SPI_USER_REG(0), SPI_USR_DUMMY);
366         } else {
367             REG_SET_BIT(SPI_USER_REG(0), SPI_USR_DUMMY);
368             REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN, g_rom_spiflash_dummy_len_plus[0] - 1);
369         }
370         REG_SET_BIT(SPI_USER_REG(0), SPI_USR_MISO | SPI_USR_ADDR);
371         REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_ADDR_BITLEN, SPI0_R_SIO_ADDR_BITSLEN);
372         REG_SET_FIELD(SPI_USER2_REG(0), SPI_USR_COMMAND_VALUE, 0x03);
373     }
374 }
375 
esp_rom_spiflash_set_bp(void)376 esp_rom_spiflash_result_t esp_rom_spiflash_set_bp(void)
377 {
378     uint32_t status;
379 
380     //read QE bit, not write if not QE
381     if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_read_statushigh(&g_rom_spiflash_chip, &status)) {
382         return ESP_ROM_SPIFLASH_RESULT_ERR;
383     }
384     //enable 2 byte status writing
385     SET_PERI_REG_MASK(PERIPHS_SPI_FLASH_CTRL, ESP_ROM_SPIFLASH_TWO_BYTE_STATUS_EN);
386 
387     if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_enable_write(&g_rom_spiflash_chip)) {
388         return ESP_ROM_SPIFLASH_RESULT_ERR;
389     }
390 
391     if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_write_status(&g_rom_spiflash_chip, status | ESP_ROM_SPIFLASH_WR_PROTECT)) {
392         return ESP_ROM_SPIFLASH_RESULT_ERR;
393     }
394 
395     return ESP_ROM_SPIFLASH_RESULT_OK;
396 }
397 esp_rom_spiflash_result_t esp_rom_spiflash_lock(void) __attribute__((alias("esp_rom_spiflash_set_bp")));
398 
esp_rom_spiflash_config_readmode(esp_rom_spiflash_read_mode_t mode)399 esp_rom_spiflash_result_t esp_rom_spiflash_config_readmode(esp_rom_spiflash_read_mode_t mode)
400 {
401     uint32_t  modebit;
402     while ((REG_READ(SPI_EXT2_REG(1)) & SPI_ST)) {
403     }
404     while ((REG_READ(SPI_EXT2_REG(0)) & SPI_ST)) {
405     }
406     //clear old mode bit
407     CLEAR_PERI_REG_MASK(PERIPHS_SPI_FLASH_CTRL, SPI_FREAD_QIO | SPI_FREAD_QUAD | SPI_FREAD_DIO | SPI_FREAD_DUAL | SPI_FASTRD_MODE);
408     CLEAR_PERI_REG_MASK(SPI_CTRL_REG(0), SPI_FREAD_QIO | SPI_FREAD_QUAD | SPI_FREAD_DIO | SPI_FREAD_DUAL | SPI_FASTRD_MODE);
409     //configure read mode
410     switch (mode) {
411     case ESP_ROM_SPIFLASH_QIO_MODE   :  modebit = SPI_FREAD_QIO  | SPI_FASTRD_MODE; break;
412     case ESP_ROM_SPIFLASH_QOUT_MODE  :  modebit = SPI_FREAD_QUAD | SPI_FASTRD_MODE; break;
413     case ESP_ROM_SPIFLASH_DIO_MODE   :  modebit = SPI_FREAD_DIO  | SPI_FASTRD_MODE; break;
414     case ESP_ROM_SPIFLASH_DOUT_MODE  :  modebit = SPI_FREAD_DUAL | SPI_FASTRD_MODE; break;
415     case ESP_ROM_SPIFLASH_FASTRD_MODE:  modebit = SPI_FASTRD_MODE; break;
416     case ESP_ROM_SPIFLASH_SLOWRD_MODE:  modebit = 0; break;
417     default : modebit = 0;
418     }
419 
420     SET_PERI_REG_MASK(PERIPHS_SPI_FLASH_CTRL, modebit);
421     SET_PERI_REG_MASK(SPI_CTRL_REG(0), modebit);
422     spi_cache_mode_switch(modebit);
423 
424     return  ESP_ROM_SPIFLASH_RESULT_OK;
425 }
426 
esp_rom_spiflash_erase_chip(void)427 esp_rom_spiflash_result_t esp_rom_spiflash_erase_chip(void)
428 {
429     if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_enable_write(&g_rom_spiflash_chip)) {
430         return ESP_ROM_SPIFLASH_RESULT_ERR;
431     }
432 
433     if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_erase_chip_internal(&g_rom_spiflash_chip)) {
434         return ESP_ROM_SPIFLASH_RESULT_ERR;
435     }
436 
437     return ESP_ROM_SPIFLASH_RESULT_OK;
438 }
439 
esp_rom_spiflash_erase_block(uint32_t block_num)440 esp_rom_spiflash_result_t esp_rom_spiflash_erase_block(uint32_t block_num)
441 {
442     // flash write is always 1 line currently
443     REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
444     REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, ESP_ROM_SPIFLASH_W_SIO_ADDR_BITSLEN);
445     //check program size
446     if (block_num >= ((g_rom_spiflash_chip.chip_size) / (g_rom_spiflash_chip.block_size))) {
447         return ESP_ROM_SPIFLASH_RESULT_ERR;
448     }
449 
450     if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_enable_write(&g_rom_spiflash_chip)) {
451         return ESP_ROM_SPIFLASH_RESULT_ERR;
452     }
453 
454     if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_erase_block_internal(&g_rom_spiflash_chip, block_num * (g_rom_spiflash_chip.block_size))) {
455         return ESP_ROM_SPIFLASH_RESULT_ERR;
456     }
457     return ESP_ROM_SPIFLASH_RESULT_OK;
458 }
459 
esp_rom_spiflash_erase_sector(uint32_t sector_num)460 esp_rom_spiflash_result_t esp_rom_spiflash_erase_sector(uint32_t sector_num)
461 {
462     // flash write is always 1 line currently
463     REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
464     REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, ESP_ROM_SPIFLASH_W_SIO_ADDR_BITSLEN);
465     //check program size
466     if (sector_num >= ((g_rom_spiflash_chip.chip_size) / (g_rom_spiflash_chip.sector_size))) {
467         return ESP_ROM_SPIFLASH_RESULT_ERR;
468     }
469 
470     if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_enable_write(&g_rom_spiflash_chip)) {
471         return ESP_ROM_SPIFLASH_RESULT_ERR;
472     }
473 
474     if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_erase_sector_internal(&g_rom_spiflash_chip, sector_num * (g_rom_spiflash_chip.sector_size))) {
475         return ESP_ROM_SPIFLASH_RESULT_ERR;
476     }
477 
478     return ESP_ROM_SPIFLASH_RESULT_OK;
479 }
480 
esp_rom_spiflash_write(uint32_t dest_addr,const uint32_t * src,int32_t len)481 esp_rom_spiflash_result_t esp_rom_spiflash_write(uint32_t dest_addr, const uint32_t *src, int32_t len)
482 {
483     uint32_t  page_size;
484     uint32_t  pgm_len;
485     uint32_t  pgm_num;
486     uint32_t    i;
487 
488     // flash write is always 1 line currently
489     REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
490     REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, ESP_ROM_SPIFLASH_W_SIO_ADDR_BITSLEN);
491     //check program size
492     if ( (dest_addr + len) > (g_rom_spiflash_chip.chip_size)) {
493         return ESP_ROM_SPIFLASH_RESULT_ERR;
494     }
495 
496     page_size = g_rom_spiflash_chip.page_size;
497     pgm_len = page_size - (dest_addr % page_size);
498     if (len < pgm_len) {
499         if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_program_page_internal(&g_rom_spiflash_chip,
500                 dest_addr, (uint32_t *)src, len)) {
501             return ESP_ROM_SPIFLASH_RESULT_ERR;
502         }
503     } else {
504         if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_program_page_internal(&g_rom_spiflash_chip,
505                 dest_addr, (uint32_t *)src, pgm_len)) {
506             return ESP_ROM_SPIFLASH_RESULT_ERR;
507         }
508 
509         //whole page program
510         pgm_num = (len - pgm_len) / page_size;
511         for (i = 0; i < pgm_num; i++) {
512             if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_program_page_internal(&g_rom_spiflash_chip,
513                     dest_addr + pgm_len, (uint32_t *)src + (pgm_len >> 2), page_size)) {
514                 return ESP_ROM_SPIFLASH_RESULT_ERR;
515             }
516             pgm_len += page_size;
517         }
518 
519         //remain parts to program
520         if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_program_page_internal(&g_rom_spiflash_chip,
521                 dest_addr + pgm_len, (uint32_t *)src + (pgm_len >> 2), len - pgm_len)) {
522             return ESP_ROM_SPIFLASH_RESULT_ERR;
523         }
524     }
525     return  ESP_ROM_SPIFLASH_RESULT_OK;
526 }
527 
esp_rom_spiflash_write_encrypted(uint32_t flash_addr,uint32_t * data,uint32_t len)528 esp_rom_spiflash_result_t esp_rom_spiflash_write_encrypted(uint32_t flash_addr, uint32_t *data, uint32_t len)
529 {
530     esp_rom_spiflash_result_t ret = ESP_ROM_SPIFLASH_RESULT_OK;
531     uint32_t i;
532 
533     if ((flash_addr & 0x1f) || (len & 0x1f)) {  //check 32 byte alignment
534         return ESP_ROM_SPIFLASH_RESULT_ERR;
535     }
536 
537     esp_rom_spiflash_write_encrypted_enable();
538 
539     for (i = 0; i < (len >> 5); i++) {
540         if ((ret = esp_rom_spiflash_prepare_encrypted_data(flash_addr + (i << 5), data + (i << 3))) != ESP_ROM_SPIFLASH_RESULT_OK) {
541             break;
542         }
543 
544         if ((ret = esp_rom_spiflash_write(flash_addr + (i << 5), data, 32)) != ESP_ROM_SPIFLASH_RESULT_OK) {
545             break;
546         }
547     }
548 
549     esp_rom_spiflash_write_encrypted_disable();
550 
551     return ret;
552 }
553 
esp_rom_spiflash_read(uint32_t src_addr,uint32_t * dest,int32_t len)554 esp_rom_spiflash_result_t esp_rom_spiflash_read(uint32_t src_addr, uint32_t *dest, int32_t len)
555 {
556     // QIO or SIO, non-QIO regard as SIO
557     uint32_t modebit;
558     modebit = READ_PERI_REG(PERIPHS_SPI_FLASH_CTRL);
559     if ((modebit & SPI_FREAD_QIO) && (modebit & SPI_FASTRD_MODE)) {
560         REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_MOSI);
561         REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_MISO | SPI_USR_DUMMY | SPI_USR_ADDR);
562         REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, SPI1_R_QIO_ADDR_BITSLEN);
563         REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_DUMMY_CYCLELEN, SPI1_R_QIO_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[1]);
564         //REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_USR_COMMAND_VALUE, 0xEB);
565         REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_USR_COMMAND_BITLEN_S) | 0xEB);
566     } else if (modebit & SPI_FASTRD_MODE) {
567         REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_MOSI);
568         REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_MISO | SPI_USR_ADDR);
569         if (modebit & SPI_FREAD_DIO) {
570             if (g_rom_spiflash_dummy_len_plus[1] == 0) {
571                 REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
572                 REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, SPI1_R_DIO_ADDR_BITSLEN);
573                 REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_USR_COMMAND_BITLEN_S) | 0xBB);
574             } else {
575                 REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
576                 REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, SPI1_R_DIO_ADDR_BITSLEN);
577                 REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_DUMMY_CYCLELEN, g_rom_spiflash_dummy_len_plus[1] - 1);
578                 REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_USR_COMMAND_VALUE, 0xBB);
579             }
580         } else {
581             if ((modebit & SPI_FREAD_QUAD)) {
582                 //REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_USR_COMMAND_VALUE, 0x6B);
583                 REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_USR_COMMAND_BITLEN_S) | 0x6B);
584             } else if ((modebit & SPI_FREAD_DUAL)) {
585                 //REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_USR_COMMAND_VALUE, 0x3B);
586                 REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_USR_COMMAND_BITLEN_S) | 0x3B);
587             } else {
588                 //REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_USR_COMMAND_VALUE, 0x0B);
589                 REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_USR_COMMAND_BITLEN_S) | 0x0B);
590             }
591             REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
592             REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, SPI1_R_FAST_ADDR_BITSLEN);
593             REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_DUMMY_CYCLELEN, SPI1_R_FAST_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[1]);
594         }
595     } else {
596         REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_MOSI);
597         if (g_rom_spiflash_dummy_len_plus[1] == 0) {
598             REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
599         } else {
600             REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
601             REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_DUMMY_CYCLELEN,  g_rom_spiflash_dummy_len_plus[1] - 1);
602         }
603         REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_MISO | SPI_USR_ADDR);
604         REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, SPI1_R_SIO_ADDR_BITSLEN);
605         //REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_USR_COMMAND_VALUE, 0x03);
606         REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_USR_COMMAND_BITLEN_S) | 0x03);
607     }
608 
609     if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_read_data(&g_rom_spiflash_chip, src_addr, dest, len)) {
610         return ESP_ROM_SPIFLASH_RESULT_ERR;
611     }
612     return ESP_ROM_SPIFLASH_RESULT_OK;
613 }
614 
esp_rom_spiflash_erase_area(uint32_t start_addr,uint32_t area_len)615 esp_rom_spiflash_result_t esp_rom_spiflash_erase_area(uint32_t start_addr, uint32_t area_len)
616 {
617     int32_t total_sector_num;
618     int32_t head_sector_num;
619     uint32_t sector_no;
620     uint32_t sector_num_per_block;
621 
622     //set read mode to Fastmode ,not QDIO mode for erase
623     //
624     // TODO: this is probably a bug as it doesn't re-enable QIO mode, not serious as this
625     // function is not used in IDF.
626     esp_rom_spiflash_config_readmode(ESP_ROM_SPIFLASH_SLOWRD_MODE);
627 
628     //check if area is oversize of flash
629     if ((start_addr + area_len) > g_rom_spiflash_chip.chip_size) {
630         return ESP_ROM_SPIFLASH_RESULT_ERR;
631     }
632 
633     //start_addr is aligned as sector boundary
634     if (0 != (start_addr % g_rom_spiflash_chip.sector_size)) {
635         return ESP_ROM_SPIFLASH_RESULT_ERR;
636     }
637 
638     //Unlock flash to enable erase
639     if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_clear_bp(/*&g_rom_spiflash_chip*/)) {
640         return ESP_ROM_SPIFLASH_RESULT_ERR;
641     }
642 
643     sector_no = start_addr / g_rom_spiflash_chip.sector_size;
644     sector_num_per_block = g_rom_spiflash_chip.block_size / g_rom_spiflash_chip.sector_size;
645     total_sector_num = (0 == (area_len % g_rom_spiflash_chip.sector_size)) ? area_len / g_rom_spiflash_chip.sector_size :
646                        1 + (area_len / g_rom_spiflash_chip.sector_size);
647 
648     //check if erase area reach over block boundary
649     head_sector_num = sector_num_per_block - (sector_no % sector_num_per_block);
650 
651     head_sector_num = (head_sector_num >= total_sector_num) ? total_sector_num : head_sector_num;
652 
653     //JJJ, BUG of 6.0 erase
654     //middle part of area is aligned by blocks
655     total_sector_num -= head_sector_num;
656 
657     //head part of area is erased
658     while (0 != head_sector_num) {
659         if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_erase_sector(sector_no)) {
660             return ESP_ROM_SPIFLASH_RESULT_ERR;
661         }
662         sector_no++;
663         head_sector_num--;
664     }
665     while (total_sector_num > sector_num_per_block) {
666         if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_erase_block(sector_no / sector_num_per_block)) {
667             return ESP_ROM_SPIFLASH_RESULT_ERR;
668         }
669         sector_no += sector_num_per_block;
670         total_sector_num -= sector_num_per_block;
671     }
672 
673     //tail part of area burn
674     while (0 < total_sector_num) {
675         if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_erase_sector(sector_no)) {
676             return ESP_ROM_SPIFLASH_RESULT_ERR;
677         }
678         sector_no++;
679         total_sector_num--;
680     }
681 
682     return ESP_ROM_SPIFLASH_RESULT_OK;
683 }
684 
esp_rom_spiflash_write_disable(void)685 esp_rom_spiflash_result_t esp_rom_spiflash_write_disable(void)
686 {
687     REG_WRITE(SPI_CMD_REG(SPI_IDX), SPI_FLASH_WRDI);
688     while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0) {
689     }
690     return ESP_ROM_SPIFLASH_RESULT_OK;
691 }
692 
693 #elif CONFIG_IDF_TARGET_ESP32S2
694 
esp_rom_spiflash_write_disable(void)695 esp_rom_spiflash_result_t esp_rom_spiflash_write_disable(void)
696 {
697     REG_WRITE(SPI_MEM_CMD_REG(SPI_IDX), SPI_MEM_FLASH_WRDI);
698     while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0) {
699     }
700     return ESP_ROM_SPIFLASH_RESULT_OK;
701 }
702 
703 #elif CONFIG_IDF_TARGET_ESP32S3
704 extern void esp_rom_spi_set_address_bit_len(int spi, int addr_bits);
esp_rom_opiflash_cache_mode_config(esp_rom_spiflash_read_mode_t mode,const esp_rom_opiflash_spi0rd_t * cache)705 void esp_rom_opiflash_cache_mode_config(esp_rom_spiflash_read_mode_t mode, const esp_rom_opiflash_spi0rd_t *cache)
706 {
707     esp_rom_spi_set_op_mode(0, mode);
708     REG_CLR_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_MOSI);
709     REG_SET_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_MISO | SPI_MEM_USR_ADDR);
710 
711     if (cache) {
712         esp_rom_spi_set_address_bit_len(0, cache->addr_bit_len);
713         // Patch for ROM function `esp_rom_opiflash_cache_mode_config`, because when dummy is 0,
714         // `SPI_MEM_USR_DUMMY` should be 0. `esp_rom_opiflash_cache_mode_config` doesn't handle this
715         // properly.
716         if (cache->dummy_bit_len == 0) {
717             REG_CLR_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_DUMMY);
718         } else {
719             REG_SET_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_DUMMY);
720             REG_SET_FIELD(SPI_MEM_USER1_REG(0), SPI_MEM_USR_DUMMY_CYCLELEN, cache->dummy_bit_len - 1 + rom_spiflash_legacy_data->dummy_len_plus[0]);
721         }
722         REG_SET_FIELD(SPI_MEM_USER2_REG(0), SPI_MEM_USR_COMMAND_VALUE, cache->cmd);
723         REG_SET_FIELD(SPI_MEM_USER2_REG(0), SPI_MEM_USR_COMMAND_BITLEN, cache->cmd_bit_len - 1);
724         REG_SET_FIELD(SPI_MEM_DDR_REG(0), SPI_MEM_SPI_FMEM_VAR_DUMMY, cache->var_dummy_en);
725     }
726 }
727 
728 #endif // IDF_TARGET
729 
730 #endif // CONFIG_SPI_FLASH_ROM_DRIVER_PATCH
731