summaryrefslogtreecommitdiff
path: root/nuttx/configs/sam3u-ek/src/up_leds.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/configs/sam3u-ek/src/up_leds.c')
-rwxr-xr-xnuttx/configs/sam3u-ek/src/up_leds.c91
1 files changed, 89 insertions, 2 deletions
diff --git a/nuttx/configs/sam3u-ek/src/up_leds.c b/nuttx/configs/sam3u-ek/src/up_leds.c
index 8ec9a4707..09acb23de 100755
--- a/nuttx/configs/sam3u-ek/src/up_leds.c
+++ b/nuttx/configs/sam3u-ek/src/up_leds.c
@@ -2,7 +2,7 @@
* configs/sam3u-ek/src/up_leds.c
* arch/arm/src/board/up_leds.c
*
- * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2009-2010 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@@ -52,6 +52,8 @@
#include "sam3u_internal.h"
#include "sam3uek_internal.h"
+#ifdef CONFIG_ARCH_LEDS
+
/****************************************************************************
* Definitions
****************************************************************************/
@@ -70,15 +72,96 @@
# define ledvdbg(x...)
#endif
+#define LED_OFF 0
+#define LED_ON 1
+#define LED_NOCHANGE 2
+#define LED_MASK 3
+
+#define LED0_SHIFT 0
+#define LED0_OFF (LED_OFF << LED0_SHIFT)
+#define LED0_ON (LED_ON << LED0_SHIFT)
+#define LED0_NOCHANGE (LED_NOCHANGE << LED0_SHIFT)
+#define LED1_SHIFT 2
+#define LED1_OFF (LED_OFF << LED1_SHIFT)
+#define LED1_ON (LED_ON << LED1_SHIFT)
+#define LED1_NOCHANGE (LED_NOCHANGE << LED1_SHIFT)
+#define LED2_SHIFT 4
+#define LED2_OFF (LED_OFF << LED2_SHIFT)
+#define LED2_ON (LED_ON << LED2_SHIFT)
+#define LED2_NOCHANGE (LED_NOCHANGE << LED2_SHIFT)
+
/****************************************************************************
* Private Data
****************************************************************************/
+static const uint8_t g_ledon[8] =
+{
+
+ (LED0_OFF |LED1_OFF |LED2_OFF), /* LED_STARTED */
+ (LED0_ON |LED1_OFF |LED2_ON), /* LED_HEAPALLOCATE */
+ (LED0_OFF |LED1_ON |LED2_OFF), /* LED_IRQSENABLED */
+ (LED0_ON |LED1_ON |LED2_ON), /* LED_STACKCREATED */
+
+ (LED0_OFF |LED1_OFF |LED2_NOCHANGE), /* LED_INIRQ */
+ (LED0_OFF |LED1_NOCHANGE|LED2_OFF), /* LED_SIGNAL */
+ (LED0_ON |LED1_NOCHANGE|LED2_NOCHANGE), /* LED_ASSERTION */
+ (LED0_ON |LED1_NOCHANGE|LED2_NOCHANGE) /* LED_PANIC */
+};
+
+static const uint8_t g_ledoff[8] =
+{
+
+ (LED0_OFF |LED1_OFF |LED2_OFF), /* LED_STARTED (does not happen) */
+ (LED0_ON |LED1_OFF |LED2_ON), /* LED_HEAPALLOCATE (does not happen) */
+ (LED0_OFF |LED1_ON |LED2_OFF), /* LED_IRQSENABLED (does not happen) */
+ (LED0_ON |LED1_ON |LED2_ON), /* LED_STACKCREATED (does not happen) */
+
+ (LED0_OFF |LED1_ON |LED2_NOCHANGE), /* LED_INIRQ */
+ (LED0_OFF |LED1_NOCHANGE|LED2_ON), /* LED_SIGNAL */
+ (LED0_OFF |LED1_NOCHANGE|LED2_NOCHANGE), /* LED_ASSERTION */
+ (LED0_OFF |LED1_NOCHANGE|LED2_NOCHANGE) /* LED_PANIC */
+};
+
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
+ * Name: up_setled
+ ****************************************************************************/
+
+static void up_setled(uint16_t pinset, uint8_t state)
+{
+ /* Assume active high. Initial state == 0 means active high */
+
+ bool polarity = ((pinset & GPIO_OUTPUT_SET) == 0);
+ switch (state)
+ {
+ case LED_OFF:
+ polarity = !polarity;
+
+ case LED_ON:
+ break;
+
+ case LED_NOCHANGE:
+ default:
+ return;
+ }
+ sam3u_gpiowrite(pinset, polarity);
+}
+
+/****************************************************************************
+ * Name: up_setleds
+ ****************************************************************************/
+
+static void up_setleds(uint8_t state)
+{
+ up_setled(GPIO_LED0, (state >> LED0_SHIFT) & LED_MASK);
+ up_setled(GPIO_LED1, (state >> LED1_SHIFT) & LED_MASK);
+ up_setled(GPIO_LED2, (state >> LED2_SHIFT) & LED_MASK);
+}
+
+/****************************************************************************
* Public Functions
****************************************************************************/
@@ -86,9 +169,11 @@
* Name: up_ledinit
****************************************************************************/
-#ifdef CONFIG_ARCH_LEDS
void up_ledinit(void)
{
+ (void)sam3u_configgpio(GPIO_LED0);
+ (void)sam3u_configgpio(GPIO_LED1);
+ (void)sam3u_configgpio(GPIO_LED2);
}
/****************************************************************************
@@ -97,6 +182,7 @@ void up_ledinit(void)
void up_ledon(int led)
{
+ up_setleds(g_ledon[led & 7]);
}
/****************************************************************************
@@ -105,6 +191,7 @@ void up_ledon(int led)
void up_ledoff(int led)
{
+ up_setleds(g_ledoff[led & 7]);
}
#endif /* CONFIG_ARCH_LEDS */