]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/pdk.git/blob - packages/ti/board/diag/dsi/src/fpd_dsi_test.c
board-rtos: add to PDK
[processor-sdk/pdk.git] / packages / ti / board / diag / dsi / src / fpd_dsi_test.c
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                              &regData, //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