1 /*
2  * SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #include <stdbool.h>
7 #include <assert.h>
8 #include "string.h"
9 #include "sdkconfig.h"
10 #include "esp_err.h"
11 #include "esp_log.h"
12 #include "esp_rom_gpio.h"
13 #include "esp_rom_efuse.h"
14 #include "esp32/rom/spi_flash.h"
15 #include "esp32/rom/cache.h"
16 #include "soc/gpio_periph.h"
17 #include "soc/efuse_reg.h"
18 #include "soc/spi_reg.h"
19 #include "soc/soc_caps.h"
20 #include "soc/soc_pins.h"
21 #include "soc/chip_revision.h"
22 #include "hal/efuse_hal.h"
23 #include "hal/gpio_hal.h"
24 #include "flash_qio_mode.h"
25 #include "bootloader_common.h"
26 #include "bootloader_flash_config.h"
27 #include "bootloader_flash_priv.h"
28 #include "bootloader_init.h"
29 
30 #define FLASH_CLK_IO SPI_CLK_GPIO_NUM
31 #define FLASH_CS_IO SPI_CS0_GPIO_NUM
32 #define FLASH_SPIQ_IO SPI_Q_GPIO_NUM
33 #define FLASH_SPID_IO SPI_D_GPIO_NUM
34 #define FLASH_SPIWP_IO SPI_WP_GPIO_NUM
35 #define FLASH_SPIHD_IO SPI_HD_GPIO_NUM
36 
bootloader_flash_update_id(void)37 void bootloader_flash_update_id(void)
38 {
39     g_rom_flashchip.device_id = bootloader_read_flash_id();
40 }
41 
bootloader_flash_update_size(uint32_t size)42 void bootloader_flash_update_size(uint32_t size)
43 {
44     g_rom_flashchip.chip_size = size;
45 }
46 
bootloader_flash_cs_timing_config(void)47 void IRAM_ATTR bootloader_flash_cs_timing_config(void)
48 {
49     SET_PERI_REG_MASK(SPI_USER_REG(0), SPI_CS_HOLD_M | SPI_CS_SETUP_M);
50     SET_PERI_REG_BITS(SPI_CTRL2_REG(0), SPI_HOLD_TIME_V, 1, SPI_HOLD_TIME_S);
51     SET_PERI_REG_BITS(SPI_CTRL2_REG(0), SPI_SETUP_TIME_V, 0, SPI_SETUP_TIME_S);
52     SET_PERI_REG_MASK(SPI_USER_REG(1), SPI_CS_HOLD_M | SPI_CS_SETUP_M);
53     SET_PERI_REG_BITS(SPI_CTRL2_REG(1), SPI_HOLD_TIME_V, 1, SPI_HOLD_TIME_S);
54     SET_PERI_REG_BITS(SPI_CTRL2_REG(1), SPI_SETUP_TIME_V, 0, SPI_SETUP_TIME_S);
55 }
56 
bootloader_flash_clock_config(const esp_image_header_t * pfhdr)57 void IRAM_ATTR bootloader_flash_clock_config(const esp_image_header_t* pfhdr)
58 {
59     uint32_t spi_clk_div = 0;
60     switch (pfhdr->spi_speed) {
61         case ESP_IMAGE_SPI_SPEED_DIV_1:
62             spi_clk_div = 1;
63             break;
64         case ESP_IMAGE_SPI_SPEED_DIV_2:
65             spi_clk_div = 2;
66             break;
67         case ESP_IMAGE_SPI_SPEED_DIV_3:
68             spi_clk_div = 3;
69             break;
70         case ESP_IMAGE_SPI_SPEED_DIV_4:
71             spi_clk_div = 4;
72             break;
73         default:
74             break;
75     }
76     esp_rom_spiflash_config_clk(spi_clk_div, 0);
77     esp_rom_spiflash_config_clk(spi_clk_div, 1);
78 }
79 
bootloader_flash_gpio_config(const esp_image_header_t * pfhdr)80 void IRAM_ATTR bootloader_flash_gpio_config(const esp_image_header_t* pfhdr)
81 {
82     uint32_t drv = 2;
83     if (pfhdr->spi_speed == ESP_IMAGE_SPI_SPEED_DIV_1) {
84         drv = 3;
85     }
86 
87     uint32_t pkg_ver = bootloader_common_get_chip_ver_pkg();
88 
89     if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32D2WDQ5 ||
90         pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD2 ||
91         pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4 ||
92         pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOV302) {
93         // For ESP32D2WD or ESP32-PICO series,the SPI pins are already configured
94         // flash clock signal should come from IO MUX.
95         gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
96         SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, drv, FUN_DRV_S);
97     } else {
98         const uint32_t spiconfig = esp_rom_efuse_get_flash_gpio_info();
99         if (spiconfig == ESP_ROM_EFUSE_FLASH_DEFAULT_SPI) {
100             esp_rom_gpio_connect_out_signal(SPI_IOMUX_PIN_NUM_CS, SPICS0_OUT_IDX, 0, 0);
101             esp_rom_gpio_connect_out_signal(SPI_IOMUX_PIN_NUM_MISO, SPIQ_OUT_IDX, 0, 0);
102             esp_rom_gpio_connect_in_signal(SPI_IOMUX_PIN_NUM_MISO, SPIQ_IN_IDX, 0);
103             esp_rom_gpio_connect_out_signal(SPI_IOMUX_PIN_NUM_MOSI, SPID_OUT_IDX, 0, 0);
104             esp_rom_gpio_connect_in_signal(SPI_IOMUX_PIN_NUM_MOSI, SPID_IN_IDX, 0);
105             esp_rom_gpio_connect_out_signal(SPI_IOMUX_PIN_NUM_WP, SPIWP_OUT_IDX, 0, 0);
106             esp_rom_gpio_connect_in_signal(SPI_IOMUX_PIN_NUM_WP, SPIWP_IN_IDX, 0);
107             esp_rom_gpio_connect_out_signal(SPI_IOMUX_PIN_NUM_HD, SPIHD_OUT_IDX, 0, 0);
108             esp_rom_gpio_connect_in_signal(SPI_IOMUX_PIN_NUM_HD, SPIHD_IN_IDX, 0);
109             //select pin function gpio
110             gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_DATA0_U, PIN_FUNC_GPIO);
111             gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_DATA1_U, PIN_FUNC_GPIO);
112             gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_DATA2_U, PIN_FUNC_GPIO);
113             gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_DATA3_U, PIN_FUNC_GPIO);
114             gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_CMD_U, PIN_FUNC_GPIO);
115             // flash clock signal should come from IO MUX.
116             // set drive ability for clock
117             gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
118             SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, drv, FUN_DRV_S);
119 
120             uint32_t flash_id = g_rom_flashchip.device_id;
121             if (flash_id == FLASH_ID_GD25LQ32C) {
122                 // Set drive ability for 1.8v flash in 80Mhz.
123                 SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA0_U, FUN_DRV, 3, FUN_DRV_S);
124                 SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA1_U, FUN_DRV, 3, FUN_DRV_S);
125                 SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA2_U, FUN_DRV, 3, FUN_DRV_S);
126                 SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA3_U, FUN_DRV, 3, FUN_DRV_S);
127                 SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CMD_U,   FUN_DRV, 3, FUN_DRV_S);
128                 SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U,   FUN_DRV, 3, FUN_DRV_S);
129             }
130         }
131     }
132 }
133 
bootloader_flash_dummy_config(const esp_image_header_t * pfhdr)134 void IRAM_ATTR bootloader_flash_dummy_config(const esp_image_header_t* pfhdr)
135 {
136     int spi_cache_dummy = 0;
137     uint32_t modebit = READ_PERI_REG(SPI_CTRL_REG(0));
138     if (modebit & SPI_FASTRD_MODE) {
139         if (modebit & SPI_FREAD_QIO) {    //SPI mode is QIO
140             spi_cache_dummy = SPI0_R_QIO_DUMMY_CYCLELEN;
141         } else if (modebit & SPI_FREAD_DIO) {    //SPI mode is DIO
142             spi_cache_dummy = SPI0_R_DIO_DUMMY_CYCLELEN;
143             SET_PERI_REG_BITS(SPI_USER1_REG(0), SPI_USR_ADDR_BITLEN_V, SPI0_R_DIO_ADDR_BITSLEN, SPI_USR_ADDR_BITLEN_S);
144         } else if(modebit & (SPI_FREAD_QUAD | SPI_FREAD_DUAL))  {    //SPI mode is QOUT or DIO
145             spi_cache_dummy = SPI0_R_FAST_DUMMY_CYCLELEN;
146         }
147     }
148 
149     switch (pfhdr->spi_speed) {
150         case ESP_IMAGE_SPI_SPEED_DIV_1:
151             g_rom_spiflash_dummy_len_plus[0] = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_80M;
152             g_rom_spiflash_dummy_len_plus[1] = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_80M;
153             break;
154         case ESP_IMAGE_SPI_SPEED_DIV_2:
155             g_rom_spiflash_dummy_len_plus[0] = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_40M;
156             g_rom_spiflash_dummy_len_plus[1] = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_40M;
157             break;
158         case ESP_IMAGE_SPI_SPEED_DIV_3:
159         case ESP_IMAGE_SPI_SPEED_DIV_4:
160             g_rom_spiflash_dummy_len_plus[0] = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_20M;
161             g_rom_spiflash_dummy_len_plus[1] = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_20M;
162             break;
163         default:
164             break;
165     }
166 
167     SET_PERI_REG_BITS(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN_V, spi_cache_dummy + g_rom_spiflash_dummy_len_plus[0],
168             SPI_USR_DUMMY_CYCLELEN_S);
169 }
170 
171 #define ESP32_D2WD_WP_GPIO 7 /* ESP32-D2WD & ESP32-PICO-D4 has this GPIO wired to WP pin of flash */
172 #define ESP32_PICO_V3_GPIO 18 /* ESP32-PICO-V3* use this GPIO for WP pin of flash */
173 
bootloader_flash_get_wp_pin(void)174 int bootloader_flash_get_wp_pin(void)
175 {
176 #if CONFIG_BOOTLOADER_SPI_CUSTOM_WP_PIN
177     return CONFIG_BOOTLOADER_SPI_WP_PIN; // can be set for bootloader when QIO or QOUT config in use
178 #elif CONFIG_SPIRAM_CUSTOM_SPIWP_SD3_PIN
179     return CONFIG_SPIRAM_SPIWP_SD3_PIN; // can be set for app when DIO or DOUT config used for PSRAM only
180 #else
181     // no custom value, find it based on the package eFuse value
182     switch(bootloader_common_get_chip_ver_pkg()) {
183     case EFUSE_RD_CHIP_VER_PKG_ESP32U4WDH:
184     case EFUSE_RD_CHIP_VER_PKG_ESP32D2WDQ5:
185         return ESP32_D2WD_WP_GPIO;
186     case EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4:
187         /* Same package IDs are used for ESP32-PICO-V3 and ESP32-PICO-D4, silicon version differentiates */
188         return !ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 300) ? ESP32_D2WD_WP_GPIO : ESP32_PICO_V3_GPIO;
189     case EFUSE_RD_CHIP_VER_PKG_ESP32PICOV302:
190         return ESP32_PICO_V3_GPIO;
191     default:
192         return SPI_WP_GPIO_NUM;
193     }
194 #endif
195 }
196 
197 static const char *TAG = "boot.esp32";
198 
bootloader_configure_spi_pins(int drv)199 void bootloader_configure_spi_pins(int drv)
200 {
201     uint32_t pkg_ver = bootloader_common_get_chip_ver_pkg();
202 
203     if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32D2WDQ5 ||
204         pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD2 ||
205         pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4 ||
206         pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOV302) {
207         // For ESP32D2WD or ESP32-PICO series,the SPI pins are already configured
208         // flash clock signal should come from IO MUX.
209         gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
210         SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, drv, FUN_DRV_S);
211     } else {
212         const uint32_t spiconfig = esp_rom_efuse_get_flash_gpio_info();
213         if (spiconfig == ESP_ROM_EFUSE_FLASH_DEFAULT_SPI) {
214             esp_rom_gpio_connect_out_signal(FLASH_CS_IO, SPICS0_OUT_IDX, 0, 0);
215             esp_rom_gpio_connect_out_signal(FLASH_SPIQ_IO, SPIQ_OUT_IDX, 0, 0);
216             esp_rom_gpio_connect_in_signal(FLASH_SPIQ_IO, SPIQ_IN_IDX, 0);
217             esp_rom_gpio_connect_out_signal(FLASH_SPID_IO, SPID_OUT_IDX, 0, 0);
218             esp_rom_gpio_connect_in_signal(FLASH_SPID_IO, SPID_IN_IDX, 0);
219             esp_rom_gpio_connect_out_signal(FLASH_SPIWP_IO, SPIWP_OUT_IDX, 0, 0);
220             esp_rom_gpio_connect_in_signal(FLASH_SPIWP_IO, SPIWP_IN_IDX, 0);
221             esp_rom_gpio_connect_out_signal(FLASH_SPIHD_IO, SPIHD_OUT_IDX, 0, 0);
222             esp_rom_gpio_connect_in_signal(FLASH_SPIHD_IO, SPIHD_IN_IDX, 0);
223             //select pin function gpio
224             gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_DATA0_U, PIN_FUNC_GPIO);
225             gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_DATA1_U, PIN_FUNC_GPIO);
226             gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_DATA2_U, PIN_FUNC_GPIO);
227             gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_DATA3_U, PIN_FUNC_GPIO);
228             gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_CMD_U, PIN_FUNC_GPIO);
229             // flash clock signal should come from IO MUX.
230             // set drive ability for clock
231             gpio_hal_iomux_func_sel(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
232             SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, drv, FUN_DRV_S);
233 
234 #if CONFIG_SPIRAM_TYPE_ESPPSRAM32 || CONFIG_SPIRAM_TYPE_ESPPSRAM64
235             uint32_t flash_id = g_rom_flashchip.device_id;
236             if (flash_id == FLASH_ID_GD25LQ32C) {
237                 // Set drive ability for 1.8v flash in 80Mhz.
238                 SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA0_U, FUN_DRV, 3, FUN_DRV_S);
239                 SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA1_U, FUN_DRV, 3, FUN_DRV_S);
240                 SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA2_U, FUN_DRV, 3, FUN_DRV_S);
241                 SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA3_U, FUN_DRV, 3, FUN_DRV_S);
242                 SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CMD_U, FUN_DRV, 3, FUN_DRV_S);
243                 SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, 3, FUN_DRV_S);
244             }
245 #endif
246         }
247     }
248 }
249 
update_flash_config(const esp_image_header_t * bootloader_hdr)250 static void update_flash_config(const esp_image_header_t *bootloader_hdr)
251 {
252     uint32_t size;
253     switch (bootloader_hdr->spi_size) {
254     case ESP_IMAGE_FLASH_SIZE_1MB:
255         size = 1;
256         break;
257     case ESP_IMAGE_FLASH_SIZE_2MB:
258         size = 2;
259         break;
260     case ESP_IMAGE_FLASH_SIZE_4MB:
261         size = 4;
262         break;
263     case ESP_IMAGE_FLASH_SIZE_8MB:
264         size = 8;
265         break;
266     case ESP_IMAGE_FLASH_SIZE_16MB:
267         size = 16;
268         break;
269     default:
270         size = 2;
271     }
272     Cache_Read_Disable(0);
273     // Set flash chip size
274     esp_rom_spiflash_config_param(g_rom_flashchip.device_id, size * 0x100000, 0x10000, 0x1000, 0x100, 0xffff);
275     // TODO: set mode
276     // TODO: set frequency
277     Cache_Flush(0);
278     Cache_Read_Enable(0);
279 }
280 
print_flash_info(const esp_image_header_t * bootloader_hdr)281 static void print_flash_info(const esp_image_header_t *bootloader_hdr)
282 {
283     ESP_EARLY_LOGD(TAG, "magic %02x", bootloader_hdr->magic);
284     ESP_EARLY_LOGD(TAG, "segments %02x", bootloader_hdr->segment_count);
285     ESP_EARLY_LOGD(TAG, "spi_mode %02x", bootloader_hdr->spi_mode);
286     ESP_EARLY_LOGD(TAG, "spi_speed %02x", bootloader_hdr->spi_speed);
287     ESP_EARLY_LOGD(TAG, "spi_size %02x", bootloader_hdr->spi_size);
288 
289     const char *str;
290     switch (bootloader_hdr->spi_speed) {
291     case ESP_IMAGE_SPI_SPEED_DIV_2:
292         str = "40MHz";
293         break;
294     case ESP_IMAGE_SPI_SPEED_DIV_3:
295         str = "26.7MHz";
296         break;
297     case ESP_IMAGE_SPI_SPEED_DIV_4:
298         str = "20MHz";
299         break;
300     case ESP_IMAGE_SPI_SPEED_DIV_1:
301         str = "80MHz";
302         break;
303     default:
304         str = "20MHz";
305         break;
306     }
307     ESP_EARLY_LOGI(TAG, "SPI Speed      : %s", str);
308 
309     /* SPI mode could have been set to QIO during boot already,
310        so test the SPI registers not the flash header */
311     uint32_t spi_ctrl = REG_READ(SPI_CTRL_REG(0));
312     if (spi_ctrl & SPI_FREAD_QIO) {
313         str = "QIO";
314     } else if (spi_ctrl & SPI_FREAD_QUAD) {
315         str = "QOUT";
316     } else if (spi_ctrl & SPI_FREAD_DIO) {
317         str = "DIO";
318     } else if (spi_ctrl & SPI_FREAD_DUAL) {
319         str = "DOUT";
320     } else if (spi_ctrl & SPI_FASTRD_MODE) {
321         str = "FAST READ";
322     } else {
323         str = "SLOW READ";
324     }
325     ESP_EARLY_LOGI(TAG, "SPI Mode       : %s", str);
326 
327     switch (bootloader_hdr->spi_size) {
328     case ESP_IMAGE_FLASH_SIZE_1MB:
329         str = "1MB";
330         break;
331     case ESP_IMAGE_FLASH_SIZE_2MB:
332         str = "2MB";
333         break;
334     case ESP_IMAGE_FLASH_SIZE_4MB:
335         str = "4MB";
336         break;
337     case ESP_IMAGE_FLASH_SIZE_8MB:
338         str = "8MB";
339         break;
340     case ESP_IMAGE_FLASH_SIZE_16MB:
341         str = "16MB";
342         break;
343     default:
344         str = "2MB";
345         break;
346     }
347     ESP_EARLY_LOGI(TAG, "SPI Flash Size : %s", str);
348 }
349 
bootloader_init_flash_configure(void)350 static void IRAM_ATTR bootloader_init_flash_configure(void)
351 {
352     bootloader_flash_gpio_config(&bootloader_image_hdr);
353     bootloader_flash_dummy_config(&bootloader_image_hdr);
354     bootloader_flash_cs_timing_config();
355 }
356 
bootloader_init_spi_flash(void)357 esp_err_t bootloader_init_spi_flash(void)
358 {
359     bootloader_init_flash_configure();
360 #ifndef CONFIG_SPI_FLASH_ROM_DRIVER_PATCH
361     const uint32_t spiconfig = esp_rom_efuse_get_flash_gpio_info();
362     if (spiconfig != ESP_ROM_EFUSE_FLASH_DEFAULT_SPI && spiconfig != ESP_ROM_EFUSE_FLASH_DEFAULT_HSPI) {
363         ESP_EARLY_LOGE(TAG, "SPI flash pins are overridden. Enable CONFIG_SPI_FLASH_ROM_DRIVER_PATCH in menuconfig");
364         return ESP_FAIL;
365     }
366 #endif
367 
368     bootloader_flash_unlock();
369 
370 #if CONFIG_ESPTOOLPY_FLASHMODE_QIO || CONFIG_ESPTOOLPY_FLASHMODE_QOUT
371     bootloader_enable_qio_mode();
372 #endif
373 
374     print_flash_info(&bootloader_image_hdr);
375     update_flash_config(&bootloader_image_hdr);
376     //ensure the flash is write-protected
377     bootloader_enable_wp();
378     return ESP_OK;
379 }
380