23
23
#include "esp_system.h"
24
24
25
25
#include "rom/cache.h"
26
+ #include "rom/efuse.h"
26
27
#include "rom/ets_sys.h"
27
28
#include "rom/spi_flash.h"
28
29
#include "rom/crc.h"
@@ -84,6 +85,8 @@ static void set_cache_and_start_app(uint32_t drom_addr,
84
85
uint32_t irom_size ,
85
86
uint32_t entry_addr );
86
87
static void update_flash_config (const esp_image_header_t * pfhdr );
88
+ static void vddsdio_configure ();
89
+ static void flash_gpio_configure ();
87
90
static void clock_configure (void );
88
91
static void uart_console_configure (void );
89
92
static void wdt_reset_check (void );
@@ -106,13 +109,15 @@ void call_start_cpu0()
106
109
cpu_configure_region_protection ();
107
110
108
111
/* Sanity check that static RAM is after the stack */
112
+ #ifndef NDEBUG
109
113
{
110
114
int * sp = get_sp ();
111
115
assert (& _bss_start <= & _bss_end );
112
116
assert (& _data_start <= & _data_end );
113
117
assert (sp < & _bss_start );
114
118
assert (sp < & _data_start );
115
119
}
120
+ #endif
116
121
117
122
//Clear bss
118
123
memset (& _bss_start , 0 , (& _bss_end - & _bss_start ) * sizeof (_bss_start ));
@@ -272,13 +277,10 @@ static IRAM_ATTR void calculate_signature (uint8_t *signature) {
272
277
MD5Init (& md5_context );
273
278
ESP_LOGI (TAG , "md5 init sig" );
274
279
while (total_len < 0x7000 ) {
275
- // Cache_Read_Disable(0);
276
280
if (ESP_ROM_SPIFLASH_RESULT_OK != bootloader_flash_read (0x1000 + total_len , (void * )bootloader_buf , SPI_SEC_SIZE , false)) {
277
281
ESP_LOGE (TAG , SPI_ERROR_LOG );
278
- // Cache_Read_Enable(0);
279
282
return ;
280
283
}
281
- // Cache_Read_Enable(0);
282
284
total_len += SPI_SEC_SIZE ;
283
285
MD5Update (& md5_context , (void * )bootloader_buf , SPI_SEC_SIZE );
284
286
}
@@ -372,16 +374,9 @@ static bool get_image_from_partition(const esp_partition_pos_t *partition, esp_i
372
374
373
375
static bool find_active_image (bootloader_state_t * bs , esp_partition_pos_t * partition )
374
376
{
375
- uint32_t chip_revision = 0 ;
376
377
boot_info_t * boot_info ;
377
378
boot_info_t _boot_info ;
378
379
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
-
385
380
if (bs -> ota_info .size < 2 * sizeof (esp_ota_select_entry_t )) {
386
381
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 ));
387
382
return false;
@@ -440,10 +435,8 @@ static bool find_active_image(bootloader_state_t *bs, esp_partition_pos_t *parti
440
435
441
436
// do we have a new image that needs to be verified?
442
437
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
447
440
}
448
441
if (!bootloader_verify (& bs -> image [boot_info -> ActiveImg ], boot_info -> size )) {
449
442
// switch to the previous image
@@ -494,15 +487,17 @@ static bool find_active_image(bootloader_state_t *bs, esp_partition_pos_t *parti
494
487
495
488
static void bootloader_main ()
496
489
{
490
+ vddsdio_configure ();
491
+ flash_gpio_configure ();
497
492
clock_configure ();
498
493
uart_console_configure ();
499
494
wdt_reset_check ();
500
495
ESP_LOGI (TAG , "ESP-IDF %s 2nd stage bootloader" );
501
496
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 ))) ;
506
501
507
502
memset (& bootloader_state , 0 , sizeof (bootloader_state ));
508
503
ets_set_appcpu_boot_addr (0 );
@@ -755,6 +750,105 @@ static void print_flash_info(const esp_image_header_t* phdr)
755
750
}
756
751
757
752
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
+
758
852
static void clock_configure (void )
759
853
{
760
854
/* Set CPU to 80MHz. Keep other clocks unmodified. */
0 commit comments