[processor-sdk/performance-audio-sr.git] / psdk_cust / pdk_k2g_1_0_1_2_eng / packages / ti / board / src / idkAM437x / idkAM437x_pinmux.c
1 /**
2 * @file idkam437xx_pinmux.c
3 *
4 * @brief
5 * This is the pin configuration for IDK EVM AM437x.
6 *
7 * \par
8 * ============================================================================
9 * @n (C) Copyright 2009-2015, Texas Instruments, Inc.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 *
15 * Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 *
18 * Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the
21 * distribution.
22 *
23 * Neither the name of Texas Instruments Incorporated nor the names of
24 * its contributors may be used to endorse or promote products derived
25 * from this software without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 *
39 * \par
40 */
42 #include <stdint.h>
43 #include <stdlib.h>
44 #include <stdio.h>
45 #include "board_internal.h"
46 #include "types.h"
47 #include "hw_types.h"
48 #include "chipdb.h"
49 #include "pinmux.h"
50 #include "error.h"
51 #include "am43xx_pinmux.h"
52 #include "debug.h"
54 extern uint32_t idkAM437x_icssPinMuxFlag;
56 Board_STATUS Board_pinmuxConfig (void)
57 {
58 int32_t status;
60 /* UART */
61 status = PINMUXModuleConfig(CHIPDB_MOD_ID_UART, 0U, NULL);
63 /* CPSW */
64 if((S_PASS == status) && (idkAM437x_icssPinMuxFlag == 0U))
65 {
66 status = PINMUXModuleConfig(CHIPDB_MOD_ID_CPSW, 0U, NULL);
67 }
69 /* I2C */
70 if(S_PASS == status)
71 {
72 status = PINMUXModuleConfig(CHIPDB_MOD_ID_I2C, 0U, NULL);
73 }
74 if(S_PASS == status)
75 {
76 status = PINMUXModuleConfig(CHIPDB_MOD_ID_I2C, 2U, NULL);
77 }
79 /* MMCSD */
80 if((S_PASS == status) && (idkAM437x_icssPinMuxFlag == 0U))
81 {
82 status = PINMUXModuleConfig(CHIPDB_MOD_ID_MMCSD, 0U, NULL);
83 }
85 /* MCSPI */
86 if(S_PASS == status)
87 {
88 status = PINMUXModuleConfig(CHIPDB_MOD_ID_MCSPI, 0U, NULL);
89 }
90 if(S_PASS == status)
91 {
92 status = PINMUXModuleConfig(CHIPDB_MOD_ID_MCSPI, 1U, NULL);
93 }
95 /* QSPI */
96 if(S_PASS == status)
97 {
98 status = PINMUXModuleConfig(CHIPDB_MOD_ID_QSPI, 0U, NULL);
99 }
101 /* VPFE */
102 if(S_PASS == status)
103 {
104 status = PINMUXModuleConfig(CHIPDB_MOD_ID_VPFE, 0U, NULL);
105 }
106 if(S_PASS == status)
107 {
108 status = PINMUXModuleConfig(CHIPDB_MOD_ID_VPFE, 1U, NULL);
109 }
111 /*GPIO*/
112 if(S_PASS == status)
113 {
114 status = PINMUXModuleConfig(CHIPDB_MOD_ID_GPIO, 0U, NULL);
115 }
116 if(S_PASS == status)
117 {
118 status = PINMUXModuleConfig(CHIPDB_MOD_ID_GPIO, 2U, NULL);
119 }
120 if(S_PASS == status)
121 {
122 status = PINMUXModuleConfig(CHIPDB_MOD_ID_GPIO, 3U, NULL);
123 }
124 if(S_PASS == status)
125 {
126 status = PINMUXModuleConfig(CHIPDB_MOD_ID_GPIO, 4U, NULL);
127 }
128 if(S_PASS == status)
129 {
130 status = PINMUXModuleConfig(CHIPDB_MOD_ID_GPIO, 5U, NULL);
131 }
133 /*PWMSS*/
134 if(S_PASS == status)
135 {
136 status = PINMUXModuleConfig(CHIPDB_MOD_ID_PWMSS, 0U, NULL);
137 }
138 if(S_PASS == status)
139 {
140 status = PINMUXModuleConfig(CHIPDB_MOD_ID_PWMSS, 2U, NULL);
141 }
142 if(S_PASS == status)
143 {
144 status = PINMUXModuleConfig(CHIPDB_MOD_ID_PWMSS, 3U, NULL);
145 }
146 if(S_PASS == status)
147 {
148 status = PINMUXModuleConfig(CHIPDB_MOD_ID_PWMSS, 4U, NULL);
149 }
150 if(S_PASS == status)
151 {
152 status = PINMUXModuleConfig(CHIPDB_MOD_ID_PWMSS, 5U, NULL);
153 }
156 /*ADC*/
157 if(S_PASS == status)
158 {
159 status = PINMUXModuleConfig(CHIPDB_MOD_ID_ADC0, 0U, NULL);
160 }
162 /* PRU_ICSS */
163 if((S_PASS == status) && (idkAM437x_icssPinMuxFlag == 1U))
164 {
165 status = PINMUXModuleConfig(CHIPDB_MOD_ID_PRU_ICSS, 0U, NULL);
166 }
167 if((S_PASS == status) && (idkAM437x_icssPinMuxFlag == 1U))
168 {
169 status = PINMUXModuleConfig(CHIPDB_MOD_ID_PRU_ICSS, 1U, NULL);
170 }
172 /* USB */
173 if(S_PASS == status)
174 {
175 status = PINMUXModuleConfig(CHIPDB_MOD_ID_USB, 0U, NULL);
176 }
177 if(S_PASS == status)
178 {
179 status = PINMUXModuleConfig(CHIPDB_MOD_ID_USB, 1U, NULL);
180 }
181 /* MCASP */
182 if(S_PASS == status)
183 {
184 status = PINMUXModuleConfig(CHIPDB_MOD_ID_MCASP, 0U, NULL);
185 }
190 return BOARD_SOK;
191 }
194 int32_t PINMUXModuleConfig(chipdbModuleID_t moduleId, uint32_t instNum,
195 void* pParam1)
196 {
197 pinmuxModuleCfg_t* pModuleData = NULL;
198 pinmuxPerCfg_t* pInstanceData = NULL;
199 volatile const pinmuxBoardCfg_t* pPinmuxData = NULL;
200 uint32_t ctrlModBase = CHIPDBBaseAddress(CHIPDB_MOD_ID_CONTROL_MODULE, 0);
201 int32_t status = E_FAIL;
202 uint32_t index = 0;
204 /* Get module Data */
205 pPinmuxData = gIdkevmPinmuxData;
207 ASSERT(NULL != pPinmuxData);
209 status = E_INVALID_MODULE_ID;
210 for(index = 0; ((S_PASS != status) &&
211 (CHIPDB_MOD_ID_INVALID != pPinmuxData[index].moduleId)); index++)
212 {
213 if(pPinmuxData[index].moduleId == moduleId)
214 {
215 pModuleData = pPinmuxData[index].modulePinCfg;
216 ASSERT(NULL != pModuleData);
217 status = S_PASS;
218 }
219 }
221 /* Get instance Data */
222 if(S_PASS == status)
223 {
224 status = E_INST_NOT_SUPP;
225 for(index = 0; ((S_PASS != status) &&
226 (CHIPDB_INVALID_INSTANCE_NUM != pModuleData[index].modInstNum)); index++)
227 {
228 if(pModuleData[index].modInstNum == instNum)
229 {
230 pInstanceData = pModuleData[index].instPins;
231 ASSERT(NULL != pInstanceData)
232 status = S_PASS;
233 }
234 }
235 }
237 /* Configure Pinmux */
238 if(S_PASS == status)
239 {
240 for(index = 0; ((uint16_t)PINMUX_INVALID_PIN !=
241 pInstanceData[index].pinOffset); index++)
242 {
243 if(NULL != pParam1)
244 {
245 if(pInstanceData[index].optParam == *(uint16_t*)pParam1)
246 {
247 HW_WR_REG32((ctrlModBase + pInstanceData[index].pinOffset),
248 pInstanceData[index].pinSettings);
249 status = S_PASS;
250 break;
251 }
252 }
253 else
254 {
255 HW_WR_REG32((ctrlModBase + pInstanceData[index].pinOffset),
256 pInstanceData[index].pinSettings);
257 }
258 }
259 if((NULL != pParam1) && ((uint16_t)PINMUX_INVALID_PIN == pInstanceData[index].pinOffset))
260 {
261 status = E_FAIL;
262 }
263 }
265 return status;
266 }