1 /*
2 * mcbsp_device.c
3 *
4 * This file contains MCBSP IP related EVM (platform) specific routines
5 * implementation. This file contains the board specific code for enabling
6 * the use of mcbsp driver, and may contain related device pre-driver
7 * initialization routines. The file is provided as a sample configuration
8 * and should be modified by customers for their own platforms and
9 * configurations.
10 *
11 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
12 *
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 *
18 * Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 *
21 * Redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the
24 * distribution.
25 *
26 * Neither the name of Texas Instruments Incorporated nor the names of
27 * its contributors may be used to endorse or promote products derived
28 * from this software without specific prior written permission.
29 *
30 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
32 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
33 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
34 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
35 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
36 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
37 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
38 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
39 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
40 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41 *
42 */
44 /* MCBSP Driver Includes. */
45 #include <ti/drv/mcbsp/mcbsp_types.h>
46 #include <ti/drv/mcbsp/mcbsp_drv.h>
47 #include <ti/drv/mcbsp/mcbsp_osal.h>
49 /* CSL MCBSP Register Layer */
50 #include <ti/csl/cslr_mcbsp.h>
52 #include <ti/csl/cslr_device.h>
54 #include <ti/csl/soc.h>
56 /*============================================================================*/
57 /* IMPORTED VARIABLES */
58 /*============================================================================*/
60 extern Mcbsp_HwInfo Mcbsp_deviceInstInfo[CSL_MCBSP_CNT];
61 extern Mcbsp_TempBuffer Mcbsp_muteBuf[CSL_MCBSP_CNT];
63 #ifdef MCBSP_LOOPJOB_ENABLE
64 extern Mcbsp_TempBuffer Mcbsp_loopDstBuf[CSL_MCBSP_CNT];
65 extern Mcbsp_TempBuffer Mcbsp_loopSrcBuf[CSL_MCBSP_CNT];
66 #endif /* MCBSP_LOOPJOB_ENABLE */
68 /* ========================================================================== */
69 /* MODULE FUNCTIONS */
70 /* ========================================================================== */
71 /**
72 * \brief Initializes McBSP driver's data structures
73 *
74 * This function initializes the McBSP driver's data structures
75 * including instance objects and channel objects. This is the
76 * MCBSP Driver Initialization API which needs to be invoked by
77 * the users to initialize the MCBSP peripheral. This call is
78 * *mandatory* and should be called before calling any of the
79 * other driver API's. This can be modified by customers for
80 * their application and configuration.
81 *
82 * \return None
83 */
84 void McbspDevice_init(void)
85 {
86 int32_t devId = 0;
87 void *key;
89 /* Begin Critical Section before accessing shared resources. */
90 key = Mcbsp_osalEnterMultipleCoreCriticalSection ();
92 /* Invalidate the Cache Contents */
93 Mcbsp_osalBeginMemAccess ((void *)Mcbsp_deviceInstInfo, sizeof(Mcbsp_deviceInstInfo));
95 /* initialize the loop job buffers and the mute buffers for all instances */
96 #ifdef MCBSP_LOOPJOB_ENABLE
97 Mcbsp_osalBeginMemAccess ((void *)Mcbsp_loopDstBuf, sizeof(Mcbsp_loopDstBuf));
98 Mcbsp_osalBeginMemAccess ((void *)Mcbsp_loopSrcBuf, sizeof(Mcbsp_loopSrcBuf));
99 memset((void *)Mcbsp_loopDstBuf,0x0,
100 sizeof(Mcbsp_TempBuffer) * CSL_MCBSP_CNT);
101 memset((void *)Mcbsp_loopSrcBuf,0x0,
102 sizeof(Mcbsp_TempBuffer) * CSL_MCBSP_CNT);
103 #endif /* MCBSP_LOOPJOB_ENABLE */
104 Mcbsp_osalBeginMemAccess ((void *)Mcbsp_muteBuf, sizeof(Mcbsp_muteBuf));
105 memset((void *)Mcbsp_muteBuf,0x0,
106 sizeof(Mcbsp_TempBuffer) * CSL_MCBSP_CNT);
108 /* initialize the information for all the device instances */
109 for (devId = 0; devId < CSL_MCBSP_CNT; devId++)
110 {
111 if (0 == devId)
112 {
113 /* instance 0 initialisation */
114 /* instance 0 initialisation */
115 Mcbsp_deviceInstInfo[devId].obj.instNum = (uint32_t)devId;
116 Mcbsp_deviceInstInfo[devId].obj.regs =
117 (CSL_McbspRegsOvly)CSL_MCBSP_0_CTRL_REGS;
118 Mcbsp_deviceInstInfo[devId].obj.fifoRegs =
119 (CSL_BfifoRegsOvly)CSL_MCBSP_0_FIFO_REGS;
120 Mcbsp_deviceInstInfo[devId].obj.dataAddress =
121 (CSL_BdataRegsOvly)CSL_MCBSP_0_DATA_REGS;
122 Mcbsp_deviceInstInfo[devId].obj.edmaTxEventNum =
123 (uint32_t)CSL_EDMA3_CHA_MCBSP0_TX;
124 Mcbsp_deviceInstInfo[devId].obj.edmaRxEventNum =
125 (uint32_t)CSL_EDMA3_CHA_MCBSP0_RX;
126 Mcbsp_deviceInstInfo[devId].obj.cpuTxEventNum =
127 (uint32_t)CSL_INTC_EVENTID_MCBSP0_TXINT ;
128 Mcbsp_deviceInstInfo[devId].obj.cpuRxEventNum =
129 (uint32_t)CSL_INTC_EVENTID_MCBSP0_RXINT ;
130 }
131 else if (1 == devId)
132 {
133 /* instance 1 initialisation */
134 Mcbsp_deviceInstInfo[devId].obj.instNum = (uint32_t)devId;
135 Mcbsp_deviceInstInfo[devId].obj.regs =
136 (CSL_McbspRegsOvly)CSL_MCBSP_1_CTRL_REGS;
137 Mcbsp_deviceInstInfo[devId].obj.fifoRegs =
138 (CSL_BfifoRegsOvly)CSL_MCBSP_1_FIFO_REGS;
139 Mcbsp_deviceInstInfo[devId].obj.dataAddress =
140 (CSL_BdataRegsOvly)CSL_MCBSP_1_DATA_REGS;
141 Mcbsp_deviceInstInfo[devId].obj.edmaTxEventNum =
142 (uint32_t)CSL_EDMA3_CHA_MCBSP1_TX;
143 Mcbsp_deviceInstInfo[devId].obj.edmaRxEventNum =
144 (uint32_t)CSL_EDMA3_CHA_MCBSP1_RX;
145 Mcbsp_deviceInstInfo[devId].obj.cpuTxEventNum =
146 (uint32_t)CSL_INTC_EVENTID_MCBSP1_TXINT ;
147 Mcbsp_deviceInstInfo[devId].obj.cpuRxEventNum =
148 (uint32_t)CSL_INTC_EVENTID_MCBSP1_RXINT ;
149 }
150 else
151 {
152 /* do nothing */
153 }
155 #ifdef MCBSP_LOOPJOB_ENABLE
156 /* align the buffers to the cache line size */
157 Mcbsp_loopSrcBuf[devId].scratchBuffer = (uint32_t *)
158 (((uint32_t)Mcbsp_loopSrcBuf[devId].scratchBuf + 0x7F) & ~0x7F);
160 Mcbsp_loopDstBuf[devId].scratchBuffer = (uint32_t *)
161 (((uint32_t)Mcbsp_loopDstBuf[devId].scratchBuf + 0x7F) & ~0x7F);
163 Mcbsp_osalEndMemAccess ((void *)Mcbsp_loopSrcBuf, sizeof(Mcbsp_loopSrcBuf));
164 Mcbsp_osalEndMemAccess ((void *)Mcbsp_loopDstBuf, sizeof(Mcbsp_loopDstBuf));
165 #endif /* MCBSP_LOOPJOB_ENABLE */
166 Mcbsp_muteBuf[devId].scratchBuffer = (uint32_t *)
167 (((uint32_t)Mcbsp_muteBuf[devId].scratchBuf + 0x7F) & ~0x7F);
168 Mcbsp_osalEndMemAccess ((void *)Mcbsp_muteBuf, sizeof(Mcbsp_muteBuf));
169 }
171 /* Writeback Global Objects */
172 Mcbsp_osalEndMemAccess ((void *)Mcbsp_deviceInstInfo, sizeof(Mcbsp_deviceInstInfo));
174 /* End Critical Section */
175 Mcbsp_osalExitMultipleCoreCriticalSection (key);
177 return;
178 }
180 /* ========================================================================== */
181 /* END OF FILE */
182 /* ========================================================================== */