Skip to content

Commit 45ffa4a

Browse files
committed
mimxrt/psram: Improve PSRAM implementation.
Add missing bullet in license. Use symbolic names for pins. Use macros for setting FlexSPI2 clock. Signed-off-by: Dryw Wade <dryw.wade@sparkfun.com>
1 parent 12091d3 commit 45ffa4a

File tree

2 files changed

+42
-34
lines changed

2 files changed

+42
-34
lines changed

ports/mimxrt/psram.c

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,13 @@
1313
* copies of the Software, and to permit persons to whom the Software is
1414
* furnished to do so, subject to the following conditions:
1515
*
16-
* The above copyright notice and this permission notice shall be included in
17-
* all copies or substantial portions of the Software.
16+
* 1. The above copyright notice and this permission notice shall be
17+
* included in all copies or substantial portions of the Software.
18+
*
19+
* 2. If the Software is incorporated into a build system that allows
20+
* selection among a list of target devices, then similar target
21+
* devices manufactured by PJRC.COM must be included in the list of
22+
* target devices and selectable in the same manner.
1823
*
1924
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2025
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
@@ -32,7 +37,6 @@
3237

3338
// These #defines are from here:
3439
// https://github.com/PaulStoffregen/cores/blob/10025393e83ca9f4dc5646643a41cb2f32022ae4/teensy4/imxrt.h
35-
#define CCM_CCGR_ON 3
3640
#define FLEXSPI_MCR2_CLRLEARNPHASE(x) ((uint32_t)(x << 14))
3741
#define FLEXSPI_LUTKEY_VALUE ((uint32_t)0x5AF05AF0)
3842

@@ -97,23 +101,23 @@ static uint8_t flexspi2_psram_size(uint32_t addr) {
97101

98102
size_t configure_external_ram() {
99103
// initialize pins
100-
IOMUXC->SW_PAD_CTL_PAD[22] = 0x1B0F9; // 100K pullup, strong drive, max speed, hyst
101-
IOMUXC->SW_PAD_CTL_PAD[23] = 0x110F9; // keeper, strong drive, max speed, hyst
102-
IOMUXC->SW_PAD_CTL_PAD[24] = 0x1B0F9; // 100K pullup, strong drive, max speed, hyst
103-
IOMUXC->SW_PAD_CTL_PAD[25] = 0x100F9; // strong drive, max speed, hyst
104-
IOMUXC->SW_PAD_CTL_PAD[26] = 0x170F9; // 47K pullup, strong drive, max speed, hyst
105-
IOMUXC->SW_PAD_CTL_PAD[27] = 0x170F9; // 47K pullup, strong drive, max speed, hyst
106-
IOMUXC->SW_PAD_CTL_PAD[28] = 0x170F9; // 47K pullup, strong drive, max speed, hyst
107-
IOMUXC->SW_PAD_CTL_PAD[29] = 0x170F9; // 47K pullup, strong drive, max speed, hyst
108-
109-
IOMUXC->SW_MUX_CTL_PAD[22] = 8 | 0x10; // ALT1 = FLEXSPI2_A_SS1_B (Flash)
110-
IOMUXC->SW_MUX_CTL_PAD[23] = 8 | 0x10; // ALT1 = FLEXSPI2_A_DQS
111-
IOMUXC->SW_MUX_CTL_PAD[24] = 8 | 0x10; // ALT1 = FLEXSPI2_A_SS0_B (RAM)
112-
IOMUXC->SW_MUX_CTL_PAD[25] = 8 | 0x10; // ALT1 = FLEXSPI2_A_SCLK
113-
IOMUXC->SW_MUX_CTL_PAD[26] = 8 | 0x10; // ALT1 = FLEXSPI2_A_DATA0
114-
IOMUXC->SW_MUX_CTL_PAD[27] = 8 | 0x10; // ALT1 = FLEXSPI2_A_DATA1
115-
IOMUXC->SW_MUX_CTL_PAD[28] = 8 | 0x10; // ALT1 = FLEXSPI2_A_DATA2
116-
IOMUXC->SW_MUX_CTL_PAD[29] = 8 | 0x10; // ALT1 = FLEXSPI2_A_DATA3
104+
IOMUXC->SW_PAD_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_22] = 0x1B0F9; // 100K pullup, strong drive, max speed, hyst
105+
IOMUXC->SW_PAD_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_23] = 0x110F9; // keeper, strong drive, max speed, hyst
106+
IOMUXC->SW_PAD_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_24] = 0x1B0F9; // 100K pullup, strong drive, max speed, hyst
107+
IOMUXC->SW_PAD_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_25] = 0x100F9; // strong drive, max speed, hyst
108+
IOMUXC->SW_PAD_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_26] = 0x170F9; // 47K pullup, strong drive, max speed, hyst
109+
IOMUXC->SW_PAD_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_27] = 0x170F9; // 47K pullup, strong drive, max speed, hyst
110+
IOMUXC->SW_PAD_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_28] = 0x170F9; // 47K pullup, strong drive, max speed, hyst
111+
IOMUXC->SW_PAD_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_29] = 0x170F9; // 47K pullup, strong drive, max speed, hyst
112+
113+
IOMUXC->SW_MUX_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_22] = 8 | 0x10; // ALT1 = FLEXSPI2_A_SS1_B (Flash)
114+
IOMUXC->SW_MUX_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_23] = 8 | 0x10; // ALT1 = FLEXSPI2_A_DQS
115+
IOMUXC->SW_MUX_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_24] = 8 | 0x10; // ALT1 = FLEXSPI2_A_SS0_B (RAM)
116+
IOMUXC->SW_MUX_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_25] = 8 | 0x10; // ALT1 = FLEXSPI2_A_SCLK
117+
IOMUXC->SW_MUX_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_26] = 8 | 0x10; // ALT1 = FLEXSPI2_A_DATA0
118+
IOMUXC->SW_MUX_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_27] = 8 | 0x10; // ALT1 = FLEXSPI2_A_DATA1
119+
IOMUXC->SW_MUX_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_28] = 8 | 0x10; // ALT1 = FLEXSPI2_A_DATA2
120+
IOMUXC->SW_MUX_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_29] = 8 | 0x10; // ALT1 = FLEXSPI2_A_DATA3
117121

