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