]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/pdk.git/blob - packages/ti/board/src/j7200_evm/board_i2c_io_exp.c
Merge pull request #46 in PROCESSOR-SDK/pdk from review_PRSDK-7418 to master
[processor-sdk/pdk.git] / packages / ti / board / src / j7200_evm / board_i2c_io_exp.c
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