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,69 @@ 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
+ typedef struct _ps_div_t {
62
+ uint8_t pfd480_div ;
63
+ uint8_t podf_div ;
64
+ } ps_div_t ;
65
+
66
+ static ps_div_t div_table_mhz [] = {
67
+ { 35 , 8 }, // Entry 0 is out of range
68
+ { 35 , 8 }, // 30 -> 30.85 MHz
69
+ { 29 , 6 }, // 50 -> 49.65 MHz
70
+ { 18 , 8 }, // 60 -> 60 MHz
71
+ { 23 , 5 }, // 75 -> 75.13 MHz
72
+ { 18 , 6 }, // 80 -> 80 MHz
73
+ { 29 , 3 }, // 100 -> 99.31 Mhz
74
+ { 13 , 5 }, // 133 -> 132.92 MHz
75
+ { 26 , 2 } // 166 -> 166.15 MHz
76
+ };
77
+ #endif
78
+
79
+ __attribute__((section (".ram_functions" ))) void flexspi_nor_update_lut_clk (void ) {
80
+ // Create a local copy of the LookupTable. Modify the entry for WRITESTATUSREG
81
+ // Add an entry for PAGEPROGRAM_QUAD.
58
82
uint32_t lookuptable_copy [64 ];
59
83
memcpy (lookuptable_copy , (const uint32_t * )& qspiflash_config .memConfig .lookupTable , 64 * sizeof (uint32_t ));
60
- // write WRITESTATUSREG code to entry 10
84
+ // write local WRITESTATUSREG code to index 4
61
85
memcpy (& lookuptable_copy [NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG * 4 ],
62
86
LUT_write_status , 4 * sizeof (uint32_t ));
63
- // write PAGEPROGRAM_QUAD code to entry 10
87
+ // write local PAGEPROGRAM_QUAD code to index 10
64
88
memcpy (& lookuptable_copy [NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD * 4 ],
65
89
LUT_pageprogram_quad , 4 * sizeof (uint32_t ));
90
+ // Update the LookupTable.
66
91
FLEXSPI_UpdateLUT (BOARD_FLEX_SPI , 0 , lookuptable_copy , 64 );
92
+
93
+ #if !defined(MIMXRT117x_SERIES )
94
+ volatile uint8_t pfd480_div = div_table_mhz [MICROPY_HW_FLASH_CLK ].pfd480_div ;
95
+ volatile uint8_t podf_div = div_table_mhz [MICROPY_HW_FLASH_CLK ].podf_div - 1 ;
96
+
97
+ __DSB ();
98
+ __ISB ();
99
+ __disable_irq ();
100
+ SCB_DisableDCache ();
101
+ while (!FLEXSPI_GetBusIdleStatus (BOARD_FLEX_SPI )) {
102
+ }
103
+ FLEXSPI_Enable (BOARD_FLEX_SPI , false);
104
+
105
+ // Disable FlexSPI clock
106
+ CCM -> CCGR6 &= ~CCM_CCGR6_CG5_MASK ;
107
+ // Changing the clock is OK now.
108
+ // Change the PFD
109
+ CCM_ANALOG -> PFD_480 = (CCM_ANALOG -> PFD_480 & ~CCM_ANALOG_PFD_480_TOG_PFD0_FRAC_MASK ) | CCM_ANALOG_PFD_480_TOG_PFD0_FRAC (pfd480_div );
110
+ // Change the flexspi divider
111
+ CCM -> CSCMR1 = (CCM -> CSCMR1 & ~CCM_CSCMR1_FLEXSPI_PODF_MASK ) | CCM_CSCMR1_FLEXSPI_PODF (podf_div );
112
+ // Re-enable FlexSPI
113
+ CCM -> CCGR6 |= CCM_CCGR6_CG5_MASK ;
114
+
115
+ FLEXSPI_Enable (BOARD_FLEX_SPI , true);
116
+ FLEXSPI_SoftwareReset (BOARD_FLEX_SPI );
117
+ while (!FLEXSPI_GetBusIdleStatus (BOARD_FLEX_SPI )) {
118
+ }
119
+
120
+ SCB_EnableDCache ();
121
+ __enable_irq ();
122
+ #endif
67
123
}
68
124
69
125
void flexspi_nor_reset (FLEXSPI_Type * base ) __attribute__((section (".ram_functions" )));
0 commit comments