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 leo_pmic_lib_test.c\r
36 *\r
37 * \brief This file contains API's used for testing the Leo PMIC using the \r
38 * Leo PMIC board library.\r
39 *\r
40 * Supported SoCs: J721E\r
41 *\r
42 * Supported Platforms: j721e_evm\r
43 */\r
44 \r
45 #include "leo_pmic_lib_test.h"\r
46 \r
47 Board_Tps65941RtcDate dateCfg = \r
48 {\r
49 31,\r
50 12,\r
51 18,\r
52 BOARD_TPS65941_SUNDAY\r
53 };\r
54 \r
55 Board_Tps65941RtcTime timeCfg =\r
56 {\r
57 59,\r
58 59,\r
59 11,\r
60 BOARD_TPS65941_12_HOUR_MODE,\r
61 BOARD_TPS65941_PM_MODE\r
62 };\r
63 \r
64 static char *gdayOfWeek[] = \r
65 {"Sunday",\r
66 "Monday",\r
67 "Tuesday",\r
68 "Wednesday",\r
69 "Thursday",\r
70 "Friday",\r
71 "Saturday"\r
72 };\r
73 \r
74 leoPmicVoltCfg gpmicaVoltSetCfg[] =\r
75 {\r
76 {BOARD_TPS65941_BUCK1_RESOURCE, 770},\r
77 {BOARD_TPS65941_LDO1_RESOURCE , 1750},\r
78 {0xFF, 0}\r
79 };\r
80 \r
81 leoPmicVoltCfg gpmicbVoltSetCfg[] =\r
82 {\r
83 {BOARD_TPS65941_BUCK1_RESOURCE, 770},\r
84 {BOARD_TPS65941_LDO1_RESOURCE , 3150},\r
85 {0xFF, 0}\r
86 };\r
87 \r
88 leoPmicVoltCfg gpmicaVoltGetCfg[] =\r
89 {\r
90 {BOARD_TPS65941_BUCK1_RESOURCE, 0},\r
91 {BOARD_TPS65941_LDO1_RESOURCE , 0},\r
92 {0xFF, 0}\r
93 };\r
94 \r
95 leoPmicVoltCfg gpmicbVoltGetCfg[] =\r
96 {\r
97 {BOARD_TPS65941_BUCK1_RESOURCE, 0},\r
98 {BOARD_TPS65941_LDO1_RESOURCE , 0},\r
99 {0xFF, 0}\r
100 };\r
101 \r
102 /**\r
103 * \brief TPS65941 PMIC RTC test function.\r
104 *\r
105 * This function is used to test the RTC functionality present in the TPS65941\r
106 * PMIC.\r
107 *\r
108 * \param handle [IN] Low level I2C driver handle\r
109 * \param slaveAddr [IN] TPS65941 slave address\r
110 *\r
111 * \return BOARD_SOK in case of success or appropriate error code.\r
112 */\r
113 static int32_t BoardDiag_leoPmicRtcTest(I2C_Handle handle, uint8_t slaveAddr)\r
114 {\r
115 int32_t retStatus;\r
116 int32_t count = 5;\r
117 \r
118 UART_printf("Testing the Leo PMIC RTC functionality\n");\r
119 UART_printf("Setting the date and time to the RTC\n");\r
120 UART_printf("Displaying RTC time: %02dH:%02dM:%02dS", timeCfg.hour, timeCfg.minutes, timeCfg.seconds);\r
121 if(timeCfg.timeMode == BOARD_TPS65941_12_HOUR_MODE)\r
122 {\r
123 if(timeCfg.meridienMode)\r
124 {\r
125 UART_printf(" PM\n");\r
126 }\r
127 else\r
128 {\r
129 UART_printf(" AM\n");\r
130 }\r
131 }\r
132 else\r
133 {\r
134 UART_printf("\n");\r
135 }\r
136 \r
137 UART_printf("Displaying RTC day: %s\n", gdayOfWeek[dateCfg.week]);\r
138 UART_printf("Displaying RTC date: %02d-%02d-20%02d\n", dateCfg.date, dateCfg.month, dateCfg.year);\r
139 retStatus = Board_tps65941SetRtc(handle, slaveAddr,\r
140 &timeCfg, &dateCfg);\r
141 if(retStatus != BOARD_SOK)\r
142 {\r
143 UART_printf("Setting the date and time to RTC failed");\r
144 retStatus = -1;\r
145 return retStatus;\r
146 }\r
147 \r
148 UART_printf("\nGetting the date and time from the RTC\n");\r
149 while(count > 0)\r
150 {\r
151 BOARD_delay(5000000); /* waiting for 5 sec */\r
152 \r
153 retStatus = Board_tps65941GetRtc(handle, slaveAddr,\r
154 &timeCfg, &dateCfg);\r
155 if(retStatus != BOARD_SOK)\r
156 {\r
157 UART_printf("Getting the date and time to RTC failed");\r
158 retStatus = -1;\r
159 return retStatus;\r
160 }\r
161 \r
162 UART_printf("Displaying RTC time: %02dH:%02dM:%02dS", timeCfg.hour, timeCfg.minutes, timeCfg.seconds);\r
163 if(timeCfg.timeMode == BOARD_TPS65941_12_HOUR_MODE)\r
164 {\r
165 if(timeCfg.meridienMode)\r
166 {\r
167 UART_printf(" PM\n");\r
168 }\r
169 else\r
170 {\r
171 UART_printf(" AM\n");\r
172 }\r
173 }\r
174 else\r
175 {\r
176 UART_printf("\n");\r
177 }\r
178 \r
179 UART_printf("Displaying RTC day: %s\n", gdayOfWeek[dateCfg.week]);\r
180 UART_printf("Displaying RTC date: %02d-%02d-20%02d\n", dateCfg.date, dateCfg.month, dateCfg.year);\r
181 count--;\r
182 }\r
183 \r
184 return retStatus;\r
185 }\r
186 \r
187 /**\r
188 * \brief TPS65941 PMIC RTC Interrupt test function.\r
189 *\r
190 * This function is used to test the RTC Interrupt functionality present in the\r
191 * TPS65941 PMIC.\r
192 *\r
193 * \param handle [IN] Low level I2C driver handle\r
194 * \param slaveAddr [IN] TPS65941 slave address\r
195 *\r
196 * \return BOARD_SOK in case of success or appropriate error code.\r
197 */\r
198 static int32_t BoardDiag_leoPmicRtcIntrTest(I2C_Handle handle, uint8_t slaveAddr)\r
199 {\r
200 int32_t retStatus;\r
201 uint8_t intrStatus;\r
202 uint8_t regData = 0x00;\r
203 Board_Tps65941RtcDate alarmDate = {\r
204 01,\r
205 01,\r
206 19,\r
207 BOARD_TPS65941_MONDAY\r
208 };\r
209 Board_Tps65941RtcTime alarmTime = {\r
210 22,\r
211 00,\r
212 12,\r
213 BOARD_TPS65941_12_HOUR_MODE,\r
214 BOARD_TPS65941_AM_MODE\r
215 };\r
216 \r
217 UART_printf("\nTesting Leo PMIC RTC Interrupt functionality\n");\r
218 \r
219 /* Clearing RTC Alarm Interrupt */\r
220 retStatus = Board_i2c8BitRegRd(handle,\r
221 slaveAddr,\r
222 BOARD_TPS65941_RTC_STATUS,\r
223 ®Data,\r
224 BOARD_I2C_NUM_OF_BYTES_01,\r
225 BOARD_I2C_TRANSACTION_TIMEOUT);\r
226 if(retStatus != BOARD_SOK)\r
227 {\r
228 return BOARD_I2C_TRANSFER_FAIL;\r
229 }\r
230 if((regData & BOARD_TPS65941_ALRM_STAT_BIT_MASK) >> BOARD_TPS65941_ALRM_STAT_SHIFT)\r
231 {\r
232 regData &= ~(BOARD_TPS65941_ALRM_STAT_BIT_MASK);\r
233 regData |= (1 << BOARD_TPS65941_ALRM_STAT_SHIFT);\r
234 retStatus = Board_i2c8BitRegWr(handle,\r
235 slaveAddr,\r
236 BOARD_TPS65941_RTC_STATUS,\r
237 ®Data,\r
238 BOARD_I2C_NUM_OF_BYTES_01,\r
239 BOARD_I2C_TRANSACTION_TIMEOUT);\r
240 if(retStatus != BOARD_SOK)\r
241 {\r
242 return BOARD_I2C_TRANSFER_FAIL;\r
243 }\r
244 }\r
245 \r
246 retStatus = Board_tps65941SetAlarmIntr(handle, slaveAddr, \r
247 &alarmTime, &alarmDate);\r
248 if(retStatus != BOARD_SOK)\r
249 {\r
250 UART_printf("Setting alarm Interrupt failed\n");\r
251 retStatus = -1;\r
252 return retStatus;\r
253 }\r
254 \r
255 BOARD_delay(35000000); /* waiting for 35 sec */\r
256 \r
257 retStatus = Board_tps65941GetIntrStatus(handle, slaveAddr,\r
258 BOARD_TPS65941_INTR_ID_RTC, &intrStatus);\r
259 if(retStatus != BOARD_SOK)\r
260 {\r
261 UART_printf("Getting the interrupt status failed\n");\r
262 retStatus = -1;\r
263 return retStatus;\r
264 }\r
265 \r
266 if(intrStatus == BOARD_TPS65941_INTR_SET)\r
267 {\r
268 retStatus = Board_i2c8BitRegRd(handle,\r
269 slaveAddr,\r
270 BOARD_TPS65941_RTC_STATUS,\r
271 ®Data,\r
272 BOARD_I2C_NUM_OF_BYTES_01,\r
273 BOARD_I2C_TRANSACTION_TIMEOUT);\r
274 if(retStatus != BOARD_SOK)\r
275 {\r
276 return BOARD_I2C_TRANSFER_FAIL;\r
277 }\r
278 \r
279 if((regData & BOARD_TPS65941_ALRM_STAT_BIT_MASK) >> BOARD_TPS65941_ALRM_STAT_SHIFT)\r
280 {\r
281 UART_printf("Alarm Interrupt has been set\n");\r
282 }\r
283 else\r
284 {\r
285 UART_printf("Alarm Interrupt has not been set\n");\r
286 }\r
287 }\r
288 else\r
289 {\r
290 UART_printf("Alarm Interrupt has not been set\n");\r
291 }\r
292 return retStatus;\r
293 }\r
294 \r
295 /**\r
296 * \brief TPS65941 PMIC set voltage test function.\r
297 *\r
298 * This function is used to test dynamic voltage setting functionality to the\r
299 * TPS65941 PMIC.\r
300 *\r
301 * \param handle [IN] Low level I2C driver handle\r
302 * \param slaveAddr [IN] TPS65941 slave address\r
303 * \param voltageSetCfg [IN] TPS65941 power resource voltage details\r
304 *\r
305 * \return BOARD_SOK in case of success or appropriate error code.\r
306 */\r
307 static int32_t BoardDiag_leoPmicSetVoltage(I2C_Handle handle, uint8_t slaveAddr,\r
308 leoPmicVoltCfg voltageSetCfg[])\r
309 {\r
310 int32_t retStatus = 0;\r
311 int32_t index = 0;\r
312 \r
313 while(voltageSetCfg[index].powerResource != 0xFF)\r
314 {\r
315 UART_printf("Setting Power Resource %d Millivolts %d\n", voltageSetCfg[index].powerResource,\r
316 voltageSetCfg[index].millivolts);\r
317 retStatus = Board_tps65941SetVoltage(handle,\r
318 slaveAddr,\r
319 voltageSetCfg[index].powerResource,\r
320 voltageSetCfg[index].millivolts);\r
321 if(retStatus != BOARD_SOK)\r
322 {\r
323 UART_printf("Failed to set the voltage for Power resource %d\n", voltageSetCfg[index].powerResource);\r
324 retStatus = -1;\r
325 return retStatus;\r
326 }\r
327 index++;\r
328 }\r
329 \r
330 return retStatus;\r
331 }\r
332 \r
333 /**\r
334 * \brief TPS65941 PMIC get voltage test function.\r
335 *\r
336 * This function is used to dynamically get the voltage of the each power\r
337 * resource in TPS65941 PMIC.\r
338 *\r
339 * \param handle [IN] Low level I2C driver handle\r
340 * \param slaveAddr [IN] TPS65941 slave address\r
341 * \param voltageSetCfg [IN] TPS65941 power resource voltage details\r
342 *\r
343 * \return BOARD_SOK in case of success or appropriate error code.\r
344 */\r
345 static int32_t BoardDiag_leoPmicGetVoltage(I2C_Handle handle, uint8_t slaveAddr,\r
346 leoPmicVoltCfg voltageSetCfg[])\r
347 {\r
348 int32_t retStatus = 0;\r
349 int32_t index = 0;\r
350 \r
351 if(slaveAddr == BOARD_I2C_LEO_PMIC_A_ADDR)\r
352 {\r
353 UART_printf("\nReading Power Resource voltage from the Leo PMIC A\n");\r
354 }\r
355 else\r
356 {\r
357 UART_printf("\nReading Power Resource voltage from the Leo PMIC B\n");\r
358 }\r
359 \r
360 while(voltageSetCfg[index].powerResource != 0xFF)\r
361 {\r
362 retStatus = Board_tps65941GetVoltage(handle,\r
363 slaveAddr,\r
364 voltageSetCfg[index].powerResource,\r
365 &voltageSetCfg[index].millivolts);\r
366 if(retStatus != BOARD_SOK)\r
367 {\r
368 UART_printf("Failed to set the voltage for Power resource %d\n", voltageSetCfg[index].powerResource);\r
369 retStatus = -1;\r
370 return retStatus;\r
371 }\r
372 else\r
373 {\r
374 UART_printf("Power Resource %d Millivolts %d\n", voltageSetCfg[index].powerResource,\r
375 voltageSetCfg[index].millivolts);\r
376 }\r
377 index++;\r
378 }\r
379 return retStatus;\r
380 }\r
381 \r
382 /**\r
383 * \brief This function is runs the RTC, RTC Interrupt and voltage\r
384 * switching functionality tests in TPS65941 PMIC.\r
385 *\r
386 * \return int8_t\r
387 * 0 - in case of success\r
388 * -1 - in case of failure.\r
389 */\r
390 static int32_t BoardDiag_leoPmicTest()\r
391 {\r
392 int32_t status;\r
393 uint8_t input;\r
394 I2C_Handle handle = NULL;\r
395 \r
396 handle = Board_getI2CHandle(BOARD_SOC_DOMAIN_WKUP,\r
397 BOARD_I2C_PMIC_INSTANCE);\r
398 \r
399 if(handle == NULL)\r
400 {\r
401 UART_printf("I2C Open failed!\n");\r
402 status = -1;\r
403 return status;\r
404 }\r
405 \r
406 status = BoardDiag_leoPmicRtcTest(handle, BOARD_I2C_LEO_PMIC_A_ADDR);\r
407 \r
408 status = BoardDiag_leoPmicRtcIntrTest(handle, BOARD_I2C_LEO_PMIC_A_ADDR);\r
409 \r
410 status = BoardDiag_leoPmicGetVoltage(handle, BOARD_I2C_LEO_PMIC_A_ADDR, gpmicaVoltGetCfg);\r
411 if(status != 0)\r
412 {\r
413 UART_printf("Failed the read voltage from Leo PMIC A\n");\r
414 status = -1;\r
415 return status;\r
416 }\r
417 status = BoardDiag_leoPmicGetVoltage(handle, BOARD_I2C_LEO_PMIC_B_ADDR, gpmicbVoltGetCfg);\r
418 if(status != 0)\r
419 {\r
420 UART_printf("Failed the read voltage from Leo PMIC B\n");\r
421 status = -1;\r
422 return status;\r
423 }\r
424 \r
425 UART_printf("\nSetting Leo PMIC A VDD_CPU_AVS to 0.77 V\n");\r
426 UART_printf("Setting Leo PMIC A VDD1_LPDDR4_1V8 to 1.725 V\n");\r
427 status = BoardDiag_leoPmicSetVoltage(handle, BOARD_I2C_LEO_PMIC_A_ADDR, gpmicaVoltSetCfg);\r
428 if(status != 0)\r
429 {\r
430 UART_printf("Failed the set voltage to Leo PMIC A\n");\r
431 status = -1;\r
432 return status;\r
433 }\r
434 UART_printf("\nSetting Leo PMIC B VDD_CPU to 0.77 V\n");\r
435 UART_printf("Setting Leo PMIC B VDD_SD_DV to 3.150 V\n");\r
436 status = BoardDiag_leoPmicSetVoltage(handle, BOARD_I2C_LEO_PMIC_B_ADDR, gpmicbVoltSetCfg);\r
437 if(status != 0)\r
438 {\r
439 UART_printf("Failed the set voltage to Leo PMIC B\n");\r
440 status = -1;\r
441 return status;\r
442 }\r
443 Board_delay(1000);\r
444 \r
445 UART_printf("Press Enter after probing the voltage\n");\r
446 UART_scanFmt("%d", &input);\r
447 UART_printf("Reverting back to previous voltage\n");\r
448 status = BoardDiag_leoPmicSetVoltage(handle, BOARD_I2C_LEO_PMIC_A_ADDR, gpmicaVoltGetCfg);\r
449 if(status != 0)\r
450 {\r
451 UART_printf("Failed the read voltage from Leo PMIC A\n");\r
452 status = -1;\r
453 return status;\r
454 }\r
455 status = BoardDiag_leoPmicSetVoltage(handle, BOARD_I2C_LEO_PMIC_B_ADDR, gpmicbVoltGetCfg);\r
456 if(status != 0)\r
457 {\r
458 UART_printf("Failed the read voltage from Leo PMIC B\n");\r
459 status = -1;\r
460 return status;\r
461 }\r
462 \r
463 return status;\r
464 }\r
465 \r
466 /**\r
467 * \brief Leo PMIC test main function\r
468 *\r
469 * \return int - Leo PMIC test status.\r
470 * 0 - in case of success\r
471 * -1 - in case of failure.\r
472 *\r
473 */\r
474 int main(void)\r
475 {\r
476 int32_t status;\r
477 Board_initCfg boardCfg;\r
478 \r
479 #ifdef PDK_RAW_BOOT\r
480 boardCfg = BOARD_INIT_PINMUX_CONFIG |\r
481 BOARD_INIT_UART_STDIO;\r
482 #else\r
483 boardCfg = BOARD_INIT_UART_STDIO;\r
484 #endif\r
485 \r
486 status = Board_init(boardCfg);\r
487 if(status != BOARD_SOK)\r
488 {\r
489 status = -1;\r
490 return status;\r
491 }\r
492 \r
493 UART_printf("\n*********************************************\n");\r
494 UART_printf ("* Leo PMIC Test *\n");\r
495 UART_printf ("*********************************************\n");\r
496 \r
497 status = BoardDiag_leoPmicTest();\r
498 if(status == 0)\r
499 {\r
500 UART_printf("Leo PMIC test completed successfully\n");\r
501 status = -1;\r
502 }\r
503 \r
504 return 0;\r
505 \r
506 }\r