From 974a7549e932c40a6cf6fc9e5726333a64dbfbf5 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 5 Nov 2017 18:33:05 +0000 Subject: [PATCH] Use the new button HAL: CC2538DK --- arch/platform/cc2538dk/Makefile.cc2538dk | 2 +- arch/platform/cc2538dk/dev/board-buttons.c | 69 +++++ arch/platform/cc2538dk/dev/button-sensor.c | 265 ------------------- arch/platform/cc2538dk/dev/button-sensor.h | 66 ----- arch/platform/cc2538dk/dev/smartrf-sensors.c | 5 +- arch/platform/cc2538dk/platform.c | 7 +- 6 files changed, 75 insertions(+), 339 deletions(-) create mode 100644 arch/platform/cc2538dk/dev/board-buttons.c delete mode 100644 arch/platform/cc2538dk/dev/button-sensor.c delete mode 100644 arch/platform/cc2538dk/dev/button-sensor.h diff --git a/arch/platform/cc2538dk/Makefile.cc2538dk b/arch/platform/cc2538dk/Makefile.cc2538dk index e7be95c28..2b88479d2 100644 --- a/arch/platform/cc2538dk/Makefile.cc2538dk +++ b/arch/platform/cc2538dk/Makefile.cc2538dk @@ -9,7 +9,7 @@ CONTIKI_TARGET_DIRS = . dev CONTIKI_TARGET_SOURCEFILES += leds-arch.c CONTIKI_TARGET_SOURCEFILES += platform.c CONTIKI_TARGET_SOURCEFILES += sensors.c smartrf-sensors.c -CONTIKI_TARGET_SOURCEFILES += button-sensor.c als-sensor.c +CONTIKI_TARGET_SOURCEFILES += board-buttons.c als-sensor.c CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES) diff --git a/arch/platform/cc2538dk/dev/board-buttons.c b/arch/platform/cc2538dk/dev/board-buttons.c new file mode 100644 index 000000000..6afc915df --- /dev/null +++ b/arch/platform/cc2538dk/dev/board-buttons.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * 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 of the copyright holder 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 HOLDER 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. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup cc2538-smartrf + * @{ + * + * \defgroup cc2538-smartrf-buttons SmartRF06EB Buttons + * + * Generic module controlling buttons on the SmartRF06EB + * @{ + * + * \file + * Defines SmartRF06EB buttons for use with the button HAL + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "dev/button-hal.h" +/*---------------------------------------------------------------------------*/ +BUTTON_HAL_BUTTON(key_left, "Key Left", \ + GPIO_PORT_PIN_TO_GPIO_HAL_PIN(BUTTON_LEFT_PORT, BUTTON_LEFT_PIN), \ + GPIO_HAL_PIN_CFG_PULL_UP, BUTTON_HAL_ID_BUTTON_ZERO, true); +BUTTON_HAL_BUTTON(key_right, "Key Right", \ + GPIO_PORT_PIN_TO_GPIO_HAL_PIN(BUTTON_RIGHT_PORT, BUTTON_RIGHT_PIN), \ + GPIO_HAL_PIN_CFG_PULL_UP, BUTTON_HAL_ID_BUTTON_ONE, true); +BUTTON_HAL_BUTTON(key_up, "Key Up", \ + GPIO_PORT_PIN_TO_GPIO_HAL_PIN(BUTTON_UP_PORT, BUTTON_UP_PIN), \ + GPIO_HAL_PIN_CFG_PULL_UP, BUTTON_HAL_ID_BUTTON_TWO, true); +BUTTON_HAL_BUTTON(key_down, "Key Down", \ + GPIO_PORT_PIN_TO_GPIO_HAL_PIN(BUTTON_DOWN_PORT, BUTTON_DOWN_PIN), \ + GPIO_HAL_PIN_CFG_PULL_UP, BUTTON_HAL_ID_BUTTON_THREE, true); +BUTTON_HAL_BUTTON(key_select, "Key Select", \ + GPIO_PORT_PIN_TO_GPIO_HAL_PIN(BUTTON_SELECT_PORT, BUTTON_SELECT_PIN), \ + GPIO_HAL_PIN_CFG_PULL_UP, BUTTON_HAL_ID_BUTTON_FOUR, true); +/*---------------------------------------------------------------------------*/ +BUTTON_HAL_BUTTONS(&key_left, &key_right, &key_up, &key_down, &key_select); +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/arch/platform/cc2538dk/dev/button-sensor.c b/arch/platform/cc2538dk/dev/button-sensor.c deleted file mode 100644 index 6c34bb847..000000000 --- a/arch/platform/cc2538dk/dev/button-sensor.c +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/ - * All rights reserved. - * - * 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 of the copyright holder 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 HOLDER 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. - */ -/** - * \addtogroup cc2538dk-button-sensor - * @{ - * - * \file - * Driver for the SmartRF06EB buttons - */ -#include "contiki.h" -#include "dev/nvic.h" -#include "dev/ioc.h" -#include "dev/gpio.h" -#include "dev/button-sensor.h" -#include "sys/timer.h" - -#include -#include - -#define BUTTON_SELECT_PORT_BASE GPIO_PORT_TO_BASE(BUTTON_SELECT_PORT) -#define BUTTON_SELECT_PIN_MASK GPIO_PIN_MASK(BUTTON_SELECT_PIN) - -#define BUTTON_LEFT_PORT_BASE GPIO_PORT_TO_BASE(BUTTON_LEFT_PORT) -#define BUTTON_LEFT_PIN_MASK GPIO_PIN_MASK(BUTTON_LEFT_PIN) - -#define BUTTON_RIGHT_PORT_BASE GPIO_PORT_TO_BASE(BUTTON_RIGHT_PORT) -#define BUTTON_RIGHT_PIN_MASK GPIO_PIN_MASK(BUTTON_RIGHT_PIN) - -#define BUTTON_UP_PORT_BASE GPIO_PORT_TO_BASE(BUTTON_UP_PORT) -#define BUTTON_UP_PIN_MASK GPIO_PIN_MASK(BUTTON_UP_PIN) - -#define BUTTON_DOWN_PORT_BASE GPIO_PORT_TO_BASE(BUTTON_DOWN_PORT) -#define BUTTON_DOWN_PIN_MASK GPIO_PIN_MASK(BUTTON_DOWN_PIN) -/*---------------------------------------------------------------------------*/ -static struct timer debouncetimer; -/*---------------------------------------------------------------------------*/ -/** - * \brief Common initialiser for all buttons - * \param port_base GPIO port's register offset - * \param pin_mask Pin mask corresponding to the button's pin - */ -static void -config(uint32_t port_base, uint32_t pin_mask) -{ - /* Software controlled */ - GPIO_SOFTWARE_CONTROL(port_base, pin_mask); - - /* Set pin to input */ - GPIO_SET_INPUT(port_base, pin_mask); - - /* Enable edge detection */ - GPIO_DETECT_EDGE(port_base, pin_mask); - - /* Single edge */ - GPIO_TRIGGER_SINGLE_EDGE(port_base, pin_mask); - - /* Trigger interrupt on Falling edge */ - GPIO_DETECT_RISING(port_base, pin_mask); - - GPIO_ENABLE_INTERRUPT(port_base, pin_mask); -} -/*---------------------------------------------------------------------------*/ -static void -button_press_handler(gpio_hal_pin_mask_t pin_mask) -{ - if(!timer_expired(&debouncetimer)) { - return; - } - - timer_set(&debouncetimer, CLOCK_SECOND / 8); - - if(pin_mask & - (gpio_hal_pin_to_mask(BUTTON_SELECT_PIN) << (BUTTON_SELECT_PORT << 3))) { - sensors_changed(&button_select_sensor); - } else if(pin_mask & - (gpio_hal_pin_to_mask(BUTTON_LEFT_PIN) << (BUTTON_LEFT_PORT << 3))) { - sensors_changed(&button_left_sensor); - } else if(pin_mask & - (gpio_hal_pin_to_mask(BUTTON_RIGHT_PIN) << (BUTTON_RIGHT_PORT << 3))) { - sensors_changed(&button_right_sensor); - } else if(pin_mask & - (gpio_hal_pin_to_mask(BUTTON_UP_PIN) << (BUTTON_UP_PORT << 3))) { - sensors_changed(&button_up_sensor); - } else if(pin_mask & - (gpio_hal_pin_to_mask(BUTTON_DOWN_PIN) << (BUTTON_DOWN_PORT << 3))) { - sensors_changed(&button_down_sensor); - } -} -/*---------------------------------------------------------------------------*/ -static gpio_hal_event_handler_t press_handler = { - .next = NULL, - .handler = button_press_handler, - .pin_mask = 0, -}; -/*---------------------------------------------------------------------------*/ -static void -register_btn_callback(uint8_t port_num, uint8_t pin) -{ - press_handler.pin_mask |= - gpio_hal_pin_to_mask(pin) << (port_num << 3); - - gpio_hal_register_handler(&press_handler); -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Init function for the select button. - * - * Parameters are ignored. They have been included because the prototype is - * dictated by the core sensor api. The return value is also not required by - * the API but otherwise ignored. - * - * \param type ignored - * \param value ignored - * \return ignored - */ -static int -config_select(int type, int value) -{ - config(BUTTON_SELECT_PORT_BASE, BUTTON_SELECT_PIN_MASK); - - ioc_set_over(BUTTON_SELECT_PORT, BUTTON_SELECT_PIN, IOC_OVERRIDE_PUE); - - NVIC_EnableIRQ(BUTTON_SELECT_VECTOR); - - register_btn_callback(BUTTON_SELECT_PORT, BUTTON_SELECT_PIN); - return 1; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Init function for the left button. - * - * Parameters are ignored. They have been included because the prototype is - * dictated by the core sensor api. The return value is also not required by - * the API but otherwise ignored. - * - * \param type ignored - * \param value ignored - * \return ignored - */ -static int -config_left(int type, int value) -{ - config(BUTTON_LEFT_PORT_BASE, BUTTON_LEFT_PIN_MASK); - - ioc_set_over(BUTTON_LEFT_PORT, BUTTON_LEFT_PIN, IOC_OVERRIDE_PUE); - - NVIC_EnableIRQ(BUTTON_LEFT_VECTOR); - - register_btn_callback(BUTTON_LEFT_PORT, BUTTON_LEFT_PIN); - return 1; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Init function for the right button. - * - * Parameters are ignored. They have been included because the prototype is - * dictated by the core sensor api. The return value is also not required by - * the API but otherwise ignored. - * - * \param type ignored - * \param value ignored - * \return ignored - */ -static int -config_right(int type, int value) -{ - config(BUTTON_RIGHT_PORT_BASE, BUTTON_RIGHT_PIN_MASK); - - ioc_set_over(BUTTON_RIGHT_PORT, BUTTON_RIGHT_PIN, IOC_OVERRIDE_PUE); - - NVIC_EnableIRQ(BUTTON_RIGHT_VECTOR); - - register_btn_callback(BUTTON_RIGHT_PORT, BUTTON_RIGHT_PIN); - return 1; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Init function for the up button. - * - * Parameters are ignored. They have been included because the prototype is - * dictated by the core sensor api. The return value is also not required by - * the API but otherwise ignored. - * - * \param type ignored - * \param value ignored - * \return ignored - */ -static int -config_up(int type, int value) -{ - config(BUTTON_UP_PORT_BASE, BUTTON_UP_PIN_MASK); - - ioc_set_over(BUTTON_UP_PORT, BUTTON_UP_PIN, IOC_OVERRIDE_PUE); - - NVIC_EnableIRQ(BUTTON_UP_VECTOR); - - register_btn_callback(BUTTON_UP_PORT, BUTTON_UP_PIN); - return 1; -} -/*---------------------------------------------------------------------------*/ -/** - * \brief Init function for the down button. - * - * Parameters are ignored. They have been included because the prototype is - * dictated by the core sensor api. The return value is also not required by - * the API but otherwise ignored. - * - * \param type ignored - * \param value ignored - * \return ignored - */ -static int -config_down(int type, int value) -{ - config(BUTTON_DOWN_PORT_BASE, BUTTON_DOWN_PIN_MASK); - - ioc_set_over(BUTTON_DOWN_PORT, BUTTON_DOWN_PIN, IOC_OVERRIDE_PUE); - - NVIC_EnableIRQ(BUTTON_DOWN_VECTOR); - - register_btn_callback(BUTTON_DOWN_PORT, BUTTON_DOWN_PIN); - return 1; -} -/*---------------------------------------------------------------------------*/ -void -button_sensor_init() -{ - timer_set(&debouncetimer, 0); -} -/*---------------------------------------------------------------------------*/ -SENSORS_SENSOR(button_select_sensor, BUTTON_SENSOR, NULL, config_select, NULL); -SENSORS_SENSOR(button_left_sensor, BUTTON_SENSOR, NULL, config_left, NULL); -SENSORS_SENSOR(button_right_sensor, BUTTON_SENSOR, NULL, config_right, NULL); -SENSORS_SENSOR(button_up_sensor, BUTTON_SENSOR, NULL, config_up, NULL); -SENSORS_SENSOR(button_down_sensor, BUTTON_SENSOR, NULL, config_down, NULL); - -/** @} */ diff --git a/arch/platform/cc2538dk/dev/button-sensor.h b/arch/platform/cc2538dk/dev/button-sensor.h deleted file mode 100644 index 266770d24..000000000 --- a/arch/platform/cc2538dk/dev/button-sensor.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/ - * All rights reserved. - * - * 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 of the copyright holder 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 HOLDER 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. - */ -/** - * \addtogroup cc2538-smartrf-sensors - * @{ - * - * \defgroup cc2538dk-button-sensor cc2538dk Button Driver - * - * Driver for the SmartRF06EB buttons - * @{ - * - * \file - * Header file for the cc2538dk Button Driver - */ -#ifndef BUTTON_SENSOR_H_ -#define BUTTON_SENSOR_H_ - -#include "lib/sensors.h" -#include "dev/gpio.h" - -#define BUTTON_SENSOR "Button" - -#define button_sensor button_select_sensor -extern const struct sensors_sensor button_select_sensor; -extern const struct sensors_sensor button_left_sensor; -extern const struct sensors_sensor button_right_sensor; -extern const struct sensors_sensor button_up_sensor; -extern const struct sensors_sensor button_down_sensor; -/*---------------------------------------------------------------------------*/ -#endif /* BUTTON_SENSOR_H_ */ - -/** \brief Common initialiser for all SmartRF Buttons */ -void button_sensor_init(); - -/** - * @} - * @} - */ diff --git a/arch/platform/cc2538dk/dev/smartrf-sensors.c b/arch/platform/cc2538dk/dev/smartrf-sensors.c index 76841af3b..1b833e764 100644 --- a/arch/platform/cc2538dk/dev/smartrf-sensors.c +++ b/arch/platform/cc2538dk/dev/smartrf-sensors.c @@ -41,16 +41,13 @@ * Implementation of a generic module controlling SmartRF06EB sensors */ #include "contiki.h" -#include "dev/button-sensor.h" #include "dev/als-sensor.h" #include "dev/cc2538-sensors.h" #include /** \brief Exports a global symbol to be used by the sensor API */ -SENSORS(&button_select_sensor, &button_left_sensor, &button_right_sensor, - &button_up_sensor, &button_down_sensor, &als_sensor, - &cc2538_temp_sensor, &vdd3_sensor); +SENSORS(&als_sensor, &cc2538_temp_sensor, &vdd3_sensor); /** * @} diff --git a/arch/platform/cc2538dk/platform.c b/arch/platform/cc2538dk/platform.c index 8add14292..bf945bfdd 100644 --- a/arch/platform/cc2538dk/platform.c +++ b/arch/platform/cc2538dk/platform.c @@ -46,14 +46,15 @@ #include "dev/adc.h" #include "dev/leds.h" #include "dev/uart.h" -#include "dev/button-sensor.h" #include "dev/serial-line.h" #include "dev/slip.h" #include "dev/cc2538-rf.h" #include "dev/udma.h" #include "dev/crypto.h" +#include "dev/button-hal.h" #include "usb/usb-serial.h" #include "lib/random.h" +#include "lib/sensors.h" #include "net/netstack.h" #include "net/mac/framer/frame802154.h" #include "net/linkaddr.h" @@ -121,8 +122,6 @@ platform_init_stage_one(void) void platform_init_stage_two() { - button_sensor_init(); - /* * Character I/O Initialisation. * When the UART receives a character it will call serial_line_input_byte to @@ -159,6 +158,8 @@ platform_init_stage_two() /* Populate linkaddr_node_addr */ ieee_addr_cpy_to(linkaddr_node_addr.u8, LINKADDR_SIZE); + button_hal_init(); + INTERRUPTS_ENABLE(); fade(LEDS_GREEN);