@@ -774,11 +774,19 @@ void esp_rom_opiflash_cache_mode_config(esp_rom_spiflash_read_mode_t mode, const
774774 // Patch for ROM function `esp_rom_opiflash_cache_mode_config`, because when dummy is 0,
775775 // `SPI_MEM_USR_DUMMY` should be 0. `esp_rom_opiflash_cache_mode_config` doesn't handle this
776776 // properly.
777- if (cache -> dummy_bit_len == 0 ) {
777+ uint16_t dummy_cyclelen = cache -> dummy_bit_len ;
778+ if (mode == ESP_ROM_SPIFLASH_DIO_MODE ) {
779+ dummy_cyclelen -= 4 ; // wb_mode(8) / line_width(2)
780+ dummy_cyclelen += rom_spiflash_legacy_data -> dummy_len_plus [0 ];
781+ } else if (mode == ESP_ROM_SPIFLASH_QIO_MODE ) {
782+ dummy_cyclelen -= 2 ; // wb_mode(8) / line_width(4)
783+ dummy_cyclelen += rom_spiflash_legacy_data -> dummy_len_plus [0 ];
784+ }
785+ if (dummy_cyclelen == 0 ) {
778786 REG_CLR_BIT (SPI_MEM_USER_REG (0 ), SPI_MEM_USR_DUMMY );
779787 } else {
780788 REG_SET_BIT (SPI_MEM_USER_REG (0 ), SPI_MEM_USR_DUMMY );
781- 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 ] );
789+ REG_SET_FIELD (SPI_MEM_USER1_REG (0 ), SPI_MEM_USR_DUMMY_CYCLELEN , dummy_cyclelen - 1 );
782790 }
783791 REG_SET_FIELD (SPI_MEM_USER2_REG (0 ), SPI_MEM_USR_COMMAND_VALUE , cache -> cmd );
784792 REG_SET_FIELD (SPI_MEM_USER2_REG (0 ), SPI_MEM_USR_COMMAND_BITLEN , cache -> cmd_bit_len - 1 );
0 commit comments