1 /*
2 * Copyright 2021-2024 NXP
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8 #include "fsl_common.h"
9 #include "fsl_debug_console.h"
10 #include "board.h"
11 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
12 #include "fsl_lpi2c.h"
13 #endif /* SDK_I2C_BASED_COMPONENT_USED */
14 #if defined(SDK_NETC_USED) && SDK_NETC_USED
15 #include "fsl_netc_soc.h"
16 #include "fsl_netc_ierb.h"
17 #endif /* SDK_NETC_USED */
18 #include "fsl_iomuxc.h"
19 #include "fsl_cache.h"
20 #include "fsl_ele_base_api.h"
21 #include "fsl_dcdc.h"
22
23 /*******************************************************************************
24 * Definitions
25 ******************************************************************************/
26 #define BOARD_FLEXSPI_DLL_LOCK_RETRY (10)
27
28 /*******************************************************************************
29 * Variables
30 ******************************************************************************/
31
32 /*******************************************************************************
33 * Code
34 ******************************************************************************/
35
36 /* Get debug console frequency. */
BOARD_DebugConsoleSrcFreq(void)37 uint32_t BOARD_DebugConsoleSrcFreq(void)
38 {
39 return CLOCK_GetRootClockFreq(BOARD_DEBUG_UART_CLK_ROOT);
40 }
41
42 /* Initialize debug console. */
BOARD_InitDebugConsole(void)43 void BOARD_InitDebugConsole(void)
44 {
45 uint32_t uartClkSrcFreq = BOARD_DebugConsoleSrcFreq();
46 DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE, BOARD_DEBUG_UART_BAUDRATE, BOARD_DEBUG_UART_TYPE, uartClkSrcFreq);
47 }
48
49 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
BOARD_LPI2C_Init(LPI2C_Type * base,uint32_t clkSrc_Hz)50 void BOARD_LPI2C_Init(LPI2C_Type *base, uint32_t clkSrc_Hz)
51 {
52 lpi2c_master_config_t lpi2cConfig = {0};
53
54 /*
55 * lpi2cConfig.debugEnable = false;
56 * lpi2cConfig.ignoreAck = false;
57 * lpi2cConfig.pinConfig = kLPI2C_2PinOpenDrain;
58 * lpi2cConfig.baudRate_Hz = 100000U;
59 * lpi2cConfig.busIdleTimeout_ns = 0;
60 * lpi2cConfig.pinLowTimeout_ns = 0;
61 * lpi2cConfig.sdaGlitchFilterWidth_ns = 0;
62 * lpi2cConfig.sclGlitchFilterWidth_ns = 0;
63 */
64 LPI2C_MasterGetDefaultConfig(&lpi2cConfig);
65 LPI2C_MasterInit(base, &lpi2cConfig, clkSrc_Hz);
66 }
67
BOARD_LPI2C_Send(LPI2C_Type * base,uint8_t deviceAddress,uint32_t subAddress,uint8_t subAddressSize,uint8_t * txBuff,uint8_t txBuffSize)68 status_t BOARD_LPI2C_Send(LPI2C_Type *base,
69 uint8_t deviceAddress,
70 uint32_t subAddress,
71 uint8_t subAddressSize,
72 uint8_t *txBuff,
73 uint8_t txBuffSize)
74 {
75 lpi2c_master_transfer_t xfer;
76
77 xfer.flags = kLPI2C_TransferDefaultFlag;
78 xfer.slaveAddress = deviceAddress;
79 xfer.direction = kLPI2C_Write;
80 xfer.subaddress = subAddress;
81 xfer.subaddressSize = subAddressSize;
82 xfer.data = txBuff;
83 xfer.dataSize = txBuffSize;
84
85 return LPI2C_MasterTransferBlocking(base, &xfer);
86 }
87
BOARD_LPI2C_Receive(LPI2C_Type * base,uint8_t deviceAddress,uint32_t subAddress,uint8_t subAddressSize,uint8_t * rxBuff,uint8_t rxBuffSize)88 status_t BOARD_LPI2C_Receive(LPI2C_Type *base,
89 uint8_t deviceAddress,
90 uint32_t subAddress,
91 uint8_t subAddressSize,
92 uint8_t *rxBuff,
93 uint8_t rxBuffSize)
94 {
95 lpi2c_master_transfer_t xfer;
96
97 xfer.flags = kLPI2C_TransferDefaultFlag;
98 xfer.slaveAddress = deviceAddress;
99 xfer.direction = kLPI2C_Read;
100 xfer.subaddress = subAddress;
101 xfer.subaddressSize = subAddressSize;
102 xfer.data = rxBuff;
103 xfer.dataSize = rxBuffSize;
104
105 return LPI2C_MasterTransferBlocking(base, &xfer);
106 }
107
BOARD_LPI2C_SendSCCB(LPI2C_Type * base,uint8_t deviceAddress,uint32_t subAddress,uint8_t subAddressSize,uint8_t * txBuff,uint8_t txBuffSize)108 status_t BOARD_LPI2C_SendSCCB(LPI2C_Type *base,
109 uint8_t deviceAddress,
110 uint32_t subAddress,
111 uint8_t subAddressSize,
112 uint8_t *txBuff,
113 uint8_t txBuffSize)
114 {
115 lpi2c_master_transfer_t xfer;
116
117 xfer.flags = kLPI2C_TransferDefaultFlag;
118 xfer.slaveAddress = deviceAddress;
119 xfer.direction = kLPI2C_Write;
120 xfer.subaddress = subAddress;
121 xfer.subaddressSize = subAddressSize;
122 xfer.data = txBuff;
123 xfer.dataSize = txBuffSize;
124
125 return LPI2C_MasterTransferBlocking(base, &xfer);
126 }
127
BOARD_LPI2C_ReceiveSCCB(LPI2C_Type * base,uint8_t deviceAddress,uint32_t subAddress,uint8_t subAddressSize,uint8_t * rxBuff,uint8_t rxBuffSize)128 status_t BOARD_LPI2C_ReceiveSCCB(LPI2C_Type *base,
129 uint8_t deviceAddress,
130 uint32_t subAddress,
131 uint8_t subAddressSize,
132 uint8_t *rxBuff,
133 uint8_t rxBuffSize)
134 {
135 status_t status;
136 lpi2c_master_transfer_t xfer;
137
138 xfer.flags = kLPI2C_TransferDefaultFlag;
139 xfer.slaveAddress = deviceAddress;
140 xfer.direction = kLPI2C_Write;
141 xfer.subaddress = subAddress;
142 xfer.subaddressSize = subAddressSize;
143 xfer.data = NULL;
144 xfer.dataSize = 0;
145
146 status = LPI2C_MasterTransferBlocking(base, &xfer);
147
148 if (kStatus_Success == status)
149 {
150 xfer.subaddressSize = 0;
151 xfer.direction = kLPI2C_Read;
152 xfer.data = rxBuff;
153 xfer.dataSize = rxBuffSize;
154
155 status = LPI2C_MasterTransferBlocking(base, &xfer);
156 }
157
158 return status;
159 }
160
BOARD_Accel_I2C_Init(void)161 void BOARD_Accel_I2C_Init(void)
162 {
163 BOARD_LPI2C_Init(BOARD_ACCEL_I2C_BASEADDR, BOARD_ACCEL_I2C_CLOCK_FREQ);
164 }
165
BOARD_Accel_I2C_Send(uint8_t deviceAddress,uint32_t subAddress,uint8_t subaddressSize,uint32_t txBuff)166 status_t BOARD_Accel_I2C_Send(uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint32_t txBuff)
167 {
168 uint8_t data = (uint8_t)txBuff;
169
170 return BOARD_LPI2C_Send(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, &data, 1);
171 }
172
BOARD_Accel_I2C_Receive(uint8_t deviceAddress,uint32_t subAddress,uint8_t subaddressSize,uint8_t * rxBuff,uint8_t rxBuffSize)173 status_t BOARD_Accel_I2C_Receive(
174 uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
175 {
176 return BOARD_LPI2C_Receive(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, rxBuff, rxBuffSize);
177 }
178
BOARD_Codec_I2C_Init(void)179 void BOARD_Codec_I2C_Init(void)
180 {
181 BOARD_LPI2C_Init(BOARD_CODEC_I2C_BASEADDR, BOARD_CODEC_I2C_CLOCK_FREQ);
182 }
183
BOARD_Codec_I2C_Send(uint8_t deviceAddress,uint32_t subAddress,uint8_t subAddressSize,const uint8_t * txBuff,uint8_t txBuffSize)184 status_t BOARD_Codec_I2C_Send(
185 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
186 {
187 return BOARD_LPI2C_Send(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,
188 txBuffSize);
189 }
190
BOARD_Codec_I2C_Receive(uint8_t deviceAddress,uint32_t subAddress,uint8_t subAddressSize,uint8_t * rxBuff,uint8_t rxBuffSize)191 status_t BOARD_Codec_I2C_Receive(
192 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
193 {
194 return BOARD_LPI2C_Receive(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff, rxBuffSize);
195 }
196 #endif /* SDK_I2C_BASED_COMPONENT_USED */
197
198 /* MPU configuration. */
199 #if __CORTEX_M == 7
BOARD_ConfigMPU(void)200 void BOARD_ConfigMPU(void)
201 {
202 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
203 extern uint32_t Image$$RW_m_ncache$$Base[];
204 /* RW_m_ncache_aux is a auxiliary region which is used to get the whole size of noncache section */
205 extern uint32_t Image$$RW_m_ncache_aux$$Base[];
206 uint32_t nonCacheStart = (uint32_t)Image$$RW_m_ncache$$Base;
207 uint32_t nonCacheSize = ((uint32_t)Image$$RW_m_ncache_aux$$Base) - nonCacheStart;
208 #elif defined(__MCUXPRESSO)
209 extern uint32_t __base_NCACHE_REGION;
210 extern uint32_t __top_NCACHE_REGION;
211 uint32_t nonCacheStart = (uint32_t)(&__base_NCACHE_REGION);
212 uint32_t nonCacheSize = (uint32_t)(&__top_NCACHE_REGION) - nonCacheStart;
213 #elif defined(__ICCARM__) || defined(__GNUC__)
214 extern uint32_t __NCACHE_REGION_START[];
215 extern uint32_t __NCACHE_REGION_SIZE[];
216 uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START;
217 uint32_t nonCacheSize = (uint32_t)__NCACHE_REGION_SIZE;
218 #endif
219 #if defined(__USE_SHMEM)
220 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
221 extern uint32_t Image$$RPMSG_SH_MEM$$Base[];
222 /* RPMSG_SH_MEM_aux is a auxiliary region which is used to get the whole size of RPMSG_SH_MEM section */
223 extern uint32_t Image$$RPMSG_SH_MEM_aux$$Base[];
224 uint32_t rpmsgShmemStart = (uint32_t)Image$$RPMSG_SH_MEM$$Base;
225 uint32_t rpmsgShmemSize = ((uint32_t)Image$$RPMSG_SH_MEM_aux$$Base) - rpmsgShmemStart;
226 #elif defined(__MCUXPRESSO)
227 extern uint32_t __base_SHMEM_REGION;
228 extern uint32_t __top_SHMEM_REGION;
229 uint32_t rpmsgShmemStart = (uint32_t)(&__base_SHMEM_REGION);
230 uint32_t rpmsgShmemSize = (uint32_t)(&__top_SHMEM_REGION) - rpmsgShmemStart;
231 #elif defined(__ICCARM__) || defined(__GNUC__)
232 extern uint32_t __RPMSG_SH_MEM_START[];
233 extern uint32_t __RPMSG_SH_MEM_SIZE[];
234 uint32_t rpmsgShmemStart = (uint32_t)__RPMSG_SH_MEM_START;
235 uint32_t rpmsgShmemSize = (uint32_t)__RPMSG_SH_MEM_SIZE;
236 #endif
237 #endif
238 volatile uint32_t i;
239
240 /* Disable I cache and D cache */
241 L1CACHE_DisableICache();
242 L1CACHE_DisableDCache();
243
244 /* Disable MPU */
245 ARM_MPU_Disable();
246
247 /* clang-format off */
248
249 /* MPU configure:
250 * Use ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size)
251 * API in mpu_armv7.h.
252 * param DisableExec Instruction access (XN) disable bit,0=instruction fetches enabled, 1=instruction fetches disabled.
253 * param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode.
254 * Use MACROS defined in mpu_armv7.h:
255 * ARM_MPU_AP_NONE/ARM_MPU_AP_PRIV/ARM_MPU_AP_URO/ARM_MPU_AP_FULL/ARM_MPU_AP_PRO/ARM_MPU_AP_RO
256 *
257 * Combine TypeExtField/IsShareable/IsCacheable/IsBufferable to configure MPU memory access attributes.
258 * TypeExtField IsShareable IsCacheable IsBufferable Memory Attribute Shareability Cache
259 * 0 x 0 0 Strongly Ordered shareable
260 * 0 x 0 1 Device shareable
261 * 0 0 1 0 Normal not shareable Outer and inner write
262 * through no write allocate
263 * 0 0 1 1 Normal not shareable Outer and inner write
264 * back no write allocate
265 * 0 1 1 0 Normal shareable Outer and inner write
266 * through no write allocate
267 * 0 1 1 1 Normal shareable Outer and inner write
268 * back no write allocate
269 * 1 0 0 0 Normal not shareable outer and inner
270 * noncache
271 * 1 1 0 0 Normal shareable outer and inner
272 * noncache
273 * 1 0 1 1 Normal not shareable outer and inner write
274 * back write/read acllocate
275 * 1 1 1 1 Normal shareable outer and inner write
276 * back write/read acllocate
277 * 2 x 0 0 Device not shareable
278 * Above are normal use settings, if your want to see more details or want to config different inner/outer cache
279 * policy, please refer to Table 4-55 /4-56 in arm cortex-M7 generic user guide <dui0646b_cortex_m7_dgug.pdf>
280 *
281 * param SubRegionDisable Sub-region disable field. 0=sub-region is enabled, 1=sub-region is disabled.
282 * param Size Region size of the region to be configured. use ARM_MPU_REGION_SIZE_xxx MACRO in mpu_armv7.h.
283 */
284
285 /* clang-format on */
286
287 /*
288 * Add default region to deny access to whole address space to workaround speculative prefetch.
289 * Refer to Arm errata 1013783-B for more details.
290 */
291
292 /* Region 0 setting: Instruction access disabled, No data access permission. */
293 MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U);
294 MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 0, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB);
295
296 /* Region 1 setting: Memory with Device type, not shareable, non-cacheable. */
297 MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U);
298 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);
299
300 /* Region 3 setting: Memory with Device type, not shareable, non-cacheable. */
301 MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U);
302 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2GB);
303
304 /* Region 4 setting: Memory with Normal type, not shareable, outer/inner write back */ /*ITCM*/
305 MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);
306 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
307
308 /* Region 5 setting: Memory with Normal type, not shareable, outer/inner write back */ /*DTCM*/
309 MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);
310 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
311
312 MPU->RBAR = ARM_MPU_RBAR(6, 0x20480000U);
313 #if defined(CACHE_MODE_WRITE_THROUGH)
314 /* Region 6 setting: Memory with Normal type, not shareable, outer/inner write through */ /*OCRAM1*/
315 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_512KB);
316 #else
317 /* Region 6 setting: Memory with Normal type, not shareable, outer/inner write back */ /*OCRAM1*/
318 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_512KB);
319 #endif
320
321 MPU->RBAR = ARM_MPU_RBAR(7, 0x20500000U);
322 #if defined(CACHE_MODE_WRITE_THROUGH)
323 /* Region 7 setting: Memory with Normal type, not shareable, outer/inner write through */ /*OCRAM2*/
324 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_256KB);
325 #else
326 /* Region 7 setting: Memory with Normal type, not shareable, outer/inner write back */ /*OCRAM2*/
327 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
328 #endif
329
330 #if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1)
331 /* Region 8 setting: Memory with Normal type, not shareable, outer/inner write back. */ /*FSPI1*/
332 MPU->RBAR = ARM_MPU_RBAR(8, 0x28000000U);
333 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_16MB);
334 #endif
335
336 #if defined(USE_HYPERRAM)
337 MPU->RBAR = ARM_MPU_RBAR(9, 0x04000000U);
338 #if defined(CACHE_MODE_WRITE_THROUGH)
339 /* Region 9 setting: Memory with Normal type, not shareable, outer/inner write through. */ /*FSPI2*/
340 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_8MB);
341 #else
342 /* Region 9 setting: Memory with Normal type, not shareable, outer/inner write back. */ /*FSPI2*/
343 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_8MB);
344 #endif
345 #endif
346
347 #if defined(USE_SDRAM)
348 MPU->RBAR = ARM_MPU_RBAR(10, 0x80000000U);
349 #if defined(CACHE_MODE_WRITE_THROUGH)
350 /* Region 10 setting: Memory with Normal type, not shareable, outer/inner write through */
351 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_64MB);
352 #else
353 /* Region 10 setting: Memory with Normal type, not shareable, outer/inner write back */
354 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64MB);
355 #endif
356 #endif
357
358 i = 0;
359 while ((nonCacheSize >> i) > 0x1U)
360 {
361 i++;
362 }
363
364 if (i != 0)
365 {
366 /* The MPU region size should be 2^N, 5<=N<=32, region base should be multiples of size. */
367 assert(!(nonCacheStart % nonCacheSize));
368 assert(nonCacheSize == (uint32_t)(1 << i));
369 assert(i >= 5);
370
371 /* Region 11 setting: Memory with Normal type, not shareable, non-cacheable */
372 MPU->RBAR = ARM_MPU_RBAR(11, nonCacheStart);
373 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, i - 1);
374 }
375
376 #if defined(__USE_SHMEM)
377 i = 0;
378 while ((rpmsgShmemSize >> i) > 0x1U)
379 {
380 i++;
381 }
382
383 if (i != 0)
384 {
385 /* The MPU region size should be 2^N, 5<=N<=32, region base should be multiples of size. */
386 assert(!(rpmsgShmemStart % rpmsgShmemSize));
387 assert(rpmsgShmemSize == (uint32_t)(1 << i));
388 assert(i >= 5);
389
390 /* Region 12 setting: Memory with Normal type, not shareable, non-cacheable */
391 MPU->RBAR = ARM_MPU_RBAR(12, rpmsgShmemStart);
392 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, i - 1);
393 }
394 #endif
395
396 /* Enable MPU */
397 ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);
398
399 /* Enable I cache and D cache */
400 L1CACHE_EnableDCache();
401 L1CACHE_EnableICache();
402 }
403 #elif __CORTEX_M == 33
BOARD_ConfigMPU(void)404 void BOARD_ConfigMPU(void)
405 {
406 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
407 extern uint32_t Image$$RW_m_ncache$$Base[];
408 /* RW_m_ncache_aux is a auxiliary region which is used to get the whole size of noncache section */
409 extern uint32_t Image$$RW_m_ncache_aux$$Base[];
410 uint32_t nonCacheStart = (uint32_t)Image$$RW_m_ncache$$Base;
411 uint32_t nonCacheSize = ((uint32_t)Image$$RW_m_ncache_aux$$Base) - nonCacheStart;
412 #elif defined(__MCUXPRESSO)
413 extern uint32_t __base_NCACHE_REGION;
414 extern uint32_t __top_NCACHE_REGION;
415 uint32_t nonCacheStart = (uint32_t)(&__base_NCACHE_REGION);
416 uint32_t nonCacheSize = (uint32_t)(&__top_NCACHE_REGION) - nonCacheStart;
417 #elif defined(__ICCARM__) || defined(__GNUC__)
418 extern uint32_t __NCACHE_REGION_START[];
419 extern uint32_t __NCACHE_REGION_SIZE[];
420 uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START;
421 uint32_t nonCacheSize = (uint32_t)__NCACHE_REGION_SIZE;
422 #endif
423 #if defined(__USE_SHMEM)
424 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
425 extern uint32_t Image$$RPMSG_SH_MEM$$Base[];
426 /* RPMSG_SH_MEM_aux is a auxiliary region which is used to get the whole size of RPMSG_SH_MEM section */
427 extern uint32_t Image$$RPMSG_SH_MEM_aux$$Base[];
428 uint32_t rpmsgShmemStart = (uint32_t)Image$$RPMSG_SH_MEM$$Base;
429 uint32_t rpmsgShmemSize = (uint32_t)Image$$RPMSG_SH_MEM_aux$$Base - rpmsgShmemStart;
430 #elif defined(__MCUXPRESSO)
431 extern uint32_t __base_SHMEM_REGION;
432 extern uint32_t __top_SHMEM_REGION;
433 uint32_t rpmsgShmemStart = (uint32_t)(&__base_SHMEM_REGION);
434 uint32_t rpmsgShmemSize = (uint32_t)(&__top_SHMEM_REGION) - rpmsgShmemStart;
435 #elif defined(__ICCARM__) || defined(__GNUC__)
436 extern uint32_t __RPMSG_SH_MEM_START[];
437 extern uint32_t __RPMSG_SH_MEM_SIZE[];
438 uint32_t rpmsgShmemStart = (uint32_t)__RPMSG_SH_MEM_START;
439 uint32_t rpmsgShmemSize = (uint32_t)__RPMSG_SH_MEM_SIZE;
440 #endif
441 #endif
442 uint32_t i;
443 uint8_t attr;
444
445 /* Disable code & system cache */
446 XCACHE_DisableCache(XCACHE_PC);
447 XCACHE_DisableCache(XCACHE_PS);
448
449 /* Disable MPU */
450 ARM_MPU_Disable();
451
452 /* Attr0: device. */
453 ARM_MPU_SetMemAttr(0U, ARM_MPU_ATTR(ARM_MPU_ATTR_DEVICE, ARM_MPU_ATTR_DEVICE));
454
455 /* Attr1: non cacheable. */
456 ARM_MPU_SetMemAttr(1U, ARM_MPU_ATTR(ARM_MPU_ATTR_NON_CACHEABLE, ARM_MPU_ATTR_NON_CACHEABLE));
457
458 /* Attr2: non transient, write through, read allocate. */
459 attr = ARM_MPU_ATTR_MEMORY_(0U, 0U, 1U, 0U);
460 ARM_MPU_SetMemAttr(2U, ARM_MPU_ATTR(attr, attr));
461
462 /* Attr3: non transient, write back, read/write allocate. */
463 attr = ARM_MPU_ATTR_MEMORY_(0U, 1U, 1U, 1U);
464 ARM_MPU_SetMemAttr(3U, ARM_MPU_ATTR(attr, attr));
465
466 /* NOTE:
467 * 1. When memory regions overlap, the processor generates a fault if a core access hits the overlapping regions
468 */
469
470 #if defined(USE_HYPERRAM)
471 /*
472 The default attribute of the background system address map for this address space:
473 normal, write through, read allocate, non-shareable, read/write in privilege and non-privilege, executable
474 */
475
476 /* Region 0 (FlexSPI2, Hyperram): [0x04000000, 0x047FFFFFF, 8M] */
477 #if !defined(CACHE_MODE_WRITE_THROUGH)
478 /* non-shareable, read/write in privilege and non-privilege, executable. Attr 3 */
479 ARM_MPU_SetRegion(0U, ARM_MPU_RBAR(0x04000000, ARM_MPU_SH_NON, 0U, 1U, 0U), ARM_MPU_RLAR(0x047FFFFF, 3U));
480 #endif
481 #endif
482
483 /* Region 1 (Code TCM): [0x0FFE0000, 0x0FFFFFFF, 128K] */
484 /* non-shareable, read/write in privilege and non-privilege, executable. Attr 2 */
485 ARM_MPU_SetRegion(1U, ARM_MPU_RBAR(0x0FFE0000, ARM_MPU_SH_NON, 0U, 1U, 0U), ARM_MPU_RLAR(0x0FFFFFFF, 2U));
486
487 /* Region 2 (System TCM): [0x20000000, 0x2001FFFF, 128K] */
488 /* non-shareable, read/write in privilege and non-privilege, executable. Attr 3 */
489 ARM_MPU_SetRegion(2U, ARM_MPU_RBAR(0x20000000, ARM_MPU_SH_NON, 0U, 1U, 0U), ARM_MPU_RLAR(0x2001FFFF, 3U));
490
491 /* Region 3 (CM7 I/D TCM): [0x203C0000, 0x2043FFFF, 512K] */
492 /* non-shareable, read/write in privilege and non-privilege, execute-never. Attr 1 (non cacheable). */
493 ARM_MPU_SetRegion(3U, ARM_MPU_RBAR(0x203C0000, ARM_MPU_SH_NON, 0U, 1U, 1U), ARM_MPU_RLAR(0x2043FFFF, 1U));
494
495 /* Region 4 (CM7 I/D TCM): [0x303C0000, 0x3043FFFF, 512K] */
496 /* non-shareable, read/write in privilege and non-privilege, execute-never. Attr 1 (non cacheable). */
497 ARM_MPU_SetRegion(4U, ARM_MPU_RBAR(0x303C0000, ARM_MPU_SH_NON, 0U, 1U, 1U), ARM_MPU_RLAR(0x3043FFFF, 1U));
498
499 /*
500 As common setting, not set this region to avoid potential overlapping setting with NCACHE(region 8)
501 and SHMEM(region 9) for specific build configuration, but use the default attribute of the background
502 system address map.
503 The default attribute of the background system address map for this address space:
504 normal, write back, write/read allocate, non-shareable, read/write in privilege and non-privilege, executable
505
506 If application needs to fine tune MPU settings, here is an example:
507 // Region 11 (OCRAM1): [0x20480000, 0x204FFFFF, 512K]
508 // non-shareable, read/write in privilege and non-privilege, executable. Attr 3
509 ARM_MPU_SetRegion(11U, ARM_MPU_RBAR(0x20480000, ARM_MPU_SH_NON, 0U, 1U, 0U), ARM_MPU_RLAR(0x204FFFFF, 3U));
510
511 // Region 12 (OCRAM2): [0x20500000, 0x2053FFFF, 256K]
512 // non-shareable, read/write in privilege and non-privilege, executable. Attr 3
513 ARM_MPU_SetRegion(12U, ARM_MPU_RBAR(0x20500000, ARM_MPU_SH_NON, 0U, 1U, 0U), ARM_MPU_RLAR(0x2053FFFF, 3U));
514 */
515
516 /* Region 5 (FlexSPI1, Nor Flash): [0x28000000, 0x28FFFFFF, 16M] */
517 /* non-shareable, read only in privilege and non-privileged, executable. Attr 2 */
518 ARM_MPU_SetRegion(5U, ARM_MPU_RBAR(0x28000000, ARM_MPU_SH_NON, 1U, 1U, 0U), ARM_MPU_RLAR(0x28FFFFFF, 2U));
519
520 /* Region 6 (Peripherals): [0x40000000, 0x7FFFFFFF, 1G ] */
521 /* non-shareable, read/write in privilege and non-privileged, execute-never. Attr 0 (device). */
522 ARM_MPU_SetRegion(6U, ARM_MPU_RBAR(0x40000000, ARM_MPU_SH_NON, 0U, 1U, 1U), ARM_MPU_RLAR(0x7FFFFFFF, 0U));
523
524 #if defined(USE_SDRAM)
525 /*
526 As common setting, not set this region to avoid potential overlapping setting with NCACHE(region 8)
527 and SHMEM(region 9) for specific build configuration, but use the default attribute of the background
528 system address map.
529 The default attribute of the background system address map for this address space:
530 normal, write through, read allocate, non-shareable, read/write in privilege and non-privilege, executable
531
532 If application needs to fine tune MPU settings, here is an example:
533 // Region 7 (SEMC, SDRAM): [0x80000000, 0x81FFFFFF, 32M]
534 // non-shareable, read/write in privilege and non-privilege, executable. Attr 3
535 ARM_MPU_SetRegion(7U, ARM_MPU_RBAR(0x80000000, ARM_MPU_SH_NON, 0U, 1U, 0U), ARM_MPU_RLAR(0x81FFFFFF, 3U));
536 */
537 #endif
538
539 i = 0;
540 while ((nonCacheSize >> i) > 0x1U)
541 {
542 i++;
543 }
544
545 if (i != 0)
546 {
547 /* The MPU region size should be 2^N, 5<=N<=32 */
548 assert(nonCacheSize == (uint32_t)(1 << i));
549 assert(i >= 5);
550
551 /* Region 8: non-shareable, read/write in privilege and non-privilege, executable. Attr 1(non-cacheable) */
552 ARM_MPU_SetRegion(8U, ARM_MPU_RBAR(nonCacheStart, ARM_MPU_SH_NON, 0U, 1U, 0U),
553 ARM_MPU_RLAR(nonCacheStart + nonCacheSize - 1, 1U));
554 }
555
556 #if defined(__USE_SHMEM)
557 i = 0;
558 while ((rpmsgShmemSize >> i) > 0x1U)
559 {
560 i++;
561 }
562
563 if (i != 0)
564 {
565 /* The MPU region size should be 2^N, 5<=N<=32, region base should be multiples of size. */
566 assert(!(rpmsgShmemStart % rpmsgShmemSize));
567 assert(rpmsgShmemSize == (uint32_t)(1 << i));
568 assert(i >= 5);
569
570 /* Region 9: non-shareable, read/write in privilege and non-privilege, executable. Attr 1(non-cacheable) */
571 ARM_MPU_SetRegion(9U, ARM_MPU_RBAR(rpmsgShmemStart, ARM_MPU_SH_NON, 0U, 1U, 0U),
572 ARM_MPU_RLAR(rpmsgShmemStart + rpmsgShmemSize - 1, 1U));
573 }
574 #endif
575
576 #if defined(CACHE_MODE_WRITE_THROUGH)
577 /*
578 * CM33 MPU settings can't overlay, so the common MPU settings for CM33 can't handle the
579 * CACHE_MODE_WRITE_THROUGH, otherwise it may conflict(overlay) with NCACHE and SHMEN.
580 *
581 * Assume the NCACHE/SHMEM region are located in OCRAM.
582 * This is a workaround that disable the cache of OCRAM1 and OCRAM 2, based on current link settings.
583 * It impacts the performance, application may fine tune MPU according to its own linkage.
584 */
585
586 // Region 8 (OCRAM1): [0x20480000, 0x204FFFFF, 512K]
587 // non-shareable, read/write in privilege and non-privilege, executable. Attr 1
588 ARM_MPU_SetRegion(8U, ARM_MPU_RBAR(0x20480000, ARM_MPU_SH_NON, 0U, 1U, 0U), ARM_MPU_RLAR(0x204FFFFF, 1U));
589
590 // Region 9 (OCRAM2): [0x20500000, 0x2053FFFF, 256K]
591 // non-shareable, read/write in privilege and non-privilege, executable. Attr 1
592 ARM_MPU_SetRegion(9U, ARM_MPU_RBAR(0x20500000, ARM_MPU_SH_NON, 0U, 1U, 0U), ARM_MPU_RLAR(0x2053FFFF, 1U));
593 #endif
594
595 /* Enable MPU */
596 ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk);
597
598 /* Enable code & system cache */
599 XCACHE_EnableCache(XCACHE_PS);
600 XCACHE_EnableCache(XCACHE_PC);
601 }
602 #endif
603
BOARD_SD_Pin_Config(uint32_t speed,uint32_t strength)604 void BOARD_SD_Pin_Config(uint32_t speed, uint32_t strength)
605 {
606 }
607
BOARD_MMC_Pin_Config(uint32_t speed,uint32_t strength)608 void BOARD_MMC_Pin_Config(uint32_t speed, uint32_t strength)
609 {
610 }
611
BOARD_DeinitFlash(FLEXSPI_Type * base)612 void BOARD_DeinitFlash(FLEXSPI_Type *base)
613 {
614 #if (__CORTEX_M == 7)
615 if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR))
616 {
617 SCB_DisableICache();
618 }
619 #endif
620
621 #if (__CORTEX_M == 33)
622 if ((XCACHE_PC->CCR & XCACHE_CCR_ENCACHE_MASK) == 1U) /* disabled if enabled */
623 {
624 /* Enable the to push all modified lines. */
625 XCACHE_PC->CCR |= XCACHE_CCR_PUSHW0_MASK | XCACHE_CCR_PUSHW1_MASK | XCACHE_CCR_GO_MASK;
626 /* Wait until the cache command completes. */
627 while ((XCACHE_PC->CCR & XCACHE_CCR_GO_MASK) != 0x00U)
628 {
629 }
630 /* As a precaution clear the bits to avoid inadvertently re-running this command. */
631 XCACHE_PC->CCR &= ~(XCACHE_CCR_PUSHW0_MASK | XCACHE_CCR_PUSHW1_MASK);
632 XCACHE_PC->CCR &= ~XCACHE_CCR_ENCACHE_MASK;
633 __ISB();
634 __DSB();
635 }
636 #endif
637
638 /* Enable FLEXSPI module */
639 base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK;
640
641 /* Wait until FLEXSPI is not busy */
642 while (!((base->STS0 & FLEXSPI_STS0_ARBIDLE_MASK) && (base->STS0 & FLEXSPI_STS0_SEQIDLE_MASK)))
643 {
644 }
645 /* Disable module during the reset procedure */
646 base->MCR0 |= FLEXSPI_MCR0_MDIS_MASK;
647 }
648
BOARD_InitFlash(FLEXSPI_Type * base)649 void BOARD_InitFlash(FLEXSPI_Type *base)
650 {
651 uint32_t status;
652 uint32_t lastStatus;
653 uint32_t retry;
654
655 /* If serial root clock is >= 100 MHz, DLLEN set to 1, OVRDEN set to 0, then SLVDLYTARGET setting of 0x0 is
656 * recommended. */
657 base->DLLCR[0] = 0x1U;
658
659 /* Enable FLEXSPI module */
660 base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK;
661
662 base->MCR0 |= FLEXSPI_MCR0_SWRESET_MASK;
663 while (base->MCR0 & FLEXSPI_MCR0_SWRESET_MASK)
664 {
665 }
666
667 /* Need to wait DLL locked if DLL enabled */
668 if (0U != (base->DLLCR[0] & FLEXSPI_DLLCR_DLLEN_MASK))
669 {
670 lastStatus = base->STS2;
671 retry = BOARD_FLEXSPI_DLL_LOCK_RETRY;
672 /* Wait slave delay line locked and slave reference delay line locked. */
673 do
674 {
675 status = base->STS2;
676 if ((status & (FLEXSPI_STS2_AREFLOCK_MASK | FLEXSPI_STS2_ASLVLOCK_MASK)) ==
677 (FLEXSPI_STS2_AREFLOCK_MASK | FLEXSPI_STS2_ASLVLOCK_MASK))
678 {
679 /* Locked */
680 retry = 100;
681 break;
682 }
683 else if (status == lastStatus)
684 {
685 /* Same delay cell number in calibration */
686 retry--;
687 }
688 else
689 {
690 retry = BOARD_FLEXSPI_DLL_LOCK_RETRY;
691 lastStatus = status;
692 }
693 } while (retry > 0);
694 /* According to ERR011377, need to delay at least 100 NOPs to ensure the DLL is locked. */
695 for (; retry > 0U; retry--)
696 {
697 __NOP();
698 }
699 }
700
701 #if (__CORTEX_M == 7)
702 SCB_EnableICache();
703 #endif
704
705 #if (__CORTEX_M == 33)
706 if ((XCACHE_PC->CCR & XCACHE_CCR_ENCACHE_MASK) == 0U)
707 {
708 /* set command to invalidate all ways and write GO bit to initiate command */
709 XCACHE_PC->CCR = XCACHE_CCR_INVW1_MASK | XCACHE_CCR_INVW0_MASK;
710 XCACHE_PC->CCR |= XCACHE_CCR_GO_MASK;
711 /* Wait until the command completes */
712 while ((XCACHE_PC->CCR & XCACHE_CCR_GO_MASK) != 0U)
713 {
714 }
715 /* Enable cache */
716 XCACHE_PC->CCR = XCACHE_CCR_ENCACHE_MASK;
717 __ISB();
718 __DSB();
719 }
720 #endif
721 }
722
723 /* BOARD_SetFlexspiClock run in RAM used to configure FlexSPI clock source and divider when XIP. */
BOARD_SetFlexspiClock(FLEXSPI_Type * base,uint8_t src,uint32_t divider)724 void BOARD_SetFlexspiClock(FLEXSPI_Type *base, uint8_t src, uint32_t divider)
725 {
726 clock_root_t root;
727 clock_lpcg_t lpcg;
728
729 if (base == FLEXSPI1)
730 {
731 root = kCLOCK_Root_Flexspi1;
732 lpcg = kCLOCK_Flexspi1;
733 }
734 else if (base == FLEXSPI2)
735 {
736 root = kCLOCK_Root_Flexspi2;
737 lpcg = kCLOCK_Flexspi2;
738 }
739 else
740 {
741 return;
742 }
743
744 if (((CCM->CLOCK_ROOT[root].CONTROL & CCM_CLOCK_ROOT_CONTROL_MUX_MASK) != CCM_CLOCK_ROOT_CONTROL_MUX(src)) ||
745 ((CCM->CLOCK_ROOT[root].CONTROL & CCM_CLOCK_ROOT_CONTROL_DIV_MASK) != CCM_CLOCK_ROOT_CONTROL_DIV(divider - 1)))
746 {
747 /* Always deinit FLEXSPI and init FLEXSPI for the flash to make sure the flash works correctly after the
748 FLEXSPI root clock changed as the default FLEXSPI configuration may does not work for the new root clock
749 frequency. */
750 BOARD_DeinitFlash(base);
751
752 /* Disable clock before changing clock source */
753 CCM->LPCG[lpcg].DIRECT &= ~CCM_LPCG_DIRECT_ON_MASK;
754 __DSB();
755 __ISB();
756 while (CCM->LPCG[lpcg].STATUS0 & CCM_LPCG_STATUS0_ON_MASK)
757 {
758 }
759
760 /* Update flexspi clock. */
761 CCM->CLOCK_ROOT[root].CONTROL = CCM_CLOCK_ROOT_CONTROL_MUX(src) | CCM_CLOCK_ROOT_CONTROL_DIV(divider - 1);
762 __DSB();
763 __ISB();
764 (void)CCM->CLOCK_ROOT[root].CONTROL;
765
766 /* Enable FLEXSPI clock again */
767 CCM->LPCG[lpcg].DIRECT |= CCM_LPCG_DIRECT_ON_MASK;
768 __DSB();
769 __ISB();
770 while (!(CCM->LPCG[lpcg].STATUS0 & CCM_LPCG_STATUS0_ON_MASK))
771 {
772 }
773
774 BOARD_InitFlash(base);
775 }
776 }
777
778 /* This function is used to change FlexSPI clock to a stable source before clock sources(Such as PLL and Main clock)
779 * updating in case XIP(execute code on FLEXSPI memory.) */
BOARD_FlexspiClockSafeConfig(void)780 void BOARD_FlexspiClockSafeConfig(void)
781 {
782 /* Move FLEXSPI clock source to OSC_RC_24M to avoid instruction/data fetch issue in XIP when updating PLL. */
783 BOARD_SetFlexspiClock(FLEXSPI1, 0U, 1U);
784 }
785
786 /* This function is used to set EdgeLock clock via safe method */
EdgeLock_SetClock(uint8_t mux,uint8_t div)787 void EdgeLock_SetClock(uint8_t mux, uint8_t div)
788 {
789 if ((CLOCK_GetRootClockDiv(kCLOCK_Root_Edgelock) != (uint32_t)div) ||
790 (CLOCK_GetRootClockMux(kCLOCK_Root_Edgelock) != (uint32_t)mux))
791 {
792 status_t sts;
793 uint32_t ele_clk_mhz;
794
795 clock_root_config_t rootCfg = {
796 .div = div,
797 .mux = mux,
798 .clockOff = false,
799 };
800
801 do
802 {
803 sts = ELE_BaseAPI_ClockChangeStart(MU_RT_S3MUA);
804 } while (sts != kStatus_Success);
805
806 CLOCK_SetRootClock(kCLOCK_Root_Edgelock, &rootCfg);
807
808 ele_clk_mhz = CLOCK_GetRootClockFreq(kCLOCK_Root_Edgelock) / 1000000UL;
809 do
810 {
811 sts = ELE_BaseAPI_ClockChangeFinish(MU_RT_S3MUA, ele_clk_mhz, 0);
812 } while (sts != kStatus_Success);
813 }
814 }
815
816 /* This function is used to set DCDC output voltage via safe method */
DCDC_SetVoltage(uint8_t core,uint8_t targetVoltage)817 void DCDC_SetVoltage(uint8_t core, uint8_t targetVoltage)
818 {
819 /*
820 * When GDET is enabled, it is required to work with special ELE FW, which
821 * support ELE API VOLTAGE_CHANGE_START and VOLTAGE_CHANGE_FINISH, and
822 * DCDC voltage setting must be guarded with VOLTAGE_CHANGE_START and
823 * VOLTAGE_CHANGE_FINISH.
824 *
825 * For those ELE FW or ELE ROM, which doesn't support ELE API VOLTAGE_CHANGE_START
826 * and VOLTAGE_CHANGE_FINISH, there is no side effect to send such API command,
827 * since ELE just responde with ERROR and ingore the API command.
828 */
829 ELE_BaseAPI_VoltageChangeStart(MU_RT_S3MUA);
830
831 DCDC_SetVDD1P0BuckModeTargetVoltage(DCDC, (dcdc_core_slice_t)core, (dcdc_1P0_target_vol_t)targetVoltage);
832
833 ELE_BaseAPI_VoltageChangeFinish(MU_RT_S3MUA);
834 }
835
836 #if defined(SDK_NETC_USED) && SDK_NETC_USED
BOARD_NETC_Init(void)837 void BOARD_NETC_Init(void)
838 {
839 /* EP and Switch port 0 use RMII interface. */
840 NETC_SocSetMiiMode(kNETC_SocLinkEp0, kNETC_RmiiMode);
841 NETC_SocSetMiiMode(kNETC_SocLinkSwitchPort0, kNETC_RmiiMode);
842
843 /* Switch port 1~3 use RGMII interface. */
844 NETC_SocSetMiiMode(kNETC_SocLinkSwitchPort1, kNETC_RgmiiMode);
845 NETC_SocSetMiiMode(kNETC_SocLinkSwitchPort2, kNETC_RgmiiMode);
846 NETC_SocSetMiiMode(kNETC_SocLinkSwitchPort3, kNETC_RgmiiMode);
847
848 /* Output reference clock for RMII interface. */
849 NETC_SocSetRmiiRefClk(kNETC_SocLinkEp0, true);
850 NETC_SocSetRmiiRefClk(kNETC_SocLinkSwitchPort0, true);
851
852 /* Unlock the IERB. It will warm reset whole NETC. */
853 if (NETC_IERBUnlock() == kStatus_Success)
854 {
855 while (!NETC_IERBIsUnlockOver())
856 {
857 }
858 }
859
860 /* Set the access attribute, otherwise MSIX access will be blocked. */
861 NETC_IERB->ARRAY_NUM_RC[0].RCMSIAMQR &= ~(7U << 27);
862 NETC_IERB->ARRAY_NUM_RC[0].RCMSIAMQR |= (1U << 27);
863
864 /* Set PHY address in IERB to use MAC port MDIO, otherwise the access will be blocked. */
865 NETC_SocSetLinkAddr(kNETC_SocLinkEp0, BOARD_EP0_PHY_ADDR);
866 NETC_SocSetLinkAddr(kNETC_SocLinkSwitchPort0, BOARD_SWT_PORT0_PHY_ADDR);
867 NETC_SocSetLinkAddr(kNETC_SocLinkSwitchPort1, BOARD_SWT_PORT1_PHY_ADDR);
868 NETC_SocSetLinkAddr(kNETC_SocLinkSwitchPort2, BOARD_SWT_PORT2_PHY_ADDR);
869 NETC_SocSetLinkAddr(kNETC_SocLinkSwitchPort3, BOARD_SWT_PORT3_PHY_ADDR);
870
871 /* Lock the IERB. */
872 assert(NETC_IERBLock() == kStatus_Success);
873 while (!NETC_IERBIsLockOver())
874 {
875 }
876 }
877 #endif /* SDK_NETC_USED */
878