1 /*
2 * Copyright 2017-2020 NXP
3 * All rights reserved.
4 *
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9 #ifndef _BOARD_H_
10 #define _BOARD_H_
11
12 #include "clock_config.h"
13
14 /* SCFW includes */
15 #include "main/rpc.h"
16 #include "svc/pm/pm_api.h"
17
18 #include "main/imx8qx_pads.h"
19 #include "svc/pad/pad_api.h"
20
21 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
22 #include "fsl_lpi2c.h"
23 #endif
24
25 /*******************************************************************************
26 * Definitions
27 ******************************************************************************/
28 /*! @brief The board name */
29 #define BOARD_NAME "MEKMIMX8QX6"
30
31 /* The UART to use for debug messages. */
32 #define BOARD_DEBUG_UART_TYPE kSerialPort_Uart
33 #define BOARD_DEBUG_UART_BAUDRATE 115200u
34 #define BOARD_DEBUG_UART_BASEADDR (uint32_t) CM4__LPUART
35 #define BOARD_DEBUG_UART_INSTANCE 4U
36 #define BOARD_DEBUG_UART_SC_RSRC SC_R_M4_0_UART
37 #define BOARD_DEBUG_UART_CLK_FREQ 6000000u
38 #define BOARD_UART_IRQ M4_LPUART_IRQn
39 #define BOARD_UART_IRQ_HANDLER LPUART0_IRQHandler
40 #define BOARD_DEBUG_UART_CLKSRC kCLOCK_M4_0_Lpuart
41 #define BOARD_M4_CPU_RSRC SC_R_M4_0_PID0
42 #define BOARD_BASEBOARD_PWR_GPIO LSIO_GPIO5
43 #define BOARD_BASEBOARD_PWR_GPIO_PIN 9U
44
45 #define BOARD_ENET0_PHY_ADDRESS (0x00)
46
47 /* DISPLAY 0: MIPI DSI0. */
48 #define BOARD_DISPLAY0_I2C_BASEADDR DI_MIPI_DSI_LVDS_0__LPI2C0
49
50 /* DISPLAY 1: MIPI DSI1. */
51 #define BOARD_DISPLAY1_I2C_BASEADDR DI_MIPI_DSI_LVDS_1__LPI2C0
52
53 /* CAMERA 0: MIPI CSI */
54 #define BOARD_CAMERA0_I2C_BASEADDR MIPI_CSI__LPI2C
55 #define BOARD_CAMERA0_I2C_RSRC SC_R_CSI_0_I2C_0
56
57 /* CAMERA 1: CI_PI */
58 #define BOARD_CAMERA1_I2C_BASEADDR CM4__LPI2C
59 #define BOARD_CAMERA1_I2C_RSRC SC_R_M4_0_I2C
60
61 #define BOARD_CODEC_I2C_BASEADDR CM4__LPI2C
62 #define BOARD_CODEC_I2C_CLOCK_FREQ CLOCK_GetIpFreq(kCLOCK_M4_0_Lpi2c)
63 #define BOARD_CODEC_I2C_INSTANCE (5U)
64
65 /*
66 * Handling of IRQ from SCFW
67 */
68 #define IPC_MU CM4__MU1_A
69 #define IPC_MU_IRQn M4_MU1_A_IRQn
70 #define IPC_MU_RSRC SC_R_M4_0_MU_1A
71 #define SC_RPC_MU_INTERRUPT_PRIORITY (configLIBRARY_LOWEST_INTERRUPT_PRIORITY - 1U)
72 #define BOARD_MU_IRQHandler M4_MU1_A_IRQHandler
73
74 #define VDEV0_VRING_BASE (0x90000000U)
75 #define VDEV1_VRING_BASE (0x90010000U)
76 #define RESOURCE_TABLE_OFFSET (0xFF000)
77
78 #ifdef BOARD_USE_SCFW_IRQ
79 /*
80 * MU IRQ Enable Mask
81 */
82 #define SC_EVENT_MASK(event) (1 << event)
83 #endif
84
85 #if defined(__cplusplus)
86 extern "C" {
87 #endif /* __cplusplus */
88
89 /*******************************************************************************
90 * Typedef
91 ******************************************************************************/
92 #ifdef BOARD_USE_SCFW_IRQ
93 typedef enum _sc_event_type
94 {
95 kSCEvent_PeerCoreReboot,
96 kSCEvent_Button,
97 kSCEvent_Pad,
98 kSCEvent_SysCtr,
99 kSCEvent_Last,
100 } sc_event_type_t;
101 #endif
102
103 /*******************************************************************************
104 * Function prototype
105 ******************************************************************************/
106 #ifdef BOARD_USE_SCFW_IRQ
107 typedef void (*eventHandler)(void *param);
108 #endif
109
110 /*******************************************************************************
111 * API
112 ******************************************************************************/
113 sc_ipc_t BOARD_InitRpc(void);
114 sc_ipc_t BOARD_GetRpcHandle(void);
115 void BOARD_InitDebugConsole(void);
116 void BOARD_InitPinsPre(void);
117 void BOARD_PowerOnBaseBoard(void);
118 void BOARD_InitMemory(void);
119
120 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
121 void BOARD_LPI2C_Init(LPI2C_Type *base, uint32_t clkSrc_Hz);
122 status_t BOARD_LPI2C_Send(LPI2C_Type *base,
123 const uint8_t dev_addr,
124 uint32_t subAddress,
125 uint32_t subAddressSize,
126 uint8_t *txBuff,
127 uint32_t txSize);
128 status_t BOARD_LPI2C_SendWithoutSubAddr(
129 LPI2C_Type *base, uint32_t baudRate_Hz, uint8_t deviceAddress, uint8_t *txBuff, uint8_t txBuffSize, bool needStop);
130 status_t BOARD_LPI2C_Receive(LPI2C_Type *base,
131 uint8_t deviceAddress,
132 uint32_t subAddress,
133 uint8_t subaddressSize,
134 uint8_t *rxBuff,
135 uint8_t rxBuffSize);
136 status_t BOARD_LPI2C_ReceiveWithoutSubAddr(LPI2C_Type *base,
137 uint32_t baudRate_Hz,
138 uint8_t deviceAddress,
139 uint8_t *txBuff,
140 uint8_t txBuffSize,
141 uint8_t needStop);
142
143 status_t BOARD_LPI2C_SendSCCB(LPI2C_Type *base,
144 uint8_t deviceAddress,
145 uint32_t subAddress,
146 uint8_t subaddressSize,
147 uint8_t *txBuff,
148 uint8_t txBuffSize);
149 status_t BOARD_LPI2C_ReceiveSCCB(LPI2C_Type *base,
150 uint8_t deviceAddress,
151 uint32_t subAddress,
152 uint8_t subaddressSize,
153 uint8_t *rxBuff,
154 uint8_t rxBuffSize);
155
156 void BOARD_Display0_I2C_Init(void);
157 void BOARD_Display0_I2C_Deinit(void);
158 status_t BOARD_Display0_I2C_Send(
159 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize);
160 status_t BOARD_Display0_I2C_Receive(
161 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
162
163 void BOARD_Display1_I2C_Init(void);
164 void BOARD_Display1_I2C_Deinit(void);
165 status_t BOARD_Display1_I2C_Send(
166 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize);
167 status_t BOARD_Display1_I2C_Receive(
168 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
169
170 void BOARD_Camera0_I2C_Init(void);
171 void BOARD_Camera0_I2C_Deinit(void);
172 status_t BOARD_Camera0_I2C_SendSCCB(
173 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize);
174 status_t BOARD_Camera0_I2C_ReceiveSCCB(
175 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
176
177 void BOARD_Camera1_I2C_Init(void);
178 void BOARD_Camera1_I2C_Deinit(void);
179 status_t BOARD_Camera1_I2C_SendSCCB(
180 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize);
181 status_t BOARD_Camera1_I2C_ReceiveSCCB(
182 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
183 void BOARD_Codec_I2C_Init(void);
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 status_t BOARD_Codec_I2C_Receive(
187 uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
188 #endif /* SDK_I2C_BASED_COMPONENT_USED */
189
190 #ifdef BOARD_USE_SCFW_IRQ
191 void BOARD_Enable_SCIRQ(bool enable);
192 void BOARD_EnableSCEvent(uint32_t mask, bool enable);
193 void BOARD_RegisterEventHandler(sc_event_type_t event, eventHandler handler, void *param);
194 void BOARD_EnablePadWakeup(sc_pad_t pad, bool enable, sc_pad_wakeup_t pad_wakeup_config);
BOARD_UnregisterEventHandeler(sc_event_type_t event)195 static inline void BOARD_UnregisterEventHandeler(sc_event_type_t event)
196 {
197 BOARD_RegisterEventHandler(event, NULL, NULL);
198 }
199 #endif
200
201 #if defined(__cplusplus)
202 }
203 #endif /* __cplusplus */
204
205 #endif /* _BOARD_H_ */
206