1 /******************************************************************************\r
2 * Copyright (c) 2019 Texas Instruments Incorporated - http://www.ti.com\r
3 *\r
4 * Redistribution and use in source and binary forms, with or without\r
5 * modification, are permitted provided that the following conditions\r
6 * are met:\r
7 *\r
8 * Redistributions of source code must retain the above copyright\r
9 * notice, this list of conditions and the following disclaimer.\r
10 *\r
11 * Redistributions in binary form must reproduce the above copyright\r
12 * notice, this list of conditions and the following disclaimer in the\r
13 * documentation and/or other materials provided with the\r
14 * distribution.\r
15 *\r
16 * Neither the name of Texas Instruments Incorporated nor the names of\r
17 * its contributors may be used to endorse or promote products derived\r
18 * from this software without specific prior written permission.\r
19 *\r
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
31 *\r
32 *****************************************************************************/\r
33 \r
34 /**\r
35 * \file fpd_dsi_test.c\r
36 *\r
37 * \brief fpd dsi test file\r
38 *\r
39 * Targeted Functionality: Verification of basic functionality of remote csi\r
40 * module connected to fpd interface.\r
41 *\r
42 * Operation: This test is used for detection of remote fpd serializer and,\r
43 * camera module. Verification of the camera module access through the FPD\r
44 * interface.\r
45 *\r
46 * Supported SoCs: J721E.\r
47 *\r
48 * Supported Platforms: j721e_evm.\r
49 *\r
50 */\r
51 \r
52 #include "fpd_dsi_test.h"\r
53 \r
54 extern const I2C_Config I2C_config[];\r
55 \r
56 Board_FpdModuleObj fpdModParams = {0x2C, 0x16, 0x11};\r
57 \r
58 Board_FpdRmtDevObj fpdRmtParams[8] =\r
59 {\r
60 {0x2c, 0x11}, //Remote derializer(UB924) divice physical and alias addresses\r
61 {0x40, 0x12}, //Remote sensor device0 physial and alias addresses\r
62 {0x00, 0x00},\r
63 {0x00, 0x00},\r
64 {0x00, 0x00},\r
65 {0x00, 0x00},\r
66 {0x00, 0x00},\r
67 {0x00, 0x00}\r
68 };\r
69 #if !defined (__aarch64__)\r
70 /**\r
71 * \brief Configures the i2c domain base address\r
72 *\r
73 * \param instNum [IN] I2C instance number.\r
74 *\r
75 * \return int8_t \r
76 * 0 - in case of success\r
77 * -1 - in case of failure.\r
78 *\r
79 */\r
80 static bool BoardDiag_setMainI2CInstBaseAddr(uint8_t instNum)\r
81 {\r
82 bool errStatFlag = false;\r
83 switch(instNum)\r
84 {\r
85 case 0:\r
86 enableMAINI2C(instNum, CSL_I2C0_CFG_BASE);\r
87 break;\r
88 case 1:\r
89 enableMAINI2C(instNum, CSL_I2C1_CFG_BASE);\r
90 break;\r
91 case 2:\r
92 enableMAINI2C(instNum, CSL_I2C2_CFG_BASE);\r
93 break;\r
94 case 3:\r
95 enableMAINI2C(instNum, CSL_I2C3_CFG_BASE);\r
96 break;\r
97 case 4:\r
98 enableMAINI2C(instNum, CSL_I2C4_CFG_BASE);\r
99 break;\r
100 case 5:\r
101 enableMAINI2C(instNum, CSL_I2C5_CFG_BASE);\r
102 break;\r
103 case 6:\r
104 enableMAINI2C(instNum, CSL_I2C6_CFG_BASE);\r
105 break;\r
106 default:\r
107 UART_printf("The user requested instance doesn't available\n\r");\r
108 errStatFlag = true;\r
109 break;\r
110 }\r
111 return errStatFlag;\r
112 }\r
113 #endif\r
114 /**\r
115 * \brief Runs the fpd dsi test.\r
116 *\r
117 * \return int8_t \r
118 * 0 - in case of success\r
119 * -1 - in case of failure.\r
120 *\r
121 */\r
122 static int8_t BoardDiag_run_fpd_dsi_test(void)\r
123 {\r
124 uint8_t dutyCycle;\r
125 int8_t ret = 0;\r
126 uint8_t index;\r
127 uint8_t domain,regData;\r
128 uint8_t i2cInst;\r
129 uint8_t slaveAddr;\r
130 uint8_t userInput;\r
131 \r
132 #if !defined (__aarch64__)\r
133 bool errFlag;\r
134 #endif\r
135 \r
136 I2C_Params i2cParams;\r
137 I2C_HwAttrs i2cConfig;\r
138 I2C_Handle handle = NULL;\r
139 \r
140 for(index = 0; index < I2C_HWIP_MAX_CNT; index++)\r
141 {\r
142 I2C_socGetInitCfg(index, &i2cConfig);\r
143 i2cConfig.enableIntr = false;\r
144 I2C_socSetInitCfg(index, &i2cConfig);\r
145 }\r
146 \r
147 /* Initializes the I2C */\r
148 I2C_init();\r
149 \r
150 /* Initializes the I2C Parameters */\r
151 I2C_Params_init(&i2cParams);\r
152 i2cParams.bitRate = I2C_400kHz; /* 400KHz */\r
153 \r
154 Board_fpdUb941GetI2CAddr(&domain, &i2cInst, &slaveAddr);\r
155 \r
156 if(domain == BOARD_SOC_DOMAIN_MAIN)\r
157 {\r
158 #if !defined (__aarch64__)\r
159 /* MCU I2C instance will be active by default for R5 core.\r
160 * Need update HW attrs to enable MAIN I2C instance.\r
161 */\r
162 errFlag = BoardDiag_setMainI2CInstBaseAddr(i2cInst);\r
163 if(errFlag == true)\r
164 {\r
165 return -1; \r
166 }\r
167 #endif\r
168 }\r
169 else if(domain == BOARD_SOC_DOMAIN_WKUP)\r
170 {\r
171 #if !defined (__aarch64__)\r
172 /* MCU I2C instance will be active by default for R5 core.\r
173 * Need update HW attrs to enable MAIN I2C instance.\r
174 */\r
175 enableI2C(CSL_WKUP_I2C0_CFG_BASE);\r
176 #endif\r
177 }\r
178 else\r
179 {\r
180 #if defined (__aarch64__)\r
181 /* MCU I2C instance will be active by default for R5 core.\r
182 * Need update HW attrs to enable MAIN I2C instance.\r
183 */\r
184 enableI2C(CSL_MCU_I2C0_CFG_BASE);\r
185 #endif\r
186 }\r
187 \r
188 fpdModParams.serSlvAddr = slaveAddr;\r
189 \r
190 /* Configures the I2C instance with the passed parameters*/\r
191 handle = I2C_open(i2cInst, &i2cParams);\r
192 if(handle == NULL)\r
193 {\r
194 UART_printf("\nI2C Open failed!\n");\r
195 ret = -1;\r
196 return ret;\r
197 }\r
198 \r
199 UART_printf("Initializing the host serializer...\n\r");\r
200 ret = Board_fpdUb941SerInit((void *)handle,\r
201 &fpdModParams,\r
202 &fpdRmtParams[0]);\r
203 if(ret != 0)\r
204 {\r
205 UART_printf("FPD serializer initialization failed\n\r");\r
206 }\r
207 else\r
208 {\r
209 UART_printf("FPD serializer initialization successful\n\r");\r
210 }\r
211 \r
212 #if 0\r
213 ret = Board_fpdUb941DsiModuleInit((void *)handle,\r
214 &fpdModParams);\r
215 if(ret != 0)\r
216 {\r
217 UART_printf("FPD serializer DSI module init failed\n\r");\r
218 }\r
219 else\r
220 {\r
221 UART_printf("FPD serializer DSI module init successful\n\r");\r
222 }\r
223 \r
224 ret = Board_fpdUb941PatternGenConfig((void *)handle,\r
225 &fpdModParams);\r
226 if(ret != 0)\r
227 {\r
228 UART_printf("FPD serializer pattern generation configuration failed\n\r");\r
229 }\r
230 else\r
231 {\r
232 UART_printf("FPD serializer pattern generation configuration successful\n\r");\r
233 }\r
234 \r
235 ret = Board_fpdUb924ModuleInit((void *)handle,\r
236 &fpdModParams);\r
237 if(ret != 0)\r
238 {\r
239 UART_printf("FPD deserializer DSI module init failed\n\r");\r
240 }\r
241 else\r
242 {\r
243 UART_printf("FPD deserializer DSI module init successful\n\r");\r
244 }\r
245 #endif\r
246 \r
247 UART_printf("Enabling the LED through LED\n\r");\r
248 /* Led Enabling through IO/Exp */\r
249 regData = 0xFE;\r
250 ret = Board_i2c8BitRegWr(handle,\r
251 0x27U,\r
252 0x00U,\r
253 ®Data, //enabling led_en - GPIO\r
254 1U,\r
255 BOARD_I2C_TRANSACTION_TIMEOUT);\r
256 if(ret != 0)\r
257 {\r
258 UART_printf("LED enabling through IO EXP failed\n\r");\r
259 return ret;\r
260 }\r
261 \r
262 \r
263 UART_printf("Configuring LED driver ...\n\r");\r
264 Board_tlc59108LedDrvCfg((void *)handle,\r
265 &fpdModParams,\r
266 &fpdRmtParams[1]);\r
267 \r
268 UART_printf("Press 'y' or 'Y' to exit the test, once after observing\n\r\\r
269 the change in LCD back light brightness...\n\r");\r
270 while(1)\r
271 {\r
272 UART_printf("\n\rBightness changing from min to max...\n\r");\r
273 dutyCycle = (uint8_t)MIN_BRIGHTNESS;\r
274 while(dutyCycle <= (uint8_t)MAX_BRIGHTNESS)\r
275 {\r
276 UART_printf("Duty cycle percentage - %d\n\r", dutyCycle);\r
277 ret = Board_tlc59108PwmDutycycleCntrl((void *)handle,\r
278 &fpdRmtParams[1],\r
279 BOARD_FPD_TLC59108_PWM_CH2,\r
280 dutyCycle);\r
281 dutyCycle += 10;\r
282 Board_delay(200);\r
283 }\r
284 \r
285 UART_printf("\n\rBightness changing from max to min...\n\r");\r
286 dutyCycle = MAX_BRIGHTNESS;\r
287 while(dutyCycle != MIN_BRIGHTNESS)\r
288 {\r
289 UART_printf("Duty cycle percentage - %d\n\r", dutyCycle);\r
290 ret = Board_tlc59108PwmDutycycleCntrl((void *)handle,\r
291 &fpdRmtParams[1],\r
292 BOARD_FPD_TLC59108_PWM_CH2,\r
293 dutyCycle);\r
294 \r
295 dutyCycle -= 10;\r
296 Board_delay(200);\r
297 }\r
298 \r
299 userInput = (char)BoardDiag_getUserInput(BOARD_UART_INSTANCE);\r
300 if((userInput == 'y') || (userInput == 'Y'))\r
301 {\r
302 UART_printf("Exiting...\n");\r
303 break;\r
304 }\r
305 }\r
306 \r
307 I2C_close(handle);\r
308 \r
309 return ret;\r
310 }\r
311 \r
312 /**\r
313 * \brief The function performs the fpd dsi verification test.\r
314 *\r
315 * \return int8_t \r
316 * 0 - in case of success\r
317 * -1 - in case of failure.\r
318 *\r
319 */\r
320 \r
321 int8_t BoardDiag_fpd_dsi_test(void)\r
322 {\r
323 int8_t ret = 0;\r
324 Board_I2cInitCfg_t i2cCfg;\r
325 \r
326 UART_printf("\n*********************************************\n"); \r
327 UART_printf("* FPD DSI TEST *\n");\r
328 UART_printf("*********************************************\n"); \r
329 \r
330 UART_printf("\nRunning FPD DSI access test\n");\r
331 \r
332 /*setting power mux for dsi lcd*/\r
333 i2cCfg.i2cInst = BOARD_I2C_IOEXP_DEVICE4_INSTANCE;\r
334 i2cCfg.socDomain = BOARD_SOC_DOMAIN_MAIN;\r
335 i2cCfg.enableIntr = false;\r
336 Board_setI2cInitConfig(&i2cCfg);\r
337 \r
338 Board_i2cIoExpInit();\r
339 \r
340 UART_printf("UB941 serializer enable external power reset\n\r");\r
341 Board_i2cIoExpSetPinDirection(BOARD_I2C_IOEXP_DEVICE4_ADDR,\r
342 ONE_PORT_IOEXP,\r
343 PORTNUM_0,\r
344 PIN_NUM_7,\r
345 PIN_DIRECTION_OUTPUT);\r
346 \r
347 Board_i2cIoExpPinLevelSet(BOARD_I2C_IOEXP_DEVICE4_ADDR,\r
348 ONE_PORT_IOEXP,\r
349 PORTNUM_0,\r
350 PIN_NUM_7,\r
351 GPIO_SIGNAL_LEVEL_HIGH);\r
352 \r
353 UART_printf("DSI power switch control enable\n\r");\r
354 Board_i2cIoExpSetPinDirection(BOARD_I2C_IOEXP_DEVICE4_ADDR,\r
355 ONE_PORT_IOEXP,\r
356 PORTNUM_0,\r
357 PIN_NUM_2,\r
358 PIN_DIRECTION_OUTPUT);\r
359 \r
360 Board_i2cIoExpPinLevelSet(BOARD_I2C_IOEXP_DEVICE4_ADDR,\r
361 ONE_PORT_IOEXP,\r
362 PORTNUM_0,\r
363 PIN_NUM_2,\r
364 GPIO_SIGNAL_LEVEL_HIGH);\r
365 Board_i2cIoExpDeInit();\r
366 \r
367 ret = BoardDiag_run_fpd_dsi_test();\r
368 if(ret == 0)\r
369 {\r
370 UART_printf("\nFPD DSI test Passed\n"); \r
371 }\r
372 else\r
373 {\r
374 UART_printf("\nFPD DSI test Failed\n"); \r
375 }\r
376 \r
377 return ret;\r
378 \r
379 }\r
380 \r
381 /**\r
382 * \brief FPD dsi Diagnostic test main function\r
383 *\r
384 * \return int - EEPROM Diagnostic test status.\r
385 * 0 - in case of success\r
386 * -1 - in case of failure.\r
387 *\r
388 */\r
389 int main(void)\r
390 {\r
391 Board_STATUS status;\r
392 Board_initCfg boardCfg;\r
393 \r
394 #ifdef PDK_RAW_BOOT\r
395 boardCfg = BOARD_INIT_MODULE_CLOCK |\r
396 BOARD_INIT_PINMUX_CONFIG |\r
397 BOARD_INIT_UART_STDIO;\r
398 #else\r
399 boardCfg = BOARD_INIT_UART_STDIO |\r
400 BOARD_INIT_PINMUX_CONFIG;\r
401 #endif\r
402 \r
403 status = Board_init(boardCfg);\r
404 if(status != BOARD_SOK)\r
405 {\r
406 return -1;\r
407 }\r
408 \r
409 return BoardDiag_fpd_dsi_test();\r
410 }\r
411 \r