From 70d8f0189d722c8cd7115a6648cdafa5257f99b4 Mon Sep 17 00:00:00 2001 From: Simon Piriou Date: Sat, 11 Mar 2017 18:15:18 +0100 Subject: [PATCH 1/2] stm32f20xxx: add BOARD_DISABLE_USBOTG_HSULPI flag --- arch/arm/src/stm32/stm32f20xxx_rcc.c | 6 ++++++ configs/photon/include/board.h | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/arch/arm/src/stm32/stm32f20xxx_rcc.c b/arch/arm/src/stm32/stm32f20xxx_rcc.c index a45241ed85..ad71714a80 100644 --- a/arch/arm/src/stm32/stm32f20xxx_rcc.c +++ b/arch/arm/src/stm32/stm32f20xxx_rcc.c @@ -195,7 +195,13 @@ static inline void rcc_enableahb1(void) #ifdef CONFIG_STM32_OTGHS /* USB OTG HS */ +#ifndef BOARD_DISABLE_USBOTG_HSULPI + /* Enable clocking for OTG and external PHY */ + regval |= (RCC_AHB1ENR_OTGHSEN | RCC_AHB1ENR_OTGHSULPIEN); +#else + regval |= (RCC_AHB1ENR_OTGHSEN); +#endif #endif putreg32(regval, STM32_RCC_AHB1ENR); /* Enable peripherals */ diff --git a/configs/photon/include/board.h b/configs/photon/include/board.h index ac5faed041..efce673115 100644 --- a/configs/photon/include/board.h +++ b/configs/photon/include/board.h @@ -146,6 +146,10 @@ #define STM32_APB2_TIM10_CLKIN (2*STM32_PCLK2_FREQUENCY) #define STM32_APB2_TIM11_CLKIN (2*STM32_PCLK2_FREQUENCY) +/* USB OTG HS definitions ***********************************************************/ +/* Do not enable external PHY clock or OTG_HS module will not work */ +#define BOARD_DISABLE_USBOTG_HSULPI 1 + /* Alternate function pin selections ************************************************/ /* UART1 */ From ef0fe50ae6803e996bbbb32359cac20d49a8a6f7 Mon Sep 17 00:00:00 2001 From: Simon Piriou Date: Sat, 11 Mar 2017 17:51:45 +0100 Subject: [PATCH 2/2] photon: add LEDs and BUTTONS support --- configs/Kconfig | 3 + configs/photon/include/board.h | 12 ++++ configs/photon/src/Makefile | 8 +++ configs/photon/src/photon.h | 13 ++++ configs/photon/src/photon_buttons.c | 101 ++++++++++++++++++++++++++++ configs/photon/src/photon_leds.c | 86 +++++++++++++++++++++++ configs/photon/src/stm32_appinit.c | 40 +++++++++-- 7 files changed, 258 insertions(+), 5 deletions(-) create mode 100644 configs/photon/src/photon_buttons.c create mode 100644 configs/photon/src/photon_leds.c diff --git a/configs/Kconfig b/configs/Kconfig index e91e262499..d5016d9b7c 100644 --- a/configs/Kconfig +++ b/configs/Kconfig @@ -959,6 +959,9 @@ config ARCH_BOARD_SPARK config ARCH_BOARD_PHOTON bool "Photon wifi board" depends on ARCH_CHIP_STM32F205RG + select ARCH_HAVE_LEDS + select ARCH_HAVE_BUTTONS + select ARCH_HAVE_IRQBUTTONS ---help--- A configuration for the Photon from Particle Devices (https://www.particle.io). This board features the STM32F205RGY6 diff --git a/configs/photon/include/board.h b/configs/photon/include/board.h index efce673115..15ee036088 100644 --- a/configs/photon/include/board.h +++ b/configs/photon/include/board.h @@ -150,6 +150,18 @@ /* Do not enable external PHY clock or OTG_HS module will not work */ #define BOARD_DISABLE_USBOTG_HSULPI 1 +/* LED definitions ******************************************************************/ + +#define BOARD_LED1 0 +#define BOARD_NLEDS 1 +#define BOARD_LED1_BIT (1 << BOARD_LED1) + +/* Button definitions ***************************************************************/ + +#define BOARD_BUTTON1 0 +#define NUM_BUTTONS 1 +#define BOARD_BUTTON1_BIT (1 << BOARD_BUTTON1) + /* Alternate function pin selections ************************************************/ /* UART1 */ diff --git a/configs/photon/src/Makefile b/configs/photon/src/Makefile index ae24c7d4c0..f834e2c7fa 100644 --- a/configs/photon/src/Makefile +++ b/configs/photon/src/Makefile @@ -41,6 +41,14 @@ ifeq ($(CONFIG_PHOTON_DFU_BOOTLOADER),y) CSRCS += dfu_signature.c endif +ifeq ($(CONFIG_BUTTONS),y) +CSRCS += photon_buttons.c +endif + +ifeq ($(CONFIG_USERLED),y) +CSRCS += photon_leds.c +endif + ifeq ($(CONFIG_PHOTON_WDG),y) CSRCS += photon_wdt.c endif diff --git a/configs/photon/src/photon.h b/configs/photon/src/photon.h index 5678dc7c1f..ec160684f6 100644 --- a/configs/photon/src/photon.h +++ b/configs/photon/src/photon.h @@ -48,6 +48,19 @@ * Pre-processor Definitions ****************************************************************************/ +/* LEDs */ + +#define GPIO_LED1 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\ + GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN13) + +/* BUTTONS -- EXTI interrupts are available on Photon board button */ + +#define MIN_IRQBUTTON BOARD_BUTTON1 +#define MAX_IRQBUTTON BOARD_BUTTON1 +#define NUM_IRQBUTTONS 1 + +#define GPIO_BUTTON1 (GPIO_INPUT|GPIO_PULLUP|GPIO_EXTI|GPIO_PORTC|GPIO_PIN7) + /**************************************************************************** * Public Types ****************************************************************************/ diff --git a/configs/photon/src/photon_buttons.c b/configs/photon/src/photon_buttons.c new file mode 100644 index 0000000000..bca373bf75 --- /dev/null +++ b/configs/photon/src/photon_buttons.c @@ -0,0 +1,101 @@ +/**************************************************************************** + * configs/photon/src/photon_buttons.c + * + * Copyright (C) 2017 Gregory Nutt. All rights reserved. + * Author: Simon Piriou + * + * 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 +#include + +#include +#include "photon.h" + +#include "stm32_gpio.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_button_initialize + ****************************************************************************/ + +void board_button_initialize(void) +{ + /* Configure Photon button gpio as input */ + + stm32_configgpio(GPIO_BUTTON1); +} + +/**************************************************************************** + * Name: board_buttons + ****************************************************************************/ + +uint8_t board_buttons(void) +{ + /* Check the state of the only button */ + + if (stm32_gpioread(GPIO_BUTTON1)) + { + return BOARD_BUTTON1_BIT; + } + + return 0; +} + +#ifdef CONFIG_ARCH_IRQBUTTONS + +/**************************************************************************** + * Name: board_button_irq + ****************************************************************************/ + +int board_button_irq(int id, xcpt_t irqhandler, FAR void *arg) +{ + if (id != BOARD_BUTTON1) { + /* Invalid button id */ + return ERROR; + } + + /* Configure interrupt on falling edge only */ + + return stm32_gpiosetevent(GPIO_BUTTON1, false, true, false, irqhandler, arg); +} + +#endif /* CONFIG_ARCH_IRQBUTTONS */ diff --git a/configs/photon/src/photon_leds.c b/configs/photon/src/photon_leds.c new file mode 100644 index 0000000000..070d6d6455 --- /dev/null +++ b/configs/photon/src/photon_leds.c @@ -0,0 +1,86 @@ +/**************************************************************************** + * configs/photon/src/photon_leds.c + * + * Copyright (C) 2017 Gregory Nutt. All rights reserved. + * Author: Simon Piriou + * + * 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 +#include + +#include +#include "photon.h" + +#include "stm32_gpio.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_userled_initialize + ****************************************************************************/ + +void board_userled_initialize(void) +{ + /* Configure Photon LED gpio as output */ + + stm32_configgpio(GPIO_LED1); +} + +/**************************************************************************** + * Name: board_userled + ****************************************************************************/ + +void board_userled(int led, bool ledon) +{ + if (led == BOARD_LED1) + { + stm32_gpiowrite(GPIO_LED1, ledon); + } +} + +/**************************************************************************** + * Name: board_userled_all + ****************************************************************************/ + +void board_userled_all(uint8_t ledset) +{ + stm32_gpiowrite(GPIO_LED1, !!(ledset & BOARD_LED1_BIT)); +} diff --git a/configs/photon/src/stm32_appinit.c b/configs/photon/src/stm32_appinit.c index 40ac5e3fa7..7952e4ea0f 100644 --- a/configs/photon/src/stm32_appinit.c +++ b/configs/photon/src/stm32_appinit.c @@ -38,15 +38,15 @@ ****************************************************************************/ #include - #include #include -#include "photon.h" -#include -#include +#include +#include "photon.h" #include "stm32_wdg.h" +#include +#include /**************************************************************************** * Pre-processor Definitions @@ -89,6 +89,36 @@ int board_app_initialize(uintptr_t arg) { int ret = OK; +#ifdef CONFIG_USERLED +#ifdef CONFIG_USERLED_LOWER + /* Register the LED driver */ + + ret = userled_lower_initialize("/dev/userleds"); + if (ret != OK) + { + syslog(LOG_ERR, "ERROR: userled_lower_initialize() failed: %d\n", ret); + return ret; + } +#else + board_userled_initialize(); +#endif /* CONFIG_USERLED_LOWER */ +#endif /* CONFIG_USERLED */ + +#ifdef CONFIG_BUTTONS +#ifdef CONFIG_BUTTONS_LOWER + /* Register the BUTTON driver */ + + ret = btn_lower_initialize("/dev/buttons"); + if (ret != OK) + { + syslog(LOG_ERR, "ERROR: btn_lower_initialize() failed: %d\n", ret); + return ret; + } +#else + board_button_initialize(); +#endif /* CONFIG_BUTTONS_LOWER */ +#endif /* CONFIG_BUTTONS */ + #ifdef CONFIG_STM32_IWDG stm32_iwdginitialize("/dev/watchdog0", STM32_LSI_FREQUENCY); #endif @@ -100,7 +130,7 @@ int board_app_initialize(uintptr_t arg) ret = photon_watchdog_initialize(); if (ret != OK) { - serr("Failed to start watchdog thread: %d\n", errno); + syslog(LOG_ERR, "Failed to start watchdog thread: %d\n", ret); return ret; } #endif