38
38
#include "flexspi_nor_flash.h"
39
39
#include "flexspi_flash_config.h"
40
40
41
+ bool flash_busy_status_pol = 0 ;
42
+ bool flash_busy_status_offset = 0 ;
43
+
41
44
uint32_t LUT_pageprogram_quad [4 ] = {
42
45
// 10 Page Program - quad mode
43
46
FLEXSPI_LUT_SEQ (CMD_SDR , FLEXSPI_1PAD , 0x32 , RADDR_SDR , FLEXSPI_1PAD , 24 ),
@@ -54,16 +57,65 @@ uint32_t LUT_write_status[4] = {
54
57
FLEXSPI_LUT_SEQ (0 , 0 , 0 , 0 , 0 , 0 ), // Filler
55
58
};
56
59
57
- void flexspi_nor_update_lut (void ) {
60
+ #if !defined(MIMXRT117x_SERIES )
61
+ static uint16_t freq_table_mhz [] = {
62
+ 60 , // Entry 0 to 2 are out of range
63
+ 60 , // So it is set to 60
64
+ 60 , // as lowest possible MHz value
65
+ 60 , // -> 60 MHz
66
+ 75 , // -> 80 MHz
67
+ 80 , // -> 80 MHz
68
+ 100 , // -> 96 Mhz
69
+ 133 , // -> 120 MHz
70
+ 166 // -> 160 MHz
71
+ };
72
+ #endif
73
+
74
+ __attribute__((section (".ram_functions" ))) void flexspi_nor_update_lut_clk (void ) {
75
+ // Create a local copy of the LookupTable. Modify the entry for WRITESTATUSREG
76
+ // Add an entry for PAGEPROGRAM_QUAD.
58
77
uint32_t lookuptable_copy [64 ];
59
78
memcpy (lookuptable_copy , (const uint32_t * )& qspiflash_config .memConfig .lookupTable , 64 * sizeof (uint32_t ));
60
- // write WRITESTATUSREG code to entry 10
79
+ // write local WRITESTATUSREG code to index 4
61
80
memcpy (& lookuptable_copy [NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG * 4 ],
62
81
LUT_write_status , 4 * sizeof (uint32_t ));
63
- // write PAGEPROGRAM_QUAD code to entry 10
82
+ // write local PAGEPROGRAM_QUAD code to index 10
64
83
memcpy (& lookuptable_copy [NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD * 4 ],
65
84
LUT_pageprogram_quad , 4 * sizeof (uint32_t ));
85
+ // Update the LookupTable.
66
86
FLEXSPI_UpdateLUT (BOARD_FLEX_SPI , 0 , lookuptable_copy , 64 );
87
+
88
+ #if !defined(MIMXRT117x_SERIES )
89
+ // We pre-calculate the divider here as long as the freq_table_mhz is accessible.
90
+ // The PFD is set below to 480 MHz.
91
+ uint32_t freq_divider = (480 + freq_table_mhz [MICROPY_HW_FLASH_CLK ] / 2 ) / freq_table_mhz [MICROPY_HW_FLASH_CLK ] - 1 ;
92
+
93
+ __DSB ();
94
+ __ISB ();
95
+ __disable_irq ();
96
+ SCB_DisableDCache ();
97
+ while (!FLEXSPI_GetBusIdleStatus (BOARD_FLEX_SPI )) {
98
+ }
99
+ FLEXSPI_Enable (BOARD_FLEX_SPI , false);
100
+
101
+ // Disable FlexSPI clock
102
+ CCM -> CCGR6 &= ~CCM_CCGR6_CG5_MASK ;
103
+ // Changing the clock is OK now.
104
+ // The PFD is 480 * 18 / PFD0_FRAC. We do / 18 which outputs 480 MHz.
105
+ CCM_ANALOG -> PFD_480 = (CCM_ANALOG -> PFD_480 & ~CCM_ANALOG_PFD_480_TOG_PFD0_FRAC_MASK ) | CCM_ANALOG_PFD_480_TOG_PFD0_FRAC (18 );
106
+ // This divides down the 480 Mhz by PODF + 1. So e.g. 480 / (3 + 1) = 120 MHz, 480 / (4 + 1) = 96 MHz.
107
+ CCM -> CSCMR1 = (CCM -> CSCMR1 & ~CCM_CSCMR1_FLEXSPI_PODF_MASK ) | CCM_CSCMR1_FLEXSPI_PODF (freq_divider );
108
+ // Re-enable FlexSPI
109
+ CCM -> CCGR6 |= CCM_CCGR6_CG5_MASK ;
110
+
111
+ FLEXSPI_Enable (BOARD_FLEX_SPI , true);
112
+ FLEXSPI_SoftwareReset (BOARD_FLEX_SPI );
113
+ while (!FLEXSPI_GetBusIdleStatus (BOARD_FLEX_SPI )) {
114
+ }
115
+
116
+ SCB_EnableDCache ();
117
+ __enable_irq ();
118
+ #endif
67
119
}
68
120
69
121
void flexspi_nor_reset (FLEXSPI_Type * base ) __attribute__((section (".ram_functions" )));
0 commit comments