2323#include "esp_system.h"
2424
2525#include "rom/cache.h"
26+ #include "rom/efuse.h"
2627#include "rom/ets_sys.h"
2728#include "rom/spi_flash.h"
2829#include "rom/crc.h"
@@ -84,6 +85,8 @@ static void set_cache_and_start_app(uint32_t drom_addr,
8485 uint32_t irom_size ,
8586 uint32_t entry_addr );
8687static void update_flash_config (const esp_image_header_t * pfhdr );
88+ static void vddsdio_configure ();
89+ static void flash_gpio_configure ();
8790static void clock_configure (void );
8891static void uart_console_configure (void );
8992static void wdt_reset_check (void );
@@ -106,13 +109,15 @@ void call_start_cpu0()
106109 cpu_configure_region_protection ();
107110
108111 /* Sanity check that static RAM is after the stack */
112+ #ifndef NDEBUG
109113 {
110114 int * sp = get_sp ();
111115 assert (& _bss_start <= & _bss_end );
112116 assert (& _data_start <= & _data_end );
113117 assert (sp < & _bss_start );
114118 assert (sp < & _data_start );
115119 }
120+ #endif
116121
117122 //Clear bss
118123 memset (& _bss_start , 0 , (& _bss_end - & _bss_start ) * sizeof (_bss_start ));
@@ -272,13 +277,10 @@ static IRAM_ATTR void calculate_signature (uint8_t *signature) {
272277 MD5Init (& md5_context );
273278 ESP_LOGI (TAG , "md5 init sig" );
274279 while (total_len < 0x7000 ) {
275- // Cache_Read_Disable(0);
276280 if (ESP_ROM_SPIFLASH_RESULT_OK != bootloader_flash_read (0x1000 + total_len , (void * )bootloader_buf , SPI_SEC_SIZE , false)) {
277281 ESP_LOGE (TAG , SPI_ERROR_LOG );
278- // Cache_Read_Enable(0);
279282 return ;
280283 }
281- // Cache_Read_Enable(0);
282284 total_len += SPI_SEC_SIZE ;
283285 MD5Update (& md5_context , (void * )bootloader_buf , SPI_SEC_SIZE );
284286 }
@@ -372,16 +374,9 @@ static bool get_image_from_partition(const esp_partition_pos_t *partition, esp_i
372374
373375static bool find_active_image (bootloader_state_t * bs , esp_partition_pos_t * partition )
374376{
375- uint32_t chip_revision = 0 ;
376377 boot_info_t * boot_info ;
377378 boot_info_t _boot_info ;
378379
379- // TODO
380- // uint32_t reg = REG_READ(EFUSE_BLK0_RDATA3_REG);
381- // if ((reg & EFUSE_RD_CHIP_VER_REV1_M) != 0) {
382- // chip_revision = 1;
383- // }
384-
385380 if (bs -> ota_info .size < 2 * sizeof (esp_ota_select_entry_t )) {
386381 ESP_LOGE (TAG , "ERROR: ota_info partition size %d is too small (minimum %d bytes)" , bs -> ota_info .size , sizeof (esp_ota_select_entry_t ));
387382 return false;
@@ -440,10 +435,8 @@ static bool find_active_image(bootloader_state_t *bs, esp_partition_pos_t *parti
440435
441436 // do we have a new image that needs to be verified?
442437 if ((boot_info -> ActiveImg != IMG_ACT_FACTORY ) && (boot_info -> Status == IMG_STATUS_CHECK )) {
443- if (chip_revision == 0 ) {
444- if (boot_info -> ActiveImg == IMG_ACT_UPDATE2 ) {
445- boot_info -> ActiveImg = IMG_ACT_FACTORY ; // we only have space for 1 OTAA image
446- }
438+ if (boot_info -> ActiveImg == IMG_ACT_UPDATE2 ) {
439+ boot_info -> ActiveImg = IMG_ACT_FACTORY ; // we only have space for 1 OTAA image
447440 }
448441 if (!bootloader_verify (& bs -> image [boot_info -> ActiveImg ], boot_info -> size )) {
449442 // switch to the previous image
@@ -494,15 +487,17 @@ static bool find_active_image(bootloader_state_t *bs, esp_partition_pos_t *parti
494487
495488static void bootloader_main ()
496489{
490+ vddsdio_configure ();
491+ flash_gpio_configure ();
497492 clock_configure ();
498493 uart_console_configure ();
499494 wdt_reset_check ();
500495 ESP_LOGI (TAG , "ESP-IDF %s 2nd stage bootloader" );
501496
502- esp_image_header_t fhdr ;
503- bootloader_state_t bootloader_state ;
504- esp_partition_pos_t partition ;
505- esp_image_metadata_t image_data ;
497+ esp_image_header_t fhdr __attribute__(( aligned ( 4 ))) ;
498+ bootloader_state_t bootloader_state __attribute__(( aligned ( 4 ))) ;
499+ esp_partition_pos_t partition __attribute__(( aligned ( 4 ))) ;
500+ esp_image_metadata_t image_data __attribute__(( aligned ( 4 ))) ;
506501
507502 memset (& bootloader_state , 0 , sizeof (bootloader_state ));
508503 ets_set_appcpu_boot_addr (0 );
@@ -755,6 +750,105 @@ static void print_flash_info(const esp_image_header_t* phdr)
755750}
756751
757752
753+ static void vddsdio_configure ()
754+ {
755+ #if CONFIG_BOOTLOADER_VDDSDIO_BOOST
756+ rtc_vddsdio_config_t cfg = rtc_vddsdio_get_config ();
757+ if (cfg .tieh == 0 ) { // 1.8V is used
758+ cfg .drefh = 3 ;
759+ cfg .drefm = 3 ;
760+ cfg .drefl = 3 ;
761+ cfg .force = 1 ;
762+ cfg .enable = 1 ;
763+ rtc_vddsdio_set_config (cfg );
764+ ets_delay_us (10 ); // wait for regulator to become stable
765+ }
766+ #endif // CONFIG_BOOTLOADER_VDDSDIO_BOOST
767+ }
768+
769+
770+ #define FLASH_CLK_IO 6
771+ #define FLASH_CS_IO 11
772+ #define FLASH_SPIQ_IO 7
773+ #define FLASH_SPID_IO 8
774+ #define FLASH_SPIWP_IO 10
775+ #define FLASH_SPIHD_IO 9
776+ #define FLASH_IO_MATRIX_DUMMY_40M 1
777+ #define FLASH_IO_MATRIX_DUMMY_80M 2
778+ static void IRAM_ATTR flash_gpio_configure ()
779+ {
780+ int spi_cache_dummy = 0 ;
781+ int drv = 2 ;
782+ #if CONFIG_FLASHMODE_QIO
783+ spi_cache_dummy = SPI0_R_QIO_DUMMY_CYCLELEN ; //qio 3
784+ #elif CONFIG_FLASHMODE_QOUT
785+ spi_cache_dummy = SPI0_R_FAST_DUMMY_CYCLELEN ; //qout 7
786+ #elif CONFIG_FLASHMODE_DIO
787+ spi_cache_dummy = SPI0_R_DIO_DUMMY_CYCLELEN ; //dio 3
788+ #elif CONFIG_FLASHMODE_DOUT
789+ spi_cache_dummy = SPI0_R_FAST_DUMMY_CYCLELEN ; //dout 7
790+ #endif
791+ /* dummy_len_plus values defined in ROM for SPI flash configuration */
792+ extern uint8_t g_rom_spiflash_dummy_len_plus [];
793+ #if CONFIG_ESPTOOLPY_FLASHFREQ_40M
794+ g_rom_spiflash_dummy_len_plus [0 ] = FLASH_IO_MATRIX_DUMMY_40M ;
795+ g_rom_spiflash_dummy_len_plus [1 ] = FLASH_IO_MATRIX_DUMMY_40M ;
796+ SET_PERI_REG_BITS (SPI_USER1_REG (0 ), SPI_USR_DUMMY_CYCLELEN_V , spi_cache_dummy + FLASH_IO_MATRIX_DUMMY_40M , SPI_USR_DUMMY_CYCLELEN_S ); //DUMMY
797+ #elif CONFIG_ESPTOOLPY_FLASHFREQ_80M
798+ g_rom_spiflash_dummy_len_plus [0 ] = FLASH_IO_MATRIX_DUMMY_80M ;
799+ g_rom_spiflash_dummy_len_plus [1 ] = FLASH_IO_MATRIX_DUMMY_80M ;
800+ SET_PERI_REG_BITS (SPI_USER1_REG (0 ), SPI_USR_DUMMY_CYCLELEN_V , spi_cache_dummy + FLASH_IO_MATRIX_DUMMY_80M , SPI_USR_DUMMY_CYCLELEN_S ); //DUMMY
801+ drv = 3 ;
802+ #endif
803+
804+ uint32_t chip_ver = REG_GET_FIELD (EFUSE_BLK0_RDATA3_REG , EFUSE_RD_CHIP_VER_PKG );
805+ uint32_t pkg_ver = chip_ver & 0x7 ;
806+
807+ if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32D2WDQ5 ) {
808+ // For ESP32D2WD the SPI pins are already configured
809+ ESP_LOGI (TAG , "Detected ESP32D2WD" );
810+ //flash clock signal should come from IO MUX.
811+ PIN_FUNC_SELECT (PERIPHS_IO_MUX_SD_CLK_U , FUNC_SD_CLK_SPICLK );
812+ SET_PERI_REG_BITS (PERIPHS_IO_MUX_SD_CLK_U , FUN_DRV , drv , FUN_DRV_S );
813+ } else if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD2 ) {
814+ // For ESP32PICOD2 the SPI pins are already configured
815+ ESP_LOGI (TAG , "Detected ESP32PICOD2" );
816+ //flash clock signal should come from IO MUX.
817+ PIN_FUNC_SELECT (PERIPHS_IO_MUX_SD_CLK_U , FUNC_SD_CLK_SPICLK );
818+ SET_PERI_REG_BITS (PERIPHS_IO_MUX_SD_CLK_U , FUN_DRV , drv , FUN_DRV_S );
819+ } else if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4 ) {
820+ // For ESP32PICOD4 the SPI pins are already configured
821+ ESP_LOGI (TAG , "Detected ESP32PICOD4" );
822+ //flash clock signal should come from IO MUX.
823+ PIN_FUNC_SELECT (PERIPHS_IO_MUX_SD_CLK_U , FUNC_SD_CLK_SPICLK );
824+ SET_PERI_REG_BITS (PERIPHS_IO_MUX_SD_CLK_U , FUN_DRV , drv , FUN_DRV_S );
825+ } else {
826+ ESP_LOGI (TAG , "Detected ESP32" );
827+ const uint32_t spiconfig = ets_efuse_get_spiconfig ();
828+ if (spiconfig == EFUSE_SPICONFIG_SPI_DEFAULTS ) {
829+ gpio_matrix_out (FLASH_CS_IO , SPICS0_OUT_IDX , 0 , 0 );
830+ gpio_matrix_out (FLASH_SPIQ_IO , SPIQ_OUT_IDX , 0 , 0 );
831+ gpio_matrix_in (FLASH_SPIQ_IO , SPIQ_IN_IDX , 0 );
832+ gpio_matrix_out (FLASH_SPID_IO , SPID_OUT_IDX , 0 , 0 );
833+ gpio_matrix_in (FLASH_SPID_IO , SPID_IN_IDX , 0 );
834+ gpio_matrix_out (FLASH_SPIWP_IO , SPIWP_OUT_IDX , 0 , 0 );
835+ gpio_matrix_in (FLASH_SPIWP_IO , SPIWP_IN_IDX , 0 );
836+ gpio_matrix_out (FLASH_SPIHD_IO , SPIHD_OUT_IDX , 0 , 0 );
837+ gpio_matrix_in (FLASH_SPIHD_IO , SPIHD_IN_IDX , 0 );
838+ //select pin function gpio
839+ PIN_FUNC_SELECT (PERIPHS_IO_MUX_SD_DATA0_U , PIN_FUNC_GPIO );
840+ PIN_FUNC_SELECT (PERIPHS_IO_MUX_SD_DATA1_U , PIN_FUNC_GPIO );
841+ PIN_FUNC_SELECT (PERIPHS_IO_MUX_SD_DATA2_U , PIN_FUNC_GPIO );
842+ PIN_FUNC_SELECT (PERIPHS_IO_MUX_SD_DATA3_U , PIN_FUNC_GPIO );
843+ PIN_FUNC_SELECT (PERIPHS_IO_MUX_SD_CMD_U , PIN_FUNC_GPIO );
844+ // flash clock signal should come from IO MUX.
845+ // set drive ability for clock
846+ PIN_FUNC_SELECT (PERIPHS_IO_MUX_SD_CLK_U , FUNC_SD_CLK_SPICLK );
847+ SET_PERI_REG_BITS (PERIPHS_IO_MUX_SD_CLK_U , FUN_DRV , drv , FUN_DRV_S );
848+ }
849+ }
850+ }
851+
758852static void clock_configure (void )
759853{
760854 /* Set CPU to 80MHz. Keep other clocks unmodified. */
0 commit comments