PASDK-575: Update McASP LLD configurations for analog in and analog out.
[processor-sdk/performance-audio-sr.git] / pasdk / test_dsp / application / itopo / evmk2g / mcasp_cfg.c
1 /*
2  * Copyright (c) 2015, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  */
34 /**
35  * \file      mcasp_config.c
36  *
37  * \brief     Configures McASP module
38  *
39  */
41 #include "mcasp_cfg.h"
42 #include "ioConfig.h"
44 #define AUDIO_DAC0_TEST
46 /* McASP device handles - one for each McASP port. */
47 Ptr mcaspDevHandles[NUM_MCASP_PORTS] = {NULL, NULL, NULL};
49 /* McASP parameters needed by mcaspBindDev */
50 Mcasp_Params mcaspParams;
52 /* Error flag */
53 uint32_t gblErrFlag = 0;
54 Error_Block eb;
56 void GblErr(Mcasp_errCbStatus arg);
58 /* Handle to eDMA */
59 extern EDMA3_DRV_Handle hEdma0;
60 extern EDMA3_DRV_Handle hEdma1;
62 /* External function declarations */
63 extern void McaspDevice_init(void);
64 extern signed char*  getGlobalAddr(signed char* addr);
66 #ifdef IO_LOOPBACK_TEST
67 extern void mcaspAppCallbackRx(void* arg, MCASP_Packet *mcasp_packet);
68 extern void mcaspAppCallbackTx(void* arg, MCASP_Packet *mcasp_packet);
69 #else
70 extern void asipMcaspCallback(void* arg, MCASP_Packet *mcasp_packet);
71 extern void asopMcaspCallback(void* arg, MCASP_Packet *mcasp_packet);
72 #endif
75 /* McASP HW setup for receive (ADC) */
76 Mcasp_HwSetupData mcaspRcvSetupADC = {
77         /* .rmask    = */ 0xFFFFFFFF, /* 16 bits are to be used     */
78         /* .rfmt     = */ 0x0001C0F0, /*
79                                        * 0 bit delay from framesync
80                                        * MSB first
81                                        * No extra bit padding
82                                        * Padding bit (ignore)
83                                        * slot Size is 32
84                                        * Reads from DMA port
85                                        * NO rotation
86                                        */
87         /* .afsrctl  = */ 0X00000112, /* I2S mode - 2 slot TDM
88                                        * Frame sync is one word
89                                        * Internally generated frame sync
90                                        * Rising edge is start of frame
91                                        */
92         /* .rtdm     = */ 0x00000003, /* slot 1 and 2 are active (I2S)        */
93         /* .rintctl  = */ 0x00000000, /* sync error and overrun error         */
94         /* .rstat    = */ 0x000001FF, /* reset any existing status bits       */
95         /* .revtctl  = */ 0x00000000, /* DMA request is enabled               */
96         {
97              /* .aclkrctl  = */ 0x000000A7, // Receiver samples data on the rising edge of the serial clock
98                                             // Internal receive clock source from output of programmable bit clock divider
99                                             // Receive bit clock divide ratio = 8
100              /* .ahclkrctl = */ 0x00008000, // Internal receive high-frequency clock source from output of programmable high clock divider.
101                                             // Falling edge. AHCLKR is inverted before programmable bit clock divider.
102              /* .rclkchk   = */ 0x00000000
103         }
104 };
106 /* McASP HW setup for receive (S/PDIF or HDMI)*/
107 Mcasp_HwSetupData mcaspRcvSetupDIR = {
108         MCASP_DIR_RMASK,   /* .rmask:   0xFFFFFFFF    */
109         MCASP_DIR_RFMT,    /* .rfmt:    0x000180F0    */
110         MCASP_DIR_AFSRCTL, /* .afsrctl: 0x00000111    */
111         MCASP_DIR_RTDM,    /* .rtdm:    0x00000003    */
112         MCASP_DIR_RINTCTL, /* .rintctl: 0x00000000    */
113         MCASP_DIR_RSTAT,   /* .rstat:   0x000001FF    */
114         MCASP_DIR_REVTCTL, /* .revtctl  */
115         {
116                         MCASP_DIR_ACLKRCTL,  /* .aclkrctl:  0x00000080  */  // Receiver samples data on the rising edge of the serial clock
117                                                                             // External receive clock source from ACLKR pin.
118                                                                             // Receive bit clock divide ratio = 1
119                         MCASP_DIR_AHCLKRCTL, /* .ahclkrctl: 0x00000000  */
120                         MCASP_DIR_RCLKCHK    /* .rclkchk:   0x00000000  */
121         }
122 };
124 /* McASP HW setup for transmit (DAC) */
125 Mcasp_HwSetupData mcaspXmtSetupDAC = {
126         /* .xmask    = */ 0xFFFFFFFF, /* 16 bits are to be used     */
127         /* .xfmt     = */ 0x000180F0, /*
128                                        * 0 bit delay from framesync
129                                        * MSB first
130                                        * No extra bit padding
131                                        * Padding bit (ignore)
132                                        * slot Size is 32
133                                        * Reads from DMA port
134                                        * NO rotation
135                                        */
136         /* .afsxctl  = */ 0x00000112, /* I2S mode - 2 slot TDM
137                                        * Frame sync is one word
138                                        * Rising edge is start of frame
139                                        * Internally generated frame sync
140                                        */
141         /* .xtdm     = */ 0x00000003, /* slot 1 and 2 are active (I2S)               */
142         /* .xintctl  = */ 0x00000000, /* sync error,overrun error,clK error   */
143         /* .xstat    = */ 0x000001FF, /* reset any existing status bits       */
144         /* .xevtctl  = */ 0x00000000, /* DMA request is enabled or disabled   */
145         {
146              /* .aclkxctl  = */ 0X000000E1,  // Transmit bit clock divide ratio = 2
147              /* .ahclkxctl = */ 0x00004000,
148              /* .xclkchk   = */ 0x00000000
149         },
150 };
152 /* McASP HW setup for transmit (DAC slave) */
153 Mcasp_HwSetupData mcaspXmtSetupDACSlave = {
154         /* .xmask    = */ 0xFFFFFFFF, /* 16 bits are to be used     */
155         /* .xfmt     = */ 0x000180F0, /*
156                                        * 0 bit delay from framesync
157                                        * MSB first
158                                        * No extra bit padding
159                                        * Padding bit (ignore)
160                                        * slot Size is 32
161                                        * Reads from DMA port
162                                        * NO rotation
163                                        */
164         /* .afsxctl  = */ 0x00000113, /* I2S mode - 2 slot TDM
165                                        * Frame sync is one word
166                                        * Rising edge is start of frame
167                                        * Internally generated frame sync
168                                        */
169         /* .xtdm     = */ 0x00000003, /* slot 1 and 2 are active (I2S)        */
170         /* .xintctl  = */ 0x00000000, /* sync error,overrun error,clK error   */
171         /* .xstat    = */ 0x000001FF, /* reset any existing status bits       */
172         /* .xevtctl  = */ 0x00000000, /* DMA request is enabled or disabled   */
173         {
174              /* .aclkxctl  = */ 0X000000A7,
175              /* .ahclkxctl = */ 0x0000C000,
176              /* .xclkchk   = */ 0x00000000
177         },
178 };
180 /* McASP channel parameters for ADC input */
181 Mcasp_ChanParams  mcaspRxChanParamADC =
183     0x0004,                   /* number of serializers      */
184     {Mcasp_SerializerNum_0,
185      Mcasp_SerializerNum_1,
186      Mcasp_SerializerNum_2,
187      Mcasp_SerializerNum_3 }, /* serializer index           */
188     &mcaspRcvSetupADC,
189     TRUE,                     /* isDmaDriven                */
190     Mcasp_OpMode_TDM,         /* Mode (TDM/DIT)             */
191     Mcasp_WordLength_32,      /* wordWidth                  */
192     NULL,                     /* void * userLoopJobBuffer   */
193     0,                        /* userLoopJobLength          */
194     NULL,                   /* edmaHandle                 */
195     GblErr,
196     2,                        /* number of TDM channels      */
197     Mcasp_BufferFormat_MULTISER_MULTISLOT_SEMI_INTERLEAVED_1,
198     TRUE,                     /* enableHwFifo */
199     1,                        /* hwFifoEventDMARatio */
200     TRUE,                     /* isDataPacked */
201     Mcasp_WordBitsSelect_LSB  /* wordBitsSelect */
202 };
204 /* McASP channel parameters for ADC 6 channel input */
205 Mcasp_ChanParams  mcaspRxChanParamADC6ch =
207     0x0003,                   /* number of serializers      */
208     {Mcasp_SerializerNum_0,
209      Mcasp_SerializerNum_1,
210      Mcasp_SerializerNum_2},  /* serializer index           */
211     &mcaspRcvSetupADC,
212     TRUE,
213     Mcasp_OpMode_TDM,         /* Mode (TDM/DIT)             */
214     Mcasp_WordLength_32,
215     NULL,
216     0,
217     NULL,
218     GblErr,
219     2,                        /* number of TDM channels      */
220     Mcasp_BufferFormat_MULTISER_MULTISLOT_SEMI_INTERLEAVED_1,
221     TRUE,                     /* enableHwFifo */
222     1,                        /* hwFifoEventDMARatio */
223     TRUE,                     /* isDataPacked */
224     Mcasp_WordBitsSelect_LSB  /* wordBitsSelect */
225 };
227 /* McASP channel parameters for ADC stereo input */
228 Mcasp_ChanParams  mcaspRxChanParamADCStereo =
230     0x0001,                   /* number of serializers      */
231     {Mcasp_SerializerNum_0},  /* serializer index           */
232     &mcaspRcvSetupADC,
233     TRUE,
234     Mcasp_OpMode_TDM,         /* Mode (TDM/DIT)             */
235     Mcasp_WordLength_32,
236     NULL,
237     0,
238     NULL,
239     GblErr,
240     2,                        /* number of TDM channels      */
241     Mcasp_BufferFormat_MULTISER_MULTISLOT_SEMI_INTERLEAVED_1,
242     TRUE,                     /* enableHwFifo */
243     1,                        /* hwFifoEventDMARatio */
244     TRUE,                     /* isDataPacked */
245     Mcasp_WordBitsSelect_LSB  /* wordBitsSelect */
246 };
248 /* McAsp channel parameters for DIR input                 */
249 Mcasp_ChanParams  mcaspRxChanParamDIR =
251         0x0001,                    /* Number of serializers      */
252         {Mcasp_SerializerNum_5},   /* Serializer index           */
253         &mcaspRcvSetupDIR,
254         TRUE,
255         Mcasp_OpMode_TDM,          /* Mode (TDM/DIT)             */
256         Mcasp_WordLength_16,       /* 16-bit by default          */
257         NULL,
258         0,
259         NULL,
260         GblErr,
261         2,                        /* number of TDM channels      */
262         Mcasp_BufferFormat_1SER_MULTISLOT_INTERLEAVED,
263         TRUE,
264         1,                        /* hwFifoEventDMARatio */
265         TRUE,                     /* isDataPacked */
266         Mcasp_WordBitsSelect_MSB  /* wordBitsSelect */
267 };
269 /* McASP LLD channel parameters for HDMI input with 4XI2S:
270  *     When slot size of McASP is configured to 32-bit, HDMI data always come to 16 MSBs of the slot
271  *     and the 16 LSBs are filled with 0's. This is the nature of HDMI and I2S.
272  *     For PCM data, we want all 32 bits in the slot to be transferred to the input buffer:
273  *        - wordWidth = Mcasp_WordLength_32
274  *        - isDataPacked = 1,
275  *        - wordBitsSelect having no effect since wordWidth = slot size
276  *     For bit stream, we want only 16 MSBs in the slot to be transferred to the input buffer:
277  *        - wordWidth = Mcasp_WordLength_16
278  *        - isDataPacked = 1,
279  *        - wordBitsSelect = Mcasp_WordBitsSelect_MSB
280  */
281 Mcasp_ChanParams  mcaspRxChanParamHDMI =
283         0x0004,                    /* number of serializers      */
284         {Mcasp_SerializerNum_12,
285          Mcasp_SerializerNum_13,
286          Mcasp_SerializerNum_14,
287          Mcasp_SerializerNum_15 }, /* serializer index           */
288         &mcaspRcvSetupDIR,
289         TRUE,
290         Mcasp_OpMode_TDM,          /* Mode (TDM/DIT)             */
291     Mcasp_WordLength_16,       /* 16-bit word length, MSB or LSB of slot to be transfered, depending on wordBitsSelect */
292         NULL,
293         0,
294         NULL,
295         GblErr,
296         2,                        /* number of TDM channels      */
297         Mcasp_BufferFormat_MULTISER_MULTISLOT_SEMI_INTERLEAVED_1,
298         TRUE,                     /* enableHwFifo */
299         1,                        /* hwFifoEventDMARatio */
300         TRUE,                     /* isDataPacked, only transfer the selected bits of slot, based on wordWidth and wordBitsSelect */
301         Mcasp_WordBitsSelect_MSB  /* wordBitsSelect, only matters if wordWidth < slot size */
302 };
304 /* McAsp channel parameters for HDMI stereo input with 1XI2S  */
305 Mcasp_ChanParams  mcaspRxChanParamHDMIStereo =
307         0x0001,                    /* Number of serializers      */
308         {Mcasp_SerializerNum_12},   /* Serializer index          */
309         &mcaspRcvSetupDIR,
310         TRUE,
311         Mcasp_OpMode_TDM,          /* Mode (TDM/DIT)             */
312     Mcasp_WordLength_16,       /* 16-bit by default          */
313         NULL,
314         0,
315         NULL,
316         GblErr,
317         2,                        /* number of TDM channels      */
318         Mcasp_BufferFormat_1SER_MULTISLOT_INTERLEAVED,
319         TRUE,                     /* enableHwFifo */
320         1,                        /* hwFifoEventDMARatio */
321         TRUE,                     /* isDataPacked */
322         Mcasp_WordBitsSelect_MSB  /* wordBitsSelect */
323 };
325 /* McAsp channel parameters for DAC output - DAC0            */
326 Mcasp_ChanParams  mcaspTx0ChanParamDAC =
328         0x0004,                   /* number of serializers       */
329         {Mcasp_SerializerNum_0,
330          Mcasp_SerializerNum_1,
331          Mcasp_SerializerNum_2,
332          Mcasp_SerializerNum_3 }, /* serializer index for DAC0   */
333         &mcaspXmtSetupDAC,
334         TRUE,
335         Mcasp_OpMode_TDM,
336         Mcasp_WordLength_32,      /* word width                  */
337         NULL,
338         0,
339         NULL,
340         GblErr,
341         2,                        /* number of TDM channels      */
342         Mcasp_BufferFormat_MULTISER_MULTISLOT_SEMI_INTERLEAVED_1,
343         TRUE,
344         1,                        /* hwFifoEventDMARatio */
345         TRUE,                     /* isDataPacked */
346         Mcasp_WordBitsSelect_LSB  /* wordBitsSelect */
347 };
349 /* McAsp channel parameters for DAC stereo output - DAC0     */
350 Mcasp_ChanParams  mcaspTx0ChanParamDACStereo =
352     0x0001,                   /* number of serializers       */
353     {Mcasp_SerializerNum_0},  /* serializer index for DAC0   */
354     &mcaspXmtSetupDAC,
355     TRUE,
356     Mcasp_OpMode_TDM,
357     Mcasp_WordLength_32,      /* word width                  */
358     NULL,
359     0,
360     NULL,
361     GblErr,
362     2,                        /* number of TDM channels      */
363     Mcasp_BufferFormat_MULTISER_MULTISLOT_SEMI_INTERLEAVED_1,
364     TRUE,
365     1,                        /* hwFifoEventDMARatio */
366     TRUE,                     /* isDataPacked */
367     Mcasp_WordBitsSelect_LSB  /* wordBitsSelect */
368 };
370 /* McAsp channel parameters for DAC 12 channel output        */
371 Mcasp_ChanParams  mcaspTx0ChanParamDAC12ch =
373     0x0006,                   /* number of serializers       */
374     {Mcasp_SerializerNum_0,
375      Mcasp_SerializerNum_1,
376      Mcasp_SerializerNum_2,
377      Mcasp_SerializerNum_3,
378      Mcasp_SerializerNum_4,
379      Mcasp_SerializerNum_5 }, /* serializer index for DAC0    */
380     &mcaspXmtSetupDAC,
381     TRUE,
382     Mcasp_OpMode_TDM,
383     Mcasp_WordLength_32,      /* word width                  */
384     NULL,
385     0,
386     NULL,
387     GblErr,
388     2,                        /* number of TDM channels      */
389     Mcasp_BufferFormat_MULTISER_MULTISLOT_SEMI_INTERLEAVED_1,
390     TRUE,
391     1,                        /* hwFifoEventDMARatio */
392     TRUE,                     /* isDataPacked */
393     Mcasp_WordBitsSelect_LSB  /* wordBitsSelect */
394 };
396 /* McAsp channel parameters for DAC 16 channel output        */
397 Mcasp_ChanParams  mcaspTx0ChanParamDAC16ch =
399     0x0008,                   /* number of serializers       */
400     {Mcasp_SerializerNum_0,
401      Mcasp_SerializerNum_1,
402      Mcasp_SerializerNum_2,
403      Mcasp_SerializerNum_3,
404      Mcasp_SerializerNum_4,
405      Mcasp_SerializerNum_5,
406      Mcasp_SerializerNum_6,
407      Mcasp_SerializerNum_7 }, /* serializer index for DAC0    */
408     &mcaspXmtSetupDAC,
409     TRUE,
410     Mcasp_OpMode_TDM,
411     Mcasp_WordLength_32,      /* word width                  */
412     NULL,
413     0,
414     NULL,
415     GblErr,
416     2,                        /* number of TDM channels      */
417     Mcasp_BufferFormat_MULTISER_MULTISLOT_SEMI_INTERLEAVED_1,
418     TRUE,
419     1,                        /* hwFifoEventDMARatio */
420     TRUE,                     /* isDataPacked */
421     Mcasp_WordBitsSelect_LSB  /* wordBitsSelect */
422 };
424 /* McAsp channel parameters for transmit - DAC1              */
425 Mcasp_ChanParams  mcaspTx1ChanParam =
427         0x0001,                   /* number of serializers       */
428         {Mcasp_SerializerNum_4},  /* serializer index for DAC0   */
429         &mcaspXmtSetupDAC,
430         TRUE,
431         Mcasp_OpMode_TDM,
432         Mcasp_WordLength_32,      /* word width                  */
433         NULL,
434         0,
435         NULL,
436         GblErr,
437         2,                        /* number of TDM channels      */
438         Mcasp_BufferFormat_1SER_MULTISLOT_INTERLEAVED,
439         TRUE,
440         1,                        /* hwFifoEventDMARatio */
441         TRUE,                     /* isDataPacked */
442         Mcasp_WordBitsSelect_LSB  /* wordBitsSelect */
443 };
446 /**
447  *  \brief    Function called by McASP driver in case of error
448  *
449  *  \return    None
450  */
451 void GblErr(Mcasp_errCbStatus arg)
453         gblErrFlag = 1;
457 /* DAC default configuration parameters */
458 DacConfig  DAC_Cfg =
460         AUDK2G_DAC_AMUTE_CTRL_DAC_DISABLE_CMD,   /* Amute event */
461         0,                          /* Amute control */
462         AUDK2G_DAC_SAMPLING_MODE_AUTO,     /* Sampling mode */
463         AUDK2G_DAC_DATA_FORMAT_I2S,        /* Data format */
464         0,                          /* Soft mute control */
465         AUDK2G_DAC_ATTENUATION_WIDE_RANGE, /* Attenuation mode */
466         AUDK2G_DAC_DEEMP_DISABLE,            /* De-emph control */
467         100                          /* Volume */
468 };
470 /**
471  *  \brief    Configures audio DAC module
472  *
473  *  \return    none
474  */
475 void configAudioDAC(void)
477         Audk2g_STATUS status;
479         audk2g_delay(10000);
481         /* Initialize Audio DAC module */
482         status = audioDacConfig(AUDK2G_DAC_DEVICE_ALL, &DAC_Cfg);
483         if(status != Audk2g_EOK)
484         {
485                 //platform_write("Audio DAC Configuration Failed!\n");
486                 //testRet(1);
487         }
489 #if 0
490 /**
491  *  \brief   Configures McASP module and creates the channel
492  *           for audio Tx and Rx
493  *
494  *  \return    Audk2g_EOK on Success or error code
495  */
496 Audk2g_STATUS mcaspAudioConfig(void)
498     int32_t status;
500         hMcaspDevTx  = NULL;
501         hMcaspDevRx  = NULL;
502         hMcaspTxChan = NULL;
503         hMcaspRxChan = NULL;
505         /* Initialize McASP Tx and Rx parameters */
506         mcaspTxParams = Mcasp_PARAMS;
507         mcaspRxParams = Mcasp_PARAMS;
509         mcaspTxParams.mcaspHwSetup.tx.clk.clkSetupClk = 0x23;  // not used
510         mcaspTxParams.mcaspHwSetup.rx.clk.clkSetupClk = 0x23;  // not used
511         mcaspRxParams.mcaspHwSetup.rx.clk.clkSetupClk = 0x23;
512         mcaspRxParams.mcaspHwSetup.tx.clk.clkSetupClk = 0x63; // Asynchronous. Separate clock and frame sync used by transmit and receive sections.
514 #ifndef INPUT_SPDIF
515         mcaspRxParams.mcaspHwSetup.glb.pdir  |= 0x2000000;   //Special case, since for HDMI input - mcasp0 is both Rx & Tx
516         mcaspRxParams.mcaspHwSetup.glb.amute = 0x2;                  // this to ensure one doesn't overwrite the other (rx/tx)
517         mcaspTxParams.mcaspHwSetup.glb.pdir  |= 0x2000000;   //Set Amute pin as output for Tx channel
518         mcaspTxParams.mcaspHwSetup.glb.amute = 0x2;
519 #else
520         mcaspTxParams.mcaspHwSetup.glb.pdir  |= 0x2000000;   //Set Amute pin as output for Tx channel
521         mcaspTxParams.mcaspHwSetup.glb.amute = 0x2;
522 #endif
524         /* Set the HW interrupt number */
525         //mcaspTxParams.hwiNumber = 8;
526         //mcaspRxParams.hwiNumber = 8;
528         /* Initialize eDMA handle */
529 #ifdef INPUT_SPDIF
530         mcaspRxChanParam.edmaHandle  = hEdma1;
531 #else
532         mcaspRxChanParam.edmaHandle  = hEdma0;
533 #endif
535         mcaspTx0ChanParam.edmaHandle = hEdma0;
536         mcaspTx1ChanParam.edmaHandle = hEdma0;
537     
538 #ifdef INPUT_SPDIF
539         /* Bind McASP0 for Tx */
540         status = mcaspBindDev(&hMcaspDevTx, CSL_MCASP_0, &mcaspTxParams);
541         if((status != MCASP_COMPLETED) || (hMcaspDevTx == NULL))
542         {
543                 //IFPRINT(platform_write("mcaspBindDev for Tx Failed\n"));
544                 return (Audk2g_EFAIL);
545         }
547         /* Bind McASP2 for Rx */
548         status = mcaspBindDev(&hMcaspDevRx, CSL_MCASP_2, &mcaspRxParams);
549         if((status != MCASP_COMPLETED) || (hMcaspDevRx == NULL))
550         {
551                 //IFPRINT(platform_write("mcaspBindDev for Rx Failed\n"));
552                 return (Audk2g_EFAIL);
553         }
555 #else /* HDMI or HDMI_STEREO */
556         /* Bind McASP0 for Rx and Tx */
557         status = mcaspBindDev(&hMcaspDevRx, CSL_MCASP_0, &mcaspRxParams);
558         if((status != MCASP_COMPLETED) || (hMcaspDevRx == NULL))
559         {
560                 //IFPRINT(platform_write("mcaspBindDev for Rx Failed\n"));
561                 return (Audk2g_EFAIL);
562         }
564         hMcaspDevTx = hMcaspDevRx;
565 #endif
567         /* Create McASP channel for Tx */
568         status = mcaspCreateChan(&hMcaspTxChan, hMcaspDevTx,
569                                  MCASP_OUTPUT,
570 #ifdef AUDIO_DAC0_TEST
571                                  &mcaspTx0ChanParam,
572 #else
573                                  &mcaspTx1ChanParam,
574 #endif
575 #ifdef IO_LOOPBACK_TEST
576                                  mcaspAppCallbackTx, NULL);
577 #else
578                                  asopMcaspCallback, NULL);
579 #endif
581         if((status != MCASP_COMPLETED) || (hMcaspTxChan == NULL))
582         {
583                 //IFPRINT(platform_write("mcaspCreateChan for Tx Failed\n"));
584                 return (Audk2g_EFAIL);
585         }
587         /* Create McASP channel for Rx */
588         status = mcaspCreateChan(&hMcaspRxChan, hMcaspDevRx,
589                                  MCASP_INPUT,
590                                  &mcaspRxChanParam,
591 #ifdef IO_LOOPBACK_TEST
592                                  mcaspAppCallbackRx, NULL);
593 #else
594                                                          asipMcaspCallback, NULL);
595 #endif
597         if((status != MCASP_COMPLETED) || (hMcaspRxChan == NULL))
598         {
599                 //IFPRINT(platform_write("mcaspCreateChan for Rx Failed\n"));
600                 return (Audk2g_EFAIL);
601         }
603         return (Audk2g_EOK);
604 } /* mcaspAudioConfig */
607 Audk2g_STATUS mcaspRx(void)
612 Audk2g_STATUS mcaspRxDeInit(void)
614         mcaspDeleteChan(hMcaspRxChan);
615         hMcaspRxChan = NULL;
617         mcaspUnBindDev(hMcaspDevRx);
618         hMcaspDevRx = NULL;
620     return (Audk2g_EOK);
623 Audk2g_STATUS mcaspChanReset(Ptr hMcaspDev, Ptr hMcaspChan)
625     if(hMcaspChan != NULL) {
626         mcaspDeleteChan(hMcaspChan);
627     }
630 Audk2g_STATUS mcaspRxReset(void)
632     if(hMcaspRxChan != NULL) {
633                 mcaspDeleteChan(hMcaspRxChan);
634                 hMcaspRxChan = NULL;
635     }
637         return (Audk2g_EOK);
640 Audk2g_STATUS mcaspRxCreate(void)
642     int32_t status;
644         /* Create McASP channel for Rx */
645         status = mcaspCreateChan(&hMcaspRxChan, hMcaspDevRx,
646                                  MCASP_INPUT,
647                                  &mcaspRxChanParam,
648 #ifdef IO_LOOPBACK_TEST
649                                  mcaspAppCallbackRx, NULL);
650 #else
651                                                          asipMcaspCallback, NULL);
652 #endif
654         if((status != MCASP_COMPLETED) || (hMcaspRxChan == NULL))
655         {
656                 //IFPRINT(platform_write("mcaspCreateChan for Rx Failed\n"));
657                 return (Audk2g_EFAIL);
658         }
660         return (Audk2g_EOK);
663 Audk2g_STATUS mcaspTxReset(void)
665     if(hMcaspTxChan != NULL) {
666                 mcaspDeleteChan(hMcaspTxChan);
667                 hMcaspTxChan = NULL;
668     }
670         return (Audk2g_EOK);
673 Audk2g_STATUS mcaspTxCreate(void)
675     int32_t status;
677         /* Create McASP channel for Tx */
678         status = mcaspCreateChan(&hMcaspTxChan, hMcaspDevTx,
679                                  MCASP_OUTPUT,
680                                  &mcaspTx0ChanParam,
681 #ifdef IO_LOOPBACK_TEST
682                                  mcaspAppCallbackTx, NULL);
683 #else
684                                  asopMcaspCallback, NULL);
685 #endif
686         if((status != MCASP_COMPLETED) || (hMcaspTxChan == NULL))
687         {
688                 //IFPRINT(platform_write("mcaspCreateChan for Tx Failed\n"));
689                 return (Audk2g_EFAIL);
690         }
692         return (Audk2g_EOK);
694 #endif
697 Audk2g_STATUS mcaspRecfgWordWidth(Ptr hMcaspChan, uint16_t wordWidth)
699     Mcasp_ChanParams chanParams;
700     int32_t status;
702     chanParams.wordWidth = wordWidth;  //to do: change mcaspControlChan to have wordWidth as the parameter instead of chanParams!!
704     status = mcaspControlChan(hMcaspChan, Mcasp_IOCTL_CHAN_PARAMS_WORD_WIDTH, &chanParams);
706     if((status != MCASP_COMPLETED)) {
707         return (Audk2g_EFAIL);
708     }
709     else {
710         return (Audk2g_EOK);
711     }
712 } /* mcaspRecfgWordWidth */
714 /*======================================================================================
715  *  This function checks if McASP Rx overruns or Tx underruns
716  *====================================================================================*/
717 int mcaspCheckOverUnderRun(Ptr mcaspChanHandle)
719     Mcasp_errCbStatus mcaspErrStat;
721     mcaspControlChan(mcaspChanHandle, Mcasp_IOCTL_CHAN_QUERY_ERROR_STATS, &mcaspErrStat);
723     return (mcaspErrStat.isRcvOvrRunOrTxUndRunErr);
727 /** McASP LLD configuration parameters for all input and output interfaces */
728 mcaspLLDconfig LLDconfigRxDIR =     // for SAP_D10_RX_DIR
730     &mcaspRcvSetupDIR, 
731     &mcaspRxChanParamDIR,
732     0x23,
733     0x63,                           // Asynchronous. Separate clock and frame sync used by transmit and receive sections.
734     0x0,
735     0x2,
736     CSL_MCASP_2,
737     MCASP_INPUT,
738     asipMcaspCallback,
739     NULL,
740     NULL
741 };
743 mcaspLLDconfig LLDconfigRxADC =     // for SAP_D10_RX_ADC_44100HZ, SAP_D10_RX_ADC_88200HZ
745     &mcaspRcvSetupADC, 
746     &mcaspRxChanParamADC,
747     0x23,
748     0x63,
749     0x0,
750     0x2,
751     CSL_MCASP_1,
752     MCASP_INPUT,
753     asipMcaspCallback,
754     NULL,
755     NULL
756 };
758 mcaspLLDconfig LLDconfigRxADC6ch =     // for SAP_D10_RX_ADC_6CH_44100HZ, SAP_D10_RX_ADC_6CH_88200HZ
760     &mcaspRcvSetupADC, 
761     &mcaspRxChanParamADC6ch,
762     0x23,
763     0x63,
764     0x0,
765     0x2,
766     CSL_MCASP_1,
767     MCASP_INPUT,
768     asipMcaspCallback,
769     NULL,
770     NULL,
771 };
773 mcaspLLDconfig LLDconfigRxADCStereo =     // for SAP_D10_RX_ADC_STEREO_44100HZ, SAP_D10_RX_ADC_STEREO_88200HZ
775     &mcaspRcvSetupADC, 
776     &mcaspRxChanParamADCStereo,
777     0x23,
778     0x63,
779     0x0,
780     0x2,
781     CSL_MCASP_1,
782     MCASP_INPUT,
783     asipMcaspCallback,
784     NULL,
785     NULL
786 };
788 mcaspLLDconfig LLDconfigRxHDMIStereo =   // for SAP_D10_RX_HDMI_STEREO
790     &mcaspRcvSetupDIR, 
791     &mcaspRxChanParamHDMIStereo,
792     0x23,
793     0x63,
794     0x02000000,                     // Set Amute pin as output since mcasp0 is both Rx & Tx for DIR/HDMI
795     0x2,
796     CSL_MCASP_0,
797     MCASP_INPUT,
798     asipMcaspCallback,
799     NULL,
800     NULL
801 };
803 mcaspLLDconfig LLDconfigRxHDMI =    // for SAP_D10_RX_HDMI
805     &mcaspRcvSetupDIR, 
806     &mcaspRxChanParamHDMI,
807     0x23,
808     0x63,
809     0x02000000,                    // Set Amute pin as output since mcasp0 is both Rx & Tx for DIR/HDMI
810     0x2,
811     CSL_MCASP_0,
812     MCASP_INPUT,
813     asipMcaspCallback,
814     NULL,
815     NULL
816 };
818 /*
819 mcaspLLDconfig LLDconfigTxDIT =    // for SAP_D10_TX_DIT
821     &mcaspXmtSetupDIT, 
822     &mcaspTx0ChanParamDIT,
823     NULL,
824     NULL,
825     CSL_MCASP_2
826 };
827 */
829 mcaspLLDconfig LLDconfigTxDAC =    // for SAP_D10_TX_DAC
831     &mcaspXmtSetupDAC,
832     &mcaspTx0ChanParamDAC,
833     0x23,
834     0x63,
835     0x02000000,                       // Set Amute pin as output for Tx channel
836     0x2,
837     CSL_MCASP_0,
838     MCASP_OUTPUT,
839     asopMcaspCallback,
840     NULL,
841     NULL
842 };
844 mcaspLLDconfig LLDconfigTxDACSlave =    // for SAP_D10_TX_DAC_SLAVE
846     &mcaspXmtSetupDACSlave, 
847     &mcaspTx0ChanParamDAC,
848     0x23,
849     0x63,
850     0x02000000,
851     0x2,
852     CSL_MCASP_0,
853     MCASP_OUTPUT,
854     asopMcaspCallback,
855     NULL,
856     NULL
857 };
859 mcaspLLDconfig LLDconfigTxDACStereo =    // for SAP_D10_TX_STEREO_DAC
861     &mcaspXmtSetupDAC, 
862     &mcaspTx0ChanParamDACStereo,
863     0x23,
864     0x63,
865     0x02000000,
866     0x2,
867     CSL_MCASP_0,
868     MCASP_OUTPUT,
869     asopMcaspCallback,
870     NULL,
871     NULL
872 };
874 mcaspLLDconfig LLDconfigTxDACStereoSlave =    // for SAP_D10_TX_STEREO_DAC_SLAVE
876     &mcaspXmtSetupDACSlave, 
877     &mcaspTx0ChanParamDACStereo,
878     0x23,
879     0x63,
880     0x02000000,
881     0x2,
882     CSL_MCASP_0,
883     MCASP_OUTPUT,
884     asopMcaspCallback,
885     NULL,
886     NULL
887 };
889 mcaspLLDconfig LLDconfigTxDAC12ch =    // for SAP_D10_TX_DAC_12CH
891     &mcaspXmtSetupDAC, 
892     &mcaspTx0ChanParamDAC12ch,
893     0x23,
894     0x63,
895     0x02000000,
896     0x2,
897     CSL_MCASP_0,
898     MCASP_OUTPUT,
899     asopMcaspCallback,
900     NULL,
901     NULL
902 };
904 mcaspLLDconfig LLDconfigTxDAC16ch =    // for SAP_D10_TX_DAC_16CH
906     &mcaspXmtSetupDAC, 
907     &mcaspTx0ChanParamDAC16ch,
908     0x23,
909     0x63,
910     0x02000000,
911     0x2,
912     CSL_MCASP_0,
913     MCASP_OUTPUT,
914     asopMcaspCallback,
915     NULL,
916     NULL
917 };
920 /**
921  *  \brief Create a channel of McASP LLD and return the handle.
922  *
923  *  \return    Audk2g_EOK on Success or error code
924  */
925 Audk2g_STATUS mcasplldChanCreate(mcaspLLDconfig *lldCfg, Ptr *pChanHandle)
927     int32_t status;
929     if(mcaspDevHandles[lldCfg->mcaspPort] == NULL) {
930         /* Initialize McASP parameters */
931         mcaspParams = Mcasp_PARAMS;    // Mcasp_PARAMS defined in McASP LLD
933         mcaspParams.mcaspHwSetup.rx.clk.clkSetupClk = lldCfg->clkSetupClkRx;
934         mcaspParams.mcaspHwSetup.tx.clk.clkSetupClk = lldCfg->clkSetupClkTx;
935         mcaspParams.mcaspHwSetup.glb.pdir  |= lldCfg->pdirAmute;
936         mcaspParams.mcaspHwSetup.glb.amute  = lldCfg->amute;
938         status = mcaspBindDev(&mcaspDevHandles[lldCfg->mcaspPort], lldCfg->mcaspPort, &mcaspParams);
939         if((status != MCASP_COMPLETED) || (mcaspDevHandles[lldCfg->mcaspPort] == NULL)) {
940             return (Audk2g_EFAIL);
941         }
942     }
944     lldCfg->hMcaspDev = mcaspDevHandles[lldCfg->mcaspPort];
946     lldCfg->mcaspChanParams->mcaspSetup = lldCfg->mcaspSetupData;
947     if(lldCfg->mcaspPort == CSL_MCASP_0) {
948         lldCfg->mcaspChanParams->edmaHandle = hEdma0;
949     }
950     else {
951         lldCfg->mcaspChanParams->edmaHandle = hEdma1;
952     }
954     /* Create McASP channel */
955     *pChanHandle = NULL;
956     status = mcaspCreateChan(pChanHandle, lldCfg->hMcaspDev,
957                              lldCfg->chanMode, lldCfg->mcaspChanParams,
958                              lldCfg->cbFxn, NULL);
960     if((status != MCASP_COMPLETED) || (*pChanHandle == NULL))
961     {
962         //IFPRINT(platform_write("mcaspCreateChan for Tx Failed\n"));
963         return (Audk2g_EFAIL);
964     }
966     return (Audk2g_EOK);
967 }  /* mcasplldChanCreate */
969 /* Nothing past this point */