1 /*
2  * Copyright (c) 2016, Freescale Semiconductor, Inc.
3  * Copyright 2016-2020 NXP
4  * All rights reserved.
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 #include "fsl_clock.h"
14 #include "fsl_rgpio.h"
15 #if defined(BOARD_USE_PCA6416A) && BOARD_USE_PCA6416A
16 #include "fsl_pca6416a.h"
17 #endif
18 /*******************************************************************************
19  * Definitions
20  ******************************************************************************/
21 #define PFD_VALID_MASK (0x40404040U)
22 #ifndef BIT
23 #define BIT(n) (1U << (n))
24 #endif
25 #define MHZ(X) ((X)*1000000UL)
26 
27 /* SoC variable type */
28 #define MPU_SOC_IMX8ULP   0xA1 /* dummy ID, full feature, iMX8ULP Dual core 7D/7C */
29 #define MPU_SOC_IMX8ULPD5 0xA2 /* dummy ID, iMX8ULP Dual core 5D/5C, EPDC disabled */
30 #define MPU_SOC_IMX8ULPS5 0xA3 /* dummy ID, iMX8ULP Single core 5D/5C, EPDC disabled */
31 #define MPU_SOC_IMX8ULPD3 0xA4 /* dummy ID, iMX8ULP Dual core 3D/3C, EPDC + GPU disabled */
32 #define MPU_SOC_IMX8ULPS3 0xA5 /* dummy ID, iMX8ULP Single core 3D/3C, EPDC + GPU disabled */
33 #define MPU_SOC_IMX8ULPSC 0xA6 /* dummy ID, iMX8ULP SC part, 900 MHz + EPDC disabled */
34 
35 /*! @brief The board name */
36 #define BOARD_NAME        "MIMX8ULP-EVK"
37 #define MANUFACTURER_NAME "NXP"
38 
39 /* SOC infomation*/
40 #define IMX8ULP_SOC_REV_A0 0xA000
41 #define IMX8ULP_SOC_REV_A1 0xA100
42 #define IMX8ULP_SOC_ID     0x084D
43 
44 /* The UART to use for debug messages. */
45 #define BOARD_DEBUG_UART_TYPE     kSerialPort_Uart
46 #define BOARD_DEBUG_UART_BAUDRATE 115200u
47 #define BOARD_DEBUG_UART_BASEADDR LPUART1_BASE
48 #define BOARD_DEBUG_UART_INSTANCE 1U
49 #define BOARD_DEBUG_UART_CLK_FREQ CLOCK_GetLpuartClkFreq(BOARD_DEBUG_UART_INSTANCE)
50 #define BOARD_DEBUG_UART_IP_NAME  kCLOCK_Lpuart1
51 #define BOARD_DEBUG_UART_CLKSRC   kCLOCK_Pcc1BusIpSrcSysOscDiv2
52 #define BOARD_DEBUG_UART_RESET    kRESET_Lpuart1
53 #define BOARD_UART_IRQ            LPUART1_IRQn
54 #define BOARD_UART_IRQ_HANDLER    LPUART1_IRQHandler
55 
56 /* Board accelerator sensor configuration */
57 #define BOARD_ACCEL_I2C_BASEADDR   LPI2C0
58 #define BOARD_ACCEL_I2C_CLOCK_FREQ CLOCK_GetLpi2cClkFreq(0)
59 
60 #define BOARD_CODEC_I2C_BASEADDR   LPI2C0
61 #define BOARD_CODEC_I2C_CLOCK_FREQ CLOCK_GetLpi2cClkFreq(0)
62 #define BOARD_CODEC_I2C_INSTANCE   0U
63 
64 /* Board mipi to hdmi bridge ic(IT6161) */
65 #define BOARD_DISPLAY_I2C_BASEADDR   LPI2C0
66 #define BOARD_DISPLAY_I2C_CLOCK_FREQ CLOCK_GetLpi2cClkFreq(0)
67 
68 #define BOARD_FLEXSPI_PSRAM FLEXSPI1
69 /* NOR FLASH */
70 #define BOARD_NOR_FLASH_READ_MAXIMUM_FREQ (40000000U) /* READ NOR FLASH MAXIMUM FREQUENCY is 40 MHz */
71 /* For NOR FLASH that connected to flexspi0 controller */
72 #define BOARD_FLEXSPI_NOR_FLASH_PORT       kFLEXSPI_PortA1
73 #define BOARD_FLEXSPI_CONNECT_TO_NOR_FLASH FLEXSPI0
74 /* For NOR FLASH GD25LX256E */
75 #ifndef SPINOR_OP_DISABLE_4_BYTE_ADDR_MODE_GIGADEVICE
76 #define SPINOR_OP_DISABLE_4_BYTE_ADDR_MODE_GIGADEVICE \
77     (0xE9) /* Disable 4-Byte Address Mode (from GigaDevice GD25LX256E) */
78 #endif
79 
80 #define BOARD_SW8_GPIO        GPIOB
81 #define BOARD_SW8_GPIO_PIN    12U
82 #define BOARD_SW8_IRQ         GPIOB_INT0_IRQn
83 #define BOARD_SW8_IRQ_HANDLER GPIOB_INT0_IRQHandler
84 #define BOARD_SW8_NAME        "SW8"
85 
86 #define BOARD_SW7_GPIO        GPIOB
87 #define BOARD_SW7_GPIO_PIN    13U
88 #define BOARD_SW7_IRQ         GPIOB_INT0_IRQn
89 #define BOARD_SW7_IRQ_HANDLER GPIOB_INT0_IRQHandler
90 #define BOARD_SW7_NAME        "SW7"
91 
92 #define LED_INIT()
93 #define LED_ON()
94 #define LED_TOGGLE()
95 
96 #define VDEV0_VRING_BASE (0xAFF00000U)
97 #define VDEV1_VRING_BASE (0xAFF10000U)
98 
99 /* MIPI panel. */
100 /* RST pin. */
101 #define BOARD_MIPI_RST_GPIO GPIOC
102 #define BOARD_MIPI_RST_PIN  23
103 /* Backlight pin. */
104 #define BOARD_MIPI_BL_GPIO GPIOA
105 #define BOARD_MIPI_BL_PIN  3
106 /* TE pin. */
107 #define BOARD_MIPI_TE_GPIO GPIOE
108 #define BOARD_MIPI_TE_PIN  17
109 
110 #define BOARD_IS_XIP_FLEXSPI0()                                                                                 \
111     ((((uint32_t)BOARD_InitDebugConsole >= 0x04000000U) && ((uint32_t)BOARD_InitDebugConsole < 0x0C000000U)) || \
112      (((uint32_t)BOARD_InitDebugConsole >= 0x14000000U) && ((uint32_t)BOARD_InitDebugConsole < 0x1C000000U)))
113 
114 /* PCA6416A (U27) */
115 #define BOARD_PCA6416A_I2C            LPI2C0
116 #define BOARD_PCA6416A_I2C_ADDR       (0x20U)
117 #define BOARD_PCA6416A_I2C_CLOCK_FREQ (CLOCK_GetLpi2cClkFreq(0))
118 
119 #define BOARD_PCA6416A_CPU_POWER_MODE0 0U
120 #define BOARD_PCA6416A_CPU_POWER_MODE1 1U
121 #define BOARD_PCA6416A_CPU_POWER_MODE2 2U
122 #define BOARD_PCA6416A_CAN0_STDBY      4U
123 #define BOARD_PCA6416A_TOUCH_RESET     5U
124 #define BOARD_PCA6416A_CAMERA_RESET    7U
125 #define BOARD_PCA6416A_CAMERA_PWDN     (8U + 0U)
126 #define BOARD_PCA6416A_MIPI_SWITCH     (8U + 1U)
127 #define BOARD_PCA6416A_EPDC_SWITCH     (8U + 2U)
128 #define BOARD_PCA6416A_BATT_ADC_ENABLE (8U + 3U)
129 #define BOARD_PCA6416A_CHG_OK          (8U + 4U)
130 #define BOARD_PCA6416A_AC_OK           (8U + 5U)
131 
132 #define TPM0_CH2 (2UL)
133 /* 500 Hz */
134 #define TPM0_CH2_PWM_FREQ (500UL)
135 #define FULL_DUTY_CYCLE   (100UL)
136 
137 /* IT6161(U10) */
138 #define BOARD_IT6161_I2C            LPI2C0
139 #define BOARD_IT6161_I2C_ADDR       (0x6CU)
140 #define BOARD_IT6161_I2C_CLOCK_FREQ (CLOCK_GetLpi2cClkFreq(0))
141 
142 #define TRDC_MBC_ACCESS_CONTROL_POLICY_ALL_INDEX (0)
143 #define TRDC_MRC_ACCESS_CONTROL_POLICY_ALL_INDEX (0)
144 #define TRDC_M33_DOMAIN_ID                       (6)
145 #define TRDC_POWERQUAD_DOMAIN_ID                 (0)
146 #define TRDC_POWERQUAD_MASTER_ID                 (4)
147 #define TRDC_DMA0_DOMAIN_ID                      (0)
148 #define TRDC_DMA0_MASTER_ID                      (2)
149 #define TRDC_MDAC2_INDEX                         (2) /* T-MADC2 */
150 #define TRDC_MDAC0_INDEX                         (0) /* T-MADC0 */
151 #define TRDC_MRC0_INDEX                          (0) /* T-MRC0 */
152 #define TRDC_MRC1_INDEX                          (1) /* T-MRC1 */
153 #define TRDC_DCNANO_DOMAIN_ID                    (3)
154 
155 #define TRDC_MBC3_INDEX    (3) /* T-MBC3(controll access of DSP Domain) */
156 #define TRDC_MBC_INDEX_NUM (4)
157 
158 /* FSB */
159 #define FUSE_BANKS           (64)
160 #define FUSE_WORDS_PER_BANKS (8)
161 #define FSB_OTP_SHADOW       (0x800)
162 #define FSB_BASE_ADDR        (0x27010000)
163 
164 /* handshake with uboot */
165 /* Define the timeout ms to do handshake with uboot with mu flag */
166 #define BOARD_HANDSHAKE_WITH_UBOOT_TIMEOUT_MS (10000U)
167 
168 /*
169  * Get a proper sequence to recovery RCR of MU0_MUA from uboot(a35)
170  * at the same time, imply that io and pwm of mipi is ready for uboot
171  */
172 #define BOARD_MU0_MUB_F0_INIT_SRTM_COMMUNICATION_FLG (0x1UL)
173 /* 1 ms */
174 #define BOARD_WAIT_MU0_MUB_F0_FLG_FROM_UBOOT_MS (0x1U)
175 
176 #define BOARD_FLEXSPI_DLL_LOCK_RETRY (10)
177 
178 #define LPI_WAKEUP_EN_SHIFT (8U)
179 
180 #define DENALI_CTL_137 (0x224U)
181 #define DENALI_CTL_143 (0x23CU)
182 #define DENALI_CTL_144 (0x240U)
183 #define DENALI_CTL_146 (0x248U)
184 #define DENALI_CTL_147 (0x24CU)
185 #define DENALI_CTL_148 (0x250U)
186 #define DENALI_CTL_153 (0x264U)
187 #define DENALI_CTL_266 (0x428U)
188 
189 #define DENALI_PHY_1559 (0x585CU)
190 #define DENALI_PHY_1590 (0x58D8U)
191 
192 #define DENALI_PI_52  (0x20D0U)
193 #define DENALI_PI_26  (0x2068U)
194 #define DENALI_PI_33  (0x2084U)
195 #define DENALI_PI_65  (0x2104U)
196 #define DENALI_PI_77  (0x2134U)
197 #define DENALI_PI_134 (0x2218U)
198 #define DENALI_PI_132 (0x2210U)
199 #define DENALI_PI_137 (0x2224U)
200 
201 /* Set RTD_SEC_SIM_GPR1 as ddr state flag between AD and RTD,  ddr active: 0, ddr in self refresh: 1 */
202 #define DDR_IN_SELFREFRESH_BASE (0x2802B004u)
203 
204 #define W32(addr, val) *((volatile uint32_t *)(addr)) = (val)
205 #define R32(addr)      *((volatile uint32_t *)(addr))
206 
207 #define SETBIT32(addr, set)   W32(addr, R32(addr) | set)
208 #define CLRBIT32(addr, clear) W32(addr, R32(addr) & ~clear)
209 
210 #define LPDDR3_TYPE                          (0x7U)
211 #define LPDDR4_TYPE                          (0xBU)
212 #define SAVED_DRAM_DATA_BASE_ADDR_FROM_TFA   (0x20055000)
213 #define SAVED_DRAM_TIMING_INFO_SIZE_FROM_TFA (0x58)
214 
215 #define LPDDR_CTRL_LP_CMD_MASK       (0x7F00U)
216 #define LPAV_LPDDR_CTRL_LP_CMD_SHIFT (8U)
217 #define LPAV_LPDDR_CTRL_LP_CMD(x) \
218     (((uint32_t)(((uint32_t)(x)) << LPAV_LPDDR_CTRL_LP_CMD_SHIFT)) & LPDDR_CTRL_LP_CMD_MASK)
219 #define CTL_NUM      680
220 #define PI_NUM       298
221 #define PHY_NUM      1654
222 #define PHY_DIFF_NUM 49
223 
224 #define LP_AUTO_ENTRY_EN (0x4U)
225 #define LP_AUTO_EXIT_EN  (0xFU)
226 #define AUTO_LP_NUM      (0x3)
227 
228 /* For debugging  */
229 #define BOARD_ENABLE_DUMP_REGS                 (0)
230 #define LPI_SRPD_LONG_MCCLK_GATE_WAKEUP_F2_NUM (0xF)
231 
232 extern struct dram_cfg *dram_timing_cfg;
233 extern uint32_t dram_class;
234 struct dram_cfg
235 {
236     uint32_t ctl_cfg[CTL_NUM];
237     uint32_t pi_cfg[PI_NUM];
238     uint32_t phy_full[PHY_NUM];
239     uint32_t phy_diff[PHY_DIFF_NUM];
240     uint32_t auto_lp_cfg[AUTO_LP_NUM];
241 };
242 
243 struct dram_cfg_param
244 {
245     uint32_t reg;
246     uint32_t val;
247 };
248 
249 struct dram_timing_info
250 {
251     /* ddr controller config */
252     struct dram_cfg_param *ctl_cfg;
253     unsigned int ctl_cfg_num;
254     /* pi config */
255     struct dram_cfg_param *pi_cfg;
256     unsigned int pi_cfg_num;
257     /* phy freq1 config */
258     struct dram_cfg_param *phy_f1_cfg;
259     unsigned int phy_f1_cfg_num;
260     /* phy freq2 config */
261     struct dram_cfg_param *phy_f2_cfg;
262     unsigned int phy_f2_cfg_num;
263     struct dram_cfg_param *auto_lp_cfg;
264     unsigned int auto_lp_cfg_num;
265     /* initialized drate table */
266     unsigned int fsp_table[3];
267 };
268 
269 /* boot type */
270 typedef enum
271 {
272     SINGLE_BOOT_TYPE,
273     DUAL_BOOT_TYPE,
274     LOW_POWER_BOOT_TYPE,
275 } boot_type_e;
276 
277 typedef enum
278 {
279     IP_EPDC = 1,
280     IP_GPU  = 2,
281     IP_MPU1 = 3, /* MPU1 - Cortex-A35 core 1 */
282 } ip_type_e;
283 #if defined(__cplusplus)
284 extern "C" {
285 #endif /* __cplusplus */
286 
287 /*******************************************************************************
288  * API
289  ******************************************************************************/
290 
291 void BOARD_InitDebugConsole(void);
292 bool BOARD_IsLowPowerBootType(void);
293 bool BOARD_IsSingleBootType(void);
294 bool BOARD_IsLPAVOwnedByRTD(void);
295 const char *BOARD_GetBootTypeName(void);
296 
297 /* TRDC */
298 bool BOARD_GetReleaseFlagOfTrdc(void);
299 void BOARD_SetReleaseFlagOfTrdc(bool flag);
300 void BOARD_ReleaseTRDC(void);
301 void BOARD_SetTrdcGlobalConfig(void);
302 /* Setup TRDC configuration before executing rom code of A35(A35 rom will access FSB, S400 MUAP A-Side, SIM0-S with
303  * secure state, so m33 help a35 to configure TRDC) */
304 void BOARD_SetTrdcAfterApdReset(void);
305 
306 /*
307  * return the handshake result(fail or success):
308  * true: succeeded to handshake with uboot; false: failed to handshake with uboot
309  */
310 bool BOARD_HandshakeWithUboot(void);
311 
312 void BOARD_ConfigMPU(void);
313 status_t BOARD_InitPsRam(void);
314 void BOARD_FlexspiClockSafeConfig(void);
315 AT_QUICKACCESS_SECTION_CODE(
316     void BOARD_SetFlexspiClock(FLEXSPI_Type *base, uint32_t src, uint8_t divValue, uint8_t fracValue));
317 AT_QUICKACCESS_SECTION_CODE(void BOARD_DeinitXip(FLEXSPI_Type *base));
318 AT_QUICKACCESS_SECTION_CODE(void BOARD_InitXip(FLEXSPI_Type *base));
319 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
320 void BOARD_LPI2C_Init(LPI2C_Type *base, uint32_t clkSrc_Hz);
321 status_t BOARD_LPI2C_Send(LPI2C_Type *base,
322                           uint8_t deviceAddress,
323                           uint32_t subAddress,
324                           uint8_t subaddressSize,
325                           uint8_t *txBuff,
326                           uint16_t txBuffSize,
327                           uint32_t flags);
328 status_t BOARD_LPI2C_Receive(LPI2C_Type *base,
329                              uint8_t deviceAddress,
330                              uint32_t subAddress,
331                              uint8_t subaddressSize,
332                              uint8_t *rxBuff,
333                              uint16_t rxBuffSize,
334                              uint32_t flags);
335 void BOARD_Accel_I2C_Init(void);
336 status_t BOARD_Accel_I2C_Send(
337     uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint32_t txBuff, uint32_t flags);
338 status_t BOARD_Accel_I2C_Receive(uint8_t deviceAddress,
339                                  uint32_t subAddress,
340                                  uint8_t subaddressSize,
341                                  uint8_t *rxBuff,
342                                  uint8_t rxBuffSize,
343                                  uint32_t flags);
344 void BOARD_Codec_I2C_Init(void);
345 status_t BOARD_Codec_I2C_Send(uint8_t deviceAddress,
346                               uint32_t subAddress,
347                               uint8_t subAddressSize,
348                               const uint8_t *txBuff,
349                               uint8_t txBuffSize,
350                               uint32_t flags);
351 status_t BOARD_Codec_I2C_Receive(uint8_t deviceAddress,
352                                  uint32_t subAddress,
353                                  uint8_t subAddressSize,
354                                  uint8_t *rxBuff,
355                                  uint8_t rxBuffSize,
356                                  uint32_t flags);
357 
358 void BOARD_Display_I2C_Init(void);
359 status_t BOARD_Display_I2C_Send(
360     uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize);
361 status_t BOARD_Display_I2C_Receive(
362     uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
363 
364 #if defined(BOARD_USE_PCA6416A) && BOARD_USE_PCA6416A
365 void BOARD_PCA6416A_I2C_Init(void);
366 status_t BOARD_PCA6416A_I2C_Send(uint8_t deviceAddress,
367                                  uint32_t subAddress,
368                                  uint8_t subAddressSize,
369                                  const uint8_t *txBuff,
370                                  uint8_t txBuffSize,
371                                  uint32_t flags);
372 status_t BOARD_PCA6416A_I2C_Receive(uint8_t deviceAddress,
373                                     uint32_t subAddress,
374                                     uint8_t subAddressSize,
375                                     uint8_t *rxBuff,
376                                     uint8_t rxBuffSize,
377                                     uint32_t flags);
378 
379 /* PCA6416A U27. */
380 extern pca6416a_handle_t g_pca6416aHandle;
381 
382 void BOARD_InitPCA6416A(pca6416a_handle_t *handle);
383 
384 /* MIPI DSI */
385 void BOARD_InitMipiDsiPins(void);
386 void BOARD_EnableMipiDsiBacklight(void);
387 #endif /* BOARD_USE_PCA6416A */
388 
389 #endif /* SDK_I2C_BASED_COMPONENT_USED */
390 
391 /* LPAV DDR */
392 void BOARD_LpavInit();
393 void BOARD_DdrSave(void);
394 void BOARD_LpavSave(void);
395 void BOARD_DramEnterRetention(void);
396 void BOARD_DramExitRetention(uint32_t dram_class, struct dram_cfg *dram_timing_cfg);
397 void BOARD_DDREnterSelfRefresh();
398 void BOARD_DDRExitSelfRefresh();
399 
400 /* Use for debugging */
401 void BOARD_DumpRegs(uint32_t start_reg_addr, uint32_t end_reg_addr);
402 void BOARD_DumpRTDRegs(void);
403 bool BOARD_IsIpDisabled(ip_type_e type);
404 uint32_t BOARD_GetSocVariantType(void);
405 #if defined(__cplusplus)
406 }
407 #endif /* __cplusplus */
408 
409 #endif /* _BOARD_H_ */
410