@@ -1359,6 +1359,36 @@ static int qspi_exit_4byte_addr(QspiDev_t* dev)
13591359}
13601360#endif
13611361
1362+ /* Soft-reset the flash to a known idle state.
1363+ * FSBL / BootROM may leave the flash in an unexpected mode (XIP enabled,
1364+ * 4-byte addr set, auto-boot probing, etc.). Issue RESET_ENABLE (0x66) +
1365+ * RESET_MEMORY (0x99) to bring it back to defaults before first transaction.
1366+ * Per Micron MT25Q datasheet: t_SHSL2 ~ 40 us max after RESET_MEMORY. */
1367+ static int qspi_flash_reset (QspiDev_t * dev )
1368+ {
1369+ int ret ;
1370+ uint8_t cmd [4 ]; /* size multiple of uint32_t */
1371+
1372+ memset (cmd , 0 , sizeof (cmd ));
1373+ cmd [0 ] = RESET_ENABLE_CMD ;
1374+ ret = qspi_transfer (dev , cmd , 1 , NULL , 0 , NULL , 0 , 0 ,
1375+ GQSPI_GEN_FIFO_MODE_SPI );
1376+ #if defined(DEBUG_ZYNQ ) && DEBUG_ZYNQ >= 2
1377+ wolfBoot_printf ("Flash Reset Enable: Ret %d\n" , ret );
1378+ #endif
1379+ if (ret == GQSPI_CODE_SUCCESS ) {
1380+ cmd [0 ] = RESET_MEMORY_CMD ;
1381+ ret = qspi_transfer (dev , cmd , 1 , NULL , 0 , NULL , 0 , 0 ,
1382+ GQSPI_GEN_FIFO_MODE_SPI );
1383+ #if defined(DEBUG_ZYNQ ) && DEBUG_ZYNQ >= 2
1384+ wolfBoot_printf ("Flash Reset Memory: Ret %d\n" , ret );
1385+ #endif
1386+ }
1387+ /* Allow flash time to complete the reset and become ready. */
1388+ hal_delay_ms (1 );
1389+ return ret ;
1390+ }
1391+
13621392/* QSPI functions */
13631393void qspi_init (void )
13641394{
@@ -1499,6 +1529,19 @@ void qspi_init(void)
14991529 (void )reg_cfg ;
15001530 (void )reg_isr ;
15011531
1532+ /* Issue flash soft reset so we start from a known state regardless of
1533+ * whatever mode FSBL/BootROM left the device in. Send to each chip in
1534+ * dual-parallel configurations by targeting both chip selects. */
1535+ mDev .mode = GQSPI_GEN_FIFO_MODE_SPI ;
1536+ mDev .bus = GQSPI_GEN_FIFO_BUS_LOW ;
1537+ mDev .cs = GQSPI_GEN_FIFO_CS_LOWER ;
1538+ (void )qspi_flash_reset (& mDev );
1539+ #if GQPI_USE_DUAL_PARALLEL == 1
1540+ mDev .bus = GQSPI_GEN_FIFO_BUS_UP ;
1541+ mDev .cs = GQSPI_GEN_FIFO_CS_UPPER ;
1542+ (void )qspi_flash_reset (& mDev );
1543+ #endif
1544+
15021545 /* ------ Flash Read ID (retry) ------ */
15031546 timeout = 0 ;
15041547 while (++ timeout < QSPI_FLASH_READY_TRIES ) {
0 commit comments