1 /* -------------------------------- Arctic Core ------------------------------
\r
2 * Arctic Core - the open source AUTOSAR platform http://arccore.com
\r
4 * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
\r
6 * This source code is free software; you can redistribute it and/or modify it
\r
7 * under the terms of the GNU General Public License version 2 as published by the
\r
8 * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.
\r
10 * This program is distributed in the hope that it will be useful, but
\r
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
\r
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
\r
14 * -------------------------------- Arctic Core ------------------------------*/
\r
16 /* ----------------------------[information]----------------------------------*/
\r
21 * 3.1.5 (ok, it says 3.1.1 but, thats wrong)
\r
24 * Implements the Gpt module
\r
28 * -------------------------------------------
\r
29 * GPT_DEV_ERROR_DETECT Y
\r
32 * GptConfigurationOfOptApiServices Support
\r
33 * -------------------------------------------
\r
35 * GPT_ENABLE_DISABLE_NOTIFICATION_API Y
\r
36 * GPT_TIME_ELAPSED_API Y
\r
37 * GPT_TIME_REMAINING_API Y
\r
38 * GPT_VERSION_INFO_API Y
\r
39 * GPT_WAKEUP_FUNCTIONALITY_API Y
\r
41 * Implementation Notes:
\r
44 * Lots of tagging still to do.
\r
47 /* ----------------------------[includes]------------------------------------*/
\r
49 #include "Std_Types.h"
\r
54 #include "mpc55xx.h"
\r
61 /* ----------------------------[private define]------------------------------*/
\r
62 /* ----------------------------[private macro]-------------------------------*/
\r
64 #if ( GPT_DEV_ERROR_DETECT == STD_ON )
\r
65 #define VALIDATE(_exp,_api,_err ) \
\r
67 Det_ReportError(MODULE_ID_GPT,0,_api,_err); \
\r
71 #define VALIDATE_W_RV(_exp,_api,_err,_rv ) \
\r
73 Det_ReportError(MODULE_ID_GPT,0,_api,_err); \
\r
77 #define VALID_CHANNEL(_ch) ( Gpt_Global.configured & (1<<(_ch)) )
\r
80 #define VALIDATE(_exp,_api,_err )
\r
81 #define VALIDATE_W_RV(_exp,_api,_err,_rv )
\r
84 /* ----------------------------[private typedef]-----------------------------*/
\r
85 /* ----------------------------[private function prototypes]-----------------*/
\r
86 /* ----------------------------[private variables]---------------------------*/
\r
87 /* ----------------------------[private functions]---------------------------*/
\r
88 /* ----------------------------[public functions]----------------------------*/
\r
91 GPT_STATE_STOPPED = 0, GPT_STATE_STARTED,
\r
95 * Type that holds all global data for Gpt
\r
98 // Set if Gpt_Init() have been called
\r
102 const Gpt_ConfigType *config;
\r
104 uint8 wakeupEnabled;
\r
106 // One bit for each channel that is configured.
\r
107 // Used to determine if validity of a channel
\r
109 // 0 - NOT configured
\r
112 // Maps the a channel id to a configured channel id
\r
113 uint8 channelMap[GPT_CHANNEL_CNT];
\r
118 * Type that holds data that are specific for a channel
\r
121 Gpt_StateType state;
\r
124 Gpt_UnitType Gpt_Unit[GPT_CHANNEL_CNT];
\r
127 Gpt_GlobalType Gpt_Global;
\r
129 //-------------------------------------------------------------------
\r
132 * ISR for a given PIT channel (macro)
\r
134 #if defined(CFG_MPC560X)
\r
135 #define GPT_ISR( _channel ) \
\r
136 static void Gpt_Isr_Channel##_channel( void ) \
\r
138 const Gpt_ConfigType *config; \
\r
141 /* Find the config entry for the PIT channel. */ \
\r
142 confCh = Gpt_Global.channelMap[ _channel ]; \
\r
143 assert(confCh != GPT_CHANNEL_ILL); \
\r
144 config = &Gpt_Global.config[ confCh ]; \
\r
146 if( config->GptChannelMode == GPT_MODE_ONESHOT ) \
\r
148 /* Disable the channel. */ \
\r
149 PIT.CH[_channel].TCTRL.B.TEN = 0; \
\r
150 Gpt_Unit[_channel].state = GPT_STATE_STOPPED; \
\r
152 config->GptNotification(); \
\r
154 /* Clear interrupt. */ \
\r
155 PIT.CH[_channel].TFLG.B.TIF = 1; \
\r
158 #define GPT_ISR( _channel ) \
\r
159 static void Gpt_Isr_Channel##_channel( void ) \
\r
161 const Gpt_ConfigType *config; \
\r
164 /* Find the config entry for the PIT channel. */ \
\r
165 confCh = Gpt_Global.channelMap[ _channel ]; \
\r
166 assert(confCh != GPT_CHANNEL_ILL); \
\r
167 config = &Gpt_Global.config[ confCh ]; \
\r
169 if( config->GptChannelMode == GPT_MODE_ONESHOT ) \
\r
171 /* Disable the channel. */ \
\r
172 PIT.EN.R &= ~( 1 << _channel ); \
\r
174 Gpt_Unit[_channel].state = GPT_STATE_STOPPED; \
\r
176 config->GptNotification(); \
\r
178 /* Clear interrupt. */ \
\r
179 PIT.FLG.R = ( 1 << _channel ); \
\r
183 #define STR__(x) #x
\r
184 #define XSTR__(x) STR__(x)
\r
187 * Create instances of the ISR for each PIT channel.
\r
193 #if !defined(CFG_MPC5606S)
\r
196 #if !defined(CFG_MPC5604B)
\r
203 #if defined(CFG_MPC560X)
\r
204 #if defined(CFG_MPC5606S)
\r
205 #define GPT_CHANNEL_PIT_LAST GPT_CHANNEL_PIT_3
\r
206 #elif defined(CFG_MPC5604B)
\r
207 #define GPT_CHANNEL_PIT_LAST GPT_CHANNEL_PIT_5
\r
211 //-------------------------------------------------------------------
\r
213 void Gpt_Init(const Gpt_ConfigType *config) {
\r
214 /** @req 3.1.5/GPT280 */
\r
215 /** @req 3.1.5/GPT006 */
\r
216 /** !req 3.1.5/GPT272 Post build not supported */
\r
217 /** @req 3.1.5/GPT107 The module is disabled */
\r
218 /** @req 3.1.5/GPT068 Global registers must be touched */
\r
219 /** @req 3.1.5/GPT205 */
\r
220 /** !req 3.1.5/GPT294 Post build not supported */
\r
221 /** !req 3.1.5/GPT309 TODO: Check*/
\r
224 const Gpt_ConfigType *cfg;
\r
225 /** @req 3.1.5/GPT307 */
\r
226 VALIDATE( (Gpt_Global.initRun == STD_OFF), GPT_INIT_SERVICE_ID, GPT_E_ALREADY_INITIALIZED );
\r
227 #if defined(GPT_VARIANT_PB)
\r
228 VALIDATE( (config != NULL ), GPT_INIT_SERVICE_ID, GPT_E_PARAM_CONFIG );
\r
229 #elif defined(GPT_VARIANT_PC)
\r
230 // We don't support GPT_VARIANT_PC
\r
233 Gpt_ChannelType ch;
\r
235 for (i = 0; i < GPT_CHANNEL_CNT; i++) {
\r
236 Gpt_Global.channelMap[i] = GPT_CHANNEL_ILL;
\r
241 while (cfg->GptChannelId != GPT_CHANNEL_ILL) {
\r
242 ch = cfg->GptChannelId;
\r
244 // Assign the configuration channel used later..
\r
245 Gpt_Global.channelMap[cfg->GptChannelId] = i;
\r
246 Gpt_Global.configured |= (1 << ch);
\r
248 #if defined(CFG_MPC560X)
\r
249 if (ch <= GPT_CHANNEL_PIT_LAST)
\r
251 if (cfg->GptNotification != NULL)
\r
255 case 0: ISR_INSTALL_ISR2( "Gpt_0", Gpt_Isr_Channel0, PIT_INT0, 2, 0 ); break;
\r
256 case 1: ISR_INSTALL_ISR2( "Gpt_1", Gpt_Isr_Channel1, PIT_INT1, 2, 0 ); break;
\r
257 case 2: ISR_INSTALL_ISR2( "Gpt_2", Gpt_Isr_Channel2, PIT_INT2, 2, 0 ); break;
\r
258 case 3: ISR_INSTALL_ISR2( "Gpt_3", Gpt_Isr_Channel3, PIT_INT3, 2, 0 ); break;
\r
259 #if !defined(CFG_MPC5606S)
\r
260 case 4: ISR_INSTALL_ISR2( "Gpt_4", Gpt_Isr_Channel4, PIT_INT4, 2, 0 ); break;
\r
261 case 5: ISR_INSTALL_ISR2( "Gpt_5", Gpt_Isr_Channel5, PIT_INT5, 2, 0 ); break;
\r
265 // Unknown PIT channel.
\r
273 if (ch <= GPT_CHANNEL_PIT_8) {
\r
274 if (cfg->GptNotification != NULL) {
\r
276 // TODO: What to do with cfg->GptNotificationPriority ?
\r
278 ISR_INSTALL_ISR2( "Gpt_0", Gpt_Isr_Channel0, PIT_PITFLG_RTIF, 2, 0 )
\r
282 ISR_INSTALL_ISR2( "Gpt_1", Gpt_Isr_Channel1, PIT_PITFLG_PIT1, 2, 0 )
\r
286 ISR_INSTALL_ISR2( "Gpt_2", Gpt_Isr_Channel2, PIT_PITFLG_PIT2, 2, 0 )
\r
290 ISR_INSTALL_ISR2( "Gpt_3", Gpt_Isr_Channel3, PIT_PITFLG_PIT3, 2, 0 )
\r
294 ISR_INSTALL_ISR2( "Gpt_4", Gpt_Isr_Channel4, PIT_PITFLG_PIT4, 2, 0 )
\r
298 ISR_INSTALL_ISR2( "Gpt_5", Gpt_Isr_Channel5, PIT_PITFLG_PIT5, 2, 0 )
\r
302 ISR_INSTALL_ISR2( "Gpt_6", Gpt_Isr_Channel6, PIT_PITFLG_PIT6, 2, 0 )
\r
306 ISR_INSTALL_ISR2( "Gpt_7", Gpt_Isr_Channel7, PIT_PITFLG_PIT7, 2, 0 )
\r
310 ISR_INSTALL_ISR2( "Gpt_8", Gpt_Isr_Channel8, PIT_PITFLG_PIT8, 2, 0 )
\r
314 // Unknown PIT channel.
\r
323 #if defined(CFG_MPC560X)
\r
324 //nothing needed to do
\r
331 Gpt_Global.config = config;
\r
333 Gpt_Global.initRun = STD_ON;
\r
335 #if defined(CFG_MPC560X)
\r
336 for(i = 0; i <= GPT_CHANNEL_PIT_LAST; i++)
\r
338 PIT.CH[i].TCTRL.B.TIE = 0;
\r
341 PIT.MCR.B.MDIS = 0;
\r
344 /* @req 3.1.5|GPT258 */
\r
345 PIT.CTRL.B.MDIS = 0;
\r
350 //-------------------------------------------------------------------
\r
352 /** @req 3.1.5/GPT194 */
\r
353 #if GPT_DEINIT_API == STD_ON
\r
355 void Gpt_DeInit(void)
\r
357 /** @req 3.1.5/GPT281 */
\r
358 /** !req 3.1.5/GPT008 TODO: Shouldn't MDIS be set to 1 */
\r
359 /** @req 3.1.5/GPT161 */
\r
360 /** @req 3.1.5/GPT105 */
\r
361 /** @req 3.1.5/GPT162 */
\r
362 /** !req 3.1.5/GPT308 Post build not supported */
\r
363 /** !req 3.1.5/GPT234 It has sideaffects now */
\r
365 Gpt_ChannelType channel;
\r
367 /* @req 3.1.5/GPT220 */
\r
368 VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_DEINIT_SERVICE_ID, GPT_E_UNINIT );
\r
369 for (channel=0; channel<GPT_CHANNEL_CNT; channel++) // Validate that all channels have been stopped
\r
371 VALIDATE( (Gpt_Unit[channel].state == GPT_STATE_STOPPED), GPT_DEINIT_SERVICE_ID, GPT_E_BUSY );
\r
372 Gpt_StopTimer(channel); // Should this be done here?
\r
374 Gpt_Global.initRun = STD_OFF;
\r
375 Gpt_Global.configured = 0;
\r
376 //_config.config = NULL;
\r
380 //-------------------------------------------------------------------
\r
381 // period is in "ticks" !!
\r
382 void Gpt_StartTimer(Gpt_ChannelType channel, Gpt_ValueType period_ticks) {
\r
383 #if !defined(CFG_MPC560X)
\r
388 VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_STARTTIMER_SERVICE_ID, GPT_E_UNINIT ); VALIDATE( VALID_CHANNEL(channel), GPT_STARTTIMER_SERVICE_ID, GPT_E_PARAM_CHANNEL ); VALIDATE( (Gpt_Unit[channel].state == GPT_STATE_STOPPED), GPT_STARTTIMER_SERVICE_ID, GPT_E_BUSY );
\r
389 // GPT_E_PARAM_VALUE, all have 32-bit so no need to check
\r
391 DEBUG(DEBUG_HIGH, "Gpt_StartTimer ch=%d, period=%d [ticks]\n", channel, period_ticks);
\r
393 confCh = Gpt_Global.channelMap[channel];
\r
394 #if defined(CFG_MPC560X)
\r
395 if (channel <= GPT_CHANNEL_PIT_LAST)
\r
397 PIT.CH[channel].LDVAL.R = period_ticks;
\r
399 // Make sure that no interrupt is pending.
\r
400 PIT.CH[channel].TFLG.B.TIF = 1;
\r
402 PIT.CH[channel].TCTRL.B.TEN = 1;
\r
405 if (channel <= GPT_CHANNEL_PIT_8) {
\r
406 uint32 *tlval = (uint32 *) &PIT.TLVAL0;
\r
407 uint32 *tval = (uint32 *) &PIT.TVAL0;
\r
409 tlval[channel] = period_ticks;
\r
410 tval[channel] = period_ticks;
\r
412 // always select interrupt
\r
413 if (channel != GPT_CHANNEL_RTI) {
\r
414 PIT.INTSEL.R |= (1 << channel);
\r
417 // Make sure that no interrupt is pending.
\r
418 PIT.FLG.R = (1 << channel);
\r
421 PIT.EN.R |= (1 << channel);
\r
422 } else if (channel == GPT_CHANNEL_DEC) {
\r
424 tmp = get_spr(SPR_HID0);
\r
426 set_spr(SPR_HID0,tmp);
\r
428 /* Initialize the Decrementer */
\r
429 set_spr(SPR_DEC, period_ticks);
\r
430 set_spr(SPR_DECAR, period_ticks);
\r
432 if (Gpt_Global.config[confCh].GptChannelMode == GPT_MODE_CONTINUOUS) {
\r
433 /* Set autoreload */
\r
434 tmp = get_spr(SPR_TCR);
\r
436 set_spr(SPR_TCR,tmp);
\r
440 if (Gpt_Global.config[confCh].GptNotification != NULL) {
\r
442 Gpt_EnableNotification(channel);
\r
445 Gpt_Unit[channel].state = GPT_STATE_STARTED;
\r
448 void Gpt_StopTimer(Gpt_ChannelType channel) {
\r
450 VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_STOPTIMER_SERVICE_ID, GPT_E_UNINIT ); VALIDATE( VALID_CHANNEL(channel), GPT_STOPTIMER_SERVICE_ID, GPT_E_PARAM_CHANNEL );
\r
452 #if defined(CFG_MPC560X)
\r
453 if (channel <= GPT_CHANNEL_PIT_LAST)
\r
456 PIT.CH[channel].TCTRL.B.TEN = 0;
\r
459 if (channel <= GPT_CHANNEL_PIT_8) {
\r
461 PIT.EN.R &= ~(1 << channel);
\r
462 } else if (channel == GPT_CHANNEL_DEC) {
\r
464 tb = get_spr(SPR_HID0);
\r
466 set_spr(SPR_HID0,tb);
\r
469 Gpt_DisableNotification(channel);
\r
470 Gpt_Unit[channel].state = GPT_STATE_STOPPED;
\r
473 #if ( GPT_TIME_REMAINING_API == STD_ON )
\r
475 Gpt_ValueType Gpt_GetTimeRemaining(Gpt_ChannelType channel)
\r
477 VALIDATE_W_RV( (Gpt_Global.initRun == STD_ON), GPT_GETTIMEREMAINING_SERVICE_ID, GPT_E_UNINIT, 0 );
\r
478 VALIDATE_W_RV( VALID_CHANNEL(channel),GPT_GETTIMEREMAINING_SERVICE_ID, GPT_E_PARAM_CHANNEL, 0 );
\r
479 VALIDATE_W_RV( (Gpt_Unit[channel].state == GPT_STATE_STARTED), GPT_GETTIMEREMAINING_SERVICE_ID, GPT_E_NOT_STARTED, 0 );
\r
480 Gpt_ValueType remaining;
\r
482 #if defined(CFG_MPC560X)
\r
483 if (channel <= GPT_CHANNEL_PIT_LAST)
\r
485 // Time remaining is the time until it hits 0, so just return the current timer value
\r
486 remaining = PIT.CH[channel].CVAL.R;
\r
489 if (channel <= GPT_CHANNEL_PIT_8)
\r
491 uint32 *tval = (uint32 *)&PIT.TVAL0;
\r
492 // Time remaining is the time until it hits 0, so just return the current timer value
\r
493 remaining = tval[channel];
\r
495 else if (channel == GPT_CHANNEL_DEC)
\r
497 remaining = get_spr(SPR_DEC);
\r
501 /* We have written a fault in the fault log. Return 0. */
\r
510 #if ( GPT_TIME_ELAPSED_API == STD_ON )
\r
511 Gpt_ValueType Gpt_GetTimeElapsed(Gpt_ChannelType channel)
\r
513 Gpt_ValueType timer;
\r
515 VALIDATE_W_RV( (Gpt_Global.initRun == STD_ON), GPT_GETTIMEELAPSED_SERVICE_ID, GPT_E_UNINIT ,0 );
\r
516 VALIDATE_W_RV( VALID_CHANNEL(channel),GPT_GETTIMEELAPSED_SERVICE_ID, GPT_E_PARAM_CHANNEL, 0 );
\r
517 VALIDATE_W_RV( (Gpt_Unit[channel].state == GPT_STATE_STARTED),GPT_GETTIMEELAPSED_SERVICE_ID, GPT_E_NOT_STARTED, 0 );
\r
520 // These little creatures count down
\r
522 #if defined(CFG_MPC560X)
\r
523 if (channel <= GPT_CHANNEL_PIT_LAST)
\r
525 uint32 tval = PIT.CH[channel].CVAL.R;
\r
526 uint32 tlval = PIT.CH[channel].LDVAL.R;
\r
527 timer = tlval - tval;
\r
534 if (channel <= GPT_CHANNEL_PIT_8)
\r
536 uint32 *tval = (uint32 *)&PIT.TVAL0;
\r
537 uint32 *tlval = (uint32 *)&PIT.TLVAL0;
\r
538 timer = tlval[channel] - tval[channel];
\r
540 else if (channel == GPT_CHANNEL_DEC)
\r
542 timer = get_spr(SPR_DECAR) - get_spr(SPR_DEC);
\r
546 /* We have written a fault in the fault log. Return 0. */
\r
555 #if ( GPT_ENABLE_DISABLE_NOTIFICATION_API == STD_ON )
\r
556 void Gpt_EnableNotification(Gpt_ChannelType channel)
\r
559 VALIDATE( (Gpt_Global.initRun == STD_ON), 0x7, GPT_E_UNINIT );
\r
560 VALIDATE( VALID_CHANNEL(channel),0x7, GPT_E_PARAM_CHANNEL );
\r
562 #if defined(CFG_MPC560X)
\r
563 if (channel <= GPT_CHANNEL_PIT_LAST)
\r
565 PIT.CH[channel].TCTRL.B.TIE = 1;
\r
568 if (channel <= GPT_CHANNEL_PIT_8)
\r
570 // enable interrupts
\r
571 PIT.INTEN.R |= ( 1 << channel );
\r
573 else if (channel == GPT_CHANNEL_DEC)
\r
576 tmp = get_spr(SPR_TCR);
\r
578 set_spr(SPR_TCR, tmp );
\r
583 void Gpt_DisableNotification(Gpt_ChannelType channel)
\r
586 VALIDATE( (Gpt_Global.initRun == STD_ON), 0x8, GPT_E_UNINIT );
\r
587 VALIDATE( VALID_CHANNEL(channel),0x8, GPT_E_PARAM_CHANNEL );
\r
589 #if defined(CFG_MPC560X)
\r
590 if (channel <= GPT_CHANNEL_PIT_LAST)
\r
592 PIT.CH[channel].TCTRL.B.TIE = 0;
\r
595 if (channel <= GPT_CHANNEL_PIT_8)
\r
597 PIT.INTEN.R &= ~( 1 << channel );
\r
599 else if (channel == GPT_CHANNEL_DEC)
\r
602 tmp = get_spr(SPR_TCR);
\r
604 set_spr(SPR_TCR, tmp );
\r
612 #if ( GPT_WAKEUP_FUNCTIONALITY_API == STD_ON )
\r
614 void Gpt_SetMode(Gpt_ModeType mode)
\r
618 VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_SETMODE_SERVIVCE_ID, GPT_E_UNINIT );
\r
619 VALIDATE( ( mode <= GPT_MODE_SLEEP ), GPT_SETMODE_SERVIVCE_ID, GPT_E_PARAM_MODE );
\r
621 #if defined(CFG_MPC560X)
\r
622 if (mode == GPT_MODE_NORMAL)
\r
624 PIT.PITMCR.B.MDIS = 0;
\r
625 // Do NOT restart channels
\r
627 else if (mode == GPT_MODE_SLEEP)
\r
629 PIT.PITMCR.B.MDIS = 0;
\r
630 // Disable all but RTI
\r
631 for (i= 0; i <= GPT_CHANNEL_PIT_3; i++)
\r
636 if (mode == GPT_MODE_NORMAL)
\r
638 PIT.CTRL.B.MDIS = 0;
\r
639 // Do NOT restart channels
\r
641 else if (mode == GPT_MODE_SLEEP)
\r
644 PIT.CTRL.B.MDIS = 1;
\r
645 // Disable all but RTI
\r
646 for (i= 0; i <= GPT_CHANNEL_PIT_8; i++)
\r
654 void Gpt_DisableWakeup(Gpt_ChannelType channel)
\r
656 VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_DISABLEWAKEUP_SERVICE_ID, GPT_E_UNINIT );
\r
657 VALIDATE( VALID_CHANNEL(channel), GPT_DISABLEWAKEUP_SERVICE_ID, GPT_E_PARAM_CHANNEL );
\r
658 // Only RTI have system wakeup
\r
659 if (channel == GPT_CHANNEL_RTI)
\r
661 Gpt_Global.wakeupEnabled = STD_OFF;
\r
670 void Gpt_EnableWakeup(Gpt_ChannelType channel)
\r
672 VALIDATE( (Gpt_Global.initRun == STD_ON), GPT_ENABLEWAKEUP_SERVICE_ID, GPT_E_UNINIT );
\r
673 VALIDATE( VALID_CHANNEL(channel),GPT_ENABLEWAKEUP_SERVICE_ID, GPT_E_PARAM_CHANNEL );
\r
674 if (channel == GPT_CHANNEL_RTI)
\r
676 Gpt_Global.wakeupEnabled = STD_ON;
\r
685 void Gpt_Cbk_CheckWakeup(EcuM_WakeupSourceType wakeupSource)
\r
692 void Gpt_Notification_0(void) {
\r
693 #if defined(CFG_MPC560X)
\r
694 SIU.GPDO[66].B.PDO = ~SIU.GPDO[66].B.PDO;
\r
697 void Gpt_Notification_1(void) {
\r
698 #if defined(CFG_MPC560X)
\r
699 SIU.GPDO[67].B.PDO = ~SIU.GPDO[67].B.PDO;
\r
702 void Gpt_Notification_2(void) {
\r
703 #if defined(CFG_MPC560X)
\r
704 SIU.GPDO[68].B.PDO = ~SIU.GPDO[68].B.PDO;
\r
707 void Gpt_Notification_3(void) {
\r
708 #if defined(CFG_MPC560X)
\r
709 SIU.GPDO[69].B.PDO = ~SIU.GPDO[69].B.PDO;
\r