Fixing the loopback test issue on C6657
[keystone-rtos/mcbsp-lld.git] / example / c6657 / MCBSPDigLpbk / sample_init.c
1 /*
2  * sample_init.c
3  *
4  * Sample Initialization for the EDMA3 Driver for BIOS 6 based applications.
5  * It should be MANDATORILY done once before EDMA3 usage.
6  *
7  * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
8  *
9  *
10  *  Redistribution and use in source and binary forms, with or without
11  *  modification, are permitted provided that the following conditions
12  *  are met:
13  *
14  *    Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  *
17  *    Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the
20  *    distribution.
21  *
22  *    Neither the name of Texas Instruments Incorporated nor the names of
23  *    its contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37  *
38 */
40 #include <ti/sysbios/hal/Hwi.h>
41 #include <ti/sysbios/knl/Semaphore.h>
42 #include <ti/sysbios/family/c64p/EventCombiner.h>
44 #include <ti/sdo/edma3/drv/sample/bios6_edma3_drv_sample.h>
46 /** @brief EDMA3 Driver Instance specific Semaphore handle */
47 extern EDMA3_OS_Sem_Handle semHandle[EDMA3_MAX_EDMA3_INSTANCES];
49 /**  To Register the ISRs with the underlying OS, if required. */
50 extern void registerEdma3Interrupts (uint32_t edma3Id);
51 /**  To Unregister the ISRs with the underlying OS, if previously registered. */
52 extern void unregisterEdma3Interrupts (uint32_t edma3Id);
54 /* To find out the DSP# */
55 extern uint16_t determineProcId(void);
57 /**
58  * To check whether the global EDMA3 configuration is required or not.
59  * It should be done ONCE by any of the masters present in the system.
60  * This function checks whether the global configuration is required by the
61  * current master or not. In case of many masters, it should be done only
62  * by one of the masters. Hence this function will return TRUE only once
63  * and FALSE for all other masters. 
64  */
65 extern uint16_t isGblConfigRequired(uint32_t dspNum);
67 /**
68  * DSP instance number on which the executable is running. Its value is
69  * determined by reading the processor specific register DNUM.
70  */
71 uint32_t dsp_num;
73 /**
74  * Shadow Region on which the executable is runnig. Its value is populated
75  * with the DSP Instance Number here in this case.
76  */
77 uint32_t region_id;
79 /* Number of EDMA3 controllers present in the system */
80 extern const uint32_t numEdma3Instances;
82 /* External Global Configuration Structure */
83 extern EDMA3_DRV_GblConfigParams sampleEdma3GblCfgParams[EDMA3_MAX_EDMA3_INSTANCES];
85 /* External Instance Specific Configuration Structure */
86 extern EDMA3_DRV_InstanceInitConfig sampleInstInitConfig[EDMA3_MAX_EDMA3_INSTANCES][EDMA3_MAX_REGIONS];
88 #ifdef DMA_XBAR_AVAILABLE
89 extern EDMA3_DRV_Result sampleInitXbarEvt(EDMA3_DRV_Handle hEdma, uint32_t edma3Id);
90 #endif
92 /**
93  * \brief   EDMA3 Initialization
94  *
95  * This function initializes the EDMA3 Driver and registers the
96  * interrupt handlers.
97  *
98   * \return  EDMA3_DRV_SOK if success, else error code
99  */
100 EDMA3_DRV_Handle edma3init (uint32_t edma3Id, EDMA3_DRV_Result *errorCode)
101     {
102     EDMA3_DRV_Result edma3Result = EDMA3_DRV_E_INVALID_PARAM;
103     Semaphore_Params semParams;
104     EDMA3_DRV_GblConfigParams *globalConfig = NULL;
105         EDMA3_DRV_InitConfig initCfg;
106         EDMA3_RM_MiscParam miscParam;
107         EDMA3_DRV_Handle hEdma = NULL;
109         if ((edma3Id >= numEdma3Instances) || (errorCode == NULL))
110     {
111                 hEdma = NULL;
112     }
113     else
114     {
115     /* DSP instance number */
116     dsp_num = determineProcId();
118         globalConfig = &sampleEdma3GblCfgParams[edma3Id];
120         /* Configure it as master, if required */
121         miscParam.isSlave = isGblConfigRequired(dsp_num);
122         edma3Result = EDMA3_DRV_create (edma3Id, globalConfig ,
123                                                                         (void *)&miscParam);
125         if (edma3Result == EDMA3_DRV_SOK)
126                 {
127                 /**
128                 * Driver Object created successfully.
129                 * Create a semaphore now for driver instance.
130                 */
131                 Semaphore_Params_init(&semParams);
133                 initCfg.drvSemHandle = NULL;
134                 edma3Result = edma3OsSemCreate((int32_t)1, &semParams, &initCfg.drvSemHandle);
135                 }
137         if (edma3Result == EDMA3_DRV_SOK)
138                 {
139                 /* Save the semaphore handle for future use */
140                 semHandle[edma3Id] = initCfg.drvSemHandle;
142         /* Driver instance specific config NULL */
143                 initCfg.drvInstInitConfig = NULL;
145 #ifndef EDMA3_DRV_USE_DEF_RM_CFG
146         /* Hook for running examples with default RM config */
147                 /* configuration structure for the Driver */
148                 initCfg.drvInstInitConfig = &sampleInstInitConfig[edma3Id][dsp_num];
149 #endif
151                 initCfg.isMaster = TRUE;
152                 /* Choose shadow region according to the DSP# */
153                 initCfg.regionId = (EDMA3_RM_RegionId)dsp_num;
154                 /*Saving the regionId for using it in the sample_cs.c file */
155                 region_id = (EDMA3_RM_RegionId)dsp_num;
156                 /* Driver instance specific config NULL */
158                 initCfg.gblerrCb = NULL;
159                 initCfg.gblerrData = NULL;
161                 /* Open the Driver Instance */
162                 hEdma = EDMA3_DRV_open (edma3Id, (void *) &initCfg, &edma3Result);
163                 }
165 #ifdef DMA_XBAR_AVAILABLE
166         {
167         if((hEdma != NULL) && (edma3Result == EDMA3_DRV_SOK))
168                 {
169                 edma3Result = sampleInitXbarEvt(hEdma, edma3Id);
170                 }
171         }
172 #endif
173         if((hEdma != NULL) && (edma3Result == EDMA3_DRV_SOK))
174                 {
175                 /**
176                 * Register Interrupt Handlers for various interrupts
177                 * like transfer completion interrupt, CC error
178                 * interrupt, TC error interrupts etc, if required.
179                 */
180                 registerEdma3Interrupts(edma3Id);
181                 }
183         *errorCode = edma3Result;
184     }
185     return hEdma;
186     }
189 /**
190  * \brief   EDMA3 De-initialization
191  *
192  * This function removes the EDMA3 Driver instance and unregisters the
193  * interrupt handlers.
194  *
195   * \return  EDMA3_DRV_SOK if success, else error code
196  */
197 EDMA3_DRV_Result edma3deinit (uint32_t edma3Id, EDMA3_DRV_Handle hEdma)
198     {
199     EDMA3_DRV_Result edma3Result = EDMA3_DRV_E_INVALID_PARAM;
201     /* Unregister Interrupt Handlers first */
202     unregisterEdma3Interrupts(edma3Id);
204     /* Delete the semaphore */
205     edma3Result = edma3OsSemDelete(semHandle[edma3Id]);
207     if (EDMA3_DRV_SOK == edma3Result )
208         {
209         /* Make the semaphore handle as NULL. */
210         semHandle[edma3Id] = NULL;
212         /* Now, close the EDMA3 Driver Instance */
213         edma3Result = EDMA3_DRV_close (hEdma, NULL);
214         }
216         if (EDMA3_DRV_SOK == edma3Result )
217         {
218         /* Now, delete the EDMA3 Driver Object */
219         edma3Result = EDMA3_DRV_delete (edma3Id, NULL);
220         }
222     return edma3Result;
223     }
225 /* End of File */