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 |