1 /*
2  * Copyright 2023-2024 NXP
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <stdint.h>
8 #include "fsl_common.h"
9 #include "fsl_debug_console.h"
10 #if defined(MIMXRT798S_cm33_core0_SERIES)
11 #include "fsl_cache.h"
12 #endif
13 #include "fsl_clock.h"
14 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
15 #include "fsl_lpi2c.h"
16 #endif /* SDK_I2C_BASED_COMPONENT_USED */
17 #include "clock_config.h"
18 #include "board.h"
19 
20 /*******************************************************************************
21  * Definitions
22  ******************************************************************************/
23 #if defined(MIMXRT798S_cm33_core0_SERIES)
24 #define HYPERRAM_CMD_LUT_SEQ_IDX_SYNC_READ   0
25 #define HYPERRAM_CMD_LUT_SEQ_IDX_SYNC_WRITE  1
26 #define HYPERRAM_CMD_LUT_SEQ_IDX_BURST_READ  2
27 #define HYPERRAM_CMD_LUT_SEQ_IDX_BURST_WRITE 3
28 #define HYPERRAM_CMD_LUT_SEQ_IDX_REG_READ    4
29 #define HYPERRAM_CMD_LUT_SEQ_IDX_REG_WRITE   5
30 #define HYPERRAM_CMD_LUT_SEQ_IDX_RESET       6
31 
32 #define CUSTOM_LUT_LENGTH 40
33 #endif
34 
35 /*******************************************************************************
36  * Variables
37  ******************************************************************************/
38 
39 /*******************************************************************************
40  * Prototypes
41  ******************************************************************************/
42 
43 /*******************************************************************************
44  * Code
45  ******************************************************************************/
46 /* Initialize debug console. */
BOARD_InitDebugConsole(void)47 void BOARD_InitDebugConsole(void)
48 {
49     uint32_t uartClkSrcFreq;
50 
51 #if (defined(MIMXRT798S_cm33_core0_SERIES) || defined(MIMXRT798S_hifi4_SERIES))
52     CLOCK_AttachClk(BOARD_DEBUG_UART_FCCLK_ATTACH);
53     CLOCK_SetClkDiv(BOARD_DEBUG_UART_FCCLK_DIV, 1U);
54 
55     /* attach FC0 clock to LP_FLEXCOMM (debug console) */
56     CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
57 #else
58     CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
59     CLOCK_SetClkDiv(BOARD_DEBUG_UART_CLK_DIV, 4U);
60 #endif
61 
62     uartClkSrcFreq = BOARD_DEBUG_UART_CLK_FREQ;
63 
64     DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE, BOARD_DEBUG_UART_BAUDRATE, BOARD_DEBUG_UART_TYPE, uartClkSrcFreq);
65 }
66 
67 #if defined(MIMXRT798S_cm33_core0_SERIES)
AT_QUICKACCESS_SECTION_CODE(void BOARD_EnableXspiCache (CACHE64_CTRL_Type * cache))68 AT_QUICKACCESS_SECTION_CODE(void BOARD_EnableXspiCache(CACHE64_CTRL_Type *cache))
69 {
70     /* First, invalidate the entire cache. */
71     cache->CCR |= CACHE64_CTRL_CCR_INVW0_MASK | CACHE64_CTRL_CCR_INVW1_MASK | CACHE64_CTRL_CCR_GO_MASK;
72     while ((cache->CCR & CACHE64_CTRL_CCR_GO_MASK) != 0x00U)
73     {
74     }
75     /* As a precaution clear the bits to avoid inadvertently re-running this command. */
76     cache->CCR &= ~(CACHE64_CTRL_CCR_INVW0_MASK | CACHE64_CTRL_CCR_INVW1_MASK);
77     /* Now enable the cache. */
78     cache->CCR |= CACHE64_CTRL_CCR_ENCACHE_MASK;
79 }
80 
AT_QUICKACCESS_SECTION_CODE(void BOARD_DisableXspiCache (CACHE64_CTRL_Type * cache))81 AT_QUICKACCESS_SECTION_CODE(void BOARD_DisableXspiCache(CACHE64_CTRL_Type *cache))
82 {
83     /* First, clean XSPI cache. */
84     cache->CCR |= CACHE64_CTRL_CCR_PUSHW0_MASK | CACHE64_CTRL_CCR_PUSHW1_MASK | CACHE64_CTRL_CCR_GO_MASK;
85     while ((cache->CCR & CACHE64_CTRL_CCR_GO_MASK) != 0x00U)
86     {
87     }
88     /* As a precaution clear the bits to avoid inadvertently re-running this command. */
89     cache->CCR &= ~(CACHE64_CTRL_CCR_PUSHW0_MASK | CACHE64_CTRL_CCR_PUSHW1_MASK);
90 
91     /* Now disable XSPI cache. */
92     cache->CCR &= ~CACHE64_CTRL_CCR_ENCACHE_MASK;
93 }
94 
BOARD_ConfigMPU(void)95 void BOARD_ConfigMPU(void)
96 {
97     uint8_t attr;
98 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
99     extern uint32_t Image$$RW_m_ncache$$Base[];
100     /* RW_m_ncache_unused is a auxiliary region which is used to get the whole size of noncache section */
101     extern uint32_t Image$$RW_m_ncache_unused$$Base[];
102     extern uint32_t Image$$RW_m_ncache_unused$$ZI$$Limit[];
103     uint32_t nonCacheStart = (uint32_t)Image$$RW_m_ncache$$Base;
104     uint32_t nonCacheSize  = ((uint32_t)Image$$RW_m_ncache_unused$$Base == nonCacheStart) ?
105                                  0 :
106                                  ((uint32_t)Image$$RW_m_ncache_unused$$ZI$$Limit - nonCacheStart);
107 #elif defined(__MCUXPRESSO)
108     extern uint32_t __base_NCACHE_REGION;
109     extern uint32_t __top_NCACHE_REGION;
110     uint32_t nonCacheStart = (uint32_t)(&__base_NCACHE_REGION);
111     uint32_t nonCacheSize  = (uint32_t)(&__top_NCACHE_REGION) - nonCacheStart;
112 #elif defined(__ICCARM__) || defined(__GNUC__)
113     extern uint32_t __NCACHE_REGION_START[];
114     extern uint32_t __NCACHE_REGION_SIZE[];
115     uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START;
116     uint32_t nonCacheSize  = (uint32_t)__NCACHE_REGION_SIZE;
117 #else
118 #error "Unsupported compiler"
119 #endif
120 
121     XCACHE_DisableCache(XCACHE0);
122     XCACHE_DisableCache(XCACHE1);
123 
124     /* Disable MPU */
125     ARM_MPU_Disable();
126 
127     /* Attr0: device memory. */
128     ARM_MPU_SetMemAttr(0U, ARM_MPU_ATTR(ARM_MPU_ATTR_DEVICE, ARM_MPU_ATTR_DEVICE));
129     /* Attr1: non cacheable. */
130     ARM_MPU_SetMemAttr(1U, ARM_MPU_ATTR(ARM_MPU_ATTR_NON_CACHEABLE, ARM_MPU_ATTR_NON_CACHEABLE));
131     /* Attr2: non transient, write through, read allocate. */
132     attr = ARM_MPU_ATTR_MEMORY_(0U, 0U, 1U, 0U);
133     ARM_MPU_SetMemAttr(2U, ARM_MPU_ATTR(attr, attr));
134     /* Attr3: non transient, write back, read/write allocate. */
135     attr = ARM_MPU_ATTR_MEMORY_(0U, 1U, 1U, 1U);
136     ARM_MPU_SetMemAttr(3U, ARM_MPU_ATTR(attr, attr));
137 
138     /* Region 0: [0x0, 0x1FFFFFFF], non-shareable, read/write, any privileged, executable. Attr 2 (write through). */
139     ARM_MPU_SetRegion(0U, ARM_MPU_RBAR(0U, ARM_MPU_SH_NON, 0U, 1U, 0U), ARM_MPU_RLAR(0x1FFFFFFFU, 2U));
140     /* Region 2 (Peripherals): [0x40000000, 0x5FFFFFFF], non-shareable, read/write, non-privileged, executable. Attr 0
141      * (device). */
142     ARM_MPU_SetRegion(2U, ARM_MPU_RBAR(0x40000000U, ARM_MPU_SH_NON, 0U, 1U, 0U), ARM_MPU_RLAR(0x5FFFFFFF, 0U));
143 
144     if (nonCacheSize != 0)
145     {
146         /* The MPU region size should a granularity of 32 bytes. */
147         assert((nonCacheSize & 0x1FU) == 0x0U);
148 
149         /* Region 1 setting : outter-shareable, read-write,  non-privileged, executable. Attr 1. (non-cacheable) */
150         ARM_MPU_SetRegion(1U, ARM_MPU_RBAR(nonCacheStart, ARM_MPU_SH_OUTER, 0U, 1U, 0U),
151                           ARM_MPU_RLAR(nonCacheStart + nonCacheSize - 1, 1U));
152     }
153 
154     /*
155      * Enable MPU and HFNMIENA feature
156      * HFNMIENA ensures the core uses MPU configuration when in hard fault, NMI, and FAULTMASK handlers,
157      * otherwise all memory regions are accessed without MPU protection.
158      */
159     ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);
160 
161     /* Enable code & system cache */
162     XCACHE_EnableCache(XCACHE0);
163     XCACHE_EnableCache(XCACHE1);
164 
165     /* flush pipeline */
166     __DSB();
167     __ISB();
168 }
169 
BOARD_DeinitXspi(XSPI_Type * base,CACHE64_CTRL_Type * cache)170 void BOARD_DeinitXspi(XSPI_Type *base, CACHE64_CTRL_Type *cache)
171 {
172     if (base == XSPI0)
173     {
174         /* Enable clock again. */
175         CLKCTL0->PSCCTL1_SET = CLKCTL0_PSCCTL1_CLR_XSPI0_MASK;
176     }
177     else if (base == XSPI1)
178     {
179         /* Enable clock again. */
180         CLKCTL0->PSCCTL1_SET = CLKCTL0_PSCCTL1_CLR_XSPI1_MASK;
181     }
182     else
183     {
184     }
185 
186     base->MCR &= ~XSPI_MCR_MDIS_MASK;
187     if ((cache->CCR & CACHE64_CTRL_CCR_ENCACHE_MASK) != 0x00U)
188     {
189         BOARD_DisableXspiCache(cache);
190     }
191     /* Wait until XSPI is not busy */
192     while ((base->SR & XSPI_SR_BUSY_MASK) != 0U)
193     {
194     }
195     /* Disable module. */
196     base->MCR |= XSPI_MCR_MDIS_MASK;
197 }
198 
BOARD_InitXspi(XSPI_Type * base,CACHE64_CTRL_Type * cache)199 void BOARD_InitXspi(XSPI_Type *base, CACHE64_CTRL_Type *cache)
200 {
201     /* Enable XSPI module */
202     base->MCR |= XSPI_MCR_MDIS_MASK;
203 
204     base->MCR |= XSPI_MCR_SWRSTSD_MASK | XSPI_MCR_SWRSTHD_MASK;
205     for (uint32_t i = 0U; i < 6U; i++)
206     {
207         __NOP();
208     }
209     base->MCR &= ~(XSPI_MCR_SWRSTSD_MASK | XSPI_MCR_SWRSTHD_MASK);
210     base->MCR |= XSPI_MCR_IPS_TG_RST_MASK | XSPI_MCR_MDIS_MASK;
211     base->MCR &= ~XSPI_MCR_ISD3FA_MASK;
212     base->MCR &= ~XSPI_MCR_MDIS_MASK;
213     base->MCR |= XSPI_MCR_MDIS_MASK;
214     base->MCR |= XSPI_MCR_ISD3FA_MASK;
215     base->MCR &= ~XSPI_MCR_MDIS_MASK;
216 
217     base->MCR |= XSPI_MCR_MDIS_MASK;
218     base->SMPR = (((base->SMPR) & (~XSPI_SMPR_DLLFSMPFA_MASK)) |
219                   XSPI_SMPR_DLLFSMPFA(FSL_FEATURE_XSPI_DLL_REF_VALUE_DDR_DELAY_TAP_NUM));
220     base->MCR &= ~XSPI_MCR_MDIS_MASK;
221 
222     base->DLLCR[0] &= ~(XSPI_DLLCR_SLV_DLL_BYPASS_MASK | XSPI_DLLCR_DLL_CDL8_MASK | XSPI_DLLCR_SLV_DLY_OFFSET_MASK |
223                         XSPI_DLLCR_SLV_FINE_OFFSET_MASK | XSPI_DLLCR_DLLRES_MASK | XSPI_DLLCR_DLL_REFCNTR_MASK |
224                         XSPI_DLLCR_FREQEN_MASK);
225     base->DLLCR[0] &= ~(XSPI_DLLCR_SLV_EN_MASK | XSPI_DLLCR_SLAVE_AUTO_UPDT_MASK | XSPI_DLLCR_DLLEN_MASK);
226     /* Enable subordinate as auto update mode. */
227     base->DLLCR[0] |= XSPI_DLLCR_SLV_EN_MASK | XSPI_DLLCR_SLAVE_AUTO_UPDT_MASK;
228     /* program DLL to desired delay. */
229     base->DLLCR[0] |= XSPI_DLLCR_DLLRES(FSL_FEATURE_XSPI_DLL_REF_VALUE_AUTOUPDATE_X16_DISABLE_RES) |
230                       XSPI_DLLCR_DLL_REFCNTR(FSL_FEATURE_XSPI_DLL_REF_VALUE_AUTOUPDATE_X16_DISABLED_REF_COUNTER) |
231                       XSPI_DLLCR_SLV_FINE_OFFSET(0) | XSPI_DLLCR_SLV_DLY_OFFSET(0) | XSPI_DLLCR_FREQEN(1U);
232     /* Load above settings into delay chain. */
233     base->DLLCR[0] |= XSPI_DLLCR_SLV_UPD_MASK;
234     base->DLLCR[0] |= XSPI_DLLCR_DLLEN_MASK;
235     base->DLLCR[0] &= ~XSPI_DLLCR_SLV_UPD_MASK;
236 
237     while ((base->DLLSR & XSPI_DLLSR_SLVA_LOCK_MASK) == 0UL)
238     {
239     }
240 
241     if ((cache->CCR & CACHE64_CTRL_CCR_ENCACHE_MASK) == 0x00U)
242     {
243         BOARD_EnableXspiCache(cache);
244         /* flush pipeline */
245         __DSB();
246         __ISB();
247     }
248 }
249 
250 /* BOARD_SetXspiClock run in RAM used to configure XSPI clock source and divider when XIP. */
BOARD_SetXspiClock(XSPI_Type * base,uint32_t src,uint32_t divider)251 void BOARD_SetXspiClock(XSPI_Type *base, uint32_t src, uint32_t divider)
252 {
253     if (base == XSPI0)
254     {
255         if ((CLKCTL0->XSPI0FCLKSEL != CLKCTL0_XSPI0FCLKSEL_SEL(src)) ||
256             ((CLKCTL0->XSPI0FCLKDIV & CLKCTL0_XSPI0FCLKDIV_DIV_MASK) != (divider - 1)))
257         {
258             /* Always deinit XSPI and init XSPI for the flash to make sure the flash works correctly after the
259              XSPI root clock changed as the default XSPI configuration may does not work for the new root clock
260              frequency. */
261             BOARD_DeinitXspi(base, CACHE64_CTRL0);
262 
263             /* Disable clock before changing clock source */
264             CLKCTL0->PSCCTL1_CLR = CLKCTL0_PSCCTL1_CLR_XSPI0_MASK;
265             /* Update XSPI clock. */
266             CLKCTL0->XSPI0FCLKSEL = CLKCTL0_XSPI0FCLKSEL_SEL(src) | CLKCTL0_XSPI0FCLKSEL_SEL_EN_MASK;
267             CLKCTL0->XSPI0FCLKDIV = CLKCTL0_XSPI0FCLKDIV_DIV(divider - 1);
268             while ((CLKCTL0->XSPI0FCLKDIV) & CLKCTL0_XSPI0FCLKDIV_REQFLAG_MASK)
269             {
270             }
271             /* Enable XSPI clock again */
272             CLKCTL0->PSCCTL1_SET = CLKCTL0_PSCCTL1_SET_XSPI0_MASK;
273 
274             BOARD_InitXspi(base, CACHE64_CTRL0);
275         }
276     }
277     else if (base == XSPI1)
278     {
279         if ((CLKCTL0->XSPI1FCLKSEL != CLKCTL0_XSPI1FCLKSEL_SEL(src)) ||
280             ((CLKCTL0->XSPI1FCLKDIV & CLKCTL0_XSPI1FCLKDIV_DIV_MASK) != (divider - 1)))
281         {
282             /* Always deinit XSPI and init XSPI for the flash to make sure the flash works correctly after the
283              XSPI root clock changed as the default XSPI configuration may does not work for the new root clock
284              frequency. */
285             BOARD_DeinitXspi(base, CACHE64_CTRL1);
286 
287             /* Disable clock before changing clock source */
288             CLKCTL0->PSCCTL1_CLR = CLKCTL0_PSCCTL1_CLR_XSPI1_MASK;
289             /* Update XSPI clock. */
290             CLKCTL0->XSPI1FCLKSEL = CLKCTL0_XSPI1FCLKSEL_SEL(src) | CLKCTL0_XSPI1FCLKSEL_SEL_EN_MASK;
291             CLKCTL0->XSPI1FCLKDIV = CLKCTL0_XSPI1FCLKDIV_DIV(divider - 1);
292             while ((CLKCTL0->XSPI1FCLKDIV) & CLKCTL0_XSPI1FCLKDIV_REQFLAG_MASK)
293             {
294             }
295             /* Enable XSPI clock again */
296             CLKCTL0->PSCCTL1_SET = CLKCTL0_PSCCTL1_SET_XSPI1_MASK;
297 
298             BOARD_InitXspi(base, CACHE64_CTRL1);
299         }
300     }
301     else
302     {
303         return;
304     }
305 }
306 
BOARD_XspiClockSafeConfig(void)307 void BOARD_XspiClockSafeConfig(void)
308 {
309     BOARD_SetXspiClock(XSPI0, 0U, 1U);
310     BOARD_SetXspiClock(XSPI1, 0U, 1U);
311 }
312 
xspi_hyper_ram_get_mcr(XSPI_Type * base,uint32_t regAddr,uint8_t * mrVal)313 static void xspi_hyper_ram_get_mcr(XSPI_Type *base, uint32_t regAddr, uint8_t *mrVal)
314 {
315     xspi_transfer_t flashXfer = {0U};
316 
317     /* Read data */
318     if (base == XSPI1)
319     {
320         flashXfer.deviceAddress = XSPI1_AMBA_BASE + regAddr;
321     }
322     else if (base == XSPI2)
323     {
324         flashXfer.deviceAddress = XSPI2_AMBA_BASE + regAddr;
325     }
326     flashXfer.cmdType         = kXSPI_Read;
327     flashXfer.seqIndex        = HYPERRAM_CMD_LUT_SEQ_IDX_REG_READ;
328     flashXfer.targetGroup     = kXSPI_TargetGroup0;
329     flashXfer.data            = (uint32_t *)mrVal;
330     flashXfer.dataSize        = 4;
331     flashXfer.lockArbitration = false;
332 
333     (void)XSPI_TransferBlocking(base, &flashXfer);
334 }
335 
xspi_hyper_ram_write_mcr(XSPI_Type * base,uint32_t regAddr,uint8_t * mrVal)336 static void xspi_hyper_ram_write_mcr(XSPI_Type *base, uint32_t regAddr, uint8_t *mrVal)
337 {
338     xspi_transfer_t flashXfer = {0U};
339 
340     /* Write data */
341     if (base == XSPI1)
342     {
343         flashXfer.deviceAddress = XSPI1_AMBA_BASE + regAddr;
344     }
345     else if (base == XSPI2)
346     {
347         flashXfer.deviceAddress = XSPI2_AMBA_BASE + regAddr;
348     }
349     flashXfer.cmdType         = kXSPI_Write;
350     flashXfer.seqIndex        = HYPERRAM_CMD_LUT_SEQ_IDX_REG_WRITE;
351     flashXfer.targetGroup     = kXSPI_TargetGroup0;
352     flashXfer.data            = (uint32_t *)mrVal;
353     flashXfer.dataSize        = 4;
354     flashXfer.lockArbitration = false;
355 
356     (void)XSPI_TransferBlocking(base, &flashXfer);
357 }
358 
BOARD_Init16bitsPsRam(XSPI_Type * base)359 void BOARD_Init16bitsPsRam(XSPI_Type *base)
360 {
361     xspi_config_t config;
362     xspi_ahb_access_config_t psRamAhbAccessConfig;
363     xspi_ip_access_config_t psRamIpAccessConfig;
364 
365     config.ptrAhbAccessConfig = &psRamAhbAccessConfig;
366     config.ptrIpAccessConfig  = &psRamIpAccessConfig;
367 
368     /* clang-format off */
369     const uint32_t customLUT[CUSTOM_LUT_LENGTH] = {
370 #if (defined(BOARD_PSRAM_ENABLE_VARIABLE_LATENCY) && BOARD_PSRAM_ENABLE_VARIABLE_LATENCY)
371         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_BURST_READ] = XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0xA0,
372                                                                 kXSPI_Command_RADDR_DDR, kXSPI_8PAD, 0x18),
373         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_BURST_READ + 1] = XSPI_LUT_SEQ(kXSPI_Command_CADDR_DDR, kXSPI_8PAD, 0x10,
374                                                                     kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 6), /* Dummy cycle: 2 * 6 + 2 */
375         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_BURST_READ + 2] = XSPI_LUT_SEQ(kXSPI_Command_READ_DDR, kXSPI_8PAD, 0x04,
376                                                                     kXSPI_Command_STOP, kXSPI_1PAD, 0x0),
377 
378         /* Memory Write */
379         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_BURST_WRITE + 0] = XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0x20,
380                                                                     kXSPI_Command_RADDR_DDR, kXSPI_8PAD, 0x18),
381         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_BURST_WRITE + 1] = XSPI_LUT_SEQ(kXSPI_Command_CADDR_DDR, kXSPI_8PAD, 0x10,
382                                                                     kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 6), /* Dummy cycle: 2 * 6 + 2 */
383         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_BURST_WRITE + 2] = XSPI_LUT_SEQ(kXSPI_Command_WRITE_DDR, kXSPI_8PAD, 0x04,
384                                                                     kXSPI_Command_STOP, kXSPI_1PAD, 0X0),
385 
386         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_REG_READ] = XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0xE0,
387                                                             kXSPI_Command_RADDR_DDR, kXSPI_8PAD, 0x18),
388         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_REG_READ + 1] = XSPI_LUT_SEQ(kXSPI_Command_CADDR_DDR, kXSPI_8PAD, 0x10,
389                                                                 kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 0x6), /* Dummy cycle: 2 * 6 + 2 */
390         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_REG_READ + 2] = XSPI_LUT_SEQ(kXSPI_Command_READ_DDR, kXSPI_8PAD, 0x04,
391                                                                 kXSPI_Command_STOP, kXSPI_1PAD, 0x0),
392 
393         /* Register write */
394         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_REG_WRITE] = XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0x60,
395                                                                 kXSPI_Command_RADDR_DDR, kXSPI_8PAD, 0x18),
396         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_REG_WRITE + 1] = XSPI_LUT_SEQ(kXSPI_Command_CADDR_DDR, kXSPI_8PAD, 0x10,
397                                                                 kXSPI_Command_WRITE_DDR, kXSPI_8PAD, 0x02),
398         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_REG_WRITE + 2] = XSPI_LUT_SEQ(kXSPI_Command_STOP, kXSPI_1PAD, 0x0,
399                                                                 kXSPI_Command_STOP, kXSPI_1PAD, 0x0),
400 #else
401         /* Memory Read */
402         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_BURST_READ] = XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0xA0,
403                                                                 kXSPI_Command_RADDR_DDR, kXSPI_8PAD, 0x18),
404         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_BURST_READ + 1] = XSPI_LUT_SEQ(kXSPI_Command_CADDR_DDR, kXSPI_8PAD, 0x10,
405                                                                 kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 13),
406         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_BURST_READ + 2] = XSPI_LUT_SEQ(kXSPI_Command_READ_DDR, kXSPI_8PAD, 0x04,
407                                                                     kXSPI_Command_STOP, kXSPI_1PAD, 0x0),
408 
409         /* Memory Write */
410         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_BURST_WRITE] = XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0x20,
411                                                                 kXSPI_Command_RADDR_DDR, kXSPI_8PAD, 0x18),
412         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_BURST_WRITE + 1] = XSPI_LUT_SEQ(kXSPI_Command_CADDR_DDR, kXSPI_8PAD, 0x10,
413                                                                 kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 13), /* Dummy cycle: 13 + 1 */
414         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_BURST_WRITE + 2] = XSPI_LUT_SEQ(kXSPI_Command_WRITE_DDR, kXSPI_8PAD, 0x04,
415                                                                     kXSPI_Command_STOP, kXSPI_1PAD, 0X0),
416 
417         /* Register Read */
418         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_REG_READ] = XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0xE0,
419                                                                 kXSPI_Command_RADDR_DDR, kXSPI_8PAD, 0x18),
420         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_REG_READ + 1] = XSPI_LUT_SEQ(kXSPI_Command_CADDR_DDR, kXSPI_8PAD, 0x10,
421                                                                     kXSPI_Command_DUMMY_SDR, kXSPI_8PAD, 13),  /* Dummy cycle: 13 + 1 */
422         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_REG_READ + 2] = XSPI_LUT_SEQ(kXSPI_Command_READ_DDR, kXSPI_8PAD, 0x04,
423                                                                     kXSPI_Command_STOP, kXSPI_1PAD, 0x0),
424 
425         /* Register write */
426         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_REG_WRITE] = XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0x60,
427                                                                 kXSPI_Command_RADDR_DDR, kXSPI_8PAD, 0x18),
428         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_REG_WRITE + 1] = XSPI_LUT_SEQ(kXSPI_Command_CADDR_DDR, kXSPI_8PAD, 0x10,
429                                                                     kXSPI_Command_WRITE_DDR, kXSPI_8PAD, 0x02),
430         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_REG_WRITE + 2] = XSPI_LUT_SEQ(kXSPI_Command_STOP, kXSPI_1PAD, 0x0,
431                                                                     kXSPI_Command_STOP, kXSPI_1PAD, 0x0),
432 #endif
433         /* reset */
434         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_RESET + 0]     = XSPI_LUT_SEQ(kXSPI_Command_DDR, kXSPI_8PAD, 0xFF, kXSPI_Command_DDR, kXSPI_8PAD, 0xFF),
435         [5 * HYPERRAM_CMD_LUT_SEQ_IDX_RESET + 1]     = XSPI_LUT_SEQ(kXSPI_Command_STOP, kXSPI_8PAD, 0x0, kXSPI_Command_STOP, kXSPI_8PAD, 0x0),
436     };
437     /* clang-format on */
438 
439     xspi_device_ddr_config_t psRamDdrConfig = {
440         .ddrDataAlignedClk         = kXSPI_DDRDataAlignedWith2xInternalRefClk,
441         .enableByteSwapInOctalMode = false,
442         .enableDdr                 = true,
443     };
444 
445     xspi_device_config_t psRamDeviceConfig = {
446         .xspiRootClk                                = 500000000,      /*!< 500MHz */
447         .enableCknPad                               = true,           /*!< CKN signal is connected in board. */
448         .deviceInterface                            = kXSPI_HyperBus, /*!< HyperBus protocol. */
449         .interfaceSettings.hyperBusSettings.x16Mode = kXSPI_x16ModeEnabledOnlyData, /*!< Only Data use x16 mode. */
450 #if (defined(BOARD_PSRAM_ENABLE_VARIABLE_LATENCY) && BOARD_PSRAM_ENABLE_VARIABLE_LATENCY)
451         .interfaceSettings.hyperBusSettings.enableVariableLatency =
452             true, /*!< Enable additional latency to increase performance. */
453 #else
454          .interfaceSettings.hyperBusSettings.enableVariableLatency = false,
455 #endif
456         .interfaceSettings.hyperBusSettings.forceBit10To1 = false,
457         .CSHoldTime                                       = 3,
458         .CSSetupTime                                      = 3,
459         .sampleClkConfig.sampleClkSource                  = kXSPI_SampleClkFromExternalDQS,
460         .sampleClkConfig.enableDQSLatency                 = false,
461         .sampleClkConfig.dllConfig.dllMode                = kXSPI_AutoUpdateMode,
462         .sampleClkConfig.dllConfig.useRefValue            = true,
463         .sampleClkConfig.dllConfig.enableCdl8             = false,
464         .addrMode                                         = kXSPI_Device2ByteAddressable,
465         .columnAddrWidth                                  = 3U,
466         .enableCASInterleaving                            = false,
467         .deviceSize[0]                                    = 0x8000U,
468         .deviceSize[1]      = 0x8000U, /*!< Single die device, so deviceSize1 should equal to deviceSize0. */
469         .ptrDeviceRegInfo   = NULL,
470         .ptrDeviceDdrConfig = &psRamDdrConfig,
471     };
472     /* Get XSPI default settings and configure the xspi. */
473     XSPI_GetDefaultConfig(&config);
474     if (base == XSPI2)
475     {
476         POWER_DisablePD(kPDRUNCFG_APD_XSPI2);
477         POWER_DisablePD(kPDRUNCFG_PPD_XSPI2);
478         POWER_ApplyPD();
479 
480         CLOCK_AttachClk(kMAIN_PLL_PFD3_to_XSPI2);
481         CLOCK_SetClkDiv(kCLOCK_DivXspi2Clk, 1U);
482 #if (defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
483         CLOCK_EnableClock(kCLOCK_Xspi2);
484 #endif
485     }
486     else
487     {
488         psRamDeviceConfig.xspiRootClk = 400000000;
489         POWER_DisablePD(kPDRUNCFG_APD_XSPI1);
490         POWER_DisablePD(kPDRUNCFG_PPD_XSPI1);
491         POWER_ApplyPD();
492 
493         CLOCK_AttachClk(kAUDIO_PLL_PFD1_to_XSPI1);
494         CLOCK_SetClkDiv(kCLOCK_DivXspi1Clk, 1U);
495 #if (defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
496         CLOCK_EnableClock(kCLOCK_Xspi1);
497 #endif
498     }
499 
500     xspi_ahb_write_config_t psRamAhbWriteConfig = {
501         .AWRSeqIndex          = HYPERRAM_CMD_LUT_SEQ_IDX_BURST_WRITE,
502         .blockRead            = false,
503         .blockSequenceWrite   = false,
504         .pageWaitTimeoutValue = 0UL,
505         .policy               = kXSPI_SoftwareClearPPWFlag,
506     };
507     config.ptrAhbAccessConfig->ARDSeqIndex                 = HYPERRAM_CMD_LUT_SEQ_IDX_BURST_READ;
508     config.ptrAhbAccessConfig->ahbErrorPayload.highPayload = 0x5A5A5A5A;
509     config.ptrAhbAccessConfig->ahbErrorPayload.lowPayload  = 0x5A5A5A5A;
510     config.ptrAhbAccessConfig->enableAHBBufferWriteFlush   = true;
511     config.ptrAhbAccessConfig->enableAHBPrefetch           = true;
512     config.ptrAhbAccessConfig->ptrAhbWriteConfig           = &psRamAhbWriteConfig;
513 
514     config.ptrIpAccessConfig->ptrSfpFradConfig = NULL;
515     config.ptrIpAccessConfig->ptrSfpMdadConfig = NULL;
516 
517     XSPI_Init(base, &config);
518     XSPI_SetDeviceConfig(base, &psRamDeviceConfig);
519 
520     /* Update LUT table. */
521     XSPI_UpdateLUT(base, 0, customLUT, CUSTOM_LUT_LENGTH);
522 
523     uint16_t cr1Register[2] = {0x0, 0x0};
524 
525     /* Enable CLKn. */
526     (void)xspi_hyper_ram_get_mcr(base, ((1U << 11) | (1U << 0)), (uint8_t *)cr1Register);
527     cr1Register[1] &= ~(0x01 << 6); /* enable ckn */
528     (void)xspi_hyper_ram_write_mcr(base, ((1U << 12) | (1U << 0)), (uint8_t *)cr1Register);
529 
530 
531 #if (defined(BOARD_PSRAM_ENABLE_VARIABLE_LATENCY) && BOARD_PSRAM_ENABLE_VARIABLE_LATENCY)
532     /* Following code to enable variable latency for hyperRAM */
533     uint16_t cr0Register[2] = {0x0U, 0x0U};
534 
535     (void)xspi_hyper_ram_get_mcr(base, (1U << 11), (uint8_t *)cr0Register);
536 
537     cr0Register[1] &= ~(1U << 3U);
538     cr0Register[0] &= ~(0x07 << 4); /* Clear drive strength */
539     cr0Register[0] |= (0x03 << 4);  /* 46Ohms */
540 
541     (void)xspi_hyper_ram_write_mcr(base, (1U << 11), (uint8_t *)cr0Register);
542 #endif
543     /* Updated address mode for AHB access. */
544     psRamDeviceConfig.addrMode = kXSPI_Device4ByteAddressable;
545     XSPI_SetDeviceConfig(base, &psRamDeviceConfig);
546 }
547 
548 #endif /* MIMXRT798S_cm33_core0_SERIES */
549 
550 #if defined(MIMXRT798S_cm33_core0_SERIES) || defined(MIMXRT798S_cm33_core1_SERIES)
GlikeyWriteEnable(GLIKEY_Type * base,uint8_t idx)551 void GlikeyWriteEnable(GLIKEY_Type *base, uint8_t idx)
552 {
553     (void)GLIKEY_SyncReset(base);
554 
555     (void)GLIKEY_StartEnable(base, idx);
556     (void)GLIKEY_ContinueEnable(base, GLIKEY_CODEWORD_STEP1);
557     (void)GLIKEY_ContinueEnable(base, GLIKEY_CODEWORD_STEP2);
558     (void)GLIKEY_ContinueEnable(base, GLIKEY_CODEWORD_STEP3);
559     (void)GLIKEY_ContinueEnable(base, GLIKEY_CODEWORD_STEP_EN);
560 }
561 
GlikeyClearConfig(GLIKEY_Type * base)562 void GlikeyClearConfig(GLIKEY_Type *base)
563 {
564     (void)GLIKEY_SyncReset(base);
565 }
566 
567 /* Disable the secure check for AHBSC and enable periperhals/sram access for masters */
BOARD_InitAHBSC(void)568 void BOARD_InitAHBSC(void)
569 {
570 #if defined(MIMXRT798S_cm33_core0_SERIES)
571     GlikeyWriteEnable(GLIKEY0, 1U);
572     AHBSC0->MISC_CTRL_DP_REG = 0x000086aa;
573     AHBSC0->MISC_CTRL_REG    = 0x000086aa; /* AHBSC0 MISC_CTRL_REG, disable Privilege & Secure checking. */
574 
575     GlikeyWriteEnable(GLIKEY0, 7U);
576     /* Enable arbiter0 accessing SRAM */
577     AHBSC0->COMPUTE_ARB0RAM_ACCESS_ENABLE = 0x3FFFFFFF;
578     AHBSC0->SENSE_ARB0RAM_ACCESS_ENABLE   = 0x3FFFFFFF;
579     AHBSC0->MEDIA_ARB0RAM_ACCESS_ENABLE   = 0x3FFFFFFF;
580     AHBSC0->NPU_ARB0RAM_ACCESS_ENABLE     = 0x3FFFFFFF;
581     AHBSC0->HIFI4_ARB0RAM_ACCESS_ENABLE   = 0x3FFFFFFF;
582 #endif
583 
584     GlikeyWriteEnable(GLIKEY1, 1U);
585     AHBSC3->MISC_CTRL_DP_REG = 0x000086aa;
586     AHBSC3->MISC_CTRL_REG    = 0x000086aa; /* AHBSC3 MISC_CTRL_REG, disable Privilege & Secure checking.*/
587 
588     GlikeyWriteEnable(GLIKEY1, 9U);
589     /* Enable arbiter1 accessing SRAM */
590     AHBSC3->COMPUTE_ARB1RAM_ACCESS_ENABLE = 0x3FFFFFFF;
591     AHBSC3->SENSE_ARB1RAM_ACCESS_ENABLE   = 0x3FFFFFFF;
592     AHBSC3->MEDIA_ARB1RAM_ACCESS_ENABLE   = 0x3FFFFFFF;
593     AHBSC3->NPU_ARB1RAM_ACCESS_ENABLE     = 0x3FFFFFFF;
594     AHBSC3->HIFI4_ARB1RAM_ACCESS_ENABLE   = 0x3FFFFFFF;
595     AHBSC3->HIFI1_ARB1RAM_ACCESS_ENABLE   = 0x3FFFFFFF;
596 
597     GlikeyWriteEnable(GLIKEY1, 8U);
598     /* Access enable for COMPUTE domain masters to common APB peripherals.*/
599     AHBSC3->COMPUTE_APB_PERIPHERAL_ACCESS_ENABLE = 0xffffffff;
600     AHBSC3->SENSE_APB_PERIPHERAL_ACCESS_ENABLE   = 0xffffffff;
601     GlikeyWriteEnable(GLIKEY1, 7U);
602     AHBSC3->COMPUTE_AIPS_PERIPHERAL_ACCESS_ENABLE = 0xffffffff;
603     AHBSC3->SENSE_AIPS_PERIPHERAL_ACCESS_ENABLE   = 0xffffffff;
604 
605     GlikeyWriteEnable(GLIKEY2, 1U);
606     /*Disable secure and secure privilege checking. */
607     AHBSC4->MISC_CTRL_DP_REG = 0x000086aa;
608     AHBSC4->MISC_CTRL_REG    = 0x000086aa;
609 
610 #if defined(MIMXRT798S_cm33_core0_SERIES)
611     GlikeyClearConfig(GLIKEY0);
612 #endif
613     GlikeyClearConfig(GLIKEY1);
614     GlikeyClearConfig(GLIKEY2);
615 }
616 #endif /* MIMXRT798S_cm33_core0_SERIES || MIMXRT798S_cm33_core1_SERIES */
617 
618 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
BOARD_I2C_Init(LPI2C_Type * base,uint32_t clkSrc_Hz)619 void BOARD_I2C_Init(LPI2C_Type *base, uint32_t clkSrc_Hz)
620 {
621     lpi2c_master_config_t i2cConfig = {0};
622 
623     LPI2C_MasterGetDefaultConfig(&i2cConfig);
624     LPI2C_MasterInit(base, &i2cConfig, clkSrc_Hz);
625 }
626 
BOARD_I2C_Send(LPI2C_Type * base,uint8_t deviceAddress,uint32_t subAddress,uint8_t subaddressSize,uint8_t * txBuff,uint8_t txBuffSize)627 status_t BOARD_I2C_Send(LPI2C_Type *base,
628                         uint8_t deviceAddress,
629                         uint32_t subAddress,
630                         uint8_t subaddressSize,
631                         uint8_t *txBuff,
632                         uint8_t txBuffSize)
633 {
634     lpi2c_master_transfer_t masterXfer;
635 
636     /* Prepare transfer structure. */
637     masterXfer.slaveAddress   = deviceAddress;
638     masterXfer.direction      = kLPI2C_Write;
639     masterXfer.subaddress     = subAddress;
640     masterXfer.subaddressSize = subaddressSize;
641     masterXfer.data           = txBuff;
642     masterXfer.dataSize       = txBuffSize;
643     masterXfer.flags          = kLPI2C_TransferDefaultFlag;
644 
645     return LPI2C_MasterTransferBlocking(base, &masterXfer);
646 }
647 
BOARD_I2C_Receive(LPI2C_Type * base,uint8_t deviceAddress,uint32_t subAddress,uint8_t subaddressSize,uint8_t * rxBuff,uint8_t rxBuffSize)648 status_t BOARD_I2C_Receive(LPI2C_Type *base,
649                            uint8_t deviceAddress,
650                            uint32_t subAddress,
651                            uint8_t subaddressSize,
652                            uint8_t *rxBuff,
653                            uint8_t rxBuffSize)
654 {
655     lpi2c_master_transfer_t masterXfer;
656 
657     /* Prepare transfer structure. */
658     masterXfer.slaveAddress   = deviceAddress;
659     masterXfer.subaddress     = subAddress;
660     masterXfer.subaddressSize = subaddressSize;
661     masterXfer.data           = rxBuff;
662     masterXfer.dataSize       = rxBuffSize;
663     masterXfer.direction      = kLPI2C_Read;
664     masterXfer.flags          = kLPI2C_TransferDefaultFlag;
665 
666     return LPI2C_MasterTransferBlocking(base, &masterXfer);
667 }
668 
BOARD_PMIC_I2C_Init(void)669 void BOARD_PMIC_I2C_Init(void)
670 {
671     BOARD_I2C_Init(BOARD_PMIC_I2C_BASEADDR, BOARD_PMIC_I2C_CLOCK_FREQ);
672 }
673 
BOARD_PMIC_I2C_Deinit(void)674 void BOARD_PMIC_I2C_Deinit(void)
675 {
676     LPI2C_MasterDeinit(BOARD_PMIC_I2C_BASEADDR);
677 }
678 
BOARD_PMIC_I2C_Send(uint8_t deviceAddress,uint32_t subAddress,uint8_t subAddressSize,const uint8_t * txBuff,uint8_t txBuffSize)679 status_t BOARD_PMIC_I2C_Send(
680     uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
681 {
682     return BOARD_I2C_Send(BOARD_PMIC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,
683                           txBuffSize);
684 }
685 
BOARD_PMIC_I2C_Receive(uint8_t deviceAddress,uint32_t subAddress,uint8_t subAddressSize,uint8_t * rxBuff,uint8_t rxBuffSize)686 status_t BOARD_PMIC_I2C_Receive(
687     uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
688 {
689     return BOARD_I2C_Receive(BOARD_PMIC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff, rxBuffSize);
690 }
691 
692 #if defined(MIMXRT798S_cm33_core0_SERIES)
BOARD_MIPIPanelTouch_I2C_Init(void)693 void BOARD_MIPIPanelTouch_I2C_Init(void)
694 {
695     CLOCK_AttachClk(kOSC_CLK_to_FCCLK0);
696     CLOCK_AttachClk(kFCCLK0_to_FLEXCOMM8);
697     CLOCK_EnableClock(kCLOCK_LPFlexComm8);
698     BOARD_I2C_Init(BOARD_MIPI_PANEL_TOUCH_I2C_BASEADDR, BOARD_MIPI_PANEL_TOUCH_I2C_CLOCK_FREQ);
699 }
700 
BOARD_MIPIPanelTouch_I2C_Send(uint8_t deviceAddress,uint32_t subAddress,uint8_t subAddressSize,const uint8_t * txBuff,uint8_t txBuffSize)701 status_t BOARD_MIPIPanelTouch_I2C_Send(
702     uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
703 {
704     return BOARD_I2C_Send(BOARD_MIPI_PANEL_TOUCH_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize,
705                           (uint8_t *)txBuff, txBuffSize);
706 }
707 
BOARD_MIPIPanelTouch_I2C_Receive(uint8_t deviceAddress,uint32_t subAddress,uint8_t subAddressSize,uint8_t * rxBuff,uint8_t rxBuffSize)708 status_t BOARD_MIPIPanelTouch_I2C_Receive(
709     uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
710 {
711     return BOARD_I2C_Receive(BOARD_MIPI_PANEL_TOUCH_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff,
712                              rxBuffSize);
713 }
714 #endif
715 #endif
716