audio-preprocessing-fw: change real time demo to use the cmbk2g library
[processor-sdk/audio-preprocessing.git] / realtime_demo_bios / k2g / src / edma_cfg.c
1 /*\r
2  * Copyright (c) 2015, Texas Instruments Incorporated\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  *\r
9  * *  Redistributions of source code must retain the above copyright\r
10  *    notice, this list of conditions and the following disclaimer.\r
11  *\r
12  * *  Redistributions in binary form must reproduce the above copyright\r
13  *    notice, this list of conditions and the following disclaimer in the\r
14  *    documentation and/or other materials provided with the 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 "AS IS"\r
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\r
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
31  *\r
32  */\r
33 \r
34 /**\r
35  * \file      edma_config.c\r
36  *\r
37  * \brief     Initializes eDMA module\r
38  *\r
39  */\r
40 \r
41 #include "edma_cfg.h"\r
42 \r
43 #include <ti/sysbios/knl/Semaphore.h>\r
44 #include <ti/sysbios/family/c64p/EventCombiner.h>\r
45 #include <ti/sdo/edma3/rm/sample/bios6_edma3_rm_sample.h>\r
46 \r
47 /** @brief EDMA3 Driver Instance specific Semaphore handle */\r
48 extern EDMA3_OS_Sem_Handle semHandle[];\r
49 \r
50 /**  To Register the ISRs with the underlying OS, if required. */\r
51 extern void registerEdma3Interrupts (unsigned int edma3Id);\r
52 /**  To Unregister the ISRs with the underlying OS, if previously registered. */\r
53 extern void unregisterEdma3Interrupts (unsigned int edma3Id);\r
54 \r
55 /* To find out the DSP# */\r
56 extern unsigned short determineProcId();\r
57 \r
58 /**\r
59  * To check whether the global EDMA3 configuration is required or not.\r
60  * It should be done ONCE by any of the masters present in the system.\r
61  * This function checks whether the global configuration is required by the\r
62  * current master or not. In case of many masters, it should be done only\r
63  * by one of the masters. Hence this function will return TRUE only once\r
64  * and FALSE for all other masters.\r
65  */\r
66 extern unsigned short isGblConfigRequired(unsigned int dspNum);\r
67 \r
68 /**\r
69  * DSP instance number on which the executable is running. Its value is\r
70  * determined by reading the processor specific register DNUM.\r
71  */\r
72 unsigned int dsp_num;\r
73 \r
74 /**\r
75  * Shadow Region on which the executable is running. Its value is populated\r
76  * with the DSP Instance Number here in this case.\r
77  */\r
78 unsigned int region_id;\r
79 \r
80 /* Number of EDMA3 controllers present in the system */\r
81 extern const unsigned int numEdma3Instances;\r
82 \r
83 /* External Global Configuration Structure */\r
84 extern EDMA3_DRV_GblConfigParams sampleEdma3GblCfgParams[];\r
85 \r
86 /* External Instance Specific Configuration Structure */\r
87 extern EDMA3_DRV_InstanceInitConfig sampleInstInitConfig[][EDMA3_MAX_REGIONS];\r
88 \r
89 EDMA3_DRV_Handle hEdma0;\r
90 EDMA3_DRV_Handle hEdma1;\r
91 \r
92 /**\r
93  *  \brief    Configures eDMA module\r
94  *\r
95  *  \return    Cmbk2g_EOK on Success or error code\r
96  */\r
97 Cmbk2g_STATUS eDmaConfig(void)\r
98 {\r
99     EDMA3_DRV_Result edmaResult = 0;\r
100     uint32_t temp;\r
101 \r
102     /* Enabling the dmaChannel MCASP2 Events to EDMACC1 (50 & 51) */\r
103     temp=sampleEdma3GblCfgParams[1].dmaChannelHwEvtMap[1];\r
104     sampleEdma3GblCfgParams[1].dmaChannelHwEvtMap[1]= temp | 0x000C0000;\r
105 \r
106         /* Initialize eDMA 0 */\r
107     hEdma0 = edma3init(CSL_EDMACC_0, &edmaResult);\r
108     if((hEdma0 == NULL) || (edmaResult != 0))\r
109     {\r
110                 IFPRINT(cmbk2g_write("eDMA instance 0 Initialization Failed\n"));\r
111                 return (Cmbk2g_EFAIL);\r
112         }\r
113 \r
114         /* Initialize eDMA 1 */\r
115     hEdma1 = edma3init(CSL_EDMACC_1, &edmaResult);\r
116     if((hEdma1 == NULL) || (edmaResult != 0))\r
117     {\r
118                 IFPRINT(cmbk2g_write("eDMA instance 1 Initialization Failed\n"));\r
119                 return (Cmbk2g_EFAIL);\r
120         }\r
121 \r
122         return (Cmbk2g_EOK);\r
123 }\r
124 \r
125 /**\r
126  * \brief   EDMA3 Initialization\r
127  *\r
128  * This function initializes the EDMA3 Driver and registers the\r
129  * interrupt handlers.\r
130  *\r
131  * \return  EDMA3_DRV_SOK if success, else error code\r
132  */\r
133 EDMA3_DRV_Handle edma3init (unsigned int edma3Id, EDMA3_DRV_Result *errorCode)\r
134 {\r
135     EDMA3_DRV_Result edma3Result = EDMA3_DRV_E_INVALID_PARAM;\r
136     Semaphore_Params semParams;\r
137     EDMA3_DRV_GblConfigParams *globalConfig = NULL;\r
138         EDMA3_DRV_InitConfig initCfg;\r
139         EDMA3_RM_MiscParam miscParam;\r
140         EDMA3_DRV_Handle hEdma = NULL;\r
141 \r
142         if ((edma3Id >= numEdma3Instances) || (errorCode == NULL))\r
143                 return hEdma;\r
144 \r
145     /* DSP instance number */\r
146     dsp_num = determineProcId();\r
147 \r
148     globalConfig = &sampleEdma3GblCfgParams[edma3Id];\r
149 \r
150         /* Configure it as master, if required */\r
151         miscParam.isSlave = isGblConfigRequired(dsp_num);\r
152         edma3Result = EDMA3_DRV_create (edma3Id, globalConfig ,\r
153                                                                         (void *)&miscParam);\r
154 \r
155         if (edma3Result == EDMA3_DRV_SOK)\r
156         {\r
157                 /**\r
158                 * Driver Object created successfully.\r
159                 * Create a semaphore now for driver instance.\r
160                 */\r
161                 Semaphore_Params_init(&semParams);\r
162 \r
163                 initCfg.drvSemHandle = NULL;\r
164                 edma3Result = edma3OsSemCreate(1, &semParams, &initCfg.drvSemHandle);\r
165         }\r
166 \r
167         if (edma3Result == EDMA3_DRV_SOK)\r
168         {\r
169                 /* Save the semaphore handle for future use */\r
170                 semHandle[edma3Id] = initCfg.drvSemHandle;\r
171 \r
172         /* Driver instance specific config NULL */\r
173                 initCfg.drvInstInitConfig = NULL;\r
174 \r
175 #ifndef EDMA3_DRV_USE_DEF_RM_CFG\r
176         /* Hook for running examples with default RM config */\r
177                 /* configuration structure for the Driver */\r
178                 initCfg.drvInstInitConfig = &sampleInstInitConfig[edma3Id][dsp_num];\r
179 #endif\r
180 \r
181                 initCfg.isMaster = TRUE;\r
182                 /* Choose shadow region according to the DSP# */\r
183                 initCfg.regionId = (EDMA3_RM_RegionId)dsp_num;\r
184                 /*Saving the regionId for using it in the sample_cs.c file */\r
185                 region_id = (EDMA3_RM_RegionId)dsp_num;\r
186                 /* Driver instance specific config NULL */\r
187 \r
188                 initCfg.gblerrCb = NULL;\r
189                 initCfg.gblerrData = NULL;\r
190 \r
191                 /* Open the Driver Instance */\r
192                 hEdma = EDMA3_DRV_open (edma3Id, (void *) &initCfg, &edma3Result);\r
193         }\r
194 \r
195         if(hEdma && (edma3Result == EDMA3_DRV_SOK))\r
196         {\r
197                 /**\r
198                 * Register Interrupt Handlers for various interrupts\r
199                 * like transfer completion interrupt, CC error\r
200                 * interrupt, TC error interrupts etc, if required.\r
201                 */\r
202                 registerEdma3Interrupts(edma3Id);\r
203         }\r
204 \r
205         *errorCode = edma3Result;\r
206 \r
207         return (hEdma);\r
208 }\r
209 \r
210 \r
211 /**\r
212  * \brief   EDMA3 De-initialization\r
213  *\r
214  * This function removes the EDMA3 Driver instance and unregisters the\r
215  * interrupt handlers.\r
216  *\r
217   * \return  EDMA3_DRV_SOK if success, else error code\r
218  */\r
219 EDMA3_DRV_Result edma3deinit (unsigned int edma3Id, EDMA3_DRV_Handle hEdma)\r
220 {\r
221     EDMA3_DRV_Result edma3Result = EDMA3_DRV_E_INVALID_PARAM;\r
222 \r
223     /* Unregister Interrupt Handlers first */\r
224     unregisterEdma3Interrupts(edma3Id);\r
225 \r
226     /* Delete the semaphore */\r
227     edma3Result = edma3OsSemDelete(semHandle[edma3Id]);\r
228 \r
229     if (EDMA3_DRV_SOK == edma3Result )\r
230     {\r
231         /* Make the semaphore handle as NULL. */\r
232         semHandle[edma3Id] = NULL;\r
233 \r
234         /* Now, close the EDMA3 Driver Instance */\r
235         edma3Result = EDMA3_DRV_close (hEdma, NULL);\r
236     }\r
237 \r
238         if (EDMA3_DRV_SOK == edma3Result )\r
239     {\r
240         /* Now, delete the EDMA3 Driver Object */\r
241         edma3Result = EDMA3_DRV_delete (edma3Id, NULL);\r
242     }\r
243 \r
244     return (edma3Result);\r
245 }\r
246 \r
247 /* Nothing past this point */\r