|
30 | 30 | * THE SOFTWARE. |
31 | 31 | */ |
32 | 32 |
|
| 33 | +// This implementation is adapted from here: |
| 34 | +// https://github.com/PaulStoffregen/cores/blob/10025393e83ca9f4dc5646643a41cb2f32022ae4/teensy4/startup.c#L421-L615 |
33 | 35 | #include "py/mphal.h" |
34 | 36 | #include "fsl_flexspi.h" |
35 | 37 |
|
36 | 38 | #if MICROPY_HW_ENABLE_PSRAM |
37 | 39 |
|
38 | | -// These #defines are from here: |
39 | | -// https://github.com/PaulStoffregen/cores/blob/10025393e83ca9f4dc5646643a41cb2f32022ae4/teensy4/imxrt.h |
40 | | -#define FLEXSPI_MCR2_CLRLEARNPHASE(x) ((uint32_t)(x << 14)) |
41 | | -#define FLEXSPI_LUTKEY_VALUE ((uint32_t)0x5AF05AF0) |
| 40 | +/*! |
| 41 | + * @brief Clock divider value. |
| 42 | + * |
| 43 | + * See https://www.pjrc.com/teensy/IMXRT1060RM_rev3_annotations.pdf (p1010 and p1050) |
| 44 | + */ |
| 45 | +typedef enum _clock_mux_value { |
| 46 | + kCLOCK_Flexspi2Mux_396MHz = 0U, /*!< FLEXSPI2 clock source is PLL2 PFD2. */ |
| 47 | + kCLOCK_Flexspi2Mux_720MHz = 1U, /*!< FLEXSPI2 clock source is PLL3 PFD0. */ |
| 48 | + kCLOCK_Flexspi2Mux_664_62MHz = 2U, /*!< FLEXSPI2 clock source is PLL3 PFD1. */ |
| 49 | + kCLOCK_Flexspi2Mux_528MHz = 3U, /*!< FLEXSPI2 clock source is PLL2 (pll2_main_clk). */ |
| 50 | +} clock_mux_value_t; |
42 | 51 |
|
43 | | -// The rest of the implementation is adapted from here: |
44 | | -// https://github.com/PaulStoffregen/cores/blob/10025393e83ca9f4dc5646643a41cb2f32022ae4/teensy4/startup.c#L421-L615 |
45 | | -static void flexspi2_command(uint32_t index, uint32_t addr) { |
46 | | - FLEXSPI2->IPCR0 = addr; |
47 | | - FLEXSPI2->IPCR1 = FLEXSPI_IPCR1_ISEQID(index); |
48 | | - FLEXSPI2->IPCMD = FLEXSPI_IPCMD_TRG(1); |
49 | | - while (!(FLEXSPI2->INTR & FLEXSPI_INTR_IPCMDDONE(1))) { |
50 | | - ; // wait |
51 | | - } |
52 | | - FLEXSPI2->INTR = FLEXSPI_INTR_IPCMDDONE(1); |
| 52 | +static void flexspi2_command(uint32_t index, uint32_t addr, flexspi_port_t port) { |
| 53 | + flexspi_transfer_t xfer = { |
| 54 | + .deviceAddress = addr, |
| 55 | + .port = port, |
| 56 | + .cmdType = kFLEXSPI_Command, |
| 57 | + .seqIndex = index, |
| 58 | + .SeqNumber = 1, |
| 59 | + .data = NULL, |
| 60 | + .dataSize = 0, |
| 61 | + }; |
| 62 | + FLEXSPI_TransferBlocking(FLEXSPI2, &xfer); |
| 63 | + FLEXSPI_ClearInterruptStatusFlags(FLEXSPI2, kFLEXSPI_IpCommandExecutionDoneFlag); |
53 | 64 | } |
54 | 65 |
|
55 | | -static uint32_t flexspi2_psram_id(uint32_t addr) { |
56 | | - FLEXSPI2->IPCR0 = addr; |
57 | | - FLEXSPI2->IPCR1 = FLEXSPI_IPCR1_ISEQID(3) | FLEXSPI_IPCR1_IDATSZ(4); |
58 | | - FLEXSPI2->IPCMD = FLEXSPI_IPCMD_TRG(1); |
59 | | - while (!(FLEXSPI2->INTR & FLEXSPI_INTR_IPCMDDONE(1))) { |
60 | | - ; // wait |
61 | | - } |
62 | | - uint32_t id = FLEXSPI2->RFDR[0]; |
63 | | - FLEXSPI2->INTR = FLEXSPI_INTR_IPCMDDONE(1) | FLEXSPI_INTR_IPRXWA(1); |
| 66 | +static uint32_t flexspi2_psram_id(uint32_t addr, flexspi_port_t port) { |
| 67 | + uint32_t id = 0; |
| 68 | + flexspi_transfer_t xfer = { |
| 69 | + .deviceAddress = addr, |
| 70 | + .port = port, |
| 71 | + .cmdType = kFLEXSPI_Read, |
| 72 | + .seqIndex = 3, |
| 73 | + .SeqNumber = 1, |
| 74 | + .data = &id, |
| 75 | + .dataSize = 4, |
| 76 | + }; |
| 77 | + FLEXSPI_TransferBlocking(FLEXSPI2, &xfer); |
| 78 | + FLEXSPI_ClearInterruptStatusFlags(FLEXSPI2, |
| 79 | + kFLEXSPI_IpCommandExecutionDoneFlag | kFLEXSPI_IpRxFifoWatermarkAvailableFlag); |
64 | 80 | return id; |
65 | 81 | } |
66 | 82 |
|
67 | 83 | /** |
68 | 84 | * \return size of PSRAM in MBytes, or 0 if not present |
69 | 85 | */ |
70 | | -static uint8_t flexspi2_psram_size(uint32_t addr) { |
| 86 | +static uint8_t flexspi2_psram_size(uint32_t addr, flexspi_port_t port) { |
71 | 87 | uint8_t result = 0; // assume we don't have PSRAM at this address |
72 | | - flexspi2_command(0, addr); // exit quad mode |
73 | | - flexspi2_command(1, addr); // reset enable |
74 | | - flexspi2_command(2, addr); // reset (is this really necessary?) |
75 | | - uint32_t id = flexspi2_psram_id(addr); |
| 88 | + flexspi2_command(0, addr, port); // exit quad mode |
| 89 | + flexspi2_command(1, addr, port); // reset enable |
| 90 | + flexspi2_command(2, addr, port); // reset (is this really necessary?) |
| 91 | + uint32_t id = flexspi2_psram_id(addr, port); |
76 | 92 |
|
77 | 93 | switch (id & 0xFFFF) |
78 | 94 | { |
@@ -127,116 +143,120 @@ size_t configure_external_ram() { |
127 | 143 | IOMUXC->SELECT_INPUT_1[kIOMUXC_FLEXSPI2_IPP_IND_SCK_FA_SELECT_INPUT] = 1; // GPIO_EMC_25 for Mode: ALT8 |
128 | 144 |
|
129 | 145 | // turn on clock (QSPI flash & PSRAM chips usually spec max clock 100 to 133 MHz) |
130 | | - // CLOCK_SetDiv(kCLOCK_Flexspi2Div, 5); // 88.0 MHz |
131 | | - // CLOCK_SetMux(kCLOCK_Flexspi2Mux, 3); // 88.0 MHz |
132 | | - // CLOCK_SetDiv(kCLOCK_Flexspi2Div, 3); // 99.0 MHz |
133 | | - // CLOCK_SetMux(kCLOCK_Flexspi2Mux, 0); // 99.0 MHz |
134 | | - // CLOCK_SetDiv(kCLOCK_Flexspi2Div, 6); // 102.9 MHz |
135 | | - // CLOCK_SetMux(kCLOCK_Flexspi2Mux, 1); // 102.9 MHz |
136 | | - CLOCK_SetDiv(kCLOCK_Flexspi2Div, 4); // 105.6 MHz |
137 | | - CLOCK_SetMux(kCLOCK_Flexspi2Mux, 3); // 105.6 MHz |
138 | | - // CLOCK_SetDiv(kCLOCK_Flexspi2Div, 5); // 110.8 MHz |
139 | | - // CLOCK_SetMux(kCLOCK_Flexspi2Mux, 2); // 110.8 MHz |
140 | | - // CLOCK_SetDiv(kCLOCK_Flexspi2Div, 5); // 120.0 MHz |
141 | | - // CLOCK_SetMux(kCLOCK_Flexspi2Mux, 1); // 120.0 MHz |
142 | | - // CLOCK_SetDiv(kCLOCK_Flexspi2Div, 3); // 132.0 MHz |
143 | | - // CLOCK_SetMux(kCLOCK_Flexspi2Mux, 3); // 132.0 MHz |
144 | | - // CLOCK_SetDiv(kCLOCK_Flexspi2Div, 4); // 144.0 MHz |
145 | | - // CLOCK_SetMux(kCLOCK_Flexspi2Mux, 1); // 144.0 MHz |
146 | | - // CLOCK_SetDiv(kCLOCK_Flexspi2Div, 3); // 166.2 MHz |
147 | | - // CLOCK_SetMux(kCLOCK_Flexspi2Mux, 2); // 166.2 MHz |
148 | | - // CLOCK_SetDiv(kCLOCK_Flexspi2Div, 2); // 176.0 MHz |
149 | | - // CLOCK_SetMux(kCLOCK_Flexspi2Mux, 3); // 176.0 MHz |
150 | | - CLOCK_EnableClock(kCLOCK_FlexSpi2); |
151 | | - |
152 | | - FLEXSPI2->MCR0 |= FLEXSPI_MCR0_MDIS(1); |
153 | | - FLEXSPI2->MCR0 = (FLEXSPI2->MCR0 & ~(FLEXSPI_MCR0_AHBGRANTWAIT_MASK |
154 | | - | FLEXSPI_MCR0_IPGRANTWAIT_MASK | FLEXSPI_MCR0_SCKFREERUNEN(1) |
155 | | - | FLEXSPI_MCR0_COMBINATIONEN(1) | FLEXSPI_MCR0_DOZEEN(1) |
156 | | - | FLEXSPI_MCR0_HSEN(1) | FLEXSPI_MCR0_ATDFEN(1) | FLEXSPI_MCR0_ARDFEN(1) |
157 | | - | FLEXSPI_MCR0_RXCLKSRC_MASK | FLEXSPI_MCR0_SWRESET(1))) |
158 | | - | FLEXSPI_MCR0_AHBGRANTWAIT(0xFF) | FLEXSPI_MCR0_IPGRANTWAIT(0xFF) |
159 | | - | FLEXSPI_MCR0_RXCLKSRC(1) | FLEXSPI_MCR0_MDIS(1); |
160 | | - FLEXSPI2->MCR1 = FLEXSPI_MCR1_SEQWAIT(0xFFFF) | FLEXSPI_MCR1_AHBBUSWAIT(0xFFFF); |
161 | | - FLEXSPI2->MCR2 = (FLEXSPI->MCR2 & ~(FLEXSPI_MCR2_RESUMEWAIT_MASK |
162 | | - | FLEXSPI_MCR2_SCKBDIFFOPT(1) | FLEXSPI_MCR2_SAMEDEVICEEN(1) |
163 | | - | FLEXSPI_MCR2_CLRLEARNPHASE(1) | FLEXSPI_MCR2_CLRAHBBUFOPT(1))) |
164 | | - | FLEXSPI_MCR2_RESUMEWAIT(0x20) /*| FLEXSPI_MCR2_SAMEDEVICEEN*/; |
165 | | - |
166 | | - FLEXSPI2->AHBCR = FLEXSPI2->AHBCR & ~(FLEXSPI_AHBCR_READADDROPT(1) | FLEXSPI_AHBCR_PREFETCHEN(1) |
167 | | - | FLEXSPI_AHBCR_BUFFERABLEEN(1) | FLEXSPI_AHBCR_CACHABLEEN(1)); |
168 | | - uint32_t mask = (FLEXSPI_AHBRXBUFCR0_PREFETCHEN(1) | FLEXSPI_AHBRXBUFCR0_PRIORITY_MASK |
169 | | - | FLEXSPI_AHBRXBUFCR0_MSTRID_MASK | FLEXSPI_AHBRXBUFCR0_BUFSZ_MASK); |
170 | | - FLEXSPI2->AHBRXBUFCR0[0] = (FLEXSPI2->AHBRXBUFCR0[0] & ~mask) |
171 | | - | FLEXSPI_AHBRXBUFCR0_PREFETCHEN(1) | FLEXSPI_AHBRXBUFCR0_BUFSZ(64); |
172 | | - FLEXSPI2->AHBRXBUFCR0[1] = (FLEXSPI2->AHBRXBUFCR0[0] & ~mask) |
173 | | - | FLEXSPI_AHBRXBUFCR0_PREFETCHEN(1) | FLEXSPI_AHBRXBUFCR0_BUFSZ(64); |
174 | | - FLEXSPI2->AHBRXBUFCR0[2] = mask; |
175 | | - FLEXSPI2->AHBRXBUFCR0[3] = mask; |
176 | | - |
177 | | - // RX watermark = one 64 bit line |
178 | | - FLEXSPI2->IPRXFCR = (FLEXSPI->IPRXFCR & 0xFFFFFFC0) | FLEXSPI_IPRXFCR_CLRIPRXF(1); |
179 | | - // TX watermark = one 64 bit line |
180 | | - FLEXSPI2->IPTXFCR = (FLEXSPI->IPTXFCR & 0xFFFFFFC0) | FLEXSPI_IPTXFCR_CLRIPTXF(1); |
181 | | - |
182 | | - FLEXSPI2->INTEN = 0; |
183 | | - FLEXSPI2->FLSHCR1[0] = FLEXSPI_FLSHCR1_CSINTERVAL(0) |
184 | | - | FLEXSPI_FLSHCR1_TCSH(1) | FLEXSPI_FLSHCR1_TCSS(1); |
185 | | - FLEXSPI2->FLSHCR2[0] = FLEXSPI_FLSHCR2_AWRSEQID(6) | FLEXSPI_FLSHCR2_AWRSEQNUM(0) |
186 | | - | FLEXSPI_FLSHCR2_ARDSEQID(5) | FLEXSPI_FLSHCR2_ARDSEQNUM(0); |
187 | | - |
188 | | - FLEXSPI2->FLSHCR1[1] = FLEXSPI_FLSHCR1_CSINTERVAL(0) |
189 | | - | FLEXSPI_FLSHCR1_TCSH(1) | FLEXSPI_FLSHCR1_TCSS(1); |
190 | | - FLEXSPI2->FLSHCR2[1] = FLEXSPI_FLSHCR2_AWRSEQID(6) | FLEXSPI_FLSHCR2_AWRSEQNUM(0) |
191 | | - | FLEXSPI_FLSHCR2_ARDSEQID(5) | FLEXSPI_FLSHCR2_ARDSEQNUM(0); |
192 | | - |
193 | | - FLEXSPI2->MCR0 &= ~FLEXSPI_MCR0_MDIS(1); |
194 | | - |
195 | | - FLEXSPI2->LUTKEY = FLEXSPI_LUTKEY_VALUE; |
196 | | - FLEXSPI2->LUTCR = FLEXSPI_LUTCR_UNLOCK(1); |
197 | | - volatile uint32_t *luttable = &FLEXSPI2->LUT[0]; |
198 | | - for (int i = 0; i < 64; i++) { luttable[i] = 0; |
199 | | - } |
200 | | - FLEXSPI2->MCR0 |= FLEXSPI_MCR0_SWRESET(1); |
201 | | - while (FLEXSPI2->MCR0 & FLEXSPI_MCR0_SWRESET(1)) { |
202 | | - ; // wait |
| 146 | + // CLOCK_SetDiv(kCLOCK_Flexspi2Div, kCLOCK_Flexspi2DivBy6); // 88.0 MHz |
| 147 | + // CLOCK_SetMux(kCLOCK_Flexspi2Mux, kCLOCK_Flexspi2Mux_528MHz); // 88.0 MHz |
| 148 | + // CLOCK_SetDiv(kCLOCK_Flexspi2Div, kCLOCK_Flexspi2DivBy4); // 99.0 MHz |
| 149 | + // CLOCK_SetMux(kCLOCK_Flexspi2Mux, kCLOCK_Flexspi2Mux_396MHz); // 99.0 MHz |
| 150 | + // CLOCK_SetDiv(kCLOCK_Flexspi2Div, kCLOCK_Flexspi2DivBy7); // 102.9 MHz |
| 151 | + // CLOCK_SetMux(kCLOCK_Flexspi2Mux, kCLOCK_Flexspi2Mux_720MHz); // 102.9 MHz |
| 152 | + CLOCK_SetDiv(kCLOCK_Flexspi2Div, kCLOCK_Flexspi2DivBy5); // 105.6 MHz |
| 153 | + CLOCK_SetMux(kCLOCK_Flexspi2Mux, kCLOCK_Flexspi2Mux_528MHz); // 105.6 MHz |
| 154 | + // CLOCK_SetDiv(kCLOCK_Flexspi2Div, kCLOCK_Flexspi2DivBy6); // 110.8 MHz |
| 155 | + // CLOCK_SetMux(kCLOCK_Flexspi2Mux, kCLOCK_Flexspi2Mux_664_62MHz); // 110.8 MHz |
| 156 | + // CLOCK_SetDiv(kCLOCK_Flexspi2Div, kCLOCK_Flexspi2DivBy6); // 120.0 MHz |
| 157 | + // CLOCK_SetMux(kCLOCK_Flexspi2Mux, kCLOCK_Flexspi2Mux_720MHz); // 120.0 MHz |
| 158 | + // CLOCK_SetDiv(kCLOCK_Flexspi2Div, kCLOCK_Flexspi2DivBy4); // 132.0 MHz |
| 159 | + // CLOCK_SetMux(kCLOCK_Flexspi2Mux, kCLOCK_Flexspi2Mux_528MHz); // 132.0 MHz |
| 160 | + // CLOCK_SetDiv(kCLOCK_Flexspi2Div, kCLOCK_Flexspi2DivBy5); // 144.0 MHz |
| 161 | + // CLOCK_SetMux(kCLOCK_Flexspi2Mux, kCLOCK_Flexspi2Mux_720MHz); // 144.0 MHz |
| 162 | + // CLOCK_SetDiv(kCLOCK_Flexspi2Div, kCLOCK_Flexspi2DivBy4); // 166.2 MHz |
| 163 | + // CLOCK_SetMux(kCLOCK_Flexspi2Mux, kCLOCK_Flexspi2Mux_664_62MHz); // 166.2 MHz |
| 164 | + // CLOCK_SetDiv(kCLOCK_Flexspi2Div, kCLOCK_Flexspi2DivBy3); // 176.0 MHz |
| 165 | + // CLOCK_SetMux(kCLOCK_Flexspi2Mux, kCLOCK_Flexspi2Mux_528MHz); // 176.0 MHz |
203 | 166 |
|
204 | | - } |
205 | | - FLEXSPI2->LUTKEY = FLEXSPI_LUTKEY_VALUE; |
206 | | - FLEXSPI2->LUTCR = FLEXSPI_LUTCR_UNLOCK(1); |
| 167 | + flexspi_config_t flexspi_config = { |
| 168 | + .rxSampleClock = kFLEXSPI_ReadSampleClkLoopbackFromDqsPad, |
| 169 | + .enableSckFreeRunning = false, |
| 170 | + .enableCombination = false, |
| 171 | + .enableDoze = false, |
| 172 | + .enableHalfSpeedAccess = false, |
| 173 | + .enableSckBDiffOpt = false, |
| 174 | + .enableSameConfigForAll = false, |
| 175 | + .seqTimeoutCycle = 0xFFFF, |
| 176 | + .ipGrantTimeoutCycle = 0xFF, |
| 177 | + .txWatermark = 0, |
| 178 | + .rxWatermark = 0, |
| 179 | + .ahbConfig = { |
| 180 | + .enableAHBWriteIpTxFifo = false, |
| 181 | + .enableAHBWriteIpRxFifo = false, |
| 182 | + .ahbGrantTimeoutCycle = 0xFF, |
| 183 | + .ahbBusTimeoutCycle = 0xFFFF, |
| 184 | + .resumeWaitCycle = 0x20, |
| 185 | + .buffer = { |
| 186 | + {.priority = 0, .masterIndex = 0, .bufferSize = 512, .enablePrefetch = true}, |
| 187 | + {.priority = 0, .masterIndex = 0, .bufferSize = 512, .enablePrefetch = true}, |
| 188 | + {.priority = 0, .masterIndex = 0, .bufferSize = 0, .enablePrefetch = false}, |
| 189 | + {.priority = 0, .masterIndex = 0, .bufferSize = 0, .enablePrefetch = false}, |
| 190 | + }, |
| 191 | + .enableClearAHBBufferOpt = false, |
| 192 | + .enableReadAddressOpt = false, |
| 193 | + .enableAHBPrefetch = false, |
| 194 | + .enableAHBBufferable = false, |
| 195 | + .enableAHBCachable = false, |
| 196 | + }, |
| 197 | + }; |
| 198 | + FLEXSPI_Init(FLEXSPI2, &flexspi_config); |
| 199 | + |
| 200 | + FLEXSPI_DisableInterrupts(FLEXSPI2, kFLEXSPI_AllInterruptFlags); |
| 201 | + |
| 202 | + flexspi_device_config_t flexspi_device_config = { |
| 203 | + .flexspiRootClk = 0, |
| 204 | + .isSck2Enabled = false, |
| 205 | + .flashSize = 1 << 16, // Default value, will be updated later |
| 206 | + .CSIntervalUnit = kFLEXSPI_CsIntervalUnit1SckCycle, |
| 207 | + .CSInterval = 0, |
| 208 | + .CSHoldTime = 1, |
| 209 | + .CSSetupTime = 1, |
| 210 | + .dataValidTime = 0, |
| 211 | + .columnspace = 0, |
| 212 | + .enableWordAddress = false, |
| 213 | + .AWRSeqIndex = 6, |
| 214 | + .AWRSeqNumber = 1, |
| 215 | + .ARDSeqIndex = 5, |
| 216 | + .ARDSeqNumber = 1, |
| 217 | + .AHBWriteWaitUnit = kFLEXSPI_AhbWriteWaitUnit2AhbCycle, |
| 218 | + .AHBWriteWaitInterval = 0, |
| 219 | + .enableWriteMask = false, |
| 220 | + }; |
| 221 | + FLEXSPI_SetFlashConfig(FLEXSPI2, &flexspi_device_config, kFLEXSPI_PortA1); |
| 222 | + FLEXSPI_SetFlashConfig(FLEXSPI2, &flexspi_device_config, kFLEXSPI_PortA2); |
207 | 223 |
|
| 224 | + uint32_t cmd[64] = {0}; |
208 | 225 | // cmd index 0 = exit QPI mode |
209 | | - FLEXSPI2->LUT[0] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0xF5, 0, 0, 0); |
| 226 | + cmd[0] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0xF5, 0, 0, 0); |
210 | 227 | // cmd index 1 = reset enable |
211 | | - FLEXSPI2->LUT[4] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x66, 0, 0, 0); |
| 228 | + cmd[4] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x66, 0, 0, 0); |
212 | 229 | // cmd index 2 = reset |
213 | | - FLEXSPI2->LUT[8] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x99, 0, 0, 0); |
| 230 | + cmd[8] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x99, 0, 0, 0); |
214 | 231 | // cmd index 3 = read ID bytes |
215 | | - FLEXSPI2->LUT[12] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x9F, kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_1PAD, 24); |
216 | | - FLEXSPI2->LUT[13] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 1, 0, 0, 0); |
| 232 | + cmd[12] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x9F, kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_1PAD, 24); |
| 233 | + cmd[13] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 1, 0, 0, 0); |
217 | 234 | // cmd index 4 = enter QPI mode |
218 | | - FLEXSPI2->LUT[16] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x35, 0, 0, 0); |
| 235 | + cmd[16] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x35, 0, 0, 0); |
219 | 236 | // cmd index 5 = read QPI |
220 | | - FLEXSPI2->LUT[20] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0xEB, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 24); |
221 | | - FLEXSPI2->LUT[21] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 6, kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 1); |
| 237 | + cmd[20] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0xEB, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 24); |
| 238 | + cmd[21] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 6, kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 1); |
222 | 239 | // cmd index 6 = write QPI |
223 | | - FLEXSPI2->LUT[24] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0x38, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 24); |
224 | | - FLEXSPI2->LUT[25] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 1, 0, 0, 0); |
| 240 | + cmd[24] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0x38, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 24); |
| 241 | + cmd[25] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 1, 0, 0, 0); |
| 242 | + FLEXSPI_UpdateLUT(FLEXSPI2, 0, cmd, 64); |
225 | 243 |
|
226 | 244 | // Detected PSRAM size in MB |
227 | 245 | uint8_t external_psram_size = 0; |
228 | 246 |
|
229 | 247 | // look for the first PSRAM chip |
230 | | - uint8_t size1 = flexspi2_psram_size(0); |
| 248 | + uint8_t size1 = flexspi2_psram_size(0, kFLEXSPI_PortA1); |
231 | 249 | if (size1 > 0) { |
232 | | - FLEXSPI2->FLSHCR0[0] = size1 << 10; |
233 | | - flexspi2_command(4, 0); // enter QPI mode |
| 250 | + flexspi_device_config.flashSize = size1 << 10; |
| 251 | + FLEXSPI_SetFlashConfig(FLEXSPI2, &flexspi_device_config, kFLEXSPI_PortA1); |
| 252 | + flexspi2_command(4, 0, kFLEXSPI_PortA1); // enter QPI mode |
234 | 253 | // look for a second PSRAM chip |
235 | | - uint8_t size2 = flexspi2_psram_size(size1 << 20); |
| 254 | + uint8_t size2 = flexspi2_psram_size(size1 << 20, kFLEXSPI_PortA2); |
236 | 255 | external_psram_size = size1 + size2; |
237 | 256 | if (size2 > 0) { |
238 | | - FLEXSPI2->FLSHCR0[1] = size2 << 10; |
239 | | - flexspi2_command(4, size1 << 20); // enter QPI mode |
| 257 | + flexspi_device_config.flashSize = size2 << 10; |
| 258 | + FLEXSPI_SetFlashConfig(FLEXSPI2, &flexspi_device_config, kFLEXSPI_PortA2); |
| 259 | + flexspi2_command(4, size1 << 20, kFLEXSPI_PortA2); // enter QPI mode |
240 | 260 | } |
241 | 261 | } else { |
242 | 262 | // No PSRAM |
|
0 commit comments