iLLD_TC27xD  1.0
IfxGtm_Tom_Timer.c
Go to the documentation of this file.
1 /**
2  * \file IfxGtm_Tom_Timer.c
3  * \brief GTM TIMER details
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 "IfxGtm_Tom_Timer.h"
30 #include "_Utilities/Ifx_Assert.h"
31 #include "IfxGtm_bf.h"
32 #include "stddef.h"
33 
34 /******************************************************************************/
35 /*-------------------------Function Implementations---------------------------*/
36 /******************************************************************************/
37 
39 {
40  boolean event;
41 
42  event = IfxGtm_Tom_Ch_isZeroNotification(driver->tom, driver->timerChannel);
43 
44  if (event)
45  {
47  }
48  else
49  {}
50 
51  return event;
52 }
53 
54 
56 {
57  boolean event;
58 
59  event = IfxGtm_Tom_Ch_isOneNotification(driver->tom, driver->triggerChannel);
60 
61  if (event)
62  {
64  }
65  else
66  {}
67 
68  return event;
69 }
70 
71 
73 {
74  if (driver->timerChannel <= IfxGtm_Tom_Ch_7)
75  {
76  if (channel <= IfxGtm_Tom_Ch_7)
77  {
78  driver->channelsMask[0] |= 1 << channel;
79  driver->tgcGlobalControlDisableUpdate[0] = IfxGtm_Tom_Tgc_buildFeature(0, driver->channelsMask[0], IFX_GTM_TOM_TGC0_GLB_CTRL_UPEN_CTRL0_OFF);
80  driver->tgcGlobalControlApplyUpdate[0] = IfxGtm_Tom_Tgc_buildFeature(driver->channelsMask[0], 0, IFX_GTM_TOM_TGC0_GLB_CTRL_UPEN_CTRL0_OFF);
81  }
82  else
83  {
84  driver->channelsMask[1] |= 1 << (channel - IfxGtm_Tom_Ch_8);
85  driver->tgcGlobalControlDisableUpdate[1] = IfxGtm_Tom_Tgc_buildFeature(0, driver->channelsMask[1], IFX_GTM_TOM_TGC0_GLB_CTRL_UPEN_CTRL0_OFF);
86  driver->tgcGlobalControlApplyUpdate[1] = IfxGtm_Tom_Tgc_buildFeature(driver->channelsMask[1], 0, IFX_GTM_TOM_TGC0_GLB_CTRL_UPEN_CTRL0_OFF);
87  }
88  }
89  else
90  {
91  driver->channelsMask[0] |= 1 << (channel - IfxGtm_Tom_Ch_8);
92  driver->tgcGlobalControlDisableUpdate[0] = IfxGtm_Tom_Tgc_buildFeature(0, driver->channelsMask[0], IFX_GTM_TOM_TGC0_GLB_CTRL_UPEN_CTRL0_OFF);
93  driver->tgcGlobalControlApplyUpdate[0] = IfxGtm_Tom_Tgc_buildFeature(driver->channelsMask[0], 0, IFX_GTM_TOM_TGC0_GLB_CTRL_UPEN_CTRL0_OFF);
94  }
95 }
96 
97 
99 {
101 
102  if (driver->tgc[1])
103  {
104  IfxGtm_Tom_Tgc_writeGlobalControl(driver->tgc[1], driver->tgcGlobalControlApplyUpdate[1]); /* Note: Write of 0 value has no effect */
105  }
106 }
107 
108 
110 {
112 
113  if (driver->tgc[1])
114  {
115  IfxGtm_Tom_Tgc_writeGlobalControl(driver->tgc[1], driver->tgcGlobalControlDisableUpdate[1]); /* Note: Write of 0 value has no effect */
116  }
117 }
118 
119 
121 {
122  return 1.0 / IfxStdIf_Timer_tickToS(driver->base.clockFreq, driver->base.period);
123 }
124 
125 
127 {
128  return driver->base.clockFreq;
129 }
130 
131 
133 {
134  return driver->offset;
135 }
136 
137 
139 {
140  return driver->base.period;
141 }
142 
143 
145 {
146  return IfxGtm_Tom_Ch_getTimerPointer(driver->tom, driver->timerChannel);
147 }
148 
149 
151 {
152  return 1.0 / driver->base.clockFreq;
153 }
154 
155 
157 {
158  return IfxGtm_Tom_Ch_getCompareOne(driver->tom, driver->triggerChannel) - 1;
159 }
160 
161 
163 {
164  return IfxGtm_Tom_Ch_getCompareOnePointer(driver->tom, driver->triggerChannel);
165 }
166 
167 
169 {
170  boolean result = TRUE;
171  IfxGtm_Tom_Timer_Base *base = &driver->base;
172  uint16 maskShift;
173 
174  IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, config->base.countDir == IfxStdIf_Timer_CountDir_up); /* only this mode is supported */
175 
176  driver->gtm = config->gtm;
177  driver->tomIndex = config->tom;
178  driver->tom = &config->gtm->TOM[config->tom];
179  driver->timerChannel = config->timerChannel;
180 
181  base->triggerEnabled = config->base.trigger.enabled;
182 
183  if (base->triggerEnabled)
184  {
185  driver->triggerChannel = config->triggerOut->channel;
186  }
187  else
188  {
189  driver->triggerChannel = driver->timerChannel; // Set to timer channel to disable its use
190  }
191 
192  if (config->timerChannel <= 7)
193  {
194  driver->tgc[0] = IfxGtm_Tom_Ch_getTgcPointer(driver->tom, 0);
195  driver->tgc[1] = IfxGtm_Tom_Ch_getTgcPointer(driver->tom, 1);
196  }
197  else
198  {
199  driver->tgc[0] = IfxGtm_Tom_Ch_getTgcPointer(driver->tom, 1);
200  driver->tgc[1] = NULL_PTR; /* NOTE currently no concatenation between TOMs */
201  }
202 
203  driver->channelsMask[1] = 0;
204  driver->tgcGlobalControlApplyUpdate[1] = 0;
205  driver->tgcGlobalControlDisableUpdate[1] = 0;
206 
207  /* Initialize the timer part */
208  /* FIXME add IfxGtm_Tom_Ch_configurePwmMode() and use it */
209  IfxGtm_Tom_Ch_setClockSource(driver->tom, driver->timerChannel, config->clock);
211 
213 
214  if ((config->base.minResolution > 0) && ((1.0 / base->clockFreq) > config->base.minResolution))
215  {
216  result = FALSE;
218  }
219 
220  result &= IfxGtm_Tom_Timer_setFrequency(driver, config->base.frequency);
221  driver->offset = IfxStdIf_Timer_sToTick(driver->base.clockFreq, 1.0 / config->base.frequency * config->base.startOffset);
222 
223  /* check that driver->offset is not more than 16 bits */
224  if (driver->offset <= 0xFFFF)
225  {
226  IfxGtm_Tom_Ch_setCounterValue(driver->tom, driver->timerChannel, driver->offset);
227  }
228  else
229  {
230  result = FALSE;
232  }
233 
234  /* Initialize the trigger part */
235  maskShift = (config->timerChannel <= 7) ? 0 : 8;
237 
238  if (base->triggerEnabled)
239  {
240  IfxGtm_Tom_Ch triggerChannel = driver->triggerChannel;
241  uint16 triggerChannelMask = 1 << (triggerChannel - maskShift);
242  /* TO DO: enable the trigger to be not in the same TGC group as the timer */
243 
245  IfxGtm_Tom_Ch_setCounterValue(driver->tom, triggerChannel, driver->offset);
246 
247  if (triggerChannel != driver->timerChannel)
248  {
249  /* FIXME add IfxGtm_Tom_Ch_configurePwmMode() and use it */
251  IfxGtm_Tom_Ch_setClockSource(driver->tom, triggerChannel, config->clock);
253  IfxGtm_Tom_Tgc_enableChannels(driver->tgc[0], triggerChannelMask, 0, FALSE);
255  }
256 
257  /* Signal must go out of the GTM even if the port outpout is not enabled */
258  IfxGtm_Tom_Tgc_enableChannelsOutput(driver->tgc[0], triggerChannelMask, 0, FALSE);
259 
260  if (config->base.trigger.outputEnabled)
261  {
262  /* Initialize the port */
264  }
265 
266  result &= IfxGtm_Tom_Timer_setTrigger(driver, config->base.trigger.triggerPoint);
267  }
268 
269  /* Interrupt configuration */
270  {
271  volatile Ifx_SRC_SRCR *src;
272  boolean timerHasIrq = config->base.isrPriority > 0;
273  boolean triggerHasIrq = (config->base.trigger.isrPriority > 0) && base->triggerEnabled;
274 
275  if (driver->triggerChannel == driver->timerChannel)
276  {
277  IfxGtm_Tom_Ch_setNotification(driver->tom, driver->timerChannel, timerHasIrq ? config->irqModeTimer : config->irqModeTrigger, timerHasIrq, triggerHasIrq);
278  src = IfxGtm_Tom_Ch_getSrcPointer(driver->gtm, config->tom, driver->timerChannel);
279  IfxSrc_init(src, timerHasIrq ? config->base.isrProvider : config->base.trigger.isrProvider, timerHasIrq ? config->base.isrPriority : config->base.trigger.isrPriority);
280  /* FIXME ADD warning on interrupt setting in case timer and trigger uses the same channels or different channels, and in case only timer or trigger or both generates interrupts */
281  IfxSrc_enable(src);
282  }
283  else
284  {
286 
287  if (timerHasIrq)
288  {
289  IfxGtm_Tom_Ch_setNotification(driver->tom, driver->timerChannel, irqMode, TRUE, FALSE);
290  src = IfxGtm_Tom_Ch_getSrcPointer(driver->gtm, config->tom, driver->timerChannel);
291  IfxSrc_init(src, config->base.isrProvider, config->base.isrPriority);
292  IfxSrc_enable(src);
293  }
294 
295  if (triggerHasIrq)
296  {
297  IfxGtm_Tom_Ch_setNotification(driver->tom, driver->triggerChannel, irqMode, FALSE, TRUE);
298  src = IfxGtm_Tom_Ch_getSrcPointer(driver->gtm, config->tom, driver->triggerChannel);
299  IfxSrc_init(src, config->base.trigger.isrProvider, config->base.trigger.isrPriority);
300  IfxSrc_enable(src);
301  }
302  }
303  }
304 
305  /* Transfer the shadow registers */
306  IfxGtm_Tom_Tgc_setChannelsForceUpdate(driver->tgc[0], driver->channelsMask[0], 0, 0, 0);
307  IfxGtm_Tom_Tgc_trigger(driver->tgc[0]);
308  IfxGtm_Tom_Tgc_setChannelsForceUpdate(driver->tgc[0], 0, driver->channelsMask[0], 0, 0);
309 
310  return result;
311 }
312 
313 
315 {
317  config->gtm = gtm;
318  config->tom = IfxGtm_Tom_0;
319  config->timerChannel = IfxGtm_Tom_Ch_0;
320  config->triggerOut = NULL_PTR;
325 }
326 
327 
329 {
330  IfxGtm_Tom_Tgc_enableChannels(driver->tgc[0], driver->channelsMask[0], 0, TRUE);
331 
332  if (driver->tgc[1])
333  {
334  IfxGtm_Tom_Tgc_enableChannels(driver->tgc[1], driver->channelsMask[1], 0, TRUE); /* Note: Write of 0 value has no effect */
335  }
336 }
337 
338 
340 {
341  Ifx_TimerValue period = IfxStdIf_Timer_sToTick(driver->base.clockFreq, 1.0 / frequency);
342 
343  return IfxGtm_Tom_Timer_setPeriod(driver, period);
344 }
345 
346 
348 {
349  boolean result = TRUE;
350  driver->base.period = period;
351 
352  /* check that period is not more that 16 bits */
353  if (period <= 0xFFFF)
354  {
355  IfxGtm_Tom_Ch_setCompareZeroShadow(driver->tom, driver->timerChannel, period);
356 
357  if (driver->triggerChannel != driver->timerChannel)
358  {
359  IfxGtm_Tom_Ch_setCompareZeroShadow(driver->tom, driver->triggerChannel, period);
360  }
361  }
362  else
363  {
364  result = FALSE;
366  }
367 
368  return result;
369 }
370 
371 
372 void IfxGtm_Tom_Timer_setSingleMode(IfxGtm_Tom_Timer *driver, boolean enabled)
373 {
374  IfxGtm_Tom_Ch_setOneShotMode(driver->tom, driver->timerChannel, enabled);
375 }
376 
377 
379 {
380  boolean result = TRUE;
381 
382  /* check that trigger point is not more that 16 bits */
383  if (triggerPoint <= (0xFFFF - 1))
384  {
385  IfxGtm_Tom_Ch_setCompareOneShadow(driver->tom, driver->triggerChannel, triggerPoint + 1);
386  }
387  else
388  {
389  result = FALSE;
391  }
392 
393  return result;
394 }
395 
396 
398 {
399  /* *INDENT-OFF* Note: this file was indented manually by the author. */
400  /* Set the API link */
401  stdif->driver = driver;
418  /* *INDENT-ON* */
419 
420  return TRUE;
421 }
422 
423 
425 {
426  IfxGtm_Tom_Tgc_enableChannels(driver->tgc[0], 0, driver->channelsMask[0], TRUE);
427 
428  if (driver->tgc[1])
429  {
430  IfxGtm_Tom_Tgc_enableChannels(driver->tgc[1], 0, driver->channelsMask[1], TRUE); /* Note: Write of 0 value has no effect */
431  }
432 }
433 
434 
436 {
437  driver->base.clockFreq = IfxGtm_Tom_Ch_getClockFrequency(driver->gtm, driver->tom, driver->timerChannel);
438 }