aboutsummaryrefslogtreecommitdiff
path: root/lib/chibios-contrib/ext/mcux-sdk/devices/MIMXRT1024/project_template/board.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chibios-contrib/ext/mcux-sdk/devices/MIMXRT1024/project_template/board.c')
-rw-r--r--lib/chibios-contrib/ext/mcux-sdk/devices/MIMXRT1024/project_template/board.c309
1 files changed, 309 insertions, 0 deletions
diff --git a/lib/chibios-contrib/ext/mcux-sdk/devices/MIMXRT1024/project_template/board.c b/lib/chibios-contrib/ext/mcux-sdk/devices/MIMXRT1024/project_template/board.c
new file mode 100644
index 000000000..acfa11440
--- /dev/null
+++ b/lib/chibios-contrib/ext/mcux-sdk/devices/MIMXRT1024/project_template/board.c
@@ -0,0 +1,309 @@
1/*
2 * Copyright 2020 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 BOARD_USE_CODEC
15#include "fsl_wm8960.h"
16#endif
17#include "fsl_iomuxc.h"
18
19/*******************************************************************************
20 * Variables
21 ******************************************************************************/
22#if defined BOARD_USE_CODEC
23codec_config_t boardCodecConfig = {.I2C_SendFunc = BOARD_Codec_I2C_Send,
24 .I2C_ReceiveFunc = BOARD_Codec_I2C_Receive,
25 .op.Init = WM8960_Init,
26 .op.Deinit = WM8960_Deinit,
27 .op.SetFormat = WM8960_ConfigDataFormat};
28#endif
29
30/*******************************************************************************
31 * Code
32 ******************************************************************************/
33
34/* Get debug console frequency. */
35uint32_t BOARD_DebugConsoleSrcFreq(void)
36{
37 uint32_t freq;
38
39 /* To make it simple, we assume default PLL and divider settings, and the only variable
40 from application is use PLL3 source or OSC source */
41 if (CLOCK_GetMux(kCLOCK_UartMux) == 0) /* PLL3 div6 80M */
42 {
43 freq = (CLOCK_GetPllFreq(kCLOCK_PllUsb1) / 6U) / (CLOCK_GetDiv(kCLOCK_UartDiv) + 1U);
44 }
45 else
46 {
47 freq = CLOCK_GetOscFreq() / (CLOCK_GetDiv(kCLOCK_UartDiv) + 1U);
48 }
49
50 return freq;
51}
52
53/* Initialize debug console. */
54void BOARD_InitDebugConsole(void)
55{
56 uint32_t uartClkSrcFreq = BOARD_DebugConsoleSrcFreq();
57
58 DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE, BOARD_DEBUG_UART_BAUDRATE, BOARD_DEBUG_UART_TYPE, uartClkSrcFreq);
59}
60
61void BOARD_SD_Pin_Config(uint32_t speed, uint32_t strength)
62{
63 IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_02_USDHC1_CMD,
64 IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
65 IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
66 IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
67 IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
68 IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_03_USDHC1_CLK,
69 IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
70 IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
71 IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
72 IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_04_USDHC1_DATA0,
73 IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
74 IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
75 IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
76 IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
77 IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_05_USDHC1_DATA1,
78 IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
79 IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
80 IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
81 IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
82 IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_00_USDHC1_DATA2,
83 IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
84 IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
85 IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
86 IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
87 IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_01_USDHC1_DATA3,
88 IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
89 IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
90 IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
91 IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
92}
93
94void BOARD_MMC_Pin_Config(uint32_t speed, uint32_t strength)
95{
96}
97
98/* MPU configuration. */
99void BOARD_ConfigMPU(void)
100{
101 /* Disable I cache and D cache */
102 if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR))
103 {
104 SCB_DisableICache();
105 }
106 if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR))
107 {
108 SCB_DisableDCache();
109 }
110
111 /* Disable MPU */
112 ARM_MPU_Disable();
113
114 /* Region 0 setting */
115 MPU->RBAR = ARM_MPU_RBAR(0, 0xC0000000U);
116 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);
117
118 /* Region 1 setting */
119 MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U);
120 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
121
122/* Region 2 setting */
123#if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1)
124 MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
125 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_8MB);
126#else
127 MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
128 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_8MB);
129#endif
130
131 /* Region 3 setting */
132 MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U);
133 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
134
135 /* Region 4 setting */
136 MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);
137 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64KB);
138
139 /* Region 5 setting */
140 MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);
141 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64KB);
142
143 /* Region 6 setting */
144 MPU->RBAR = ARM_MPU_RBAR(6, 0x20200000U);
145 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
146
147/* The define sets the cacheable memory to shareable,
148 * this suggestion is referred from chapter 2.2.1 Memory regions,
149 * types and attributes in Cortex-M7 Devices, Generic User Guide */
150#if defined(SDRAM_IS_SHAREABLE)
151 /* Region 7 setting, set whole SDRAM can be accessed by cache */
152 MPU->RBAR = ARM_MPU_RBAR(7, 0x80000000U);
153 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, 1, 1, 0, ARM_MPU_REGION_SIZE_32MB);
154#else
155 /* Region 7 setting, set whole SDRAM can be accessed by cache */
156 MPU->RBAR = ARM_MPU_RBAR(7, 0x80000000U);
157 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_32MB);
158#endif
159
160 /* Region 8 setting, set last 2MB of SDRAM can't be accessed by cache, glocal variables which are not expected to be
161 * accessed by cache can be put here */
162 MPU->RBAR = ARM_MPU_RBAR(8, 0x81E00000U);
163 MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB);
164
165 /* Enable MPU */
166 ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk);
167
168 /* Enable I cache and D cache */
169 SCB_EnableDCache();
170 SCB_EnableICache();
171}
172
173#if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
174void BOARD_LPI2C_Init(LPI2C_Type *base, uint32_t clkSrc_Hz)
175{
176 lpi2c_master_config_t lpi2cConfig = {0};
177
178 /*
179 * lpi2cConfig.debugEnable = false;
180 * lpi2cConfig.ignoreAck = false;
181 * lpi2cConfig.pinConfig = kLPI2C_2PinOpenDrain;
182 * lpi2cConfig.baudRate_Hz = 100000U;
183 * lpi2cConfig.busIdleTimeout_ns = 0;
184 * lpi2cConfig.pinLowTimeout_ns = 0;
185 * lpi2cConfig.sdaGlitchFilterWidth_ns = 0;
186 * lpi2cConfig.sclGlitchFilterWidth_ns = 0;
187 */
188 LPI2C_MasterGetDefaultConfig(&lpi2cConfig);
189 LPI2C_MasterInit(base, &lpi2cConfig, clkSrc_Hz);
190}
191
192status_t BOARD_LPI2C_Send(LPI2C_Type *base,
193 uint8_t deviceAddress,
194 uint32_t subAddress,
195 uint8_t subAddressSize,
196 uint8_t *txBuff,
197 uint8_t txBuffSize)
198{
199 status_t reVal;
200
201 /* Send master blocking data to slave */
202 reVal = LPI2C_MasterStart(base, deviceAddress, kLPI2C_Write);
203 if (kStatus_Success == reVal)
204 {
205 while (LPI2C_MasterGetStatusFlags(base) & kLPI2C_MasterNackDetectFlag)
206 {
207 }
208
209 reVal = LPI2C_MasterSend(base, &subAddress, subAddressSize);
210 if (reVal != kStatus_Success)
211 {
212 return reVal;
213 }
214
215 reVal = LPI2C_MasterSend(base, txBuff, txBuffSize);
216 if (reVal != kStatus_Success)
217 {
218 return reVal;
219 }
220
221 reVal = LPI2C_MasterStop(base);
222 if (reVal != kStatus_Success)
223 {
224 return reVal;
225 }
226 }
227
228 return reVal;
229}
230
231status_t BOARD_LPI2C_Receive(LPI2C_Type *base,
232 uint8_t deviceAddress,
233 uint32_t subAddress,
234 uint8_t subAddressSize,
235 uint8_t *rxBuff,
236 uint8_t rxBuffSize)
237{
238 status_t reVal;
239
240 reVal = LPI2C_MasterStart(base, deviceAddress, kLPI2C_Write);
241 if (kStatus_Success == reVal)
242 {
243 while (LPI2C_MasterGetStatusFlags(base) & kLPI2C_MasterNackDetectFlag)
244 {
245 }
246
247 reVal = LPI2C_MasterSend(base, &subAddress, subAddressSize);
248 if (reVal != kStatus_Success)
249 {
250 return reVal;
251 }
252
253 reVal = LPI2C_MasterRepeatedStart(base, deviceAddress, kLPI2C_Read);
254 if (reVal != kStatus_Success)
255 {
256 return reVal;
257 }
258
259 reVal = LPI2C_MasterReceive(base, rxBuff, rxBuffSize);
260 if (reVal != kStatus_Success)
261 {
262 return reVal;
263 }
264
265 reVal = LPI2C_MasterStop(base);
266 if (reVal != kStatus_Success)
267 {
268 return reVal;
269 }
270 }
271 return reVal;
272}
273
274void BOARD_Accel_I2C_Init(void)
275{
276 BOARD_LPI2C_Init(BOARD_ACCEL_I2C_BASEADDR, BOARD_ACCEL_I2C_CLOCK_FREQ);
277}
278
279status_t BOARD_Accel_I2C_Send(uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint32_t txBuff)
280{
281 uint8_t data = (uint8_t)txBuff;
282
283 return BOARD_LPI2C_Send(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, &data, 1);
284}
285
286status_t BOARD_Accel_I2C_Receive(
287 uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
288{
289 return BOARD_LPI2C_Receive(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, rxBuff, rxBuffSize);
290}
291
292void BOARD_Codec_I2C_Init(void)
293{
294 BOARD_LPI2C_Init(BOARD_CODEC_I2C_BASEADDR, BOARD_CODEC_I2C_CLOCK_FREQ);
295}
296
297status_t BOARD_Codec_I2C_Send(
298 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
299{
300 return BOARD_LPI2C_Send(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,
301 txBuffSize);
302}
303
304status_t BOARD_Codec_I2C_Receive(
305 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
306{
307 return BOARD_LPI2C_Receive(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff, rxBuffSize);
308}
309#endif /* SDK_I2C_BASED_COMPONENT_USED */