diff options
Diffstat (limited to 'nuttx/configs/sam3u-ek/src/up_leds.c')
-rwxr-xr-x | nuttx/configs/sam3u-ek/src/up_leds.c | 91 |
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 8ec9a47075..09acb23dec 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 */ |