]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/pdk.git/blob - packages/ti/board/src/devices/audio/pcm3168A.c
board-rtos: add to PDK
[processor-sdk/pdk.git] / packages / ti / board / src / devices / audio / pcm3168A.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  * \file  pcm3168A.c\r
35  *\r
36  * \brief APIs to configure the pcm3168A codec.\r
37  *\r
38  */\r
39 \r
40 #include "pcm3168A.h"\r
41 #include <ti/board/src/devices/common/common.h>\r
42 \r
43 /** PCM codec default configurations */\r
44 uint8_t pcmConfigs[31][2] =\r
45 {\r
46         { BOARD_PCM3168_MODECTRL_REG_ADDR,               0xC0 },\r
47         { BOARD_PCM3168_DAC_PWR_MST_FMT_REG_ADDR,        0x00 },\r
48         { BOARD_PCM3168_DAC_OP_FLT_REG_ADDR,             0x00 },\r
49         { BOARD_PCM3168_DAC_INV_REG_ADDR,                0x00 },\r
50         { BOARD_PCM3168_DAC_MUTE_REG_ADDR,               0x00 },\r
51         { BOARD_PCM3168_DAC_ZERO_REG_ADDR,               0x00 },\r
52         { BOARD_PCM3168_DAC_ATT_DEMP_ZF_REG_ADDR,        0x10 },\r
53         { BOARD_PCM3168_DAC_VOL_MASTER_REG_ADDR,         0xff },\r
54         { BOARD_PCM3168_DAC_VOL_CHAN_START_REG_ADDR,     0xff },\r
55         { BOARD_PCM3168_DAC_VOL_CHAN_START_REG_ADDR + 1, 0xff },\r
56         { BOARD_PCM3168_DAC_VOL_CHAN_START_REG_ADDR + 2, 0xff },\r
57         { BOARD_PCM3168_DAC_VOL_CHAN_START_REG_ADDR + 3, 0xff },\r
58         { BOARD_PCM3168_DAC_VOL_CHAN_START_REG_ADDR + 4, 0xff },\r
59         { BOARD_PCM3168_DAC_VOL_CHAN_START_REG_ADDR + 5, 0xff },\r
60         { BOARD_PCM3168_DAC_VOL_CHAN_START_REG_ADDR + 6, 0xff },\r
61         { BOARD_PCM3168_DAC_VOL_CHAN_START_REG_ADDR + 7, 0xff },\r
62         { BOARD_PCM3168_ADC_SMODE_REG_ADDR,              0x00 },\r
63         { BOARD_PCM3168_ADC_MST_FMT_REG_ADDR,            0x00 },\r
64         { BOARD_PCM3168_ADC_PWR_HPFB_REG_ADDR,           0x00 },\r
65         { BOARD_PCM3168_ADC_SEAD_REG_ADDR,               0x00 },\r
66         { BOARD_PCM3168_ADC_INV_REG_ADDR,                0x00 },\r
67         { BOARD_PCM3168_ADC_MUTE_REG_ADDR,               0x00 },\r
68         { BOARD_PCM3168_ADC_OV_REG_ADDR,                 0x00 },\r
69         { BOARD_PCM3168_ADC_ATT_OVF_REG_ADDR,            0x00 },\r
70         { BOARD_PCM3168_ADC_VOL_MASTER_REG_ADDR,         0xd7 },\r
71         { BOARD_PCM3168_ADC_VOL_CHAN_START_REG_ADDR,     0xd7 },\r
72         { BOARD_PCM3168_ADC_VOL_CHAN_START_REG_ADDR + 1, 0xd7 },\r
73         { BOARD_PCM3168_ADC_VOL_CHAN_START_REG_ADDR + 2, 0xd7 },\r
74         { BOARD_PCM3168_ADC_VOL_CHAN_START_REG_ADDR + 3, 0xd7 },\r
75         { BOARD_PCM3168_ADC_VOL_CHAN_START_REG_ADDR + 4, 0xd7 },\r
76         { BOARD_PCM3168_ADC_VOL_CHAN_START_REG_ADDR + 5, 0xd7 }\r
77 };\r
78 \r
79 /**\r
80  * \brief   This function is used to configure the PCM3168A codec.\r
81  *\r
82  * All the registers of PCM code shall be configured to default\r
83  * value by this function.\r
84  *\r
85  * \param   handle       [IN] I2C driver handle\r
86  * \param       slaveAddr    [IN] Codec slave address\r
87  *\r
88  * \return  BOARD_SOK in case of success or appropriate error code.\r
89  */\r
90 Board_STATUS Board_pcm3168Config(void *handle, uint8_t slaveAddr)\r
91 {\r
92     Board_STATUS boardStatus = BOARD_SOK;\r
93     uint8_t regCount = 0;\r
94 \r
95         if(handle == NULL)\r
96         {\r
97                 return BOARD_INVALID_PARAM;\r
98         }\r
99 \r
100     for(regCount=0; regCount<31; regCount++)\r
101     {\r
102         boardStatus = Board_pcm3168RegWrite(handle,\r
103                                             slaveAddr,\r
104                                             pcmConfigs[regCount][0],\r
105                                             &(pcmConfigs[regCount][1]));\r
106         if(boardStatus != BOARD_SOK)\r
107         {\r
108             return boardStatus;\r
109         }\r
110     }\r
111     return boardStatus;\r
112 }\r
113 \r
114 /**\r
115  * \brief       This function is used to control the DAC sampling mode\r
116  *                              00 - Auto\r
117  *                              01 - Single rate\r
118  *                              10 - Dual rate\r
119  *                              11 - Quad rate\r
120  *\r
121  * \n       Reset Control register     - 0x40\r
122  *\r
123  * \param   handle        [IN] I2C driver handle\r
124  * \param   slaveAddr     [IN] Codec slave address\r
125  * \param   samplingMode  [IN] Sampling mode select\r
126  *\r
127  * \return  BOARD_SOK in case of success or appropriate error code.\r
128  *\r
129  */\r
130 static Board_STATUS Board_pcm3168DACSamplingModeSel(void *handle,\r
131                                                     uint8_t slaveAddr,\r
132                                                     uint8_t samplingMode)\r
133 {\r
134     Board_STATUS boardStatus = BOARD_SOK;\r
135     uint8_t regData = 0;\r
136 \r
137         if(handle == NULL)\r
138         {\r
139                 return BOARD_INVALID_PARAM;\r
140         }\r
141 \r
142     if(samplingMode > BOARD_PCM3168_QUAD_RATE)\r
143     {\r
144         return BOARD_INVALID_PARAM;\r
145     }\r
146 \r
147     boardStatus = Board_pcm3168RegRead(handle,\r
148                                        slaveAddr,\r
149                                                                            BOARD_PCM3168_MODECTRL_REG_ADDR,\r
150                                        &regData);\r
151     if(boardStatus != BOARD_SOK)\r
152     {\r
153         return boardStatus;\r
154     }\r
155 \r
156     regData &= ~(BOARD_PCM3168_SRDA_BIT_MASK);\r
157     regData |= (samplingMode << BOARD_PCM3168_SRDA_SHIFT_CNT);\r
158     boardStatus = Board_pcm3168RegWrite(handle,\r
159                                                                             slaveAddr,\r
160                                                                             BOARD_PCM3168_MODECTRL_REG_ADDR,\r
161                                                                             &regData);\r
162     if(boardStatus != BOARD_SOK)\r
163     {\r
164         return boardStatus;\r
165     }\r
166 \r
167     return boardStatus;  \r
168 }\r
169 \r
170 /**\r
171  * \brief       This function is used to control the ADC sampling mode\r
172  *                              00 - Auto\r
173  *                              01 - Single rate\r
174  *                              10 - Dual rate\r
175  *                              11 - Reserved\r
176  *\r
177  * \n       ADC Sampling Mode register - 0x50\r
178  *\r
179  * \param   handle        [IN] I2C driver handle\r
180  * \param   slaveAddr     [IN] Codec slave address\r
181  * \param   samplingMode  [IN] Sampling mode select\r
182  *\r
183  * \return  BOARD_SOK in case of success or appropriate error code.\r
184  *\r
185  */\r
186 static Board_STATUS Board_pcm3168ADCSamplingModeSel(void *handle,\r
187                                                     uint8_t slaveAddr,\r
188                                                     uint8_t samplingMode)\r
189 {\r
190     Board_STATUS boardStatus = BOARD_SOK;\r
191     uint8_t regData = 0;\r
192 \r
193         if(handle == NULL)\r
194         {\r
195                 return BOARD_INVALID_PARAM;\r
196         }\r
197 \r
198     if(samplingMode > BOARD_PCM3168_DUAL_RATE)\r
199     {\r
200         return BOARD_INVALID_PARAM;\r
201     }\r
202 \r
203     boardStatus = Board_pcm3168RegRead(handle,\r
204                                        slaveAddr,\r
205                                                                            BOARD_PCM3168_ADC_SMODE_REG_ADDR,\r
206                                        &regData);\r
207     if(boardStatus != BOARD_SOK)\r
208     {\r
209         return boardStatus;\r
210     }\r
211 \r
212     regData &= ~(BOARD_PCM3168_SRAD_BIT_MASK);\r
213     regData |= (samplingMode << BOARD_PCM3168_SRAD_SHIFT_CNT);\r
214     boardStatus = Board_pcm3168RegWrite(handle,\r
215                                                                             slaveAddr,\r
216                                                                             BOARD_PCM3168_ADC_SMODE_REG_ADDR,\r
217                                                                             &regData);\r
218     if(boardStatus != BOARD_SOK)\r
219     {\r
220         return boardStatus;\r
221     }\r
222 \r
223     return boardStatus;\r
224   \r
225 }\r
226 \r
227 /**\r
228  * \brief   This function is used to control the DAC audio interface mode.\r
229  *\r
230  *                              000 - SlaveMode\r
231  *                              001 - Master mode, 768 fS\r
232  *                              010 - Master mode, 512 fS\r
233  *                              011 - Master mode, 384 fS\r
234  *                              100 - Master mode, 256 fS\r
235  *              101 - Master mode, 192 fS\r
236  *                              110 - Master mode, 128 fS\r
237  *\r
238  * \n       DAC Control 1 register - 0x41\r
239  *\r
240  * \param   handle        [IN] I2C driver handle\r
241  * \param   slaveAddr     [IN] Codec slave address\r
242  * \param   mscfgMode     [IN] Master/slave mode select\r
243  *\r
244  * \return  BOARD_SOK in case of success or appropriate error code.\r
245  *\r
246  */\r
247 static Board_STATUS Board_pcm3168DACMasterSlaveModeSel(void    *handle,\r
248                                                        uint8_t slaveAddr,\r
249                                                        uint8_t mscfgMode)\r
250 {\r
251     Board_STATUS boardStatus = BOARD_SOK;\r
252     uint8_t regData = 0;\r
253 \r
254         if(handle == NULL)\r
255         {\r
256                 return BOARD_INVALID_PARAM;\r
257         }\r
258 \r
259     if(mscfgMode > BOARD_PCM3168_MASTER_MODE_128FS)\r
260     {\r
261         return BOARD_INVALID_PARAM;\r
262     }\r
263 \r
264     boardStatus = Board_pcm3168RegRead(handle,\r
265                                        slaveAddr,\r
266                                                                            BOARD_PCM3168_DAC_PWR_MST_FMT_REG_ADDR,\r
267                                        &regData);\r
268     if(boardStatus != BOARD_SOK)\r
269     {\r
270         return boardStatus;\r
271     }\r
272 \r
273     regData &= ~(BOARD_PCM3168_MSDA_BIT_MASK);\r
274     regData |= (mscfgMode << BOARD_PCM3168_MSDA_SHIFT_CNT);\r
275     boardStatus = Board_pcm3168RegWrite(handle,\r
276                                                                             slaveAddr,\r
277                                                                             BOARD_PCM3168_DAC_PWR_MST_FMT_REG_ADDR,\r
278                                                                             &regData);\r
279     if(boardStatus != BOARD_SOK)\r
280     {\r
281         return boardStatus;\r
282     }\r
283 \r
284     return boardStatus;\r
285 }\r
286 \r
287 /**\r
288  * \brief   This function is used to control the ADC audio interface mode.\r
289  *\r
290  *                              000 - SlaveMode\r
291  *                              001 - Master mode, 768 fS\r
292  *                              010 - Master mode, 512 fS\r
293  *                              011 - Master mode, 384 fS\r
294  *                              100 - Master mode, 256 fS\r
295  *\r
296  * \n       ADC Control 1 register - 0x51\r
297  *\r
298  * \param   handle        [IN] I2C driver handle\r
299  * \param   slaveAddr     [IN] Codec slave address\r
300  * \param   mscfgMode     [IN] Master/slave mode select\r
301  *\r
302  * \return  BOARD_SOK in case of success or appropriate error code.\r
303  *\r
304  */\r
305 static Board_STATUS Board_pcm3168ADCMasterSlaveModeSel(void    *handle,\r
306                                                        uint8_t slaveAddr,\r
307                                                        uint8_t mscfgMode)\r
308 {\r
309     Board_STATUS boardStatus = BOARD_SOK;\r
310     uint8_t regData = 0;\r
311 \r
312         if(handle == NULL)\r
313         {\r
314                 return BOARD_INVALID_PARAM;\r
315         }\r
316 \r
317     if(mscfgMode > BOARD_PCM3168_MASTER_MODE_256FS)\r
318     {\r
319         return BOARD_INVALID_PARAM;\r
320     }\r
321 \r
322     boardStatus = Board_pcm3168RegRead(handle,\r
323                                        slaveAddr,\r
324                                                                            BOARD_PCM3168_ADC_MST_FMT_REG_ADDR,\r
325                                        &regData);\r
326     if(boardStatus != BOARD_SOK)\r
327     {\r
328         return boardStatus;\r
329     }\r
330 \r
331     regData &= ~(BOARD_PCM3168_MSAD_BIT_MASK);\r
332     regData |= (mscfgMode << BOARD_PCM3168_MSAD_SHIFT_CNT);\r
333     boardStatus = Board_pcm3168RegWrite(handle,\r
334                                                                             slaveAddr,\r
335                                                                             BOARD_PCM3168_ADC_MST_FMT_REG_ADDR,\r
336                                                                             &regData);\r
337     if(boardStatus != BOARD_SOK)\r
338     {\r
339         return boardStatus;\r
340     }\r
341 \r
342     return boardStatus;\r
343 }\r
344 \r
345 /**\r
346  * \brief   This function is used to control the ADC audio interface format.\r
347  *                              000 - 24-bit I2S format\r
348  *                              001 - 24-bit left-justified format\r
349  *                              010 - 24-bit right-justified format\r
350  *                              011 - 16-bit right-justified format\r
351  *                              100 - 24-bit I2S mode DSP format\r
352  *                              101 - 24-bit left-justified mode DSP format\r
353  *                              110 - 24-bit I2S mode TDM format\r
354  *              111 - 24-bit left-justified mode TDM format\r
355  *\r
356  * \n       ADC Control 1 register - 0x51\r
357  *\r
358  * \param   handle        [IN] I2C driver handle\r
359  * \param       slaveAddr     [IN] Codec slave address\r
360  * \param   fmt                   [IN] Audio format\r
361  *\r
362  * \return  BOARD_SOK in case of success or appropriate error code.\r
363  */\r
364 static Board_STATUS Board_pcm3168ADCAudioFmtSel(void    *handle,\r
365                                                 uint8_t slaveAddr,\r
366                                                 uint8_t fmt)\r
367 {\r
368     Board_STATUS boardStatus = BOARD_SOK;\r
369     uint8_t regData = 0;\r
370 \r
371         if(handle == NULL)\r
372         {\r
373                 return BOARD_INVALID_PARAM;\r
374         }\r
375 \r
376     if(fmt > BOARD_PCM3168_24B_LJ_TDM_FMT)\r
377     {\r
378         return BOARD_INVALID_PARAM;\r
379     }\r
380 \r
381     boardStatus = Board_pcm3168RegRead(handle,\r
382                                        slaveAddr,\r
383                                                                            BOARD_PCM3168_ADC_MST_FMT_REG_ADDR,\r
384                                        &regData);\r
385     if(boardStatus != BOARD_SOK)\r
386     {\r
387         return boardStatus;\r
388     }\r
389 \r
390     regData &= ~(BOARD_PCM3168_FMTAD_BIT_MASK);\r
391     regData |= (fmt << BOARD_PCM3168_FMTAD_SHIFT_CNT);\r
392     boardStatus = Board_pcm3168RegWrite(handle,\r
393                                                                             slaveAddr,\r
394                                                                             BOARD_PCM3168_ADC_MST_FMT_REG_ADDR,\r
395                                                                             &regData);\r
396     if(boardStatus != BOARD_SOK)\r
397     {\r
398         return boardStatus;\r
399     }\r
400 \r
401     return boardStatus;    \r
402 }\r
403 \r
404 /**\r
405  * \brief   This function is used to control the DAC audio interface format.\r
406  *                              0000 - 24-bit I2S format\r
407  *                              0001 - 24-bit left-justified format\r
408  *                              0010 - 24-bit right-justified format\r
409  *                              0011 - 16-bit right-justified format\r
410  *                              0100 - 24-bit I2S mode DSP format\r
411  *                              0101 - 24-bit left-justified mode DSP format\r
412  *                              0110 - 24-bit I2S mode TDM format\r
413  *              0111 - 24-bit left-justified mode TDM format\r
414  *              1000 - 24-bit high-speed I2S mode TDM format\r
415  *              1001 - 24-bit high-speed left-justified mode TDM format\r
416  *\r
417  * \n       DAC: DAC Control 1 register - 0x41\r
418  *\r
419  * \param   handle        [IN] I2C driver handle\r
420  * \param       slaveAddr     [IN] Codec slave address\r
421  * \param   fmt                   [IN] Audio format\r
422  *\r
423  * \return  BOARD_SOK in case of success or appropriate error code.\r
424  */\r
425 static Board_STATUS Board_pcm3168DACAudioFmtSel(void    *handle,\r
426                                                 uint8_t slaveAddr,\r
427                                                 uint8_t fmt)\r
428 {\r
429     Board_STATUS boardStatus = BOARD_SOK;\r
430     uint8_t regData = 0;\r
431 \r
432         if(handle == NULL)\r
433         {\r
434                 return BOARD_INVALID_PARAM;\r
435         }\r
436 \r
437     if(fmt > BOARD_PCM3168_24B_HS_LJ_TDM_FMT)\r
438     {\r
439         return BOARD_INVALID_PARAM;\r
440     }\r
441 \r
442     boardStatus = Board_pcm3168RegRead(handle,\r
443                                        slaveAddr,\r
444                                                                            BOARD_PCM3168_DAC_PWR_MST_FMT_REG_ADDR,\r
445                                        &regData);\r
446     if(boardStatus != BOARD_SOK)\r
447     {\r
448         return boardStatus;\r
449     }\r
450 \r
451     regData &= ~(BOARD_PCM3168_FMTDA_BIT_MASK);\r
452     regData |= (fmt << BOARD_PCM3168_FMTDA_SHIFT_CNT);\r
453     boardStatus = Board_pcm3168RegWrite(handle,\r
454                                                                             slaveAddr,\r
455                                                                             BOARD_PCM3168_DAC_PWR_MST_FMT_REG_ADDR,\r
456                                                                             &regData);\r
457     if(boardStatus != BOARD_SOK)\r
458     {\r
459         return boardStatus;\r
460     }\r
461 \r
462     return boardStatus;    \r
463 }\r
464 \r
465 /**\r
466  * \brief   This function is used to enable or disable the Soft Mute\r
467  *          function for the corresponding DAC outputs\r
468  *                              0  - Mute Disabled\r
469  *              1  - Mute Enabled\r
470  *\r
471  * \n       DAC Soft Mute register - 0x44\r
472  *\r
473  * \param   handle        [IN] I2C driver handle\r
474  * \param       slaveAddr     [IN] Codec slave address\r
475  * \param       chanNum       [IN] Channel Number to configure\r
476  *                                                              0 - All channels by default \r
477  * \param   muteCtrl      [IN] Soft mute enable or disable\r
478  *\r
479  * \return  BOARD_SOK in case of success or appropriate error code.\r
480  */\r
481 static Board_STATUS Board_pcm3168DACSoftMuteCtrl(void    *handle,\r
482                                                                                      uint8_t slaveAddr,\r
483                                                                                      uint8_t chanNum,\r
484                                                                                  uint8_t muteCtrl)\r
485 {\r
486     Board_STATUS boardStatus = BOARD_SOK;\r
487     uint8_t regData = 0;\r
488 \r
489         if(handle == NULL)\r
490         {\r
491                 return BOARD_INVALID_PARAM;\r
492         }\r
493 \r
494     if(chanNum > BOARD_PCM3168_CHANNEL_8)\r
495     {\r
496         return BOARD_INVALID_PARAM;\r
497     }\r
498     \r
499     if(chanNum == BOARD_PCM3168_CHANNEL_0)\r
500     {\r
501         if(muteCtrl == BOARD_PCM3168_MUTE_ENABLE)\r
502         {\r
503             regData = 0xFF;\r
504         }\r
505         boardStatus = Board_pcm3168RegWrite(handle,\r
506                                             slaveAddr,\r
507                                             BOARD_PCM3168_DAC_MUTE_REG_ADDR,\r
508                                             &regData);\r
509         if(boardStatus != BOARD_SOK)\r
510         {\r
511             return boardStatus;\r
512         }\r
513     }\r
514     else\r
515     {\r
516         boardStatus = Board_pcm3168RegRead(handle,\r
517                                            slaveAddr,\r
518                                            BOARD_PCM3168_DAC_MUTE_REG_ADDR,\r
519                                            &regData);\r
520         if(boardStatus != BOARD_SOK)\r
521         {\r
522             return boardStatus;\r
523         }\r
524 \r
525         if(muteCtrl == BOARD_PCM3168_MUTE_DISABLE)\r
526         {\r
527            regData &= ~(1 <<(chanNum-1));\r
528         }\r
529         else\r
530         {\r
531            regData |= (1 << (chanNum-1));\r
532         }\r
533         boardStatus = Board_pcm3168RegWrite(handle,\r
534                                             slaveAddr,\r
535                                             BOARD_PCM3168_DAC_MUTE_REG_ADDR,\r
536                                             &regData);\r
537         if(boardStatus != BOARD_SOK)\r
538         {\r
539             return boardStatus;\r
540         }\r
541     }\r
542 \r
543     return boardStatus;     \r
544 }\r
545 \r
546 /**\r
547  * \brief   This function is used to enable or disable the Soft Mute\r
548  *          function for the corresponding ADC outputs\r
549  *                              0  - Mute Disabled\r
550  *              1  - Mute Enabled\r
551  *\r
552  * \n       ADC Soft Mute register - 0x55\r
553  *\r
554  * \param   handle        [IN] I2C driver handle\r
555  * \param       slaveAddr     [IN] Codec slave address\r
556  * \param       chanNum       [IN] Channel Number to configure\r
557  *                                                              0 - All channels by default \r
558  * \param   muteCtrl      [IN] Soft mute enable or disable\r
559  *\r
560  * \return  BOARD_SOK in case of success or appropriate error code.\r
561  */\r
562 static Board_STATUS Board_pcm3168ADCSoftMuteCtrl(void    *handle,\r
563                                                                                      uint8_t slaveAddr,\r
564                                                                                      uint8_t chanNum,\r
565                                                                                  uint8_t muteCtrl)\r
566 {\r
567     Board_STATUS boardStatus = BOARD_SOK;\r
568     uint8_t regData = 0;\r
569 \r
570         if(handle == NULL)\r
571         {\r
572                 return BOARD_INVALID_PARAM;\r
573         }\r
574 \r
575     if(chanNum > BOARD_PCM3168_CHANNEL_6)\r
576     {\r
577         return BOARD_INVALID_PARAM;\r
578     }\r
579 \r
580     if(chanNum == BOARD_PCM3168_CHANNEL_0)\r
581     {\r
582         if(muteCtrl == BOARD_PCM3168_MUTE_ENABLE)\r
583         {\r
584             regData = 0x3F;\r
585         }\r
586         boardStatus = Board_pcm3168RegWrite(handle,\r
587                                             slaveAddr,\r
588                                             BOARD_PCM3168_ADC_MUTE_REG_ADDR,\r
589                                             &regData);\r
590         if(boardStatus != BOARD_SOK)\r
591         {\r
592             return boardStatus;\r
593         }\r
594     }\r
595     else\r
596     {\r
597         boardStatus = Board_pcm3168RegRead(handle,\r
598                                            slaveAddr,\r
599                                            BOARD_PCM3168_ADC_MUTE_REG_ADDR,\r
600                                            &regData);\r
601         if(boardStatus != BOARD_SOK)\r
602         {\r
603             return boardStatus;\r
604         }\r
605         if(muteCtrl == BOARD_PCM3168_MUTE_DISABLE)\r
606         {\r
607            regData &= ~(1 << (chanNum-1));\r
608         }\r
609         else\r
610         {\r
611            regData |= (1 << (chanNum-1));\r
612         }\r
613         boardStatus = Board_pcm3168RegWrite(handle,\r
614                                             slaveAddr,\r
615                                             BOARD_PCM3168_ADC_MUTE_REG_ADDR,\r
616                                             &regData);\r
617         if(boardStatus != BOARD_SOK)\r
618         {\r
619             return boardStatus;\r
620         }\r
621     }\r
622     return boardStatus;     \r
623 }\r
624 \r
625 /**\r
626  * \brief   This function is used to set the DAC attenuation level for each\r
627  *                      channel independently.\r
628  *\r
629  * \n       DAC Attenuation register  -  0x47\r
630  *\r
631  * \param   handle        [IN] I2C driver handle\r
632  * \param       slaveAddr     [IN] Codec slave address\r
633  * \param       chanNum       [IN] Channel Number to configure\r
634  *                                                              0 - All channels by default \r
635  * \param   attLevel      [IN] Attenuation level \r
636  *\r
637  * \return  BOARD_SOK in case of success or appropriate error code.\r
638  */                                                                \r
639 static Board_STATUS Board_pcm3168DACAttnLevelSet(void    *handle,\r
640                                                                                      uint8_t slaveAddr,\r
641                                                                                      uint8_t chanNum,\r
642                                                                                      uint8_t attLevel)\r
643 {\r
644     Board_STATUS boardStatus = BOARD_SOK;\r
645     uint8_t regData = attLevel;\r
646 \r
647         if(handle == NULL)\r
648         {\r
649                 return BOARD_INVALID_PARAM;\r
650         }\r
651 \r
652     if(chanNum > BOARD_PCM3168_CHANNEL_8)\r
653     {\r
654         return BOARD_INVALID_PARAM;\r
655     }\r
656 \r
657     boardStatus = Board_pcm3168RegWrite(handle,\r
658                                                                             slaveAddr,\r
659                                                                             BOARD_PCM3168_DAC_VOL_MASTER_REG_ADDR + chanNum,\r
660                                                                             &regData);\r
661     if(boardStatus != BOARD_SOK)\r
662     {\r
663         return boardStatus;\r
664     }\r
665 \r
666     return boardStatus;    \r
667 }\r
668 \r
669 /**\r
670  * \brief   This function is used to set the DAC attenuation level for each\r
671  *                      channel independently.\r
672  *\r
673  * \n       DAC Attenuation register  -  0x47\r
674  *\r
675  * \param   handle        [IN] I2C driver handle\r
676  * \param       slaveAddr     [IN] Codec slave address\r
677  * \param       chanNum       [IN] Channel Number to configure\r
678  *                                                              0 - All channels by default \r
679  * \param   attLevel      [IN] Attenuation level \r
680  *\r
681  * \return  BOARD_SOK in case of success or appropriate error code.\r
682  */                                                                \r
683 static Board_STATUS Board_pcm3168ADCAttnLevelSet(void    *handle,\r
684                                                                                      uint8_t slaveAddr,\r
685                                                                                      uint8_t chanNum,\r
686                                                                                      uint8_t attLevel)\r
687 {\r
688     Board_STATUS boardStatus = BOARD_SOK;\r
689     uint8_t regData = attLevel;\r
690 \r
691         if(handle == NULL)\r
692         {\r
693                 return BOARD_INVALID_PARAM;\r
694         }\r
695 \r
696     if(chanNum > BOARD_PCM3168_CHANNEL_6)\r
697     {\r
698         return BOARD_INVALID_PARAM;\r
699     }\r
700 \r
701     boardStatus = Board_pcm3168RegWrite(handle,\r
702                                                                             slaveAddr,\r
703                                                                             BOARD_PCM3168_ADC_VOL_MASTER_REG_ADDR + chanNum,\r
704                                                                             &regData);\r
705     if(boardStatus != BOARD_SOK)\r
706     {\r
707         return boardStatus;\r
708     }\r
709 \r
710     return boardStatus;\r
711 }\r
712 \r
713 /**\r
714  * \brief   This function is used to read the Codec register value\r
715  * \r
716  * \param   handle          [IN]     I2C instance handle.\r
717  * \param   slaveAddr       [IN]     Codec Slave Address\r
718  * \param   regAddr         [IN]     register Address of the Codec\r
719  * \param   regData         [IN/OUT] register Data \r
720  *\r
721  * \return  BOARD_SOK in case of success or appropriate error code.\r
722  */\r
723 Board_STATUS Board_pcm3168RegRead(void *handle,\r
724                                   uint8_t slaveAddr,\r
725                                   uint8_t regAddr,\r
726                                   uint8_t *regData)\r
727 {\r
728     Board_STATUS boardStatus = BOARD_SOK;\r
729 \r
730         if(handle == NULL)\r
731         {\r
732                 return BOARD_INVALID_PARAM;\r
733         }\r
734 \r
735     boardStatus = Board_i2c8BitRegRd(handle,\r
736                                      slaveAddr,\r
737                                                                          regAddr,\r
738                                      regData,\r
739                                      BOARD_I2C_NUM_OF_BYTES_1,\r
740                                      BOARD_I2C_TRANSACTION_TIMEOUT);\r
741     return boardStatus;\r
742 }\r
743 \r
744 /**\r
745  * \brief   This function is used to write the register data to the\r
746  *          PCM Codec.\r
747  *\r
748  * \param   handle          [IN] I2C instance handle.\r
749  * \param   slaveAddr       [IN]  Codec Slave Address\r
750  * \param   regAddr         [IN]  register Address of the Codec\r
751  * \param   regData         [OUT] register Data\r
752  *\r
753  * \return  BOARD_SOK in case of success or appropriate error code.\r
754  */\r
755 Board_STATUS Board_pcm3168RegWrite(void *handle,\r
756                                    uint8_t slaveAddr,\r
757                                    uint8_t regAddr,\r
758                                    uint8_t *regData)\r
759 {\r
760     Board_STATUS boardStatus = BOARD_SOK;\r
761 \r
762         if(handle == NULL)\r
763         {\r
764                 return BOARD_INVALID_PARAM;\r
765         }\r
766 \r
767     boardStatus = Board_i2c8BitRegWr(handle,\r
768                                                                          slaveAddr,\r
769                                                                          regAddr,\r
770                                                                          regData,\r
771                                      BOARD_I2C_NUM_OF_BYTES_1,\r
772                                      BOARD_I2C_TRANSACTION_TIMEOUT);\r
773 \r
774     return boardStatus;\r
775 }\r
776 \r
777 /**\r
778  * \brief   This function is used to set the mode control register reset to the\r
779  *                      default value\r
780  *                              0  -  Writes default value to mode control register\r
781  *                              1  -  Normal operation\r
782  *\r
783  * \n       Reset Control register - 0x40\r
784  *\r
785  * \param   handle        [IN] I2C driver handle\r
786  * \param   slaveAddr     [IN] Codec slave address\r
787  * \param   modeCtrl      [IN] Mode control register reset for the ADC and DAC\r
788  *\r
789  * \return  BOARD_SOK in case of success or appropriate error code.\r
790  *\r
791  */\r
792 Board_STATUS Board_pcm3168ModeCtrl(void   *handle,\r
793                                                                    uint8_t slaveAddr,\r
794                                                                    uint8_t modeCtrl)\r
795 {\r
796     Board_STATUS boardStatus = BOARD_SOK;\r
797     uint8_t regData = 0;\r
798 \r
799         if(handle == NULL)\r
800         {\r
801                 return BOARD_INVALID_PARAM;\r
802         }\r
803 \r
804     boardStatus = Board_pcm3168RegRead(handle,\r
805                                        slaveAddr,\r
806                                                                            BOARD_PCM3168_MODECTRL_REG_ADDR,\r
807                                        &regData);\r
808     if(boardStatus != BOARD_SOK)\r
809     {\r
810         return boardStatus;\r
811     }\r
812 \r
813     regData &= ~(BOARD_PCM3168_MRST_BIT_MASK);\r
814     regData |= (modeCtrl << BOARD_PCM3168_MRST_SHIFT_CNT);\r
815     boardStatus = Board_pcm3168RegWrite(handle,\r
816                                                                             slaveAddr,\r
817                                                                             BOARD_PCM3168_MODECTRL_REG_ADDR,\r
818                                                                             &regData);\r
819     if(boardStatus != BOARD_SOK)\r
820     {\r
821         return boardStatus;\r
822     }\r
823 \r
824     return boardStatus;\r
825 }                                          \r
826 \r
827 /**\r
828  * \brief  This function is used to control the  system reset\r
829  *                              0  - Restarts the system by resyncronizing the system clock and\r
830  *                                   sampling clock\r
831  *                              1  - Normal operation\r
832  *\r
833  * \n       Reset Control register - 0x40\r
834  *\r
835  * \param   handle        [IN] I2C driver handle\r
836  * \param   slaveAddr     [IN] Codec slave address\r
837  * \param   modeCtrl      [IN] System reset for the ADC and DAC\r
838  *\r
839  * \return  BOARD_SOK in case of success or appropriate error code.\r
840  *\r
841  */\r
842 Board_STATUS Board_pcm3168Reset(void    *handle,\r
843                                                                 uint8_t slaveAddr,\r
844                                                             uint8_t modeCtrl)\r
845 {\r
846     Board_STATUS boardStatus = BOARD_SOK;\r
847     uint8_t regData = 0;\r
848 \r
849         if(handle == NULL)\r
850         {\r
851                 return BOARD_INVALID_PARAM;\r
852         }\r
853 \r
854     boardStatus = Board_pcm3168RegRead(handle,\r
855                                        slaveAddr,\r
856                                                                            BOARD_PCM3168_MODECTRL_REG_ADDR,\r
857                                        &regData);\r
858     if(boardStatus != BOARD_SOK)\r
859     {\r
860         return boardStatus;\r
861     }\r
862 \r
863     regData &= ~(BOARD_PCM3168_SRST_BIT_MASK);\r
864     regData |= (modeCtrl << BOARD_PCM3168_SRST_SHIFT_CNT);\r
865     boardStatus = Board_pcm3168RegWrite(handle,\r
866                                                                             slaveAddr,\r
867                                                                             BOARD_PCM3168_MODECTRL_REG_ADDR,\r
868                                                                             &regData);\r
869     if(boardStatus != BOARD_SOK)\r
870     {\r
871         return boardStatus;\r
872     }\r
873 \r
874     return boardStatus;\r
875 }\r
876 \r
877 /**\r
878  * \brief       This function is used to control the sampling mode of DAC/ADC\r
879  *                              00 - Auto\r
880  *                              01 - Single rate\r
881  *                              10 - Dual rate\r
882  *                              11 - Reserved for ADC\r
883  *              11 - Quad rate for DAC\r
884  *\r
885  * \n        DAC : Reset Control register     - 0x40\r
886  * \n            ADC : ADC Sampling Mode register - 0x50\r
887  *\r
888  * \param   handle        [IN] I2C driver handle\r
889  * \param   slaveAddr     [IN] Codec slave address\r
890  * \param   samplingMode  [IN] Sampling mode select\r
891  * \param   cfgMode       [IN] Configure ADC/DAC channel\r
892  *\r
893  * \return  BOARD_SOK in case of success or appropriate error code.\r
894  *\r
895  */\r
896 Board_STATUS Board_pcm3168SamplingModeSel(void    *handle,\r
897                                                                               uint8_t slaveAddr,\r
898                                                                               uint8_t samplingMode,\r
899                                                                                   uint8_t cfgMode)\r
900 {\r
901     Board_STATUS boardStatus = BOARD_SOK;\r
902 \r
903     if(handle == NULL)\r
904         {\r
905                 return BOARD_INVALID_PARAM;\r
906         }\r
907 \r
908     if(cfgMode > BOARD_PCM3168_CFG_ALL)\r
909     {\r
910         return BOARD_INVALID_PARAM;\r
911     }\r
912 \r
913     if((cfgMode == BOARD_PCM3168_CFG_DAC) || (cfgMode == BOARD_PCM3168_CFG_ALL))\r
914     {\r
915         boardStatus = Board_pcm3168DACSamplingModeSel(handle,\r
916                                                       slaveAddr,\r
917                                                       samplingMode);\r
918         if(boardStatus != BOARD_SOK)\r
919         {\r
920             return boardStatus;         \r
921         }\r
922     }\r
923 \r
924     if((cfgMode == BOARD_PCM3168_CFG_ADC) || (cfgMode == BOARD_PCM3168_CFG_ALL))\r
925     {\r
926         boardStatus = Board_pcm3168ADCSamplingModeSel(handle,\r
927                                                       slaveAddr,\r
928                                                       samplingMode);\r
929         if(boardStatus != BOARD_SOK)\r
930         {\r
931             return boardStatus;         \r
932         }        \r
933     }\r
934 \r
935     return boardStatus;\r
936 }\r
937 \r
938 /**\r
939  * \brief   This function is used to control the power save mode of DAC\r
940  *                      operation\r
941  *                              0 - Power-save enable  mode\r
942  *                              1 - Power-save disable mode\r
943  *\r
944  * \n       DAC Control 1 register  - 0x41\r
945  *\r
946  * \param   handle         [IN] I2C driver handle\r
947  * \param   slaveAddr      [IN] Codec slave address\r
948  * \param   pwrSaveMode    [IN] Power-save mode select\r
949  *\r
950  * \return  BOARD_SOK in case of success or appropriate error code.\r
951  *\r
952  */                                                                                      \r
953 Board_STATUS Board_pcm3168DACPwrSaveModeSel(void    *handle,\r
954                                             uint8_t slaveAddr,\r
955                                             uint8_t pwrSaveMode)\r
956 {\r
957     Board_STATUS boardStatus = BOARD_SOK;\r
958     uint8_t regData = 0;\r
959 \r
960         if(handle == NULL)\r
961         {\r
962                 return BOARD_INVALID_PARAM;\r
963         }\r
964 \r
965     boardStatus = Board_pcm3168RegRead(handle,\r
966                                        slaveAddr,\r
967                                                                            BOARD_PCM3168_DAC_PWR_MST_FMT_REG_ADDR,\r
968                                        &regData);\r
969     if(boardStatus != BOARD_SOK)\r
970     {\r
971         return boardStatus;\r
972     }\r
973 \r
974     regData &= ~(BOARD_PCM3168_PSMDA_BIT_MASK);\r
975     regData |= (pwrSaveMode << BOARD_PCM3168_PSMDA_SHIFT_CNT);\r
976     boardStatus = Board_pcm3168RegWrite(handle,\r
977                                                                             slaveAddr,\r
978                                                                             BOARD_PCM3168_DAC_PWR_MST_FMT_REG_ADDR,\r
979                                                                             &regData);\r
980     if(boardStatus != BOARD_SOK)\r
981     {\r
982         return boardStatus;\r
983     }\r
984 \r
985     return boardStatus;\r
986       \r
987 }\r
988 \r
989 /**\r
990  * \brief   This function is used to control the power save mode of ADC\r
991  *                      operation\r
992  *                              0 - normal operation\r
993  *                              1 - power-save mode\r
994  *\r
995  * \n       ADC Control 2 register      - 0x52\r
996  *\r
997  * \param   handle         [IN] I2C driver handle\r
998  * \param   slaveAddr      [IN] Codec slave address\r
999  * \param   pwrSaveMode    [IN] Power-save mode select\r
1000  *\r
1001  * \return  BOARD_SOK in case of success or appropriate error code.\r
1002  *\r
1003  */                                                                                      \r
1004 Board_STATUS Board_pcm3168ADCPwrSaveModeSel(void    *handle,\r
1005                                             uint8_t slaveAddr,\r
1006                                             uint8_t pwrSaveMode)\r
1007 {\r
1008     Board_STATUS boardStatus = BOARD_SOK;\r
1009     uint8_t regData = 0;\r
1010 \r
1011         if(handle == NULL)\r
1012         {\r
1013                 return BOARD_INVALID_PARAM;\r
1014         }\r
1015 \r
1016     boardStatus = Board_pcm3168RegRead(handle,\r
1017                                        slaveAddr,\r
1018                                                                            BOARD_PCM3168_ADC_PWR_HPFB_REG_ADDR,\r
1019                                        &regData);\r
1020     if(boardStatus != BOARD_SOK)\r
1021     {\r
1022         return boardStatus;\r
1023     }\r
1024 \r
1025     regData &= ~(BOARD_PCM3168_PSVAD_BIT_MASK);\r
1026     regData |= (((pwrSaveMode == 1) ?  0x7 : 0x00) << BOARD_PCM3168_PSVAD_SHIFT_CNT);\r
1027 \r
1028     boardStatus = Board_pcm3168RegWrite(handle,\r
1029                                                                             slaveAddr,\r
1030                                                                             BOARD_PCM3168_ADC_PWR_HPFB_REG_ADDR,\r
1031                                                                             &regData);\r
1032     if(boardStatus != BOARD_SOK)\r
1033     {\r
1034         return boardStatus;\r
1035     }\r
1036 \r
1037     return boardStatus;\r
1038 }\r
1039 \r
1040 /**\r
1041  * \brief   This function is used to control the audio interface mode.\r
1042  *\r
1043  *                              000 - SlaveMode\r
1044  *                              001 - Master mode, 768 fS\r
1045  *                              010 - Master mode, 512 fS\r
1046  *                              011 - Master mode, 384 fS\r
1047  *                              100 - Master mode, 256 fS\r
1048  *          Below modes supports only for DAC operation \r
1049  *              101 - Master mode, 192 fS\r
1050  *                              110 - Master mode, 128 fS\r
1051  *\r
1052  * \n       DAC: DAC Control 1 register - 0x41\r
1053  * \n       ADC: ADC Control 1 register - 0x51\r
1054  *\r
1055  * \param   handle        [IN] I2C driver handle\r
1056  * \param   slaveAddr     [IN] Codec slave address\r
1057  * \param   mscfgMode     [IN] Master/slave mode select\r
1058  * \param   cfgMode       [IN] Configure ADC/DAC channel\r
1059  *\r
1060  * \return  BOARD_SOK in case of success or appropriate error code.\r
1061  *\r
1062  */\r
1063 Board_STATUS Board_pcm3168MasterSlaveModeSel(void    *handle,\r
1064                                                                                  uint8_t slaveAddr,\r
1065                                                                                  uint8_t mscfgMode,\r
1066                                                                                          uint8_t cfgMode)\r
1067 {\r
1068      Board_STATUS boardStatus = BOARD_SOK;\r
1069 \r
1070     if(handle == NULL)\r
1071         {\r
1072                 return BOARD_INVALID_PARAM;\r
1073         }\r
1074 \r
1075     if(cfgMode > BOARD_PCM3168_CFG_ALL)\r
1076     {\r
1077         return BOARD_INVALID_PARAM;\r
1078     }\r
1079 \r
1080     if((cfgMode == BOARD_PCM3168_CFG_DAC) || (cfgMode == BOARD_PCM3168_CFG_ALL))\r
1081     {\r
1082         boardStatus = Board_pcm3168DACMasterSlaveModeSel(handle,\r
1083                                                          slaveAddr,\r
1084                                                          mscfgMode);\r
1085         if(boardStatus != BOARD_SOK)\r
1086         {\r
1087             return boardStatus;\r
1088         }\r
1089     }\r
1090 \r
1091     if((cfgMode == BOARD_PCM3168_CFG_ADC) || (cfgMode == BOARD_PCM3168_CFG_ALL))\r
1092     {\r
1093         boardStatus = Board_pcm3168ADCMasterSlaveModeSel(handle,\r
1094                                                          slaveAddr,\r
1095                                                          mscfgMode);\r
1096         if(boardStatus != BOARD_SOK)\r
1097         {\r
1098             return boardStatus;\r
1099         }   \r
1100     }\r
1101 \r
1102     return boardStatus;\r
1103 }\r
1104                                                \r
1105 /**\r
1106  * \brief   This function is used to control the audio interface format.\r
1107  *                              000 - 24-bit I2S format\r
1108  *                              001 - 24-bit left-justified format\r
1109  *                              010 - 24-bit right-justified format\r
1110  *                              011 - 16-bit right-justified format\r
1111  *                              100 - 24-bit I2S mode DSP format\r
1112  *                              101 - 24-bit left-justified mode DSP format\r
1113  *                              110 - 24-bit I2S mode TDM format\r
1114  *              111 - 24-bit left-justified mode TDM format\r
1115  *          Below modes support only for DAC configuration\r
1116  *              1000 - 24-bit high-speed I2S mode TDM format\r
1117  *              1001 - 24-bit high-speed left-justified mode TDM format\r
1118  *\r
1119  * \n       DAC: DAC Control 1 register - 0x41\r
1120  * \n       ADC: ADC Control 1 register - 0x51\r
1121  *\r
1122  * \param   handle        [IN] I2C driver handle\r
1123  * \param       slaveAddr     [IN] Codec slave address\r
1124  * \param   fmt                   [IN] Audio format\r
1125  * \param   cfgMode       [IN] Configure ADC/DAC channel\r
1126  *\r
1127  * \return  BOARD_SOK in case of success or appropriate error code.\r
1128  */\r
1129 Board_STATUS Board_pcm3168AudioFmtSel(void    *handle,\r
1130                                                                           uint8_t slaveAddr,\r
1131                                                                       uint8_t fmt,\r
1132                                                                           uint8_t cfgMode)\r
1133 {\r
1134      Board_STATUS boardStatus = BOARD_SOK;\r
1135 \r
1136     if(handle == NULL)\r
1137         {\r
1138                 return BOARD_INVALID_PARAM;\r
1139         }\r
1140 \r
1141     if(cfgMode > BOARD_PCM3168_CFG_ALL)\r
1142     {\r
1143         return BOARD_INVALID_PARAM;\r
1144     }\r
1145 \r
1146     if((cfgMode == BOARD_PCM3168_CFG_DAC) || (cfgMode == BOARD_PCM3168_CFG_ALL))\r
1147     {\r
1148         boardStatus = Board_pcm3168DACAudioFmtSel(handle,\r
1149                                                   slaveAddr,\r
1150                                                   fmt);\r
1151         if(boardStatus != BOARD_SOK)\r
1152         {\r
1153             return boardStatus;\r
1154         }\r
1155     }\r
1156 \r
1157     if((cfgMode == BOARD_PCM3168_CFG_ADC) || (cfgMode == BOARD_PCM3168_CFG_ALL))\r
1158     {\r
1159         boardStatus = Board_pcm3168ADCAudioFmtSel(handle,\r
1160                                                   slaveAddr,\r
1161                                                   fmt);\r
1162         if(boardStatus != BOARD_SOK)\r
1163         {\r
1164             return boardStatus;\r
1165         }\r
1166     }\r
1167 \r
1168     return boardStatus;\r
1169 }\r
1170 \r
1171 /**\r
1172  * \brief   This function is used to control the DAC operation mode.\r
1173  *\r
1174  *                      In operation disable mode,the DAC output is cut off from DIN with\r
1175  *          a fade-out sequence, and the internal DAC data is reset.\r
1176  *                      DAC output is forced into VCOMDA if PSMDA = 1\r
1177  *          DAC output is forced into AGNDDA and goes into a power-down state\r
1178  *                      if PSMDA = 0.\r
1179  *                  In normal operating mode, a fade-in sequence is applied on the DAC\r
1180  *                      output in resume process.\r
1181  *                         0 - Normal mode\r
1182  *                                 1 - Operation disable with or without power save\r
1183  *\r
1184  * \n       DAC Control 2 register -  0x42\r
1185  *\r
1186  * \param   handle        [IN] I2C driver handle\r
1187  * \param       slaveAddr     [IN] Codec slave address\r
1188  * \param   opMode            [IN] Enable/Disable the power-save mode\r
1189  *\r
1190  * \return  BOARD_SOK in case of success or appropriate error code.\r
1191  */\r
1192 Board_STATUS Board_pcm3168DACOperationalCtrl(void    *handle,\r
1193                                                                              uint8_t slaveAddr,\r
1194                                                                              uint8_t opMode)\r
1195 {\r
1196     Board_STATUS boardStatus = BOARD_SOK;\r
1197     uint8_t regData = 0;\r
1198 \r
1199         if(handle == NULL)\r
1200         {\r
1201                 return BOARD_INVALID_PARAM;\r
1202         }\r
1203 \r
1204     boardStatus = Board_pcm3168RegRead(handle,\r
1205                                        slaveAddr,\r
1206                                                                            BOARD_PCM3168_DAC_OP_FLT_REG_ADDR,\r
1207                                        &regData);\r
1208     if(boardStatus != BOARD_SOK)\r
1209     {\r
1210         return boardStatus;\r
1211     }\r
1212 \r
1213     regData |= (((opMode == 1) ? 0x0F : 0) << BOARD_PCM3168_OPED_SHIFT_CNT);\r
1214     boardStatus = Board_pcm3168RegWrite(handle,\r
1215                                                                             slaveAddr,\r
1216                                                                             BOARD_PCM3168_DAC_OP_FLT_REG_ADDR,\r
1217                                                                             &regData);\r
1218     if(boardStatus != BOARD_SOK)\r
1219     {\r
1220         return boardStatus;\r
1221     }\r
1222 \r
1223     return boardStatus;\r
1224 }\r
1225 \r
1226 /**\r
1227  * \brief   This function is used to enable or disable the Soft Mute\r
1228  *          function for the corresponding DAC/ADC outputs\r
1229  *                              0  - Mute Disabled\r
1230  *              1  - Mute Enabled\r
1231  *\r
1232  * \n       DAC: DAC Soft Mute register - 0x44\r
1233  * \n       ADC: ADC Soft Mute register - 0x55\r
1234  *\r
1235  * \param   handle        [IN] I2C driver handle\r
1236  * \param       slaveAddr     [IN] Codec slave address\r
1237  * \param       chanNum       [IN] Channel Number to configure\r
1238  *                                                              0 - All channels by default \r
1239  * \param   muteCtrl      [IN] Soft mute enable or disable\r
1240  * \param   cfgMode       [IN] Configure ADC/DAC channel\r
1241  *\r
1242  * \return  BOARD_SOK in case of success or appropriate error code.\r
1243  */\r
1244 Board_STATUS Board_pcm3168SoftMuteCtrl(void    *handle,\r
1245                                                                            uint8_t slaveAddr,\r
1246                                                                            uint8_t chanNum,\r
1247                                                                        uint8_t muteCtrl,\r
1248                                                                            uint8_t cfgMode)\r
1249 {\r
1250      Board_STATUS boardStatus = BOARD_SOK;\r
1251 \r
1252     if(handle == NULL)\r
1253         {\r
1254                 return BOARD_INVALID_PARAM;\r
1255         }\r
1256 \r
1257     if(cfgMode > BOARD_PCM3168_CFG_ALL)\r
1258     {\r
1259         return BOARD_INVALID_PARAM;\r
1260     }\r
1261 \r
1262     if((cfgMode == BOARD_PCM3168_CFG_DAC) || (cfgMode == BOARD_PCM3168_CFG_ALL))\r
1263     {\r
1264         \r
1265         boardStatus = Board_pcm3168DACSoftMuteCtrl(handle,\r
1266                                                    slaveAddr,\r
1267                                                    chanNum,\r
1268                                                    muteCtrl);\r
1269         if(boardStatus != BOARD_SOK)\r
1270         {\r
1271             return boardStatus;\r
1272         }\r
1273     }\r
1274 \r
1275     if((cfgMode == BOARD_PCM3168_CFG_ADC) || (cfgMode == BOARD_PCM3168_CFG_ALL))\r
1276     {\r
1277         boardStatus = Board_pcm3168ADCSoftMuteCtrl(handle,\r
1278                                                    slaveAddr,\r
1279                                                    chanNum,\r
1280                                                    muteCtrl);\r
1281         if(boardStatus != BOARD_SOK)\r
1282         {\r
1283             return boardStatus;\r
1284         }\r
1285     }\r
1286 \r
1287     return boardStatus;\r
1288 }\r
1289 \r
1290 /**\r
1291  * \brief   This function is used to set the attenuation level for each channel\r
1292  *                      independently.\r
1293  *\r
1294  * \n       DAC :DAC Attenuation register  -  0x47\r
1295  * \n       ADC :ADC Attenuation register  -  0x58\r
1296  *\r
1297  * \param   handle        [IN] I2C driver handle\r
1298  * \param       slaveAddr     [IN] Codec slave address\r
1299  * \param       chanNum       [IN] Channel Number to configure\r
1300  *                                                              0 - All channels by default \r
1301  * \param   attLevel      [IN] Attenuation level\r
1302  * \param   cfgMode       [IN] Configure ADC/DAC channel \r
1303  *\r
1304  * \return  BOARD_SOK in case of success or appropriate error code.\r
1305  */                                                                \r
1306 Board_STATUS Board_pcm3168AttnLevelSet(void    *handle,\r
1307                                                                            uint8_t slaveAddr,\r
1308                                                                            uint8_t chanNum,\r
1309                                                                            uint8_t attLevel,\r
1310                                                                            uint8_t cfgMode)\r
1311 {\r
1312      Board_STATUS boardStatus = BOARD_SOK;\r
1313 \r
1314     if(handle == NULL)\r
1315         {\r
1316                 return BOARD_INVALID_PARAM;\r
1317         }\r
1318 \r
1319     if(cfgMode > BOARD_PCM3168_CFG_ALL)\r
1320     {\r
1321         return BOARD_INVALID_PARAM;\r
1322     }\r
1323 \r
1324     if((cfgMode == BOARD_PCM3168_CFG_DAC) || (cfgMode == BOARD_PCM3168_CFG_ALL))\r
1325     {\r
1326         boardStatus = Board_pcm3168DACAttnLevelSet(handle,\r
1327                                                    slaveAddr,\r
1328                                                    chanNum,\r
1329                                                    attLevel);\r
1330         if(boardStatus != BOARD_SOK)\r
1331         {\r
1332             return boardStatus;\r
1333         }\r
1334     }\r
1335 \r
1336     if((cfgMode == BOARD_PCM3168_CFG_ADC) || (cfgMode == BOARD_PCM3168_CFG_ALL))\r
1337     {\r
1338         boardStatus = Board_pcm3168ADCAttnLevelSet(handle,\r
1339                                                    slaveAddr,\r
1340                                                    chanNum,\r
1341                                                    attLevel);\r
1342         if(boardStatus != BOARD_SOK)\r
1343         {\r
1344             return boardStatus;\r
1345         }\r
1346     }\r
1347 \r
1348     return boardStatus;\r
1349 }\r
1350 \r
1351 /* End of file */\r