omap3530/beagle_drivers/led/led.cpp
changeset 62 4132b3bda717
parent 60 7f38143c4aa6
equal deleted inserted replaced
57:002c11474c92 62:4132b3bda717
    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 		GPIO::SetPinMode(KGPIO_LED0, GPIO::EEnabled);
       
    43 		GPIO::SetOutputState(KGPIO_LED0, GPIO::ELow);
       
    44 		iTimer.OneShot(NKern::TimerTicks(KBeatTimeInSeconds * 1000));		
    46 		}
    45 		}
    47 	else
    46 	else
    48 		{
    47 		{
    49 		GPIO::SetOutputState(KGPIO_LED1, GPIO::EHigh);
    48 		Kern::Printf("LedHeartBeat: SetPinDirection for LED failed, r %d", r);
    50 		}
    49 		}
    51 	
    50 	return r;
    52 	heartBeatTimer->Again(Variant::GetMsTickPeriod());
       
    53 	}
    51 	}
    54 
    52 
       
    53 void LedHeartBeat::Beat(TAny * aPtr)
       
    54 	{
       
    55 	LedHeartBeat* b = (LedHeartBeat*)aPtr;
       
    56 	if(b->iIsLedOn)
       
    57 		{
       
    58 		GPIO::SetOutputState(KGPIO_LED0, GPIO::ELow);
       
    59 		b->iIsLedOn = EFalse;
       
    60 		}
       
    61 	else
       
    62 		{
       
    63 		GPIO::SetOutputState(KGPIO_LED0, GPIO::EHigh);
       
    64 		b->iIsLedOn = ETrue;
       
    65 		}
       
    66 	b->iTimer.Again(NKern::TimerTicks(KBeatTimeInSeconds * 1000));
       
    67 	}
       
    68 
       
    69 // the following macro is defined in led.mmp file..
       
    70 #ifdef USER_BUTTON_ENTERS_CRASH_DEBUGGER
       
    71 static void UserButtonIsr(TAny* aPtr)
       
    72 	{
       
    73 	//make sure the heartbeat led is OFF when we crash
       
    74 	GPIO::SetOutputState(KGPIO_LED0, GPIO::ELow);
       
    75 	Kern::Printf("User button pressed, entering crash debugger..\n");
       
    76 	Kern::Fault("led.cpp", __LINE__);
       
    77 	}
       
    78 
       
    79 TInt SetupUserButton()
       
    80 	{
       
    81 	TInt r = GPIO::BindInterrupt(KGPIO_UserButton, UserButtonIsr, NULL);
       
    82 	if(r != KErrNone)
       
    83 		{
       
    84 		Kern::Printf("GPIO::BindInterrupt() failed for button %d, r=%d, (is in use?)",
       
    85 		             KGPIO_UserButton, r);
       
    86 		return r;
       
    87 		}
       
    88 
       
    89 	r = GPIO::SetInterruptTrigger(KGPIO_UserButton, GPIO::EEdgeRising);
       
    90 	if(r == KErrNone)
       
    91 		{
       
    92 		r = GPIO::SetPinDirection(KGPIO_UserButton, GPIO::EInput);
       
    93 		if(r == KErrNone)
       
    94 			{
       
    95 			GPIO::SetDebounceTime(KGPIO_UserButton, 500);
       
    96 			GPIO::SetPinMode(KGPIO_UserButton, GPIO::EEnabled);
       
    97 			r = GPIO::EnableInterrupt(KGPIO_UserButton);
       
    98 			}
       
    99 		}
       
   100 	return r;
       
   101 	}
       
   102 #endif
    55 
   103 
    56 DECLARE_STANDARD_EXTENSION()
   104 DECLARE_STANDARD_EXTENSION()
    57 	{
   105 	{
    58 		
   106 	TInt r = KErrNoMemory;
    59 	//Set up the button to proivde a panic button invoking Fault()
   107 	LedHeartBeat* beat = new LedHeartBeat;
    60 	if(KErrNone != GPIO::SetPinDirection(KGPIO_UserButton, GPIO::EInput))
   108 	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 		{
   109 		{
    74 		GPIO::UnbindInterrupt(KGPIO_UserButton);
   110 		r = beat->DoCreate();
    75 		return KErrInUse;
   111 		}
    76 		}		
       
    77 
   112 
    78 	//setup the Led to flash at the system tick rate ( heartbeat) 
   113 #ifdef USER_BUTTON_ENTERS_CRASH_DEBUGGER
    79 	heartBeatTimer = new NTimer(beatLedHeartBeat,NULL);
   114 	if(r == KErrNone)
    80 	
   115 		{
    81 	if(KErrNone != GPIO::SetPinDirection(KGPIO_LED1, GPIO::EOutput))
   116 		r = SetupUserButton();
    82 			return KErrArgument;
   117 		}
    83 	
   118 #endif
    84 	if(KErrNone != GPIO::SetPinDirection(KGPIO_LED0, GPIO::EOutput))
   119 	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 	}
   120 	}
    94 
   121