1 /*
2  * Copyright 2018-2019, 2023 NXP
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef _BOARD_H_
8 #define _BOARD_H_
9 
10 #include "clock_config.h"
11 #include "fsl_common.h"
12 #include "fsl_reset.h"
13 #include "fsl_gpio.h"
14 
15 /*******************************************************************************
16  * Definitions
17  ******************************************************************************/
18 /*! @brief The board name */
19 #define BOARD_NAME      "MIMXRT685-EVK"
20 #define BOARD_I3C_CODEC (1)
21 
22 /*! @brief The UART to use for debug messages. */
23 #define BOARD_DEBUG_UART_TYPE     kSerialPort_Uart
24 #define BOARD_DEBUG_UART_BASEADDR (uint32_t) USART0
25 #define BOARD_DEBUG_UART_INSTANCE 0U
26 #define BOARD_DEBUG_UART_CLK_FREQ CLOCK_GetFlexCommClkFreq(0U)
27 #define BOARD_DEBUG_UART_FRG_CLK \
28     (&(const clock_frg_clk_config_t){0, kCLOCK_FrgPllDiv, 255, 0}) /*!< Select FRG0 mux as frg_pll */
29 #define BOARD_DEBUG_UART_CLK_ATTACH kFRG_to_FLEXCOMM0
30 #define BOARD_DEBUG_UART_RST        kFC0_RST_SHIFT_RSTn
31 #define BOARD_DEBUG_UART_CLKSRC     kCLOCK_Flexcomm0
32 #define BOARD_UART_IRQ_HANDLER      FLEXCOMM0_IRQHandler
33 #define BOARD_UART_IRQ              FLEXCOMM0_IRQn
34 
35 #ifndef BOARD_DEBUG_UART_BAUDRATE
36 #define BOARD_DEBUG_UART_BAUDRATE 115200
37 #endif /* BOARD_DEBUG_UART_BAUDRATE */
38 
39 #define BOARD_FLEXSPI_PSRAM FLEXSPI
40 #ifndef BOARD_ENABLE_PSRAM_CACHE
41 #define BOARD_ENABLE_PSRAM_CACHE 1
42 #endif
43 
44 #if BOARD_I3C_CODEC && (defined(SDK_I3C_BASED_COMPONENT_USED) && SDK_I3C_BASED_COMPONENT_USED)
45 #define BOARD_CODEC_I2C_BASEADDR   I3C
46 #define BOARD_CODEC_I2C_CLOCK_FREQ CLOCK_GetI3cClkFreq()
47 #define BOARD_CODEC_I2C_INSTANCE   0
48 #else
49 #define BOARD_CODEC_I2C_BASEADDR   I2C4
50 #define BOARD_CODEC_I2C_CLOCK_FREQ CLOCK_GetFlexCommClkFreq(4U)
51 #define BOARD_CODEC_I2C_INSTANCE   4
52 #endif
53 
54 #define BOARD_PMIC_I2C_BASEADDR   I2C15
55 #define BOARD_PMIC_I2C_CLOCK_FREQ CLOCK_GetFlexCommClkFreq(15U)
56 
57 #define BOARD_ACCEL_I2C_BASEADDR   I2C2
58 #define BOARD_ACCEL_I2C_ADDR       0x1E
59 #define BOARD_ACCEL_I2C_CLOCK_FREQ CLOCK_GetFlexCommClkFreq(2U)
60 
61 /* Board led color mapping */
62 #define LOGIC_LED_ON  1U
63 #define LOGIC_LED_OFF 0U
64 
65 #ifndef BOARD_LED_RED_GPIO
66 #define BOARD_LED_RED_GPIO GPIO
67 #endif
68 #define BOARD_LED_RED_GPIO_PORT 0U
69 #ifndef BOARD_LED_RED_GPIO_PIN
70 #define BOARD_LED_RED_GPIO_PIN 31U
71 #endif
72 
73 #ifndef BOARD_LED_GREEN_GPIO
74 #define BOARD_LED_GREEN_GPIO GPIO
75 #endif
76 #define BOARD_LED_GREEN_GPIO_PORT 0U
77 #ifndef BOARD_LED_GREEN_GPIO_PIN
78 #define BOARD_LED_GREEN_GPIO_PIN 14U
79 #endif
80 #ifndef BOARD_LED_BLUE_GPIO
81 #define BOARD_LED_BLUE_GPIO GPIO
82 #endif
83 #define BOARD_LED_BLUE_GPIO_PORT 0U
84 #ifndef BOARD_LED_BLUE_GPIO_PIN
85 #define BOARD_LED_BLUE_GPIO_PIN 26U
86 #endif
87 
88 #ifndef BOARD_FLASH_RESET_GPIO
89 #define BOARD_FLASH_RESET_GPIO GPIO
90 #endif
91 #ifndef BOARD_FLASH_RESET_GPIO_PORT
92 #define BOARD_FLASH_RESET_GPIO_PORT 2U
93 #endif
94 #ifndef BOARD_FLASH_RESET_GPIO_PIN
95 #define BOARD_FLASH_RESET_GPIO_PIN 12U
96 #endif
97 
98 /* Board microphone defines */
99 #ifndef BOARD_DMIC_NUM
100 #define BOARD_DMIC_NUM 2
101 #endif
102 
103 #define LED_RED_INIT(output)                                                          \
104     GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \
105                  &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}) /*!< Enable target LED_RED */
106 #define LED_RED_ON()                                          \
107     GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \
108                  1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */
109 #define LED_RED_OFF()                                           \
110     GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \
111                    1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */
112 #define LED_RED_TOGGLE()                                         \
113     GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \
114                     1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */
115 
116 #define LED_GREEN_INIT(output)                                                              \
117     GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \
118                  &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}) /*!< Enable target LED_GREEN */
119 #define LED_GREEN_ON()                                            \
120     GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \
121                  1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */
122 #define LED_GREEN_OFF()                                             \
123     GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \
124                    1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */
125 #define LED_GREEN_TOGGLE()                                           \
126     GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \
127                     1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */
128 
129 #define LED_BLUE_INIT(output)                                                            \
130     GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \
131                  &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}) /*!< Enable target LED_BLUE */
132 #define LED_BLUE_ON()                                           \
133     GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \
134                  1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */
135 #define LED_BLUE_OFF()                                            \
136     GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \
137                    1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */
138 #define LED_BLUE_TOGGLE()                                          \
139     GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \
140                     1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */
141 
142 /* Board SW PIN */
143 #ifndef BOARD_SW1_GPIO
144 #define BOARD_SW1_GPIO GPIO
145 #endif
146 #define BOARD_SW1_GPIO_PORT 1U
147 #ifndef BOARD_SW1_GPIO_PIN
148 #define BOARD_SW1_GPIO_PIN 1U
149 #endif
150 
151 #ifndef BOARD_SW2_GPIO
152 #define BOARD_SW2_GPIO GPIO
153 #endif
154 #define BOARD_SW2_GPIO_PORT 0U
155 #ifndef BOARD_SW2_GPIO_PIN
156 #define BOARD_SW2_GPIO_PIN 10U
157 #endif
158 
159 /* USDHC configuration */
160 #define BOARD_SD_SUPPORT_180V          (1)
161 #define BOARD_USDHC_CD_GPIO_BASE       GPIO
162 #define BOARD_USDHC_CD_GPIO_PORT       (2)
163 #define BOARD_USDHC_CD_GPIO_PIN        (9)
164 #define BOARD_SD_POWER_RESET_GPIO      (GPIO)
165 #define BOARD_SD_POWER_RESET_GPIO_PORT (2)
166 #define BOARD_SD_POWER_RESET_GPIO_PIN  (10)
167 
168 /* Card detect handled by uSDHC, no GPIO interrupt */
169 #define BOARD_SD_DETECT_TYPE              kSDMMCHOST_DetectCardByHostCD
170 #define BOARD_USDHC_CD_PORT_IRQ           USDHC0_IRQn
171 #define BOARD_USDHC_CD_STATUS()           0
172 #define BOARD_USDHC_CD_INTERRUPT_STATUS() 0
173 #define BOARD_USDHC_CD_CLEAR_INTERRUPT(flag)
174 #define BOARD_USDHC_CD_GPIO_INIT()
175 
176 #define BOARD_HAS_SDCARD                 (1U)
177 #define BOARD_USDHC_CARD_INSERT_CD_LEVEL (0U)
178 
179 #define BOARD_USDHC_MMCCARD_POWER_CONTROL_INIT()
180 #define BOARD_USDHC_MMCCARD_POWER_CONTROL(state)
181 #define BOARD_USDHC_SDCARD_POWER_CONTROL_INIT()                                                                \
182     {                                                                                                          \
183         GPIO_PortInit(BOARD_SD_POWER_RESET_GPIO, BOARD_SD_POWER_RESET_GPIO_PORT);                              \
184         GPIO_PinInit(BOARD_SD_POWER_RESET_GPIO, BOARD_SD_POWER_RESET_GPIO_PORT, BOARD_SD_POWER_RESET_GPIO_PIN, \
185                      &(gpio_pin_config_t){kGPIO_DigitalOutput, 0});                                            \
186     }
187 
188 #define BOARD_MMC_SUPPORT_8BIT_BUS 0
189 
190 #define BOARD_USDHC_SDCARD_POWER_CONTROL(state)                                                                        \
191     (state ?                                                                                                           \
192          GPIO_PortSet(BOARD_SD_POWER_RESET_GPIO, BOARD_SD_POWER_RESET_GPIO_PORT, 1 << BOARD_SD_POWER_RESET_GPIO_PIN) : \
193          GPIO_PortClear(BOARD_SD_POWER_RESET_GPIO, BOARD_SD_POWER_RESET_GPIO_PORT,                                     \
194                         1 << BOARD_SD_POWER_RESET_GPIO_PIN))
195 
196 #define BOARD_USDHC0_BASEADDR USDHC0
197 
198 #define BOARD_USDHC0_CLK_FREQ CLOCK_GetSdioClkFreq(0)
199 
200 #define BOARD_USDHC_SWITCH_VOLTAGE_FUNCTION 1U
201 
202 #define BOARD_SD_HOST_BASEADDR BOARD_USDHC0_BASEADDR
203 #define BOARD_SD_HOST_CLK_FREQ BOARD_USDHC0_CLK_FREQ
204 #define BOARD_SD_HOST_IRQ      USDHC0_IRQn
205 
206 #define BOARD_SD_Pin_Config(speed, strength)
207 
208 /* USB PHY condfiguration */
209 #define BOARD_USB_PHY_D_CAL     (0x0CU)
210 #define BOARD_USB_PHY_TXCAL45DP (0x06U)
211 #define BOARD_USB_PHY_TXCAL45DM (0x06U)
212 
213 #define BOARD_FLASH_SIZE (0x4000000U)
214 
215 /* Display. */
216 #define BOARD_LCD_DC_GPIO      GPIO
217 #define BOARD_LCD_DC_GPIO_PORT 1U
218 #define BOARD_LCD_DC_GPIO_PIN  7U
219 
220 #define BOARD_BT_UART_INSTANCE 4
221 #define BOARD_BT_UART_BAUDRATE 3000000
222 #define BOARD_BT_UART_CLK_FREQ CLOCK_GetFlexCommClkFreq(4U)
223 #define BOARD_BT_UART_FRG_CLK \
224     (&(const clock_frg_clk_config_t){4, kCLOCK_FrgPllDiv, 255, 4}) /*!< Select FRG0 mux as frg_pll */
225 #define BOARD_BT_UART_CLK_ATTACH  kFRG_to_FLEXCOMM4
226 #define BOARD_BT_UART_RST         kFC4_RST_SHIFT_RSTn
227 #define BOARD_BT_UART_IRQ         FLEXCOMM4_IRQn
228 #define BOARD_BT_UART_IRQ_HANDLER FLEXCOMM4_IRQHandler
229 #define BOARD_BT_UART_CLKSRC      kCLOCK_Flexcomm4
230 
231 /* ERPC SPI configuration */
232 #define ERPC_BOARD_SPI_SLAVE_READY_USE_GPIO (1)
233 #define ERPC_BOARD_SPI_BASEADDR             SPI14_BASE
234 #define ERPC_BOARD_SPI_BAUDRATE             500000U
235 #define ERPC_BOARD_SPI_CLKSRC               kCLOCK_Flexcomm14
236 #define ERPC_BOARD_SPI_CLK_FREQ             CLOCK_GetFlexCommClkFreq(14)
237 #define ERPC_BOARD_SPI_INT_GPIO             GPIO
238 #define ERPC_BOARD_SPI_INT_PORT             1U
239 #define ERPC_BOARD_SPI_INT_PIN              16U
240 #define ERPC_BOARD_SPI_INT_PIN_IRQ          PIN_INT1_IRQn
241 #define ERPC_BOARD_SPI_INT_PIN_IRQ_HANDLER  PIN_INT1_IRQHandler
242 #define ERPC_BOARD_SPI_INT_GPIO_LPC         (1)
243 
244 /* ERPC I2C configuration */
245 #define ERPC_BOARD_I2C_BASEADDR            I2C2_BASE
246 #define ERPC_BOARD_I2C_BAUDRATE            100000U
247 #define ERPC_BOARD_I2C_CLKSRC              kCLOCK_Flexcomm2
248 #define ERPC_BOARD_I2C_CLK_FREQ            CLOCK_GetFlexCommClkFreq(2)
249 #define ERPC_BOARD_I2C_INT_GPIO            GPIO
250 #define ERPC_BOARD_I2C_INT_PORT            1U
251 #define ERPC_BOARD_I2C_INT_PIN             16U
252 #define ERPC_BOARD_I2C_INT_PIN_IRQ         PIN_INT1_IRQn
253 #define ERPC_BOARD_I2C_INT_PIN_IRQ_HANDLER PIN_INT1_IRQHandler
254 
255 #if defined(__cplusplus)
256 extern "C" {
257 #endif /* __cplusplus */
258 
259 /*******************************************************************************
260  * API
261  ******************************************************************************/
262 
263 void BOARD_InitDebugConsole(void);
264 status_t BOARD_InitPsRam(void);
265 void BOARD_FlexspiClockSafeConfig(void);
266 AT_QUICKACCESS_SECTION_CODE(void BOARD_SetFlexspiClock(uint32_t src, uint32_t divider));
267 AT_QUICKACCESS_SECTION_CODE(void BOARD_DeinitXip(FLEXSPI_Type *base));
268 AT_QUICKACCESS_SECTION_CODE(void BOARD_InitXip(FLEXSPI_Type *base));
269 AT_QUICKACCESS_SECTION_CODE(void BOARD_SetDeepSleepPinConfig(void));
270 AT_QUICKACCESS_SECTION_CODE(void BOARD_RestoreDeepSleepPinConfig(void));
271 AT_QUICKACCESS_SECTION_CODE(void BOARD_EnterDeepSleep(const uint32_t exclude_from_pd[4]));
272 AT_QUICKACCESS_SECTION_CODE(void BOARD_EnterDeepPowerDown(const uint32_t exclude_from_pd[4]));
273 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
274 void BOARD_I2C_Init(I2C_Type *base, uint32_t clkSrc_Hz);
275 status_t BOARD_I2C_Send(I2C_Type *base,
276                         uint8_t deviceAddress,
277                         uint32_t subAddress,
278                         uint8_t subaddressSize,
279                         uint8_t *txBuff,
280                         uint8_t txBuffSize);
281 status_t BOARD_I2C_Receive(I2C_Type *base,
282                            uint8_t deviceAddress,
283                            uint32_t subAddress,
284                            uint8_t subaddressSize,
285                            uint8_t *rxBuff,
286                            uint8_t rxBuffSize);
287 #endif
288 #if defined(SDK_I3C_BASED_COMPONENT_USED) && SDK_I3C_BASED_COMPONENT_USED
289 void BOARD_I3C_Init(I3C_Type *base, uint32_t clkSrc_Hz);
290 status_t BOARD_I3C_Send(I3C_Type *base,
291                         uint8_t deviceAddress,
292                         uint32_t subAddress,
293                         uint8_t subaddressSize,
294                         uint8_t *txBuff,
295                         uint8_t txBuffSize);
296 status_t BOARD_I3C_Receive(I3C_Type *base,
297                            uint8_t deviceAddress,
298                            uint32_t subAddress,
299                            uint8_t subaddressSize,
300                            uint8_t *rxBuff,
301                            uint8_t rxBuffSize);
302 #endif
303 #if defined BOARD_USE_CODEC
304 void BOARD_Codec_I2C_Init(void);
305 status_t BOARD_Codec_I2C_Send(
306     uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize);
307 status_t BOARD_Codec_I2C_Receive(
308     uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
309 #endif
310 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
311 void BOARD_PMIC_I2C_Init(void);
312 status_t BOARD_PMIC_I2C_Send(
313     uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize);
314 status_t BOARD_PMIC_I2C_Receive(
315     uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
316 
317 void BOARD_Accel_I2C_Init(void);
318 status_t BOARD_Accel_I2C_Send(uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint32_t txBuff);
319 status_t BOARD_Accel_I2C_Receive(
320     uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
321 
322 #endif /* SDK_I2C_BASED_COMPONENT_USED */
323 #if defined(__cplusplus)
324 }
325 #endif /* __cplusplus */
326 
327 #endif /* _BOARD_H_ */
328