summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2010-07-04 16:22:00 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2010-07-04 16:22:00 +0000
commitaf7acc9b9fa7b530cde8ed8c9e10b726e0473c28 (patch)
tree86f4b77720246a9871687d6b2b3f70a965197e43
parent14cba9fc43059f43e3907e2a1fc942b8e2c318c6 (diff)
downloadnuttx-af7acc9b9fa7b530cde8ed8c9e10b726e0473c28.tar.gz
nuttx-af7acc9b9fa7b530cde8ed8c9e10b726e0473c28.tar.bz2
nuttx-af7acc9b9fa7b530cde8ed8c9e10b726e0473c28.zip
Fix LED control logic
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2773 42af7a65-404d-4744-a932-0658087f49c3
-rwxr-xr-xnuttx/configs/nucleus2g/README.txt53
-rwxr-xr-xnuttx/configs/nucleus2g/include/board.h47
-rwxr-xr-xnuttx/configs/nucleus2g/src/nucleus2g_internal.h6
-rwxr-xr-xnuttx/configs/nucleus2g/src/up_leds.c291
4 files changed, 171 insertions, 226 deletions
diff --git a/nuttx/configs/nucleus2g/README.txt b/nuttx/configs/nucleus2g/README.txt
index d77c77c83..2bedd2c43 100755
--- a/nuttx/configs/nucleus2g/README.txt
+++ b/nuttx/configs/nucleus2g/README.txt
@@ -13,7 +13,7 @@ Contents
IDEs
NuttX buildroot Toolchain
USB Device Controller Functions
- OLED
+ LEDs
Nucleus 2G Configuration Options
Configurations
@@ -208,6 +208,57 @@ NuttX buildroot Toolchain
NOTE: This is an OABI toolchain.
+LEDs
+^^^^
+
+ If CONFIG_ARCH_LEDS is defined, then support for the Nucleus-2G LEDs will be
+ included in the build. See:
+
+ - configs/nucleus2g/include/board.h - Defines LED constants, types and
+ prototypes the LED interface functions.
+
+ - configs/nucleus2g/src/nucleus2g_internal.h - GPIO settings for the LEDs.
+
+ - configs/nucleus2g/src/up_leds.c - LED control logic.
+
+ The Nucleus2G has 3 LEDs... two on the Babel CAN board and a "heartbeat" LED."
+ The LEDs on the Babel CAN board are capabl of OFF/GREEN/RED/AMBER status.
+ In normal usage, the two LEDs on the Babel CAN board would show CAN status, but if
+ CONFIG_ARCH_LEDS is defined, these LEDs will be controlled as follows for NuttX
+ debug functionality (where NC means "No Change").
+
+ During the boot phases. LED1 and LED2 will show boot status.
+
+ /* LED1 LED2 HEARTBEAT */
+ #define LED_STARTED 0 /* OFF OFF OFF */
+ #define LED_HEAPALLOCATE 1 /* GREEN OFF OFF */
+ #define LED_IRQSENABLED 2 /* OFF GREEN OFF */
+ #define LED_STACKCREATED 3 /* OFF OFF OFF */
+
+ #define LED_INIRQ 4 /* NC NC ON (momentary) */
+ #define LED_SIGNAL 5 /* NC NC ON (momentary) */
+ #define LED_ASSERTION 6 /* NC NC ON (momentary) */
+ #define LED_PANIC 7 /* NC NC ON (1Hz flashing) */
+
+ After the system is booted, this logic will no longer use LEDs 1 and 2. They
+ are then available for use the application software using lpc17_led1() and
+ lpc17_led2():
+
+ enum lpc17_ledstate_e
+ {
+ LPC17_LEDSTATE_OFF = 0,
+ LPC17_LEDSTATE_GREEN = 1,
+ LPC17_LEDSTATE_RED = 2,
+ LPC17_LEDSTATE_AMBER = (LPC17_LEDSTATE_GREEN|LPC17_LEDSTATE_RED),
+ };
+
+ EXTERN void lpc17_led1(enum lpc17_ledstate_e state);
+ EXTERN void lpc17_led2(enum lpc17_ledstate_e state);
+
+ The heartbeat LED is illuminated during all interrupt and signal procressing.
+ Normally, it will glow dimly to inicate that the LPC17xx is taking interrupts.
+ On an assertion PANIC, it will flash at 1Hz.
+
Nucleus 2G Configuration Options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/nuttx/configs/nucleus2g/include/board.h b/nuttx/configs/nucleus2g/include/board.h
index 11d793f9d..415bf1741 100755
--- a/nuttx/configs/nucleus2g/include/board.h
+++ b/nuttx/configs/nucleus2g/include/board.h
@@ -127,17 +127,24 @@
* In normal usage, the two LEDs on the Babel CAN board would show CAN status, but if
* CONFIG_ARCH_LEDS is defined, these LEDs will be controlled as follows for NuttX
* debug functionality (where NC means "No Change").
- *
+ *
+ * During the boot phases. LED1 and LED2 will show boot status.
+ */
/* LED1 LED2 HEARTBEAT */
#define LED_STARTED 0 /* OFF OFF OFF */
#define LED_HEAPALLOCATE 1 /* GREEN OFF OFF */
#define LED_IRQSENABLED 2 /* OFF GREEN OFF */
-#define LED_STACKCREATED 3 /* GREEN GREEN OFF */
+#define LED_STACKCREATED 3 /* OFF OFF OFF */
-#define LED_INIRQ 4 /* NC NC ON */
-#define LED_SIGNAL 5 /* NC RED NC */
-#define LED_ASSERTION 6 /* RED NC NC */
-#define LED_PANIC 7 /* RED RED NC (1Hz flashing) */
+/* After the system is booted, this logic will no longer use LEDs 1 and 2. They
+ * are available for use the application software using lpc17_led1() and lpc17_led2()
+ * (prototyped below)
+ */
+ /* LED1 LED2 HEARTBEAT */
+#define LED_INIRQ 4 /* NC NC ON (momentary) */
+#define LED_SIGNAL 5 /* NC NC ON (momentary) */
+#define LED_ASSERTION 6 /* NC NC ON (momentary) */
+#define LED_PANIC 7 /* NC NC ON (1Hz flashing) */
/* Alternate pin selections *********************************************************/
/* UART1 -- Not connected */
@@ -175,10 +182,23 @@
#define GPIO_SSP1_SCK GPIO_SSP1_SCK_1
/************************************************************************************
- * Public Data
+ * Public Types
************************************************************************************/
#ifndef __ASSEMBLY__
+#ifdef CONFIG_ARCH_LEDS
+enum lpc17_ledstate_e
+{
+ LPC17_LEDSTATE_OFF = 0,
+ LPC17_LEDSTATE_GREEN = 1,
+ LPC17_LEDSTATE_RED = 2,
+ LPC17_LEDSTATE_AMBER = (LPC17_LEDSTATE_GREEN|LPC17_LEDSTATE_RED),
+};
+#endif
+
+/************************************************************************************
+ * Public Data
+ ************************************************************************************/
#undef EXTERN
#if defined(__cplusplus)
@@ -203,6 +223,19 @@ extern "C" {
EXTERN void lpc17_boardinitialize(void);
+/************************************************************************************
+ * Name: lpc17_led1 and 2
+ *
+ * Description:
+ * Once the system has booted, these functions can be used to control LEDs 1 and 2
+ *
+ ************************************************************************************/
+
+#ifdef CONFIG_ARCH_LEDS
+EXTERN void lpc17_led1(enum lpc17_ledstate_e state);
+EXTERN void lpc17_led2(enum lpc17_ledstate_e state);
+#endif
+
#undef EXTERN
#if defined(__cplusplus)
}
diff --git a/nuttx/configs/nucleus2g/src/nucleus2g_internal.h b/nuttx/configs/nucleus2g/src/nucleus2g_internal.h
index 775596e3e..6a84314ee 100755
--- a/nuttx/configs/nucleus2g/src/nucleus2g_internal.h
+++ b/nuttx/configs/nucleus2g/src/nucleus2g_internal.h
@@ -113,12 +113,12 @@
#define NUCLEUS2G_232_ENABLE (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT2 | GPIO_PIN5)
#define NUCLEUS2G_232_POWERSAVE (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORT2 | GPIO_PIN5)
#define NUCLEUS2G_232_VALID (GPIO_INPUT | GPIO_PULLUP | GPIO_PORT2 | GPIO_PIN5)
-#define NUCLEUS2G_HEARTBEAT (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORT2 | GPIO_PIN11)
+#define NUCLEUS2G_HEARTBEAT (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT2 | GPIO_PIN11)
#define NUCLEUS2G_EXTRA_LED (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORT2 | GPIO_PIN12)
-#define NUCLEUS2G_5V_ENABLE (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT2 | GPIO_PIN13)
+#define NUCLEUS2G_5V_ENABLE (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT2 | GPIO_PIN13)
#define NUCLEUS2G_5V_DISABLE (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORT2 | GPIO_PIN13)
-#define NUCLEUS2G_MMCSD_CS (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT0 | GPIO_PIN16)
+#define NUCLEUS2G_MMCSD_CS (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT0 | GPIO_PIN16)
/************************************************************************************
* Public Types
diff --git a/nuttx/configs/nucleus2g/src/up_leds.c b/nuttx/configs/nucleus2g/src/up_leds.c
index fbc5a30af..64eaad65e 100755
--- a/nuttx/configs/nucleus2g/src/up_leds.c
+++ b/nuttx/configs/nucleus2g/src/up_leds.c
@@ -60,17 +60,6 @@
* Definitions
****************************************************************************/
-#define LED_OFF 0
-#define LED_ON 1
-#define LED_GREEN 2
-#define LED_PLUSGREEN 3
-#define LED_MINUSGREEN 4
-#define LED_RED 5
-#define LED_PLUSRED 6
-#define LED_MINUSRED 7
-#define LED_NC 8
-#define LED_PREV 9
-
/* Enables debug output from this file (needs CONFIG_DEBUG with
* CONFIG_DEBUG_VERBOSE too)
*/
@@ -114,196 +103,21 @@
* LED_STARTED | OFF OFF OFF
* LED_HEAPALLOCATE | GREEN OFF OFF
* LED_IRQSENABLED | OFF GREEN OFF
- * LED_STACKCREATED | GREEN GREEN OFF
- * LED_INIRQ | NC NC ON
- * LED_SIGNAL | NC RED NC
- * LED_ASSERTION | RED NC NC
- * LED_PANIC | RED RED NC (1Hz flashing)
+ * LED_STACKCREATED | OFF OFF OFF
+ * LED_INIRQ | NC NC ON (momentary)
+ * LED_SIGNAL | NC NC ON (momentary)
+ * LED_ASSERTION | NC NC ON (momentary)
+ * LED_PANIC | NC NC ON (1Hz flashing)
*/
-static const uint8_t g_led1on[8] =
-{
- LED_OFF, LED_GREEN, LED_OFF, LED_GREEN,
- LED_NC, LED_NC, LED_PLUSRED, LED_PLUSRED
-};
-
-static const uint8_t g_led1off[8] =
-{
- LED_OFF, LED_OFF, LED_GREEN, LED_OFF,
- LED_NC, LED_NC, LED_MINUSRED, LED_PREV
-};
-
-static const uint8_t g_led2on[8] =
-{
- LED_OFF, LED_OFF, LED_GREEN, LED_GREEN,
- LED_NC, LED_PLUSRED, LED_NC, LED_PLUSRED
-};
-
-static const uint8_t g_led2off[8] =
-{
- LED_OFF, LED_OFF, LED_OFF, LED_GREEN,
- LED_NC, LED_MINUSRED, LED_NC, LED_PREV
-};
-
-static const uint8_t g_ledhbon[8] =
-{
- LED_OFF, LED_OFF, LED_OFF, LED_OFF,
- LED_ON, LED_NC, LED_NC, LED_NC
-};
-
-static const uint8_t g_ledhboff[8] =
-{
- LED_OFF, LED_OFF, LED_OFF, LED_OFF,
- LED_OFF, LED_NC, LED_NC, LED_NC
-};
-
-static bool g_prevled1a;
-static bool g_currled1a;
-static bool g_prevled1b;
-static bool g_currled1b;
-static bool g_prevled2a;
-static bool g_currled2a;
-static bool g_prevled2b;
-static bool g_currled2b;
+static bool g_initialized;
+static int g_nestcount;
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
- * Name: up_led1
- ****************************************************************************/
-
-void up_led1(uint8_t newstate)
-{
- bool led1a = false;
- bool led1b = false;
-
- switch (newstate)
- {
- default:
- case LED_OFF:
- case LED_ON:
- break;
-
- case LED_GREEN:
- led1b = true;
- break;
-
- case LED_PLUSGREEN:
- led1b = true;
- case LED_MINUSGREEN:
- led1a = g_currled1a;
- break;
-
- case LED_RED:
- break;
-
- case LED_PLUSRED:
- led1a = true;
- case LED_MINUSRED:
- led1b = g_currled1b;
- break;
-
- case LED_NC:
- led1a = g_currled1a;
- led1b = g_currled1b;
- break;
-
- case LED_PREV:
- led1a = g_prevled1a;
- led1b = g_prevled1b;
- break;
- }
-
- lpc17_gpiowrite(NUCLEUS2G_LED1_A, led1a);
- lpc17_gpiowrite(NUCLEUS2G_LED1_B, led1b);
- g_prevled1a = g_currled1a;
- g_currled1a = led1a;
- g_prevled1b = g_currled1b;
- g_currled1b = led1b;
-}
-
-/****************************************************************************
- * Name: up_led2
- ****************************************************************************/
-
-void up_led2(uint8_t newstate)
-{
- bool led2a = false;
- bool led2b = false;
-
- switch (newstate)
- {
- default:
- case LED_OFF:
- case LED_ON:
- break;
-
- case LED_GREEN:
- led2b = true;
- break;
-
- case LED_PLUSGREEN:
- led2b = true;
- case LED_MINUSGREEN:
- led2a = g_currled2a;
- break;
-
- case LED_RED:
- break;
-
- case LED_PLUSRED:
- led2a = true;
- case LED_MINUSRED:
- led2b = g_currled2b;
- break;
-
- case LED_NC:
- led2a = g_currled2a;
- led2b = g_currled2b;
- break;
-
- case LED_PREV:
- led2a = g_prevled2a;
- led2b = g_prevled2b;
- break;
- }
-
- lpc17_gpiowrite(NUCLEUS2G_LED2_A, led2a);
- lpc17_gpiowrite(NUCLEUS2G_LED2_B, led2b);
- g_prevled2a = g_currled2a;
- g_currled2a = led2a;
- g_prevled2b = g_currled2b;
- g_currled2b = led2b;
-}
-
-/****************************************************************************
- * Name: up_ledhb
- ****************************************************************************/
-
-void up_ledhb(uint8_t newstate)
-{
- bool ledhb = false;
-
- switch (newstate)
- {
- default:
- case LED_OFF:
- break;
-
- case LED_ON:
- ledhb = true;
- break;
-
- case LED_NC:
- return;
- }
-
- lpc17_gpiowrite(NUCLEUS2G_HEARTBEAT, ledhb);
-}
-
-/****************************************************************************
* Public Functions
****************************************************************************/
@@ -333,20 +147,45 @@ void up_ledinit(void)
void up_ledon(int led)
{
- up_led1(g_led1on[led]);
- up_led2(g_led2on[led]);
- up_ledhb(g_ledhbon[led]);
+ /* We will control LED1 and LED2 not yet completed the boot sequence. */
-#ifdef LED_VERBOSE
- if (led != LED_INIRQ)
+ if (!g_initialized)
{
- ledvdbg("led: %d LED1: %d LED2: %d HB: %d\n",
- led, g_led1on[led], g_led2on[led], g_ledhbon[led]);
- ledvdbg("LED1: {(%d,%d), (%d,%d)} LED2: {(%d,%d), (%d,%d)}\n",
- g_prevled1a, g_currled1a, g_prevled1b, g_currled1b,
- g_prevled2a, g_currled2a, g_prevled2b, g_currled2b);
+ enum lpc17_ledstate_e led1 = LPC17_LEDSTATE_OFF;
+ enum lpc17_ledstate_e led2 = LPC17_LEDSTATE_OFF;
+ switch (led)
+ {
+ case LED_STACKCREATED:
+ g_initialized = true;
+ case LED_STARTED:
+ default:
+ break;
+
+ case LED_HEAPALLOCATE:
+ led1 = LPC17_LEDSTATE_GREEN;
+ break;
+
+ case LED_IRQSENABLED:
+ led2 = LPC17_LEDSTATE_GREEN;
+ }
+ lpc17_led1(led1);
+ lpc17_led2(led2);
+ }
+
+ /* We will always control the HB LED */
+
+ switch (led)
+ {
+ default:
+ break;
+
+ case LED_INIRQ:
+ case LED_SIGNAL:
+ case LED_ASSERTION:
+ case LED_PANIC:
+ lpc17_gpiowrite(NUCLEUS2G_HEARTBEAT, false);
+ g_nestcount++;
}
-#endif
}
/****************************************************************************
@@ -355,20 +194,42 @@ void up_ledon(int led)
void up_ledoff(int led)
{
- up_led1(g_led1off[led]);
- up_led2(g_led2off[led]);
- up_ledhb(g_ledhboff[led]);
+ /* In all states, OFF can only mean turning off the HB LED */
-#ifdef LED_VERBOSE
- if (led != LED_INIRQ)
+ if (g_nestcount <= 1)
{
- ledvdbg("led: %d LED1: %d LED2: %d HB: %d\n",
- led, g_led1off[led], g_led2off[led], g_ledhboff[led]);
- ledvdbg("LED1: {(%d,%d), (%d,%d)} LED2: {(%d,%d), (%d,%d)}\n",
- g_prevled1a, g_currled1a, g_prevled1b, g_currled1b,
- g_prevled2a, g_currled2a, g_prevled2b, g_currled2b);
+ lpc17_gpiowrite(NUCLEUS2G_HEARTBEAT, true);
+ g_nestcount = 0;
+ }
+ else
+ {
+ g_nestcount--;
}
-#endif
}
+/************************************************************************************
+ * Name: lpc17_led1 and 2
+ *
+ * Description:
+ * Once the system has booted, these functions can be used to control LEDs 1 and 2
+ *
+ ************************************************************************************/
+
+void lpc17_led1(enum lpc17_ledstate_e state)
+{
+ bool red = (((unsigned int)state & LPC17_LEDSTATE_RED) != 0);
+ bool green = (((unsigned int)state & LPC17_LEDSTATE_GREEN) != 0);
+
+ lpc17_gpiowrite(NUCLEUS2G_LED1_A, red);
+ lpc17_gpiowrite(NUCLEUS2G_LED1_B, green);
+}
+
+void lpc17_led2(enum lpc17_ledstate_e state)
+{
+ bool red = (((unsigned int)state & LPC17_LEDSTATE_RED) != 0);
+ bool green = (((unsigned int)state & LPC17_LEDSTATE_GREEN) != 0);
+
+ lpc17_gpiowrite(NUCLEUS2G_LED2_A, red);
+ lpc17_gpiowrite(NUCLEUS2G_LED2_B, green);
+}
#endif /* CONFIG_ARCH_LEDS */