omap3530/beagle_drivers/led/led.cpp
branchgeneric_fixes_and_updates
changeset 54 4dfcb6499328
parent 0 6663340f3fc9
child 59 7f38143c4aa6
equal deleted inserted replaced
53:1a6d5cf981cd 54:4dfcb6499328
    11 // Contributors:
    11 // Contributors:
    12 //
    12 //
    13 // Description:
    13 // Description:
    14 // omap3530/beagle_drivers/led/led.cpp
    14 // omap3530/beagle_drivers/led/led.cpp
    15 //
    15 //
       
    16 #include <beagle/beagle_gpio.h>
    16 
    17 
    17 #include <kern_priv.h>
    18 const TInt KBeatTimeInSeconds = 4;
    18 #include <beagle/beagle_gpio.h>
       
    19 #include <assp/omap3530_assp/omap3530_gpio.h>
       
    20 #include <beagle/variant.h>
       
    21 #include <assp/omap3530_assp/omap3530_assp_priv.h>
       
    22 #include <assp/omap3530_assp/omap3530_irqmap.h> // GPIO interrupts
       
    23 
    19 
    24 #include <assp.h> // Required for definition of TIsr
    20 class LedHeartBeat
       
    21 	{
       
    22 public:
       
    23 	inline LedHeartBeat();
       
    24 	/*inline ~LedHeartBeat() { iTimer.Cancel(); }*/ // will it ever be destroyed?
       
    25 	TInt DoCreate();
       
    26 	static void Beat(TAny *aPtr);
       
    27 private:
       
    28 	NTimer iTimer;
       
    29 	TBool iIsLedOn;
       
    30 	};
    25 
    31 
    26 static NTimer * heartBeatTimer;
    32 LedHeartBeat::LedHeartBeat() :
    27 
    33 	iTimer(Beat, this)
    28 
    34 	{
    29 
       
    30 static void ledIsr(TAny* aPtr)
       
    31 	{									
       
    32 	//make sure the led is always in the sma estate when we crash
       
    33 	
       
    34 	GPIO::SetOutputState(KGPIO_LED1, GPIO::ELow);
       
    35 	Kern::Fault("User invoked crash via keypad",KErrDied);
       
    36 	}
    35 	}
    37 
    36 
    38 static void beatLedHeartBeat(TAny * ptr)
    37 TInt LedHeartBeat::DoCreate()
    39 	{
    38 	{
    40 	GPIO::TGpioState ledState;
    39 	TInt r = GPIO::SetPinDirection(KGPIO_LED0, GPIO::EOutput);
    41 	GPIO::GetOutputState(KGPIO_LED1, ledState);
    40 	if (r != KErrNone)
    42 		
       
    43 	if(GPIO::EHigh == ledState)
       
    44 		{
    41 		{
    45 		GPIO::SetOutputState(KGPIO_LED1, GPIO::ELow);
    42 		Kern::Printf("LedHeartBeat: SetPinDirection for LED failed, r %d", r);
       
    43 		}
       
    44 	GPIO::SetPinMode(KGPIO_LED0, GPIO::EEnabled);
       
    45 	GPIO::SetOutputState(KGPIO_LED0, GPIO::ELow);
       
    46 	iTimer.OneShot(NKern::TimerTicks(KBeatTimeInSeconds * 1000));
       
    47 	return r;
       
    48 	}
       
    49 
       
    50 void LedHeartBeat::Beat(TAny * aPtr)
       
    51 	{
       
    52 	LedHeartBeat* b = (LedHeartBeat*)aPtr;
       
    53 	if(b->iIsLedOn)
       
    54 		{
       
    55 		GPIO::SetOutputState(KGPIO_LED0, GPIO::ELow);
       
    56 		b->iIsLedOn = EFalse;
    46 		}
    57 		}
    47 	else
    58 	else
    48 		{
    59 		{
    49 		GPIO::SetOutputState(KGPIO_LED1, GPIO::EHigh);
    60 		GPIO::SetOutputState(KGPIO_LED0, GPIO::EHigh);
       
    61 		b->iIsLedOn = ETrue;
    50 		}
    62 		}
    51 	
    63 	b->iTimer.Again(NKern::TimerTicks(KBeatTimeInSeconds * 1000));
    52 	heartBeatTimer->Again(Variant::GetMsTickPeriod());
       
    53 	}
    64 	}
    54 
    65 
       
    66 // the following macro is defined in led.mmp file..
       
    67 #ifdef USER_BUTTON_ENTERS_CRASH_DEBUGGER
       
    68 static void UserButtonIsr(TAny* aPtr)
       
    69 	{
       
    70 	//make sure the heartbeat led is OFF when we crash
       
    71 	GPIO::SetOutputState(KGPIO_LED0, GPIO::ELow);
       
    72 	Kern::Printf("User button pressed, entering crash debugger..\n");
       
    73 	Kern::Fault("led.cpp", __LINE__);
       
    74 	}
       
    75 
       
    76 TInt SetupUserButton()
       
    77 	{
       
    78 	TInt r = GPIO::BindInterrupt(KGPIO_UserButton, UserButtonIsr, NULL);
       
    79 	if(r != KErrNone)
       
    80 		{
       
    81 		Kern::Printf("GPIO::BindInterrupt() failed for button %d, r=%d, (is in use?)",
       
    82 		             KGPIO_UserButton, r);
       
    83 		return r;
       
    84 		}
       
    85 
       
    86 	r = GPIO::SetInterruptTrigger(KGPIO_UserButton, GPIO::EEdgeRising);
       
    87 	if(r == KErrNone)
       
    88 		{
       
    89 		r = GPIO::SetPinDirection(KGPIO_UserButton, GPIO::EInput);
       
    90 		if(r == KErrNone)
       
    91 			{
       
    92 			GPIO::SetDebounceTime(KGPIO_UserButton, 500);
       
    93 			GPIO::SetPinMode(KGPIO_UserButton, GPIO::EEnabled);
       
    94 			r = GPIO::EnableInterrupt(KGPIO_UserButton);
       
    95 			}
       
    96 		}
       
    97 	return r;
       
    98 	}
       
    99 #endif
    55 
   100 
    56 DECLARE_STANDARD_EXTENSION()
   101 DECLARE_STANDARD_EXTENSION()
    57 	{
   102 	{
    58 		
   103 	TInt r = KErrNoMemory;
    59 	//Set up the button to proivde a panic button invoking Fault()
   104 	LedHeartBeat* beat = new LedHeartBeat;
    60 	if(KErrNone != GPIO::SetPinDirection(KGPIO_UserButton, GPIO::EInput))
   105 	if(beat)
    61 		return KErrArgument;
       
    62 		
       
    63 	GPIO::SetPinMode(KGPIO_UserButton, GPIO::EEnabled);
       
    64 	GPIO::SetDebounceTime(KGPIO_UserButton, 500);
       
    65 	
       
    66 	if(KErrNone !=GPIO::BindInterrupt(KGPIO_UserButton, ledIsr,NULL))
       
    67 		return KErrArgument;
       
    68 		
       
    69 	if(KErrNone !=GPIO::SetInterruptTrigger(KGPIO_UserButton, GPIO::EEdgeRising))
       
    70 		return KErrArgument;
       
    71 		
       
    72 	if(KErrNone !=GPIO::EnableInterrupt(KGPIO_UserButton))
       
    73 		{
   106 		{
    74 		GPIO::UnbindInterrupt(KGPIO_UserButton);
   107 		r = beat->DoCreate();
    75 		return KErrInUse;
   108 		}
    76 		}		
       
    77 
   109 
    78 	//setup the Led to flash at the system tick rate ( heartbeat) 
   110 #ifdef USER_BUTTON_ENTERS_CRASH_DEBUGGER
    79 	heartBeatTimer = new NTimer(beatLedHeartBeat,NULL);
   111 	if(r == KErrNone)
    80 	
   112 		{
    81 	if(KErrNone != GPIO::SetPinDirection(KGPIO_LED1, GPIO::EOutput))
   113 		r = SetupUserButton();
    82 			return KErrArgument;
   114 		}
    83 	
   115 #endif
    84 	if(KErrNone != GPIO::SetPinDirection(KGPIO_LED0, GPIO::EOutput))
   116 	return r;
    85 				return KErrArgument;
       
    86 
       
    87 	GPIO::SetPinMode(KGPIO_LED0, GPIO::EEnabled);
       
    88 	GPIO::SetPinMode(KGPIO_LED1, GPIO::EEnabled);
       
    89 	GPIO::SetOutputState(KGPIO_LED0, GPIO::ELow);	
       
    90 	
       
    91 	heartBeatTimer->OneShot(Variant::GetMsTickPeriod(),ETrue);
       
    92 	return KErrNone;	
       
    93 	}
   117 	}
    94 
   118