iLLD_TC27xD  1.0
IfxPort.c
Go to the documentation of this file.
1 /**
2  * \file IfxPort.c
3  * \brief PORT basic functionality
4  *
5  * \version iLLD_1_0_0_11_0
6  * \copyright Copyright (c) 2013 Infineon Technologies AG. All rights reserved.
7  *
8  *
9  * IMPORTANT NOTICE
10  *
11  *
12  * Infineon Technologies AG (Infineon) is supplying this file for use
13  * exclusively with Infineon's microcontroller products. This file can be freely
14  * distributed within development tools that are supporting such microcontroller
15  * products.
16  *
17  * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
18  * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
20  * INFINEON SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
21  * OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
22  *
23  */
24 
25 /******************************************************************************/
26 /*----------------------------------Includes----------------------------------*/
27 /******************************************************************************/
28 
29 #include "IfxPort.h"
30 
31 /******************************************************************************/
32 /*-------------------------Function Implementations---------------------------*/
33 /******************************************************************************/
34 
35 boolean IfxPort_disableEmergencyStop(Ifx_P *port, uint8 pinIndex)
36 {
37  sint32 portIndex;
38  boolean result = FALSE;
39 
40  for (portIndex = 0; portIndex < IFXPORT_NUM_MODULES; portIndex++)
41  {
42  if (port == IfxPort_cfg_esrMasks[portIndex].port)
43  {
44  if ((1U << pinIndex) & IfxPort_cfg_esrMasks[portIndex].masks)
45  {
46  IfxPort_resetESR(port, pinIndex);
47  result = TRUE;
48  }
49 
50  break;
51  }
52  }
53 
54  return result;
55 }
56 
57 
58 boolean IfxPort_enableEmergencyStop(Ifx_P *port, uint8 pinIndex)
59 {
60  sint32 portIndex;
61  boolean result = FALSE;
62 
63  for (portIndex = 0; portIndex < IFXPORT_NUM_MODULES; portIndex++)
64  {
65  if (port == IfxPort_cfg_esrMasks[portIndex].port)
66  {
67  if ((1U << pinIndex) & IfxPort_cfg_esrMasks[portIndex].masks)
68  {
69  IfxPort_setESR(port, pinIndex);
70  result = TRUE;
71  }
72  }
73  }
74 
75  return result;
76 }
77 
78 
80 {
81  sint32 result = -1, index;
82 
83  for (index = 0; index < IFXPORT_NUM_MODULES; index++)
84  {
85  if (IfxPort_cfg_indexMap[index].module == port)
86  {
87  result = IfxPort_cfg_indexMap[index].index;
88  break;
89  }
90  }
91 
92  return result;
93 }
94 
95 
96 void IfxPort_resetESR(Ifx_P *port, uint8 pinIndex)
97 {
99 
101  __ldmst(&port->ESR.U, 1U << pinIndex, 0);
102  IfxScuWdt_setCpuEndinit(passwd);
103 }
104 
105 
106 void IfxPort_setESR(Ifx_P *port, uint8 pinIndex)
107 {
109 
111  __ldmst(&port->ESR.U, 1U << pinIndex, 1U << pinIndex);
112  IfxScuWdt_setCpuEndinit(passwd);
113 }
114 
115 
116 void IfxPort_setGroupModeInput(Ifx_P *port, uint8 pinIndex, uint16 mask, IfxPort_InputMode mode)
117 {
118  uint32 i;
119  uint32 iocrVal[4];
120  uint32 iocrMask[4];
121 
122  /* initialise */
123  for (i = 0; i < 4; i++)
124  {
125  iocrVal[i] = 0;
126  iocrMask[i] = 0;
127  }
128 
129  /* calculate IOCRx values and masks */
130  uint32 imask = (uint32)mask << pinIndex;
131 
132  for (i = pinIndex; i < 16; i++)
133  {
134  if ((imask & (1U << i)) != 0)
135  {
136  uint32 index = i / 4;
137  uint32 shift = (i & 0x3U) * 8;
138  iocrMask[index] |= (0x1FU << 3) << shift;
139  iocrVal[index] |= (mode) << shift;
140  }
141  }
142 
143  /* write IOCRx */
144  for (i = 0; i < 4; i++)
145  {
146  if (iocrMask[i] != 0)
147  {
148  __ldmst(&((&(port->IOCR0.U))[i]), iocrMask[i], iocrVal[i]);
149  }
150  }
151 }
152 
153 
154 void IfxPort_setGroupModeOutput(Ifx_P *port, uint8 pinIndex, uint16 mask, IfxPort_OutputMode mode, IfxPort_OutputIdx index)
155 {
156  uint32 i;
157  uint32 iocrVal[4];
158  uint32 iocrMask[4];
159 
160  /* initialise */
161  for (i = 0; i < 4; i++)
162  {
163  iocrVal[i] = 0;
164  iocrMask[i] = 0;
165  }
166 
167  /* calculate IOCRx values and masks */
168  uint32 imask = (uint32)mask << pinIndex;
169 
170  for (i = pinIndex; i < 16; i++)
171  {
172  if ((imask & (1U << i)) != 0)
173  {
174  uint32 index = i / 4;
175  uint32 shift = (i & 0x3U) * 8;
176  iocrMask[index] |= (0x1FU << 3) << shift;
177  iocrVal[index] |= (mode | index) << shift;
178  }
179  }
180 
181  /* write IOCRx */
182  for (i = 0; i < 4; i++)
183  {
184  if (iocrMask[i] != 0)
185  {
186  __ldmst(&((&(port->IOCR0.U))[i]), iocrMask[i], iocrVal[i]);
187  }
188  }
189 }
190 
191 
192 void IfxPort_setGroupPadDriver(Ifx_P *port, uint8 pinIndex, uint16 mask, IfxPort_PadDriver padDriver)
193 {
195 
197  {
198  uint32 i;
199  uint32 pdrVal[2];
200  uint32 pdrMask[2];
201 
202  /* initialise */
203  for (i = 0; i < 2; i++)
204  {
205  pdrVal[i] = 0;
206  pdrMask[i] = 0;
207  }
208 
209  /* calculate PDRx values and masks */
210  uint32 imask = (uint32)mask << pinIndex;
211 
212  for (i = pinIndex; i < 16; i++)
213  {
214  if ((imask & (1U << i)) != 0)
215  {
216  uint32 index = i / 8;
217  uint32 shift = (i & 0x7U) * 4;
218  pdrMask[index] |= (0xFUL << shift);
219  pdrVal[index] |= (padDriver << shift);
220  }
221  }
222 
223  /* write PDRx */
224  for (i = 0; i < 2; i++)
225  {
226  if (pdrMask[i] != 0)
227  {
228  __ldmst(&((&(port->PDR0.U))[i]), pdrMask[i], pdrVal[i]);
229  }
230  }
231  }
232  IfxScuWdt_setCpuEndinit(passwd);
233 }
234 
235 
236 void IfxPort_setPinMode(Ifx_P *port, uint8 pinIndex, IfxPort_Mode mode)
237 {
238  volatile Ifx_P_IOCR0 *iocr = &(port->IOCR0);
239  uint8 iocrIndex = (pinIndex / 4);
240  uint8 shift = (pinIndex & 0x3U) * 8;
242 
243  if (port == &MODULE_P40)
244  {
246  port->PDISC.U &= ~(1 << pinIndex);
247  IfxScuWdt_setCpuEndinit(passwd);
248  }
249 
250  __ldmst(&iocr[iocrIndex].U, (0xFFUL << shift), (mode << shift));
251 }
252 
253 
254 void IfxPort_setPinPadDriver(Ifx_P *port, uint8 pinIndex, IfxPort_PadDriver padDriver)
255 {
257 
259  {
260  volatile uint32 *pdr = (volatile uint32 *)&(port->PDR0.U);
261  uint8 pdrIndex = (pinIndex / 8);
262  uint8 shift = (pinIndex & 0x7U) * 4;
263  __ldmst(&(pdr[pdrIndex]), (0xFUL << shift), (padDriver << shift));
264  }
265  IfxScuWdt_setCpuEndinit(passwd);
266 }
267 
268 
269 void IfxPort_setPinModeLvdsMedium(Ifx_P *port, uint8 pinIndex, IfxPort_PadDriver lvdsPadDriver, IfxPort_PadSupply padSupply)
270 {
271  uint32 pdrOffset = (pinIndex / 8);
272  uint32 shift = ((pinIndex / 2) * 8);
273  uint32 lpcrOffset = (pinIndex / 2);
274  volatile Ifx_P_PDR0 *pdr = &(port->PDR0);
275  volatile Ifx_P_LPCR0 *lpcr = &(port->LPCR0);
277 
279  {
280  pdr[pdrOffset].U = (lvdsPadDriver << shift); /* configuring LVDS mode */
281  lpcr[lpcrOffset].B.PS1 = padSupply;
282  }
283  IfxScuWdt_setCpuEndinit(passwd);
284 }
285 
286 
287 void IfxPort_setPinModeLvdsHigh(Ifx_P *port, uint8 pinIndex, IfxPort_Mode mode, IfxPort_ControlledBy enablePortControlled)
288 {
290 
292 
294  {
295  if (pinIndex < 2)
296  {}
297  else
298  {
299  port->LPCR1.B_P21.RDIS_CTRL = enablePortControlled;
300  port->LPCR1.B_P21.RX_DIS = 0;
301  }
302  }
303  else
304  {
305  port->LPCR2.B.TDIS_CTRL = enablePortControlled;
306  port->LPCR2.B.TX_DIS = 0;
307  port->LPCR2.B.TX_PD = 0;
308  }
309 
310  IfxScuWdt_setCpuEndinit(passwd);
311 }