118122
IOMUXC->SELECT_INPUT_1[kIOMUXC_FLEXSPI2_IPP_IND_DQS_FA_SELECT_INPUT] = 1; // GPIO_EMC_23 for Mode: ALT8, pg 986
119123
IOMUXC->SELECT_INPUT_1[kIOMUXC_FLEXSPI2_IPP_IND_IO_FA_BIT0_SELECT_INPUT] = 1; // GPIO_EMC_26 for Mode: ALT8
@@ -123,18 +127,17 @@ size_t configure_external_ram() {
123127
IOMUXC->SELECT_INPUT_1[kIOMUXC_FLEXSPI2_IPP_IND_SCK_FA_SELECT_INPUT] = 1; // GPIO_EMC_25 for Mode: ALT8
124128

125129
// turn on clock (QSPI flash & PSRAM chips usually spec max clock 100 to 133 MHz)
126-
CCM->CBCMR = (CCM->CBCMR & ~(CCM_CBCMR_FLEXSPI2_PODF_MASK | CCM_CBCMR_FLEXSPI2_CLK_SEL_MASK))
127-
// | CCM_CBCMR_FLEXSPI2_PODF(5) | CCM_CBCMR_FLEXSPI2_CLK_SEL(3); // 88.0 MHz
128-
// | CCM_CBCMR_FLEXSPI2_PODF(3) | CCM_CBCMR_FLEXSPI2_CLK_SEL(0); // 99.0 MHz
129-
// | CCM_CBCMR_FLEXSPI2_PODF(6) | CCM_CBCMR_FLEXSPI2_CLK_SEL(1); // 102.9 MHz
130-
| CCM_CBCMR_FLEXSPI2_PODF(4) | CCM_CBCMR_FLEXSPI2_CLK_SEL(3); // 105.6 MHz
131-
// | CCM_CBCMR_FLEXSPI2_PODF(5) | CCM_CBCMR_FLEXSPI2_CLK_SEL(2); // 110.8 MHz
132-
// | CCM_CBCMR_FLEXSPI2_PODF(5) | CCM_CBCMR_FLEXSPI2_CLK_SEL(1); // 120.0 MHz
133-
// | CCM_CBCMR_FLEXSPI2_PODF(3) | CCM_CBCMR_FLEXSPI2_CLK_SEL(3); // 132.0 MHz
134-
// | CCM_CBCMR_FLEXSPI2_PODF(4) | CCM_CBCMR_FLEXSPI2_CLK_SEL(1); // 144.0 MHz
135-
// | CCM_CBCMR_FLEXSPI2_PODF(3) | CCM_CBCMR_FLEXSPI2_CLK_SEL(2); // 166.2 MHz
136-
// | CCM_CBCMR_FLEXSPI2_PODF(2) | CCM_CBCMR_FLEXSPI2_CLK_SEL(3); // 176.0 MHz
137-
CCM->CCGR7 |= CCM_CCGR7_CG1(CCM_CCGR_ON);
130+
// CLOCK_SetDiv(kCLOCK_Flexspi2Div, 5); CLOCK_SetMux(kCLOCK_Flexspi2Mux, 3); // 88.0 MHz
131+
// CLOCK_SetDiv(kCLOCK_Flexspi2Div, 3); CLOCK_SetMux(kCLOCK_Flexspi2Mux, 0); // 99.0 MHz
132+
// CLOCK_SetDiv(kCLOCK_Flexspi2Div, 6); CLOCK_SetMux(kCLOCK_Flexspi2Mux, 1); // 102.9 MHz
133+
CLOCK_SetDiv(kCLOCK_Flexspi2Div, 4); CLOCK_SetMux(kCLOCK_Flexspi2Mux, 3); // 105.6 MHz
134+
// CLOCK_SetDiv(kCLOCK_Flexspi2Div, 5); CLOCK_SetMux(kCLOCK_Flexspi2Mux, 2); // 110.8 MHz
135+
// CLOCK_SetDiv(kCLOCK_Flexspi2Div, 5); CLOCK_SetMux(kCLOCK_Flexspi2Mux, 1); // 120.0 MHz
136+
// CLOCK_SetDiv(kCLOCK_Flexspi2Div, 3); CLOCK_SetMux(kCLOCK_Flexspi2Mux, 3); // 132.0 MHz
137+
// CLOCK_SetDiv(kCLOCK_Flexspi2Div, 4); CLOCK_SetMux(kCLOCK_Flexspi2Mux, 1); // 144.0 MHz
138+
// CLOCK_SetDiv(kCLOCK_Flexspi2Div, 3); CLOCK_SetMux(kCLOCK_Flexspi2Mux, 2); // 166.2 MHz
139+
// CLOCK_SetDiv(kCLOCK_Flexspi2Div, 2); CLOCK_SetMux(kCLOCK_Flexspi2Mux, 3); // 176.0 MHz
140+
CLOCK_EnableClock(kCLOCK_FlexSpi2);
138141

139142
FLEXSPI2->MCR0 |= FLEXSPI_MCR0_MDIS(1);
140143
FLEXSPI2->MCR0 = (FLEXSPI2->MCR0 & ~(FLEXSPI_MCR0_AHBGRANTWAIT_MASK

ports/mimxrt/psram.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,13 @@
1313
* copies of the Software, and to permit persons to whom the Software is
1414
* furnished to do so, subject to the following conditions:
1515
*
16-
* The above copyright notice and this permission notice shall be included in
17-
* all copies or substantial portions of the Software.
16+
* 1. The above copyright notice and this permission notice shall be
17+
* included in all copies or substantial portions of the Software.
18+
*
19+
* 2. If the Software is incorporated into a build system that allows
20+
* selection among a list of target devices, then similar target
21+
* devices manufactured by PJRC.COM must be included in the list of
22+
* target devices and selectable in the same manner.
1823
*
1924
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2025
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

0 commit comments

Comments
 (0)