1 /******************************************************************************\r
2 * Copyright (c) 2018 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 board_i2c_io_exp.c\r
36 *\r
37 * \brief This file contains the API's for accessing the i2c IO Expander.\r
38 *\r
39 */\r
40 \r
41 #include "board_i2c_io_exp.h"\r
42 \r
43 I2C_Handle gIoExpI2cHandle = NULL;\r
44 extern Board_I2cInitCfg_t gBoardI2cInitCfg;\r
45 \r
46 /**\r
47 * \brief Reads the current configuration of direction port.\r
48 *\r
49 * \param slaveAddr [IN] I2C Slave Address.\r
50 * \param ioExpType [IN] IO expander type.\r
51 * X_PORT_IOEXP - Total number of ports\r
52 * in slave device.\r
53 * \param portNum [IN] Port number of the i2c slave device\r
54 * PORTNUM_X - Port number of a slave\r
55 * device.\r
56 * \param data [IN/OUT] Pointer to the data buffer to store\r
57 * the pin level data of a specified port.\r
58 *\r
59 * \return Board_STATUS in case of success or appropriate error code.\r
60 *\r
61 */\r
62 Board_STATUS Board_i2cIoExpReadDirPort(uint8_t slaveAddr,\r
63 i2cIoExpType_t ioExpType,\r
64 i2cIoExpPortNumber_t portNum,\r
65 uint8_t *data)\r
66 {\r
67 Board_STATUS ret = BOARD_SOK;\r
68 uint8_t subAddr;\r
69 I2C_Transaction transaction;\r
70 \r
71 if(gIoExpI2cHandle == NULL)\r
72 {\r
73 return BOARD_INVALID_PARAM;\r
74 }\r
75 \r
76 if (ioExpType == ONE_PORT_IOEXP)\r
77 {\r
78 subAddr = BOARD_1PORT_IOEXP_CONFIGURATION_CMD;\r
79 }\r
80 else if (ioExpType == TWO_PORT_IOEXP)\r
81 {\r
82 if(portNum == PORTNUM_0)\r
83 {\r
84 subAddr = BOARD_2PORT_IOEXP_PORT0_CONFIGURATION_CMD;\r
85 }\r
86 else if(portNum == PORTNUM_1)\r
87 {\r
88 subAddr = BOARD_2PORT_IOEXP_PORT1_CONFIGURATION_CMD;\r
89 }\r
90 else\r
91 {\r
92 return BOARD_INVALID_PARAM;\r
93 }\r
94 }\r
95 else if (ioExpType == THREE_PORT_IOEXP)\r
96 {\r
97 if(portNum == PORTNUM_0)\r
98 {\r
99 subAddr = BOARD_3PORT_IOEXP_PORT0_CONFIGURATION_CMD;\r
100 }\r
101 else if(portNum == PORTNUM_1)\r
102 {\r
103 subAddr = BOARD_3PORT_IOEXP_PORT1_CONFIGURATION_CMD;\r
104 }\r
105 else if(portNum == PORTNUM_2)\r
106 {\r
107 subAddr = BOARD_3PORT_IOEXP_PORT2_CONFIGURATION_CMD;\r
108 }\r
109 else\r
110 {\r
111 return BOARD_INVALID_PARAM;\r
112 }\r
113 }\r
114 else\r
115 {\r
116 return BOARD_INVALID_PARAM;\r
117 }\r
118 \r
119 /* Initializes the I2C transaction structure with default values */\r
120 I2C_transactionInit(&transaction);\r
121 \r
122 /*Control Byte followed by read bit */\r
123 transaction.slaveAddress = slaveAddr;\r
124 transaction.writeBuf = &subAddr;\r
125 transaction.readBuf = data;\r
126 transaction.writeCount = 1;\r
127 transaction.readCount = 0;\r
128 \r
129 BOARD_delay(200);\r
130 \r
131 ret = I2C_transfer(gIoExpI2cHandle, &transaction);\r
132 if(ret != I2C_STS_SUCCESS)\r
133 {\r
134 ret = BOARD_I2C_TRANSFER_FAIL;\r
135 return ret;\r
136 }\r
137 \r
138 transaction.writeCount = 0;\r
139 transaction.readCount = 1;\r
140 \r
141 BOARD_delay(20000);\r
142 \r
143 ret = I2C_transfer(gIoExpI2cHandle, &transaction);\r
144 if(ret != I2C_STS_SUCCESS)\r
145 {\r
146 ret = BOARD_I2C_TRANSFER_FAIL;\r
147 return ret;\r
148 }\r
149 \r
150 return BOARD_SOK;\r
151 }\r
152 \r
153 /**\r
154 * \brief Reads the current configuration of output port.\r
155 *\r
156 * \param slaveAddr [IN] I2C Slave Address.\r
157 * \param ioExpType [IN] IO expander type.\r
158 * X_PORT_IOEXP - Total number of ports\r
159 * in slave device.\r
160 * \param portNum [IN] Port number of the i2c slave device\r
161 * PORTNUM_X - Port number of a slave\r
162 * device.\r
163 * \param data [IN/OUT] Pointer to the data buffer to store\r
164 * the pin level data of a specified port.\r
165 *\r
166 * \return Board_STATUS in case of success or appropriate error code.\r
167 *\r
168 */\r
169 Board_STATUS Board_i2cIoExpReadOutputPort(uint8_t slaveAddr,\r
170 i2cIoExpType_t ioExpType,\r
171 i2cIoExpPortNumber_t portNum,\r
172 uint8_t *data)\r
173 {\r
174 Board_STATUS ret = BOARD_SOK;\r
175 uint8_t subAddr;\r
176 I2C_Transaction transaction;\r
177 \r
178 if(gIoExpI2cHandle == NULL)\r
179 {\r
180 return BOARD_INVALID_PARAM;\r
181 }\r
182 \r
183 if (ioExpType == ONE_PORT_IOEXP)\r
184 {\r
185 subAddr = BOARD_1PORT_IOEXP_OUTPUT_CMD;\r
186 }\r
187 else if (ioExpType == TWO_PORT_IOEXP)\r
188 {\r
189 if(portNum == PORTNUM_0)\r
190 {\r
191 subAddr = BOARD_2PORT_IOEXP_PORT0_OUTPUT_CMD;\r
192 }\r
193 else if(portNum == PORTNUM_1)\r
194 {\r
195 subAddr = BOARD_2PORT_IOEXP_PORT1_OUTPUT_CMD;\r
196 }\r
197 else\r
198 {\r
199 return BOARD_INVALID_PARAM;\r
200 }\r
201 }\r
202 else if (ioExpType == THREE_PORT_IOEXP)\r
203 {\r
204 if(portNum == PORTNUM_0)\r
205 {\r
206 subAddr = BOARD_3PORT_IOEXP_PORT0_OUTPUT_CMD;\r
207 }\r
208 else if(portNum == PORTNUM_1)\r
209 {\r
210 subAddr = BOARD_3PORT_IOEXP_PORT1_OUTPUT_CMD;\r
211 }\r
212 else if(portNum == PORTNUM_2)\r
213 {\r
214 subAddr = BOARD_3PORT_IOEXP_PORT2_OUTPUT_CMD;\r
215 }\r
216 else\r
217 {\r
218 return BOARD_INVALID_PARAM;\r
219 }\r
220 }\r
221 else\r
222 {\r
223 return BOARD_INVALID_PARAM;\r
224 }\r
225 \r
226 /* Initializes the I2C transaction structure with default values */\r
227 I2C_transactionInit(&transaction);\r
228 \r
229 /*Control Byte followed by read bit */\r
230 transaction.slaveAddress = slaveAddr;\r
231 transaction.writeBuf = &subAddr;\r
232 transaction.readBuf = data;\r
233 transaction.writeCount = 1;\r
234 transaction.readCount = 0;\r
235 \r
236 BOARD_delay(200);\r
237 \r
238 ret = I2C_transfer(gIoExpI2cHandle, &transaction);\r
239 if(ret != I2C_STS_SUCCESS)\r
240 {\r
241 ret = BOARD_I2C_TRANSFER_FAIL;\r
242 return ret;\r
243 }\r
244 \r
245 transaction.writeCount = 0;\r
246 transaction.readCount = 1;\r
247 \r
248 BOARD_delay(20000);\r
249 \r
250 ret = I2C_transfer(gIoExpI2cHandle, &transaction);\r
251 if(ret != I2C_STS_SUCCESS)\r
252 {\r
253 ret = BOARD_I2C_TRANSFER_FAIL;\r
254 return ret;\r
255 }\r
256 \r
257 return BOARD_SOK;\r
258 }\r
259 \r
260 /**\r
261 * \brief Reads the signal level of all the pins of the specified port.\r
262 *\r
263 * \param slaveAddr [IN] I2C Slave Address.\r
264 * \param ioExpType [IN] IO expander type.\r
265 * X_PORT_IOEXP - Total number of ports\r
266 * in slave device.\r
267 * \param portNum [IN] Port number of the i2c slave device\r
268 * PORTNUM_X - Port number of a slave\r
269 * device.\r
270 * \param data [IN/OUT] Pointer to the data buffer to store\r
271 * the pin level data of a specified port.\r
272 *\r
273 * \return Board_STATUS in case of success or appropriate error code.\r
274 *\r
275 */\r
276 Board_STATUS Board_i2cIoExpReadInputPort(uint8_t slaveAddr,\r
277 i2cIoExpType_t ioExpType,\r
278 i2cIoExpPortNumber_t portNum,\r
279 uint8_t *data)\r
280 {\r
281 Board_STATUS ret = BOARD_SOK;\r
282 uint8_t subAddr;\r
283 I2C_Transaction transaction;\r
284 \r
285 if(gIoExpI2cHandle == NULL)\r
286 {\r
287 return BOARD_INVALID_PARAM;\r
288 }\r
289 \r
290 if (ioExpType == ONE_PORT_IOEXP)\r
291 {\r
292 subAddr = BOARD_1PORT_IOEXP_INPUT_CMD;\r
293 }\r
294 else if (ioExpType == TWO_PORT_IOEXP)\r
295 {\r
296 if(portNum == PORTNUM_0)\r
297 {\r
298 subAddr = BOARD_2PORT_IOEXP_PORT0_INPUT_CMD;\r
299 }\r
300 else if(portNum == PORTNUM_1)\r
301 {\r
302 subAddr = BOARD_2PORT_IOEXP_PORT1_INPUT_CMD;\r
303 }\r
304 else\r
305 {\r
306 return BOARD_INVALID_PARAM;\r
307 }\r
308 }\r
309 else if (ioExpType == THREE_PORT_IOEXP)\r
310 {\r
311 if(portNum == PORTNUM_0)\r
312 {\r
313 subAddr = BOARD_3PORT_IOEXP_PORT0_INPUT_CMD;\r
314 }\r
315 else if(portNum == PORTNUM_1)\r
316 {\r
317 subAddr = BOARD_3PORT_IOEXP_PORT1_INPUT_CMD;\r
318 }\r
319 else if(portNum == PORTNUM_2)\r
320 {\r
321 subAddr = BOARD_3PORT_IOEXP_PORT2_INPUT_CMD;\r
322 }\r
323 else\r
324 {\r
325 return BOARD_INVALID_PARAM;\r
326 }\r
327 }\r
328 else\r
329 {\r
330 return BOARD_INVALID_PARAM;\r
331 }\r
332 \r
333 /* Initializes the I2C transaction structure with default values */\r
334 I2C_transactionInit(&transaction);\r
335 \r
336 /*Control Byte followed by read bit */\r
337 transaction.slaveAddress = slaveAddr;\r
338 transaction.writeBuf = &subAddr;\r
339 transaction.readBuf = data;\r
340 transaction.writeCount = 1;\r
341 transaction.readCount = 0;\r
342 \r
343 BOARD_delay(200);\r
344 \r
345 ret = I2C_transfer(gIoExpI2cHandle, &transaction);\r
346 if(ret != I2C_STS_SUCCESS)\r
347 {\r
348 ret = BOARD_I2C_TRANSFER_FAIL;\r
349 return ret;\r
350 }\r
351 \r
352 transaction.writeCount = 0;\r
353 transaction.readCount = 1;\r
354 \r
355 BOARD_delay(20000);\r
356 \r
357 ret = I2C_transfer(gIoExpI2cHandle, &transaction);\r
358 if(ret != I2C_STS_SUCCESS)\r
359 {\r
360 ret = BOARD_I2C_TRANSFER_FAIL;\r
361 return ret;\r
362 }\r
363 \r
364 return BOARD_SOK;\r
365 }\r
366 \r
367 /**\r
368 * \brief Sets the direction of all the pins of the specified Port.\r
369 *\r
370 * \param slaveAddr [IN] I2C Slave Address.\r
371 * \param ioExpType [IN] IO expander type.\r
372 * X_PORT_IOEXP - Total number of ports\r
373 * in that slave device.\r
374 * \param portNum [IN] Port number of the i2c slave device\r
375 * PORTNUM_X - Port number of a\r
376 * slave device.\r
377 * \param data [IN] Register data to be configured.\r
378 *\r
379 * \return Board_STATUS in case of success or appropriate error code.\r
380 *\r
381 */\r
382 Board_STATUS Board_i2cIoExpSetPortDirection(uint8_t slaveAddr,\r
383 i2cIoExpType_t ioExpType,\r
384 i2cIoExpPortNumber_t portNum,\r
385 uint8_t data)\r
386 {\r
387 Board_STATUS ret = BOARD_SOK;\r
388 uint8_t dataBuff[2] = {0};\r
389 I2C_Transaction transaction;\r
390 \r
391 if(gIoExpI2cHandle == NULL)\r
392 {\r
393 return BOARD_INVALID_PARAM;\r
394 }\r
395 \r
396 if (ioExpType == ONE_PORT_IOEXP)\r
397 {\r
398 dataBuff[0] = BOARD_1PORT_IOEXP_CONFIGURATION_CMD;\r
399 }\r
400 else if (ioExpType == TWO_PORT_IOEXP)\r
401 {\r
402 if(portNum == PORTNUM_0)\r
403 {\r
404 dataBuff[0] = BOARD_2PORT_IOEXP_PORT0_CONFIGURATION_CMD;\r
405 }\r
406 else if(portNum == PORTNUM_1)\r
407 {\r
408 dataBuff[0] = BOARD_2PORT_IOEXP_PORT1_CONFIGURATION_CMD;\r
409 }\r
410 else\r
411 {\r
412 return -1;\r
413 }\r
414 }\r
415 else if (ioExpType == THREE_PORT_IOEXP)\r
416 {\r
417 if(portNum == PORTNUM_0)\r
418 {\r
419 dataBuff[0] = BOARD_3PORT_IOEXP_PORT0_CONFIGURATION_CMD;\r
420 }\r
421 else if(portNum == PORTNUM_1)\r
422 {\r
423 dataBuff[0] = BOARD_3PORT_IOEXP_PORT1_CONFIGURATION_CMD;\r
424 }\r
425 else if(portNum == PORTNUM_2)\r
426 {\r
427 dataBuff[0] = BOARD_3PORT_IOEXP_PORT2_CONFIGURATION_CMD;\r
428 }\r
429 else\r
430 {\r
431 return -1;\r
432 }\r
433 }\r
434 else\r
435 {\r
436 return -1;\r
437 }\r
438 \r
439 dataBuff[1] = data;\r
440 \r
441 /* Initializes the I2C transaction structure with default values */\r
442 I2C_transactionInit(&transaction);\r
443 \r
444 /* Control Byte followed by write bit */\r
445 transaction.slaveAddress = slaveAddr;\r
446 transaction.writeBuf = &dataBuff;\r
447 transaction.writeCount = 2;\r
448 transaction.readCount = 0;\r
449 \r
450 BOARD_delay(200);\r
451 \r
452 ret = I2C_transfer(gIoExpI2cHandle, &transaction);\r
453 if(ret != I2C_STS_SUCCESS)\r
454 {\r
455 ret = BOARD_I2C_TRANSFER_FAIL;\r
456 return ret;\r
457 }\r
458 \r
459 return BOARD_SOK;\r
460 }\r
461 \r
462 /**\r
463 * \brief Sets the direction of the specified pin of the specified port.\r
464 *\r
465 * \param slaveAddr [IN] I2C Slave Address.\r
466 * \param ioExpType [IN] IO expander type.\r
467 * X_PORT_IOEXP - Total number of ports\r
468 * in slave device.\r
469 * \param portNum [IN] Port number of the i2c slave device\r
470 * PORTNUM_X - Port number of a slave\r
471 * device.\r
472 * \param pinNum [IN] Pin with in the specified port of\r
473 * the i2c slave device.\r
474 * PIN_NUM_X - Pin number.\r
475 * \param direction [IN] Direction of the pin to be configured.\r
476 *\r
477 * \return Board_STATUS in case of success or appropriate error code.\r
478 *\r
479 */\r
480 Board_STATUS Board_i2cIoExpSetPinDirection(uint8_t slaveAddr,\r
481 i2cIoExpType_t ioExpType,\r
482 i2cIoExpPortNumber_t portNum,\r
483 i2cIoExpPinNumber_t pinNum,\r
484 i2cIoExpPinDirection_t direction)\r
485 {\r
486 Board_STATUS ret = BOARD_SOK;\r
487 uint8_t dataBuff[2] = {0};\r
488 uint8_t data;\r
489 I2C_Transaction transaction;\r
490 \r
491 if(gIoExpI2cHandle == NULL)\r
492 {\r
493 return BOARD_INVALID_PARAM;\r
494 }\r
495 \r
496 if (ioExpType == ONE_PORT_IOEXP)\r
497 {\r
498 dataBuff[0] = BOARD_1PORT_IOEXP_CONFIGURATION_CMD;\r
499 }\r
500 else if (ioExpType == TWO_PORT_IOEXP)\r
501 {\r
502 if(portNum == PORTNUM_0)\r
503 {\r
504 dataBuff[0] = BOARD_2PORT_IOEXP_PORT0_CONFIGURATION_CMD;\r
505 }\r
506 else if(portNum == PORTNUM_1)\r
507 {\r
508 dataBuff[0] = BOARD_2PORT_IOEXP_PORT1_CONFIGURATION_CMD;\r
509 }\r
510 else\r
511 {\r
512 return BOARD_INVALID_PARAM;\r
513 }\r
514 }\r
515 else if (ioExpType == THREE_PORT_IOEXP)\r
516 {\r
517 if(portNum == PORTNUM_0)\r
518 {\r
519 dataBuff[0] = BOARD_3PORT_IOEXP_PORT0_CONFIGURATION_CMD;\r
520 }\r
521 else if(portNum == PORTNUM_1)\r
522 {\r
523 dataBuff[0] = BOARD_3PORT_IOEXP_PORT1_CONFIGURATION_CMD;\r
524 }\r
525 else if(portNum == PORTNUM_2)\r
526 {\r
527 dataBuff[0] = BOARD_3PORT_IOEXP_PORT2_CONFIGURATION_CMD;\r
528 }\r
529 else\r
530 {\r
531 return BOARD_INVALID_PARAM;\r
532 }\r
533 }\r
534 else\r
535 {\r
536 return BOARD_INVALID_PARAM;\r
537 }\r
538 \r
539 Board_i2cIoExpReadDirPort(slaveAddr, ioExpType, portNum, &data);\r
540 if(direction == PIN_DIRECTION_OUTPUT)\r
541 {\r
542 dataBuff[1] = ((data & ~(1 << pinNum)) | (0 << pinNum));\r
543 }\r
544 else\r
545 {\r
546 dataBuff[1] = ((data & ~(1 << pinNum)) | (1 << pinNum));\r
547 }\r
548 \r
549 /* Initializes the I2C transaction structure with default values */\r
550 I2C_transactionInit(&transaction);\r
551 \r
552 /* Control Byte followed by write bit */\r
553 transaction.slaveAddress = slaveAddr;\r
554 transaction.writeBuf = &dataBuff;\r
555 transaction.writeCount = 2;\r
556 transaction.readCount = 0;\r
557 \r
558 BOARD_delay(200);\r
559 \r
560 ret = I2C_transfer(gIoExpI2cHandle, &transaction);\r
561 if(ret != I2C_STS_SUCCESS)\r
562 {\r
563 ret = BOARD_I2C_TRANSFER_FAIL;\r
564 return ret;\r
565 }\r
566 \r
567 return BOARD_SOK;\r
568 }\r
569 \r
570 /**\r
571 * \brief Sets the signal level of all the pins of the specified port.\r
572 *\r
573 * \param slaveAddr [IN] I2C Slave Address.\r
574 * \param ioExpType [IN] IO expander type.\r
575 * X_PORT_IOEXP - Total number of ports\r
576 * in slave device.\r
577 * \param portNum [IN] Port number of the i2c slave device\r
578 * PORTNUM_X - Port number of a slave\r
579 * device.\r
580 * \param data [IN] Signal level data of the pins to be\r
581 * configured.\r
582 *\r
583 * \return Board_STATUS in case of success or appropriate error code.\r
584 *\r
585 */\r
586 Board_STATUS Board_i2cIoExpWritePort(uint8_t slaveAddr,\r
587 i2cIoExpType_t ioExpType,\r
588 i2cIoExpPortNumber_t portNum,\r
589 uint8_t data)\r
590 {\r
591 Board_STATUS ret = BOARD_SOK;\r
592 uint8_t dataBuff[2] = {0};\r
593 I2C_Transaction transaction;\r
594 \r
595 if(gIoExpI2cHandle == NULL)\r
596 {\r
597 return BOARD_INVALID_PARAM;\r
598 }\r
599 \r
600 if (ioExpType == ONE_PORT_IOEXP)\r
601 {\r
602 dataBuff[0] = BOARD_1PORT_IOEXP_OUTPUT_CMD;\r
603 }\r
604 else if (ioExpType == TWO_PORT_IOEXP)\r
605 {\r
606 if(portNum == PORTNUM_0)\r
607 {\r
608 dataBuff[0] = BOARD_2PORT_IOEXP_PORT0_OUTPUT_CMD;\r
609 }\r
610 else if(portNum == PORTNUM_1)\r
611 {\r
612 dataBuff[0] = BOARD_2PORT_IOEXP_PORT1_OUTPUT_CMD;\r
613 }\r
614 else\r
615 {\r
616 return BOARD_INVALID_PARAM;\r
617 }\r
618 }\r
619 else if (ioExpType == THREE_PORT_IOEXP)\r
620 {\r
621 if(portNum == PORTNUM_0)\r
622 {\r
623 dataBuff[0] = BOARD_3PORT_IOEXP_PORT0_OUTPUT_CMD;\r
624 }\r
625 else if(portNum == PORTNUM_1)\r
626 {\r
627 dataBuff[0] = BOARD_3PORT_IOEXP_PORT1_OUTPUT_CMD;\r
628 }\r
629 else if(portNum == PORTNUM_2)\r
630 {\r
631 dataBuff[0] = BOARD_3PORT_IOEXP_PORT2_OUTPUT_CMD;\r
632 }\r
633 else\r
634 {\r
635 return BOARD_INVALID_PARAM;\r
636 }\r
637 }\r
638 else\r
639 {\r
640 return BOARD_INVALID_PARAM;\r
641 }\r
642 \r
643 dataBuff[1] = data;\r
644 \r
645 /* Initializes the I2C transaction structure with default values */\r
646 I2C_transactionInit(&transaction);\r
647 \r
648 /* Control Byte followed by write bit */\r
649 transaction.slaveAddress = slaveAddr;\r
650 transaction.writeBuf = &dataBuff;\r
651 transaction.writeCount = 2;\r
652 transaction.readCount = 0;\r
653 \r
654 BOARD_delay(200);\r
655 \r
656 ret = I2C_transfer(gIoExpI2cHandle, &transaction);\r
657 if(ret != I2C_STS_SUCCESS)\r
658 {\r
659 ret = BOARD_I2C_TRANSFER_FAIL;\r
660 return ret;\r
661 }\r
662 \r
663 return BOARD_SOK;\r
664 }\r
665 \r
666 /**\r
667 * \brief Sets the signal level of the specified pin of the specified port.\r
668 *\r
669 * \param slaveAddr [IN] I2C Slave Address.\r
670 * \param ioExpType [IN] IO expander type.\r
671 * X_PORT_IOEXP - Total number of ports\r
672 * in slave device.\r
673 * \param portNum [IN] Port number of the i2c slave device\r
674 * PORTNUM_X - Port number of a slave\r
675 * device.\r
676 * \param pinNum [IN] Pin with in the specified port of\r
677 * the i2c slave device.\r
678 * PIN_NUM_X - Pin number.\r
679 * \param signalLevel [IN] Signal level data of the pin to be\r
680 * configured.\r
681 *\r
682 * \return Board_STATUS in case of success or appropriate error code.\r
683 *\r
684 */\r
685 Board_STATUS Board_i2cIoExpPinLevelSet(uint8_t slaveAddr,\r
686 i2cIoExpType_t ioExpType,\r
687 i2cIoExpPortNumber_t portNum,\r
688 i2cIoExpPinNumber_t pinNum,\r
689 i2cIoExpSignalLevel_t signalLevel)\r
690 {\r
691 Board_STATUS ret = BOARD_SOK;\r
692 uint8_t dataBuff;\r
693 uint8_t data;\r
694 \r
695 ret = Board_i2cIoExpReadOutputPort(slaveAddr, ioExpType, portNum, &data);\r
696 if(ret != BOARD_SOK)\r
697 {\r
698 ret = BOARD_I2C_TRANSFER_FAIL;\r
699 return ret;\r
700 }\r
701 \r
702 dataBuff = (signalLevel << pinNum);\r
703 data = ((data & ~(1 << pinNum)) | dataBuff);\r
704 return (Board_i2cIoExpWritePort(slaveAddr, ioExpType, portNum, data));\r
705 }\r
706 \r
707 /**\r
708 * \brief Reads the signal level of specified pin of the specified port.\r
709 *\r
710 * \param slaveAddr [IN] I2C Slave Address.\r
711 * \param ioExpType [IN] IO expander type.\r
712 * X_PORT_IOEXP - Total number of ports\r
713 * in slave device.\r
714 * \param portNum [IN] Port number of the i2c slave device.\r
715 * PORTNUM_X - Port number of a slave\r
716 * device.\r
717 * \param pinNum [IN] Pin number of the specified port.\r
718 * PIN_NUM_X - Pin number.\r
719 * \param signalLevel [IN/OUT] Data buffer to store specified pin\r
720 * level of a specified port.\r
721 *\r
722 * \return Board_STATUS in case of success or appropriate error code.\r
723 *\r
724 */\r
725 Board_STATUS Board_i2cIoExpPinLevelGet(uint8_t slaveAddr,\r
726 i2cIoExpType_t ioExpType,\r
727 i2cIoExpPortNumber_t portNum,\r
728 i2cIoExpPinNumber_t pinNum,\r
729 uint8_t *signalLevel)\r
730 {\r
731 Board_STATUS ret = BOARD_SOK;\r
732 uint8_t data;\r
733 \r
734 ret = Board_i2cIoExpReadInputPort(slaveAddr, ioExpType, portNum, &data);\r
735 if(ret != BOARD_SOK)\r
736 {\r
737 ret = BOARD_I2C_TRANSFER_FAIL;\r
738 return ret;\r
739 }\r
740 \r
741 *signalLevel = (((1 << pinNum) & (data)) >> pinNum);\r
742 \r
743 return BOARD_SOK;\r
744 }\r
745 \r
746 /**\r
747 * \brief Initializes the i2c instance connected to the i2c IO Expander.\r
748 *\r
749 * \return BOARD_SOK in case of success or appropriate error code.\r
750 *\r
751 */\r
752 Board_STATUS Board_i2cIoExpInit(void)\r
753 {\r
754 Board_STATUS ret = BOARD_SOK;\r
755 \r
756 /* If handle not opened yet, initializes i2c */\r
757 if (gIoExpI2cHandle == NULL)\r
758 {\r
759 gIoExpI2cHandle = Board_getI2CHandle(gBoardI2cInitCfg.socDomain,\r
760 gBoardI2cInitCfg.i2cInst);\r
761 if(gIoExpI2cHandle == NULL)\r
762 {\r
763 ret = BOARD_I2C_OPEN_FAIL;\r
764 }\r
765 }\r
766 \r
767 return ret;\r
768 }\r
769 \r
770 /**\r
771 * \brief de-initializes the i2c instance connected to the i2c IO Expander.\r
772 *\r
773 */\r
774 void Board_i2cIoExpDeInit(void)\r
775 {\r
776 /* Closing the i2c IO Exp Instance */\r
777 Board_i2cDeInit();\r
778 gIoExpI2cHandle = NULL;\r
779 }\r