diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2014-10-17 14:17:44 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2014-10-17 14:17:44 -0600 |
commit | d6769020070182bf7f5c1ec59fc235936fb9113c (patch) | |
tree | 88d6a4cebbcacaed489d9bf163f795fa9d5aaaee | |
parent | 2a835dd7d05d6335984839b7e2177579423ea946 (diff) | |
download | nuttx-d6769020070182bf7f5c1ec59fc235936fb9113c.tar.gz nuttx-d6769020070182bf7f5c1ec59fc235936fb9113c.tar.bz2 nuttx-d6769020070182bf7f5c1ec59fc235936fb9113c.zip |
Add GPIO header file and EFM32 Gecko Starter Kit LED support
-rw-r--r-- | nuttx/arch/arm/src/efm32/efm32_gpio.h | 337 | ||||
-rw-r--r-- | nuttx/configs/efm32-g8xx-stk/README.txt | 23 | ||||
-rw-r--r-- | nuttx/configs/efm32-g8xx-stk/src/Makefile | 6 | ||||
-rw-r--r-- | nuttx/configs/efm32-g8xx-stk/src/efm32-g8xx-stk.h | 31 | ||||
-rw-r--r-- | nuttx/configs/efm32-g8xx-stk/src/efm32_autoleds.c | 258 | ||||
-rw-r--r-- | nuttx/configs/efm32-g8xx-stk/src/efm32_userleds.c | 245 |
6 files changed, 896 insertions, 4 deletions
diff --git a/nuttx/arch/arm/src/efm32/efm32_gpio.h b/nuttx/arch/arm/src/efm32/efm32_gpio.h new file mode 100644 index 000000000..903794fbe --- /dev/null +++ b/nuttx/arch/arm/src/efm32/efm32_gpio.h @@ -0,0 +1,337 @@ +/************************************************************************************ + * arch/arm/src/efm32/efm32_gpio.h + * + * Copyright (C) 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <gnutt@nuttx.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************************************/ + +#ifndef __ARCH_ARM_SRC_EFM32_EFM32_GPIO_H +#define __ARCH_ARM_SRC_EFM32_EFM32_GPIO_H + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include <nuttx/config.h> + +#include <stdint.h> +#include <stdbool.h> + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ +/* Configuration ********************************************************************/ + +#if !defined(CONFIG_EFM32_GPIOA_IRQ) && !defined(CONFIG_EFM32_GPIOB_IRQ) && \ + !defined(CONFIG_EFM32_GPIOC_IRQ) && !defined(CONFIG_EFM32_GPIOD_IRQ) && \ + !defined(CONFIG_EFM32_GPIOE_IRQ) && !defined(CONFIG_EFM32_GPIOF_IRQ) +# undef CONFIG_EFM32_GPIO_IRQ +#endif + +#ifndef CONFIG_DEBUG +# undef CONFIG_DEBUG_GPIO +#endif + +#define EFM32_NGPIO 5 /* (5) GPIOA-F */ + +/* Bit-encoded input to efm32_configgpio() *******************************************/ + +/* 16-bit Encoding: + * + * Input: MMMM OII. .PPP BBBB + * Output: MMMM VDD. .PPP BBBB + */ + +/* Port mode: + * + * MMMM O... .... .... + */ + +#define GPIO_MODE_SHIFT (12) /* Bits 12-15: Port mode */ +#define GPIO_MODE_MASK (15 << GPIO_MODE_SHIFT) +#define GPIO_MODE_DOUT (1 << 11) /* DOUT input mode modifier */ + +/* Input modes */ + +# define _GPIO_DISABLE (0 << GPIO_MODE_SHIFT) +# define _GPIO_INPUT (1 << GPIO_MODE_SHIFT) +# define _GPIO_INPUT_PULL (2 << GPIO_MODE_SHIFT) +# define _GPIO_INPUT_PULL_FILTER (3 << GPIO_MODE_SHIFT) + +# define GPIO_PULLUP \ + (_GPIO_DISABLE | GPIO_MODE_DOUT) +# define GPIO_INPUT \ + _GPIO_INPUT +# define GPIO_INPUT_FILTER \ + (_GPIO_INPUT | GPIO_MODE_DOUT) +# define GPIO_INPUT_PULLDOWN \ + _GPIO_INPUT_PULL +# define GPIO_INPUT_PULLUP \ + (_GPIO_INPUT_PULL | GPIO_MODE_DOUT) +# define GPIO_INPUT_PULLDOWN_FILTER \ + _GPIO_INPUT_PULL_FILTER +# define GPIO_INPUT_PULLUP_FILTER \ + (_GPIO_INPUT_PULL_FILTER | GPIO_MODE_DOUT) + +/* Output modes */ + +# define GPIO_OUTPUT_PUSHPULL \ + (4 << GPIO_MODE_SHIFT) +# define GPIO_OUTPUT_PUSHPULL_DRIVE \ + (5 << GPIO_MODE_SHIFT) +# define GPIO_OUTPUT_WIREDOR \ + (6 << GPIO_MODE_SHIFT) +# define GPIO_OUTPUT_WIREDOR_PULLDOWN \ + (7 << GPIO_MODE_SHIFT) +# define GPIO_OUTPUT_WIREDAND \ + (8 << GPIO_MODE_SHIFT) +# define GPIO_OUTPUT_WIREDAND_FILTER \ + (9 << GPIO_MODE_SHIFT) +# define GPIO_OUTPUT_WIREDAND_PULLUP \ + (10 << GPIO_MODE_SHIFT) +# define GPIO_OUTPUT_WIREDAND_PULLUP_FILTER \ + (11 << GPIO_MODE_SHIFT) +# define GPIO_OUTPUT_WIREDAND_DRIVE \ + (12 << GPIO_MODE_SHIFT) +# define GPIO_OUTPUT_WIREDAND_DRIVE_FILTER \ + (13 << GPIO_MODE_SHIFT) +# define GPIO_OUTPUT_WIREDAND_DRIVE_PULLUP \ + (14 << GPIO_MODE_SHIFT) +# define GPIO_OUTPUT_WIREDAND_DRIVE_PULLUP_FILTER \ + (15 << GPIO_MODE_SHIFT) + +/* If the pin is an PIO output, then this identifies the initial output value: + * + * .... V... .... .... + */ + +#define GPIO_OUTPUT_SET (1 << 11) /* Bit 11: Initial value of output */ +#define GPIO_OUTPUT_CLEAR (0) + +/* Output drive: + * + * .... .DD. .... .... + */ + +#define GPIO_DRIVE_SHIFT (9) /* Bits 9-10: Output drive strength */ +#define GPIO_DRIVE_MASK (3 << GPIO_MODE_SHIFT) +# define GPIO_DRIVE_STANDARD (0 << GPIO_MODE_SHIFT) /* 6 mA drive current */ +# define GPIO_DRIVE_LOWEST (1 << GPIO_MODE_SHIFT) /* 0.5 mA drive current */ +# define GPIO_DRIVE_HIGH (2 << GPIO_MODE_SHIFT) /* 20 mA drive current */ +# define GPIO_DRIVE_LOW (3 << GPIO_MODE_SHIFT) /* 2 mA drive current */ + +/* Interrupt Mode (Input only): + * + * .... .II. .... .... + */ + +#define GPIO_INT_SHIFT (9) /* Bits 9-10: Interrupt mode */ +#define GPIO_INT_MASK (3 << GPIO_INT_SHIFT) +# define GPIO_INT_RISING (1 << GPIO_INT_SHIFT) +# define GPIO_INT_FALLING (2 << GPIO_INT_SHIFT) +# define GPIO_INT_BOTH (3 << GPIO_INT_SHIFT) + +/* This identifies the PIO port: + * + * .... .... .PPP .... + */ + +#define GPIO_PORT_SHIFT (4) /* Bit 4-7: Port number */ +#define GPIO_PORT_MASK (7 << GPIO_PORT_SHIFT) +# define GPIO_PORTA (0 << GPIO_PORT_SHIFT) +# define GPIO_PORTB (1 << GPIO_PORT_SHIFT) +# define GPIO_PORTC (2 << GPIO_PORT_SHIFT) +# define GPIO_PORTD (3 << GPIO_PORT_SHIFT) +# define GPIO_PORTE (4 << GPIO_PORT_SHIFT) +# define GPIO_PORTF (5 << GPIO_PORT_SHIFT) + +/* This identifies the pin in the port: + * + * .... .... .... BBBB + */ + +#define GPIO_PIN_SHIFT (0) /* Bits 0-3: Pin number: 0-15 */ +#define GPIO_PIN_MASK (31 << GPIO_PIN_SHIFT) +#define GPIO_PIN0 (0 << GPIO_PIN_SHIFT) +#define GPIO_PIN1 (1 << GPIO_PIN_SHIFT) +#define GPIO_PIN2 (2 << GPIO_PIN_SHIFT) +#define GPIO_PIN3 (3 << GPIO_PIN_SHIFT) +#define GPIO_PIN4 (4 << GPIO_PIN_SHIFT) +#define GPIO_PIN5 (5 << GPIO_PIN_SHIFT) +#define GPIO_PIN6 (6 << GPIO_PIN_SHIFT) +#define GPIO_PIN7 (7 << GPIO_PIN_SHIFT) +#define GPIO_PIN8 (8 << GPIO_PIN_SHIFT) +#define GPIO_PIN9 (9 << GPIO_PIN_SHIFT) +#define GPIO_PIN10 (10 << GPIO_PIN_SHIFT) +#define GPIO_PIN11 (11 << GPIO_PIN_SHIFT) +#define GPIO_PIN12 (12 << GPIO_PIN_SHIFT) +#define GPIO_PIN13 (13 << GPIO_PIN_SHIFT) +#define GPIO_PIN14 (14 << GPIO_PIN_SHIFT) +#define GPIO_PIN15 (15 << GPIO_PIN_SHIFT) + +/************************************************************************************ + * Public Types + ************************************************************************************/ + +/* Must be big enough to hold the 16-bit encoding */ + +typedef uint16_t gpio_pinset_t; + +/************************************************************************************ + * Inline Functions + ************************************************************************************/ + +#ifndef __ASSEMBLY__ + +/************************************************************************************ + * Public Data + ************************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/************************************************************************************ + * Public Function Prototypes + ************************************************************************************/ + +/************************************************************************************ + * Name: efm32_gpioirqinitialize + * + * Description: + * Initialize logic to support a second level of interrupt decoding for PIO pins. + * + ************************************************************************************/ + +#ifdef CONFIG_EFM32_GPIO_IRQ +void efm32_gpioirqinitialize(void); +#else +# define efm32_gpioirqinitialize() +#endif + +/************************************************************************************ + * Name: efm32_configgpio + * + * Description: + * Configure a PIO pin based on bit-encoded description of the pin. + * + ************************************************************************************/ + +int efm32_configgpio(gpio_pinset_t cfgset); + +/************************************************************************************ + * Name: efm32_gpiowrite + * + * Description: + * Write one or zero to the selected PIO pin + * + ************************************************************************************/ + +void efm32_gpiowrite(gpio_pinset_t pinset, bool value); + +/************************************************************************************ + * Name: efm32_gpioread + * + * Description: + * Read one or zero from the selected PIO pin + * + ************************************************************************************/ + +bool efm32_gpioread(gpio_pinset_t pinset); + +/************************************************************************************ + * Name: efm32_gpioirq + * + * Description: + * Configure an interrupt for the specified PIO pin. + * + ************************************************************************************/ + +#ifdef CONFIG_EFM32_GPIO_IRQ +void efm32_gpioirq(gpio_pinset_t pinset); +#else +# define efm32_gpioirq(pinset) +#endif + +/************************************************************************************ + * Name: efm32_gpioirqenable + * + * Description: + * Enable the interrupt for specified PIO IRQ + * + ************************************************************************************/ + +#ifdef CONFIG_EFM32_GPIO_IRQ +void efm32_gpioirqenable(int irq); +#else +# define efm32_gpioirqenable(irq) +#endif + +/************************************************************************************ + * Name: efm32_gpioirqdisable + * + * Description: + * Disable the interrupt for specified PIO IRQ + * + ************************************************************************************/ + +#ifdef CONFIG_EFM32_GPIO_IRQ +void efm32_gpioirqdisable(int irq); +#else +# define efm32_gpioirqdisable(irq) +#endif + +/************************************************************************************ + * Function: efm32_dumpgpio + * + * Description: + * Dump all PIO registers associated with the base address of the provided pinset. + * + ************************************************************************************/ + +#ifdef CONFIG_DEBUG_GPIO +int efm32_dumpgpio(uint32_t pinset, const char *msg); +#else +# define efm32_dumpgpio(p,m) +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_ARM_SRC_EFM32_EFM32_GPIO_H */ diff --git a/nuttx/configs/efm32-g8xx-stk/README.txt b/nuttx/configs/efm32-g8xx-stk/README.txt index ed375c1c5..284f7d745 100644 --- a/nuttx/configs/efm32-g8xx-stk/README.txt +++ b/nuttx/configs/efm32-g8xx-stk/README.txt @@ -18,10 +18,25 @@ README LEDs ==== - The EFM32 Gecko Start Kithas four yellow LEDs. These LEDs are not used by - the board port unless CONFIG_ARCH_LEDS is defined. In that case, the - usage by the board port is defined in include/board.h and src/efm32_autoleds.c. - The LEDs are used to encode OS-related events as follows: + The EFM32 Gecko Start Kit has four yellow LEDs. These LEDs are connected + as follows: + + ------------------------------------- -------------------- + EFM32 PIN BOARD SIGNALS + ------------------------------------- -------------------- + C0/USART1_TX#0/PCNT0_S0IN#2/ACMP0_CH0 MCU_PC0 UIF_LED0 + C1/USART1_RX#0/PCNT0_S1IN#2/ACMP0_CH1 MCU_PC1 UIF_LED1 + C2/USART2_TX#0/ACMP0_CH2 MCU_PC2 UIF_LED2 + C3/USART2_RX#0/ACMP0_CH3 MCU_PC3 UIF_LED3 + ------------------------------------- -------------------- + + All LEDs are grounded and so are illuminated by outputting a high + value to the LED. + + These LEDs are not used by the board port unless CONFIG_ARCH_LEDS is + defined. In that case, the usage by the board port is defined in + include/board.h and src/efm32_autoleds.c. The LEDs are used to + encode OS-related events as follows: SYMBOL Meaning LED1* LED2 LED3 LED4 ----------------- ----------------------- ------ ----- ----- ------ diff --git a/nuttx/configs/efm32-g8xx-stk/src/Makefile b/nuttx/configs/efm32-g8xx-stk/src/Makefile index 49b07942c..d2503cc8b 100644 --- a/nuttx/configs/efm32-g8xx-stk/src/Makefile +++ b/nuttx/configs/efm32-g8xx-stk/src/Makefile @@ -37,6 +37,12 @@ CSRCS = efm32_boot.c +ifeq ($(CONFIG_ARCH_LEDS),y) +CSRCS += efm32_autoleds.c +else +CSRCS += efm32_userleds.c +endif + COBJS = $(CSRCS:.c=$(OBJEXT)) SRCS = $(ASRCS) $(CSRCS) OBJS = $(AOBJS) $(COBJS) diff --git a/nuttx/configs/efm32-g8xx-stk/src/efm32-g8xx-stk.h b/nuttx/configs/efm32-g8xx-stk/src/efm32-g8xx-stk.h index 21ac078a9..dd0aff5c0 100644 --- a/nuttx/configs/efm32-g8xx-stk/src/efm32-g8xx-stk.h +++ b/nuttx/configs/efm32-g8xx-stk/src/efm32-g8xx-stk.h @@ -41,6 +41,37 @@ ****************************************************************************/ /**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + + /* LEDs + * + * The EFM32 Gecko Start Kit has four yellow LEDs. These LEDs are connected + * as follows: + * + * ------------------------------------- -------------------- + * EFM32 PIN BOARD SIGNALS + * ------------------------------------- -------------------- + * C0/USART1_TX#0/PCNT0_S0IN#2/ACMP0_CH0 MCU_PC0 UIF_LED0 + * C1/USART1_RX#0/PCNT0_S1IN#2/ACMP0_CH1 MCU_PC1 UIF_LED1 + * C2/USART2_TX#0/ACMP0_CH2 MCU_PC2 UIF_LED2 + * C3/USART2_RX#0/ACMP0_CH3 MCU_PC3 UIF_LED3 + * ------------------------------------- -------------------- + * + * All LEDs are grounded and so are illuminated by outputting a high + * value to the LED. + */ + +#define GPIO_LED1 (GPIO_OUTPUT_WIREDOR_PULLDOWN|\ + GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN0) +#define GPIO_LED2 (GPIO_OUTPUT_WIREDOR_PULLDOWN|\ + GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN1) +#define GPIO_LED3 (GPIO_OUTPUT_WIREDOR_PULLDOWN|\ + GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN2) +#define GPIO_LED4 (GPIO_OUTPUT_WIREDOR_PULLDOWN|\ + GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN3) + +/**************************************************************************** * Public Function Prototypes ****************************************************************************/ diff --git a/nuttx/configs/efm32-g8xx-stk/src/efm32_autoleds.c b/nuttx/configs/efm32-g8xx-stk/src/efm32_autoleds.c new file mode 100644 index 000000000..a155b4a75 --- /dev/null +++ b/nuttx/configs/efm32-g8xx-stk/src/efm32_autoleds.c @@ -0,0 +1,258 @@ +/**************************************************************************** + * configs/efm32-g8xx-stk/src/efm32_autoleds.c + * + * Copyright (C) 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <gnutt@nuttx.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <stdint.h> +#include <stdbool.h> +#include <debug.h> + +#include <arch/board/board.h> + +#include "chip.h" +#include "up_arch.h" +#include "up_internal.h" + +#include "efm32_gpio.h" +#include "efm32-g8xx-stk.h" + +#ifdef CONFIG_ARCH_LEDS + +/**************************************************************************** + * Definitions + ****************************************************************************/ + +/* CONFIG_DEBUG_LEDS enables debug output from this file (needs CONFIG_DEBUG + * with CONFIG_DEBUG_VERBOSE too) + */ + +#ifdef CONFIG_DEBUG_LEDS +# define leddbg lldbg +# define ledvdbg llvdbg +#else +# define leddbg(x...) +# define ledvdbg(x...) +#endif + +/* The following definitions map the encoded LED setting to GPIO settings */ + +#define EFM32F4_LED1 (1 << 0) +#define EFM32F4_LED2 (1 << 1) +#define EFM32F4_LED3 (1 << 2) +#define EFM32F4_LED4 (1 << 3) + +#define ON_SETBITS_SHIFT (0) +#define ON_CLRBITS_SHIFT (4) +#define OFF_SETBITS_SHIFT (8) +#define OFF_CLRBITS_SHIFT (12) + +#define ON_BITS(v) ((v) & 0xff) +#define OFF_BITS(v) (((v) >> 8) & 0x0ff) +#define SETBITS(b) ((b) & 0x0f) +#define CLRBITS(b) (((b) >> 4) & 0x0f) + +#define ON_SETBITS(v) (SETBITS(ON_BITS(v)) +#define ON_CLRBITS(v) (CLRBITS(ON_BITS(v)) +#define OFF_SETBITS(v) (SETBITS(OFF_BITS(v)) +#define OFF_CLRBITS(v) (CLRBITS(OFF_BITS(v)) + +#define LED_STARTED_ON_SETBITS ((EFM32F4_LED1) << ON_SETBITS_SHIFT) +#define LED_STARTED_ON_CLRBITS ((EFM32F4_LED2|EFM32F4_LED3|EFM32F4_LED4) << ON_CLRBITS_SHIFT) +#define LED_STARTED_OFF_SETBITS (0 << OFF_SETBITS_SHIFT) +#define LED_STARTED_OFF_CLRBITS ((EFM32F4_LED1|EFM32F4_LED2|EFM32F4_LED3|EFM32F4_LED4) << OFF_CLRBITS_SHIFT) + +#define LED_HEAPALLOCATE_ON_SETBITS ((EFM32F4_LED2) << ON_SETBITS_SHIFT) +#define LED_HEAPALLOCATE_ON_CLRBITS ((EFM32F4_LED1|EFM32F4_LED3|EFM32F4_LED4) << ON_CLRBITS_SHIFT) +#define LED_HEAPALLOCATE_OFF_SETBITS ((EFM32F4_LED1) << OFF_SETBITS_SHIFT) +#define LED_HEAPALLOCATE_OFF_CLRBITS ((EFM32F4_LED2|EFM32F4_LED3|EFM32F4_LED4) << OFF_CLRBITS_SHIFT) + +#define LED_IRQSENABLED_ON_SETBITS ((EFM32F4_LED1|EFM32F4_LED2) << ON_SETBITS_SHIFT) +#define LED_IRQSENABLED_ON_CLRBITS ((EFM32F4_LED3|EFM32F4_LED4) << ON_CLRBITS_SHIFT) +#define LED_IRQSENABLED_OFF_SETBITS ((EFM32F4_LED2) << OFF_SETBITS_SHIFT) +#define LED_IRQSENABLED_OFF_CLRBITS ((EFM32F4_LED1|EFM32F4_LED3|EFM32F4_LED4) << OFF_CLRBITS_SHIFT) + +#define LED_STACKCREATED_ON_SETBITS ((EFM32F4_LED3) << ON_SETBITS_SHIFT) +#define LED_STACKCREATED_ON_CLRBITS ((EFM32F4_LED1|EFM32F4_LED2|EFM32F4_LED4) << ON_CLRBITS_SHIFT) +#define LED_STACKCREATED_OFF_SETBITS ((EFM32F4_LED1|EFM32F4_LED2) << OFF_SETBITS_SHIFT) +#define LED_STACKCREATED_OFF_CLRBITS ((EFM32F4_LED3|EFM32F4_LED4) << OFF_CLRBITS_SHIFT) + +#define LED_INIRQ_ON_SETBITS ((EFM32F4_LED1) << ON_SETBITS_SHIFT) +#define LED_INIRQ_ON_CLRBITS ((0) << ON_CLRBITS_SHIFT) +#define LED_INIRQ_OFF_SETBITS ((0) << OFF_SETBITS_SHIFT) +#define LED_INIRQ_OFF_CLRBITS ((EFM32F4_LED1) << OFF_CLRBITS_SHIFT) + +#define LED_SIGNAL_ON_SETBITS ((EFM32F4_LED2) << ON_SETBITS_SHIFT) +#define LED_SIGNAL_ON_CLRBITS ((0) << ON_CLRBITS_SHIFT) +#define LED_SIGNAL_OFF_SETBITS ((0) << OFF_SETBITS_SHIFT) +#define LED_SIGNAL_OFF_CLRBITS ((EFM32F4_LED2) << OFF_CLRBITS_SHIFT) + +#define LED_ASSERTION_ON_SETBITS ((EFM32F4_LED4) << ON_SETBITS_SHIFT) +#define LED_ASSERTION_ON_CLRBITS ((0) << ON_CLRBITS_SHIFT) +#define LED_ASSERTION_OFF_SETBITS ((0) << OFF_SETBITS_SHIFT) +#define LED_ASSERTION_OFF_CLRBITS ((EFM32F4_LED4) << OFF_CLRBITS_SHIFT) + +#define LED_PANIC_ON_SETBITS ((EFM32F4_LED4) << ON_SETBITS_SHIFT) +#define LED_PANIC_ON_CLRBITS ((0) << ON_CLRBITS_SHIFT) +#define LED_PANIC_OFF_SETBITS ((0) << OFF_SETBITS_SHIFT) +#define LED_PANIC_OFF_CLRBITS ((EFM32F4_LED4) << OFF_CLRBITS_SHIFT) + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const uint16_t g_ledbits[8] = +{ + (LED_STARTED_ON_SETBITS | LED_STARTED_ON_CLRBITS | + LED_STARTED_OFF_SETBITS | LED_STARTED_OFF_CLRBITS), + + (LED_HEAPALLOCATE_ON_SETBITS | LED_HEAPALLOCATE_ON_CLRBITS | + LED_HEAPALLOCATE_OFF_SETBITS | LED_HEAPALLOCATE_OFF_CLRBITS), + + (LED_IRQSENABLED_ON_SETBITS | LED_IRQSENABLED_ON_CLRBITS | + LED_IRQSENABLED_OFF_SETBITS | LED_IRQSENABLED_OFF_CLRBITS), + + (LED_STACKCREATED_ON_SETBITS | LED_STACKCREATED_ON_CLRBITS | + LED_STACKCREATED_OFF_SETBITS | LED_STACKCREATED_OFF_CLRBITS), + + (LED_INIRQ_ON_SETBITS | LED_INIRQ_ON_CLRBITS | + LED_INIRQ_OFF_SETBITS | LED_INIRQ_OFF_CLRBITS), + + (LED_SIGNAL_ON_SETBITS | LED_SIGNAL_ON_CLRBITS | + LED_SIGNAL_OFF_SETBITS | LED_SIGNAL_OFF_CLRBITS), + + (LED_ASSERTION_ON_SETBITS | LED_ASSERTION_ON_CLRBITS | + LED_ASSERTION_OFF_SETBITS | LED_ASSERTION_OFF_CLRBITS), + + (LED_PANIC_ON_SETBITS | LED_PANIC_ON_CLRBITS | + LED_PANIC_OFF_SETBITS | LED_PANIC_OFF_CLRBITS) +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static inline void led_clrbits(unsigned int clrbits) +{ + if ((clrbits & EFM32F4_LED1) != 0) + { + efm32_gpiowrite(GPIO_LED1, false); + } + + if ((clrbits & EFM32F4_LED2) != 0) + { + efm32_gpiowrite(GPIO_LED2, false); + } + + if ((clrbits & EFM32F4_LED3) != 0) + { + efm32_gpiowrite(GPIO_LED3, false); + } + + if ((clrbits & EFM32F4_LED4) != 0) + { + efm32_gpiowrite(GPIO_LED4, false); + } +} + +static inline void led_setbits(unsigned int setbits) +{ + if ((setbits & EFM32F4_LED1) != 0) + { + efm32_gpiowrite(GPIO_LED1, true); + } + + if ((setbits & EFM32F4_LED2) != 0) + { + efm32_gpiowrite(GPIO_LED2, true); + } + + if ((setbits & EFM32F4_LED3) != 0) + { + efm32_gpiowrite(GPIO_LED3, true); + } + + if ((setbits & EFM32F4_LED4) != 0) + { + efm32_gpiowrite(GPIO_LED4, true); + } +} + +static void led_setonoff(unsigned int bits) +{ + led_clrbits(CLRBITS(bits)); + led_setbits(SETBITS(bits)); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_led_initialize + ****************************************************************************/ + +void board_led_initialize(void) +{ + /* Configure LED1-4 GPIOs for output */ + + efm32_configgpio(GPIO_LED1); + efm32_configgpio(GPIO_LED2); + efm32_configgpio(GPIO_LED3); + efm32_configgpio(GPIO_LED4); +} + +/**************************************************************************** + * Name: board_led_on + ****************************************************************************/ + +void board_led_on(int led) +{ + led_setonoff(ON_BITS(g_ledbits[led])); +} + +/**************************************************************************** + * Name: board_led_off + ****************************************************************************/ + +void board_led_off(int led) +{ + led_setonoff(OFF_BITS(g_ledbits[led])); +} + +#endif /* CONFIG_ARCH_LEDS */ diff --git a/nuttx/configs/efm32-g8xx-stk/src/efm32_userleds.c b/nuttx/configs/efm32-g8xx-stk/src/efm32_userleds.c new file mode 100644 index 000000000..503e17aec --- /dev/null +++ b/nuttx/configs/efm32-g8xx-stk/src/efm32_userleds.c @@ -0,0 +1,245 @@ +/**************************************************************************** + * configs/efm32-g8xx-stk/src/efm32_userleds.c + * + * Copyright (C) 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <gnutt@nuttx.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <stdint.h> +#include <stdbool.h> +#include <debug.h> + +#include <arch/board/board.h> +#include <nuttx/power/pm.h> + +#include "chip.h" +#include "up_arch.h" +#include "up_internal.h" + +#include "efm32_gpio.h" +#include "efm32-g8xx-stk.h" + +#ifndef CONFIG_ARCH_LEDS + +/**************************************************************************** + * Definitions + ****************************************************************************/ + +/* CONFIG_DEBUG_LEDS enables debug output from this file (needs CONFIG_DEBUG + * with CONFIG_DEBUG_VERBOSE too) + */ + +#ifdef CONFIG_DEBUG_LEDS +# define leddbg lldbg +# define ledvdbg llvdbg +#else +# define leddbg(x...) +# define ledvdbg(x...) +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ +/* This array maps an LED number to GPIO pin configuration */ + +static gpio_pinset_t g_ledcfg[BOARD_NLEDS] = +{ + GPIO_LED1, GPIO_LED2, GPIO_LED3, GPIO_LED4 +}; + +/**************************************************************************** + * Private Function Protototypes + ****************************************************************************/ + +/* LED Power Management */ + +#ifdef CONFIG_PM +static void led_pm_notify(struct pm_callback_s *cb, enum pm_state_e pmstate); +static int led_pm_prepare(struct pm_callback_s *cb, enum pm_state_e pmstate); +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +#ifdef CONFIG_PM +static struct pm_callback_s g_ledscb = +{ + .notify = led_pm_notify, + .prepare = led_pm_prepare, +}; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: led_pm_notify + * + * Description: + * Notify the driver of new power state. This callback is called after + * all drivers have had the opportunity to prepare for the new power state. + * + ****************************************************************************/ + +#ifdef CONFIG_PM +static void led_pm_notify(struct pm_callback_s *cb , enum pm_state_e pmstate) +{ + switch (pmstate) + { + case(PM_NORMAL): + { + /* Restore normal LEDs operation */ + + } + break; + + case(PM_IDLE): + { + /* Entering IDLE mode - Turn leds off */ + + } + break; + + case(PM_STANDBY): + { + /* Entering STANDBY mode - Logic for PM_STANDBY goes here */ + + } + break; + + case(PM_SLEEP): + { + /* Entering SLEEP mode - Logic for PM_SLEEP goes here */ + + } + break; + + default: + { + /* Should not get here */ + + } + break; + } +} +#endif + +/**************************************************************************** + * Name: led_pm_prepare + * + * Description: + * Request the driver to prepare for a new power state. This is a warning + * that the system is about to enter into a new power state. The driver + * should begin whatever operations that may be required to enter power + * state. The driver may abort the state change mode by returning a + * non-zero value from the callback function. + * + ****************************************************************************/ + +#ifdef CONFIG_PM +static int led_pm_prepare(struct pm_callback_s *cb , enum pm_state_e pmstate) +{ + /* No preparation to change power modes is required by the LEDs driver. + * We always accept the state change by returning OK. + */ + + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: efm32_ledinit + ****************************************************************************/ + +void efm32_ledinit(void) +{ + /* Configure LED1-4 GPIOs for output */ + + efm32_configgpio(GPIO_LED1); + efm32_configgpio(GPIO_LED2); + efm32_configgpio(GPIO_LED3); + efm32_configgpio(GPIO_LED4); +} + +/**************************************************************************** + * Name: efm32_setled + ****************************************************************************/ + +void efm32_setled(int led, bool ledon) +{ + if ((unsigned)led < BOARD_NLEDS) + { + efm32_gpiowrite(g_ledcfg[led], ledon); + } +} + +/**************************************************************************** + * Name: efm32_setleds + ****************************************************************************/ + +void efm32_setleds(uint8_t ledset) +{ + efm32_gpiowrite(GPIO_LED1, (ledset & BOARD_LED1_BIT) == 0); + efm32_gpiowrite(GPIO_LED2, (ledset & BOARD_LED2_BIT) == 0); + efm32_gpiowrite(GPIO_LED3, (ledset & BOARD_LED3_BIT) == 0); + efm32_gpiowrite(GPIO_LED4, (ledset & BOARD_LED4_BIT) == 0); +} + +/**************************************************************************** + * Name: efm32_led_pminitialize + ****************************************************************************/ + +#ifdef CONFIG_PM +void efm32_led_pminitialize(void) +{ + /* Register to receive power management callbacks */ + + int ret = pm_register(&g_ledscb); + if (ret != OK) + { + board_led_on(LED_ASSERTION); + } +} +#endif /* CONFIG_PM */ + +#endif /* !CONFIG_ARCH_LEDS */ |