mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
Merge pull request #6182 from haukepetersen/opt_cc2538_gpio
cpu/cc2538: reworked GPIO driver
This commit is contained in:
commit
cfa788a823
@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Loci Controls Inc.
|
||||
* 2016 Freie Universität Berlin
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
@ -14,6 +15,9 @@
|
||||
* @brief Board specific implementations for the CC2538DK board
|
||||
*
|
||||
* @author Ian Martin <ian@locicontrols.com>
|
||||
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
@ -21,14 +25,6 @@
|
||||
#include "board.h"
|
||||
#include "cpu.h"
|
||||
|
||||
static void led_init_helper(int gpio_num) {
|
||||
gpio_software_control(gpio_num);
|
||||
gpio_dir_output(gpio_num);
|
||||
|
||||
/* Enable output without any internal pull resistors: */
|
||||
IOC_PXX_OVER[gpio_num] = IOC_OVERRIDE_OE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Initialize the SmartRF06 board
|
||||
*/
|
||||
@ -38,10 +34,8 @@ void board_init(void)
|
||||
cpu_init();
|
||||
|
||||
/* initialize the boards LEDs */
|
||||
led_init_helper(LED0_GPIO);
|
||||
led_init_helper(LED1_GPIO);
|
||||
led_init_helper(LED2_GPIO);
|
||||
led_init_helper(LED3_GPIO);
|
||||
gpio_init(LED0_PIN, GPIO_OUT);
|
||||
gpio_init(LED1_PIN, GPIO_OUT);
|
||||
gpio_init(LED2_PIN, GPIO_OUT);
|
||||
gpio_init(LED3_PIN, GPIO_OUT);
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
@ -36,26 +36,27 @@ extern "C" {
|
||||
#define LED2_PIN GPIO_PIN(2, 2)
|
||||
#define LED3_PIN GPIO_PIN(2, 3)
|
||||
|
||||
#define LED0_GPIO GPIO_PC0 /**< red LED */
|
||||
#define LED1_GPIO GPIO_PC1 /**< yellow LED */
|
||||
#define LED2_GPIO GPIO_PC2 /**< green LED */
|
||||
#define LED3_GPIO GPIO_PC3 /**< orange LED */
|
||||
#define LED_PORT GPIO_C
|
||||
#define LED0_BIT (1 << 0) /**< red LED */
|
||||
#define LED1_BIT (1 << 1) /**< yellow LED */
|
||||
#define LED2_BIT (1 << 2) /**< green LED */
|
||||
#define LED3_BIT (1 << 3) /**< orange LED */
|
||||
|
||||
#define LED0_ON cc2538_gpio_set(LED0_GPIO)
|
||||
#define LED0_OFF cc2538_gpio_clear(LED0_GPIO)
|
||||
#define LED0_TOGGLE cc2538_gpio_toggle(LED0_GPIO)
|
||||
#define LED0_ON (LED_PORT->DATA |= LED0_BIT)
|
||||
#define LED0_OFF (LED_PORT->DATA &= ~LED0_BIT)
|
||||
#define LED0_TOGGLE (LED_PORT->DATA ^= LED0_BIT)
|
||||
|
||||
#define LED1_ON cc2538_gpio_set(LED1_GPIO)
|
||||
#define LED1_OFF cc2538_gpio_clear(LED1_GPIO)
|
||||
#define LED1_TOGGLE cc2538_gpio_toggle(LED1_GPIO)
|
||||
#define LED1_ON (LED_PORT->DATA |= LED1_BIT)
|
||||
#define LED1_OFF (LED_PORT->DATA &= ~LED1_BIT)
|
||||
#define LED1_TOGGLE (LED_PORT->DATA ^= LED1_BIT)
|
||||
|
||||
#define LED2_ON cc2538_gpio_set(LED2_GPIO)
|
||||
#define LED2_OFF cc2538_gpio_clear(LED2_GPIO)
|
||||
#define LED2_TOGGLE cc2538_gpio_toggle(LED2_GPIO)
|
||||
#define LED2_ON (LED_PORT->DATA |= LED2_BIT)
|
||||
#define LED2_OFF (LED_PORT->DATA &= ~LED2_BIT)
|
||||
#define LED2_TOGGLE (LED_PORT->DATA ^= LED2_BIT)
|
||||
|
||||
#define LED3_ON cc2538_gpio_set(LED3_GPIO)
|
||||
#define LED3_OFF cc2538_gpio_clear(LED3_GPIO)
|
||||
#define LED3_TOGGLE cc2538_gpio_toggle(LED3_GPIO)
|
||||
#define LED3_ON (LED_PORT->DATA |= LED3_BIT)
|
||||
#define LED3_OFF (LED_PORT->DATA &= ~LED3_BIT)
|
||||
#define LED3_TOGGLE (LED_PORT->DATA ^= LED3_BIT)
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
|
@ -119,7 +119,6 @@ static const i2c_conf_t i2c_config[I2C_NUMOF] = {
|
||||
#define SPI_NUMOF 1
|
||||
#define SPI_0_EN 1
|
||||
|
||||
#ifdef HAVE_PERIPH_SPI_CONF_T
|
||||
static const periph_spi_conf_t spi_config[SPI_NUMOF] = {
|
||||
{
|
||||
.dev = SSI0,
|
||||
@ -129,82 +128,6 @@ static const periph_spi_conf_t spi_config[SPI_NUMOF] = {
|
||||
.cs_pin = GPIO_PD0,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name GPIO configuration
|
||||
* @{
|
||||
*/
|
||||
#define GPIO_IRQ_PRIO 1
|
||||
|
||||
#define GPIO_0_EN 1
|
||||
#define GPIO_1_EN 1
|
||||
#define GPIO_2_EN 1
|
||||
#define GPIO_3_EN 1
|
||||
#define GPIO_4_EN 1
|
||||
#define GPIO_5_EN 1
|
||||
#define GPIO_6_EN 1
|
||||
#define GPIO_7_EN 1
|
||||
#define GPIO_8_EN 1
|
||||
#define GPIO_9_EN 1
|
||||
#define GPIO_10_EN 1
|
||||
#define GPIO_11_EN 1
|
||||
#define GPIO_12_EN 1
|
||||
#define GPIO_13_EN 1
|
||||
#define GPIO_14_EN 1
|
||||
#define GPIO_15_EN 1
|
||||
#define GPIO_16_EN 1
|
||||
#define GPIO_17_EN 1
|
||||
#define GPIO_18_EN 1
|
||||
#define GPIO_19_EN 1
|
||||
#define GPIO_20_EN 1
|
||||
#define GPIO_21_EN 1
|
||||
#define GPIO_22_EN 1
|
||||
#define GPIO_23_EN 1
|
||||
#define GPIO_24_EN 1
|
||||
#define GPIO_25_EN 1
|
||||
#define GPIO_26_EN 1
|
||||
#define GPIO_27_EN 1
|
||||
#define GPIO_28_EN 1
|
||||
#define GPIO_29_EN 1
|
||||
#define GPIO_30_EN 1
|
||||
#define GPIO_31_EN 1
|
||||
|
||||
/* GPIO channel configuration */
|
||||
#define GPIO_0_PIN GPIO_PA0
|
||||
#define GPIO_1_PIN GPIO_PA1
|
||||
#define GPIO_2_PIN GPIO_PA2
|
||||
#define GPIO_3_PIN GPIO_PA3
|
||||
#define GPIO_4_PIN GPIO_PA4
|
||||
#define GPIO_5_PIN GPIO_PA5
|
||||
#define GPIO_6_PIN GPIO_PA6
|
||||
#define GPIO_7_PIN GPIO_PA7
|
||||
#define GPIO_8_PIN GPIO_PB0
|
||||
#define GPIO_9_PIN GPIO_PB1
|
||||
#define GPIO_10_PIN GPIO_PB2
|
||||
#define GPIO_11_PIN GPIO_PB3
|
||||
#define GPIO_12_PIN GPIO_PB4
|
||||
#define GPIO_13_PIN GPIO_PB5
|
||||
#define GPIO_14_PIN GPIO_PB6
|
||||
#define GPIO_15_PIN GPIO_PB7
|
||||
#define GPIO_16_PIN GPIO_PC0
|
||||
#define GPIO_17_PIN GPIO_PC1
|
||||
#define GPIO_18_PIN GPIO_PC2
|
||||
#define GPIO_19_PIN GPIO_PC3
|
||||
#define GPIO_20_PIN GPIO_PC4
|
||||
#define GPIO_21_PIN GPIO_PC5
|
||||
#define GPIO_22_PIN GPIO_PC6
|
||||
#define GPIO_23_PIN GPIO_PC7
|
||||
#define GPIO_24_PIN GPIO_PD0
|
||||
#define GPIO_25_PIN GPIO_PD1
|
||||
#define GPIO_26_PIN GPIO_PD2
|
||||
#define GPIO_27_PIN GPIO_PD3
|
||||
#define GPIO_28_PIN GPIO_PD4
|
||||
#define GPIO_29_PIN GPIO_PD5
|
||||
#define GPIO_30_PIN GPIO_PD6
|
||||
#define GPIO_31_PIN GPIO_PD7
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
|
@ -120,81 +120,6 @@ static const periph_spi_conf_t spi_config[SPI_NUMOF] = {
|
||||
.cs_pin = GPIO_PA3,
|
||||
},
|
||||
};
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name GPIO configuration
|
||||
* @{
|
||||
*/
|
||||
#define GPIO_IRQ_PRIO 1
|
||||
|
||||
#define GPIO_0_EN 1
|
||||
#define GPIO_1_EN 1
|
||||
#define GPIO_2_EN 1
|
||||
#define GPIO_3_EN 1
|
||||
#define GPIO_4_EN 1
|
||||
#define GPIO_5_EN 1
|
||||
#define GPIO_6_EN 1
|
||||
#define GPIO_7_EN 1
|
||||
#define GPIO_8_EN 1
|
||||
#define GPIO_9_EN 1
|
||||
#define GPIO_10_EN 1
|
||||
#define GPIO_11_EN 1
|
||||
#define GPIO_12_EN 1
|
||||
#define GPIO_13_EN 1
|
||||
#define GPIO_14_EN 1
|
||||
#define GPIO_15_EN 1
|
||||
#define GPIO_16_EN 1
|
||||
#define GPIO_17_EN 1
|
||||
#define GPIO_18_EN 1
|
||||
#define GPIO_19_EN 1
|
||||
#define GPIO_20_EN 1
|
||||
#define GPIO_21_EN 1
|
||||
#define GPIO_22_EN 1
|
||||
#define GPIO_23_EN 1
|
||||
#define GPIO_24_EN 1
|
||||
#define GPIO_25_EN 1
|
||||
#define GPIO_26_EN 1
|
||||
#define GPIO_27_EN 1
|
||||
#define GPIO_28_EN 1
|
||||
#define GPIO_29_EN 1
|
||||
#define GPIO_30_EN 1
|
||||
#define GPIO_31_EN 1
|
||||
|
||||
/* GPIO channel configuration */
|
||||
#define GPIO_0_PIN GPIO_PA0
|
||||
#define GPIO_1_PIN GPIO_PA1
|
||||
#define GPIO_2_PIN GPIO_PA2
|
||||
#define GPIO_3_PIN GPIO_PA3
|
||||
#define GPIO_4_PIN GPIO_PA4
|
||||
#define GPIO_5_PIN GPIO_PA5
|
||||
#define GPIO_6_PIN GPIO_PA6
|
||||
#define GPIO_7_PIN GPIO_PA7
|
||||
#define GPIO_8_PIN GPIO_PB0
|
||||
#define GPIO_9_PIN GPIO_PB1
|
||||
#define GPIO_10_PIN GPIO_PB2
|
||||
#define GPIO_11_PIN GPIO_PB3
|
||||
#define GPIO_12_PIN GPIO_PB4
|
||||
#define GPIO_13_PIN GPIO_PB5
|
||||
#define GPIO_14_PIN GPIO_PB6
|
||||
#define GPIO_15_PIN GPIO_PB7
|
||||
#define GPIO_16_PIN GPIO_PC0
|
||||
#define GPIO_17_PIN GPIO_PC1
|
||||
#define GPIO_18_PIN GPIO_PC2
|
||||
#define GPIO_19_PIN GPIO_PC3
|
||||
#define GPIO_20_PIN GPIO_PC4
|
||||
#define GPIO_21_PIN GPIO_PC5
|
||||
#define GPIO_22_PIN GPIO_PC6
|
||||
#define GPIO_23_PIN GPIO_PC7
|
||||
#define GPIO_24_PIN GPIO_PD0
|
||||
#define GPIO_25_PIN GPIO_PD1
|
||||
#define GPIO_26_PIN GPIO_PD2
|
||||
#define GPIO_27_PIN GPIO_PD3
|
||||
#define GPIO_28_PIN GPIO_PD4
|
||||
#define GPIO_29_PIN GPIO_PD5
|
||||
#define GPIO_30_PIN GPIO_PD6
|
||||
#define GPIO_31_PIN GPIO_PD7
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
|
@ -60,7 +60,7 @@ static void rf_switch_init(void)
|
||||
RF_SWITCH_PORT->DIR |= (1 << RF_SWITCH_PIN);
|
||||
|
||||
/* configure io-mux for used pins */
|
||||
IOC->PC_OVER[RF_SWITCH_PIN] = IOC_OVERRIDE_OE;
|
||||
IOC->OVER[RF_SWITCH_PIN] = IOC_OVERRIDE_OE;
|
||||
|
||||
/* Set to default */
|
||||
RF_SWITCH_INTERNAL;
|
||||
|
@ -60,7 +60,7 @@
|
||||
* @name User button pin definition
|
||||
* @{
|
||||
*/
|
||||
#define BUTTON_GPIO GPIO_9_PIN
|
||||
#define BTN0_PIN GPIO_PIN(0, 3)
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
|
@ -48,7 +48,7 @@ static const saul_gpio_params_t saul_gpio_params[] =
|
||||
},
|
||||
{
|
||||
.name = "Button(User)",
|
||||
.pin = BUTTON_GPIO,
|
||||
.pin = BTN0_PIN,
|
||||
.mode = GPIO_IN_PU
|
||||
},
|
||||
};
|
||||
|
@ -78,7 +78,6 @@ static const i2c_conf_t i2c_config[I2C_NUMOF] = {
|
||||
#define SPI_0_EN 1
|
||||
#define SPI_1_EN 1
|
||||
|
||||
#ifdef HAVE_PERIPH_SPI_CONF_T
|
||||
static const periph_spi_conf_t spi_config[SPI_NUMOF] = {
|
||||
{
|
||||
.dev = SSI0,
|
||||
@ -94,97 +93,6 @@ static const periph_spi_conf_t spi_config[SPI_NUMOF] = {
|
||||
.sck_pin = GPIO_PB5,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name GPIO configuration
|
||||
* @{
|
||||
*/
|
||||
#define GPIO_IRQ_PRIO 1
|
||||
|
||||
#define GPIO_0_EN 1
|
||||
#define GPIO_1_EN 1
|
||||
#define GPIO_2_EN 1
|
||||
#define GPIO_3_EN 1
|
||||
#define GPIO_4_EN 1
|
||||
#define GPIO_5_EN 1
|
||||
#define GPIO_6_EN 1
|
||||
#define GPIO_7_EN 1
|
||||
#define GPIO_8_EN 1
|
||||
#define GPIO_9_EN 1
|
||||
#define GPIO_10_EN 1
|
||||
#define GPIO_11_EN 1
|
||||
#define GPIO_12_EN 1
|
||||
#define GPIO_13_EN 1
|
||||
#define GPIO_14_EN 1
|
||||
#define GPIO_15_EN 1
|
||||
#define GPIO_16_EN 1
|
||||
#define GPIO_17_EN 1
|
||||
#define GPIO_18_EN 1
|
||||
#define GPIO_19_EN 1
|
||||
#define GPIO_20_EN 1
|
||||
#define GPIO_21_EN 1
|
||||
#define GPIO_22_EN 1
|
||||
#define GPIO_23_EN 1
|
||||
#define GPIO_24_EN 1
|
||||
|
||||
/**
|
||||
* @brief Port config
|
||||
*
|
||||
* These defines configures the port settings
|
||||
*/
|
||||
/* GPIO 0 configuration - LED1 Green */
|
||||
#define GPIO_0_PIN GPIO_PD5
|
||||
/* GPIO 1 configuration - LED2 Blue */
|
||||
#define GPIO_1_PIN GPIO_PC3
|
||||
/* GPIO 2 configuration - LED3 Red */
|
||||
#define GPIO_2_PIN GPIO_PD2
|
||||
/* GPIO 3 configuration - UART0 RX */
|
||||
#define GPIO_3_PIN GPIO_PA0
|
||||
/* GPIO 4 configuration - UART0 TX */
|
||||
#define GPIO_4_PIN GPIO_PA1
|
||||
/* GPIO 5 configuration - UART1 TX */
|
||||
#define GPIO_5_PIN GPIO_PC5
|
||||
/* GPIO 6 configuration - UART1 RX */
|
||||
#define GPIO_6_PIN GPIO_PC6
|
||||
/* GPIO 7 configuration - UART1 CTS */
|
||||
#define GPIO_7_PIN GPIO_PC1
|
||||
/* GPIO 8 configuration - UART RTS */
|
||||
#define GPIO_8_PIN GPIO_PC2
|
||||
/* GPIO 9 configuration - User button/Bootloader */
|
||||
#define GPIO_9_PIN GPIO_PA3
|
||||
/* GPIO 10 configuration - ADC2 */
|
||||
#define GPIO_10_PIN GPIO_PA6
|
||||
/* GPIO 11 configuration - ADC3 */
|
||||
#define GPIO_11_PIN GPIO_PA7
|
||||
/* GPIO 12 configuration - SSI0 CC1120 CLK */
|
||||
#define GPIO_12_PIN GPIO_PD1
|
||||
/* GPIO 13 configuration - SSI0 CC1120 MOSI */
|
||||
#define GPIO_13_PIN GPIO_PD0
|
||||
/* GPIO 14 configuration - SSI0 CC1120 MISO */
|
||||
#define GPIO_14_PIN GPIO_PC4
|
||||
/* GPIO 15 configuration - I2C SCL */
|
||||
#define GPIO_15_PIN GPIO_PB1
|
||||
/* GPIO 16 configuration - I2C SDA */
|
||||
#define GPIO_16_PIN GPIO_PB0
|
||||
/* GPIO 17 configuration - RF SWITCH */
|
||||
#define GPIO_17_PIN GPIO_PD4
|
||||
/* GPIO 18 configuration - SSI1 MicroSD CLK */
|
||||
#define GPIO_18_PIN GPIO_PB5
|
||||
/* GPIO 19 configuration - SSI1 MicroSD MOSI */
|
||||
#define GPIO_19_PIN GPIO_PC7
|
||||
/* GPIO 20 configuration - SSI1 MicroSD MISO */
|
||||
#define GPIO_20_PIN GPIO_PA4
|
||||
/* GPIO 21 configuration - CC1120 CSn */
|
||||
#define GPIO_21_PIN GPIO_PD3
|
||||
/* GPIO 22 configuration - CC1120 GDO0 */
|
||||
#define GPIO_22_PIN GPIO_PB4
|
||||
/* GPIO 23 configuration - CC1120 GDO2 */
|
||||
#define GPIO_23_PIN GPIO_PB3
|
||||
/* GPIO 24 configuration - CC1120 Reset */
|
||||
#define GPIO_24_PIN GPIO_PB2
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -60,8 +60,9 @@
|
||||
* @name User button pin definition
|
||||
* @{
|
||||
*/
|
||||
#define BUTTON_GPIO GPIO_3_PIN
|
||||
#define BTN0_PIN GPIO_PIN(0, 3)
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name RF switch controlled by SW
|
||||
* @brief Controls which RF interface goes to the RP-SMA external antenna
|
||||
|
@ -48,7 +48,7 @@ static const saul_gpio_params_t saul_gpio_params[] =
|
||||
},
|
||||
{
|
||||
.name = "Button(User)",
|
||||
.pin = BUTTON_GPIO,
|
||||
.pin = BTN0_PIN,
|
||||
.mode = GPIO_IN_PU
|
||||
},
|
||||
};
|
||||
|
@ -78,7 +78,6 @@ static const i2c_conf_t i2c_config[I2C_NUMOF] = {
|
||||
#define SPI_0_EN 1
|
||||
#define SPI_1_EN 1
|
||||
|
||||
#ifdef HAVE_PERIPH_SPI_CONF_T
|
||||
static const periph_spi_conf_t spi_config[SPI_NUMOF] = {
|
||||
{
|
||||
.dev = SSI0,
|
||||
@ -95,113 +94,6 @@ static const periph_spi_conf_t spi_config[SPI_NUMOF] = {
|
||||
.cs_pin = GPIO_PA7,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name GPIO configuration
|
||||
* @{
|
||||
*/
|
||||
#define GPIO_IRQ_PRIO 1
|
||||
|
||||
/* Enable only up to PD5 as PD6-PD7 are used with the 32KHz XOSC */
|
||||
#define GPIO_0_EN 1
|
||||
#define GPIO_1_EN 1
|
||||
#define GPIO_2_EN 1
|
||||
#define GPIO_3_EN 1
|
||||
#define GPIO_4_EN 1
|
||||
#define GPIO_5_EN 1
|
||||
#define GPIO_6_EN 1
|
||||
#define GPIO_7_EN 1
|
||||
#define GPIO_8_EN 1
|
||||
#define GPIO_9_EN 1
|
||||
#define GPIO_10_EN 1
|
||||
#define GPIO_11_EN 1
|
||||
#define GPIO_12_EN 1
|
||||
#define GPIO_13_EN 1
|
||||
#define GPIO_14_EN 1
|
||||
#define GPIO_15_EN 1
|
||||
#define GPIO_16_EN 1
|
||||
#define GPIO_17_EN 1
|
||||
#define GPIO_18_EN 1
|
||||
#define GPIO_19_EN 1
|
||||
#define GPIO_20_EN 1
|
||||
#define GPIO_21_EN 1
|
||||
#define GPIO_22_EN 1
|
||||
#define GPIO_23_EN 1
|
||||
#define GPIO_24_EN 1
|
||||
#define GPIO_25_EN 1
|
||||
#define GPIO_26_EN 1
|
||||
#define GPIO_27_EN 1
|
||||
#define GPIO_28_EN 1
|
||||
#define GPIO_29_EN 1
|
||||
|
||||
/**
|
||||
* @brief Port config
|
||||
*
|
||||
* These defines configures the port settings
|
||||
*/
|
||||
/* UART0 RX */
|
||||
#define GPIO_0_PIN GPIO_PA0
|
||||
/* UART0 TX */
|
||||
#define GPIO_1_PIN GPIO_PA1
|
||||
/* ADC3 */
|
||||
#define GPIO_2_PIN GPIO_PA2
|
||||
/* User button/Bootloader */
|
||||
#define GPIO_3_PIN GPIO_PA3
|
||||
/* ADC2 */
|
||||
#define GPIO_4_PIN GPIO_PA4
|
||||
/* ADC1 */
|
||||
#define GPIO_5_PIN GPIO_PA5
|
||||
/* SEL MicroSD */
|
||||
#define GPIO_6_PIN GPIO_PA6
|
||||
/* CSn MicroSD (shared with ADC extRef) */
|
||||
#define GPIO_7_PIN GPIO_PA7
|
||||
/* CC1200 GDO2 */
|
||||
#define GPIO_8_PIN GPIO_PB0
|
||||
/* SSI0 CC1200 MOSI */
|
||||
#define GPIO_9_PIN GPIO_PB1
|
||||
/* SSI0 CC1200 CLK */
|
||||
#define GPIO_10_PIN GPIO_PB2
|
||||
/* SSI0 CC1200 MISO */
|
||||
#define GPIO_11_PIN GPIO_PB3
|
||||
/* CC1200 GDO0 */
|
||||
#define GPIO_12_PIN GPIO_PB4
|
||||
/* CC1200 CSn */
|
||||
#define GPIO_13_PIN GPIO_PB5
|
||||
/* JTAG TDI */
|
||||
#define GPIO_14_PIN GPIO_PB6
|
||||
/* JTAG TDO */
|
||||
#define GPIO_15_PIN GPIO_PB7
|
||||
/* UART1 TX */
|
||||
#define GPIO_16_PIN GPIO_PC0
|
||||
/* UART1 RX */
|
||||
#define GPIO_17_PIN GPIO_PC1
|
||||
/* I2C SDA */
|
||||
#define GPIO_18_PIN GPIO_PC2
|
||||
/* I2C SCL */
|
||||
#define GPIO_19_PIN GPIO_PC3
|
||||
/* SSI1 MicroSD CLK */
|
||||
#define GPIO_20_PIN GPIO_PC4
|
||||
/* SSI1 MicroSD MOSI */
|
||||
#define GPIO_21_PIN GPIO_PC5
|
||||
/* SSI1 MicroSD MISO */
|
||||
#define GPIO_22_PIN GPIO_PC6
|
||||
/* CC1200 Reset */
|
||||
#define GPIO_23_PIN GPIO_PC7
|
||||
/* Power Management (shutdown) */
|
||||
#define GPIO_24_PIN GPIO_PD0
|
||||
/* Power Management (done) */
|
||||
#define GPIO_25_PIN GPIO_PD1
|
||||
/* RF SWITCH */
|
||||
#define GPIO_26_PIN GPIO_PD2
|
||||
/* LED2 Blue/UART1 RTS */
|
||||
#define GPIO_27_PIN GPIO_PD3
|
||||
/* LED1 Green/UART1 CTS */
|
||||
#define GPIO_28_PIN GPIO_PD4
|
||||
/* LED3 Red */
|
||||
#define GPIO_29_PIN GPIO_PD5
|
||||
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -60,7 +60,7 @@
|
||||
* @name User button pin definition
|
||||
* @{
|
||||
*/
|
||||
#define BUTTON_GPIO GPIO_3_PIN
|
||||
#define BTN0_PIN GPIO_PIN(0, 3)
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
|
@ -48,7 +48,7 @@ static const saul_gpio_params_t saul_gpio_params[] =
|
||||
},
|
||||
{
|
||||
.name = "Button(User)",
|
||||
.pin = BUTTON_GPIO,
|
||||
.pin = BTN0_PIN,
|
||||
.mode = GPIO_IN_PU
|
||||
},
|
||||
};
|
||||
|
@ -78,7 +78,6 @@ static const i2c_conf_t i2c_config[I2C_NUMOF] = {
|
||||
#define SPI_0_EN 1
|
||||
#define SPI_1_EN 1
|
||||
|
||||
#ifdef HAVE_PERIPH_SPI_CONF_T
|
||||
static const periph_spi_conf_t spi_config[SPI_NUMOF] = {
|
||||
{
|
||||
.dev = SSI0,
|
||||
@ -95,113 +94,6 @@ static const periph_spi_conf_t spi_config[SPI_NUMOF] = {
|
||||
.cs_pin = GPIO_PA7,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name GPIO configuration
|
||||
* @{
|
||||
*/
|
||||
#define GPIO_IRQ_PRIO 1
|
||||
|
||||
/* Enable only up to PD5 as PD6-PD7 are used with the 32KHz XOSC */
|
||||
#define GPIO_0_EN 1
|
||||
#define GPIO_1_EN 1
|
||||
#define GPIO_2_EN 1
|
||||
#define GPIO_3_EN 1
|
||||
#define GPIO_4_EN 1
|
||||
#define GPIO_5_EN 1
|
||||
#define GPIO_6_EN 1
|
||||
#define GPIO_7_EN 1
|
||||
#define GPIO_8_EN 1
|
||||
#define GPIO_9_EN 1
|
||||
#define GPIO_10_EN 1
|
||||
#define GPIO_11_EN 1
|
||||
#define GPIO_12_EN 1
|
||||
#define GPIO_13_EN 1
|
||||
#define GPIO_14_EN 1
|
||||
#define GPIO_15_EN 1
|
||||
#define GPIO_16_EN 1
|
||||
#define GPIO_17_EN 1
|
||||
#define GPIO_18_EN 1
|
||||
#define GPIO_19_EN 1
|
||||
#define GPIO_20_EN 1
|
||||
#define GPIO_21_EN 1
|
||||
#define GPIO_22_EN 1
|
||||
#define GPIO_23_EN 1
|
||||
#define GPIO_24_EN 1
|
||||
#define GPIO_25_EN 1
|
||||
#define GPIO_26_EN 1
|
||||
#define GPIO_27_EN 1
|
||||
#define GPIO_28_EN 1
|
||||
#define GPIO_29_EN 1
|
||||
|
||||
/**
|
||||
* @brief Port config
|
||||
*
|
||||
* These defines configures the port settings
|
||||
*/
|
||||
/* UART0 RX */
|
||||
#define GPIO_0_PIN GPIO_PA0
|
||||
/* UART0 TX */
|
||||
#define GPIO_1_PIN GPIO_PA1
|
||||
/* ADC3 */
|
||||
#define GPIO_2_PIN GPIO_PA2
|
||||
/* User button/Bootloader */
|
||||
#define GPIO_3_PIN GPIO_PA3
|
||||
/* ADC2 */
|
||||
#define GPIO_4_PIN GPIO_PA4
|
||||
/* ADC1 */
|
||||
#define GPIO_5_PIN GPIO_PA5
|
||||
/* SEL MicroSD or AIN6/ADC4 */
|
||||
#define GPIO_6_PIN GPIO_PA6
|
||||
/* CSn MicroSD or AIN7/ADC5 */
|
||||
#define GPIO_7_PIN GPIO_PA7
|
||||
/* CC1200 GDO2 */
|
||||
#define GPIO_8_PIN GPIO_PB0
|
||||
/* SSI0 CC1200 MOSI */
|
||||
#define GPIO_9_PIN GPIO_PB1
|
||||
/* SSI0 CC1200 CLK */
|
||||
#define GPIO_10_PIN GPIO_PB2
|
||||
/* SSI0 CC1200 MISO */
|
||||
#define GPIO_11_PIN GPIO_PB3
|
||||
/* CC1200 GDO0 */
|
||||
#define GPIO_12_PIN GPIO_PB4
|
||||
/* CC1200 CSn */
|
||||
#define GPIO_13_PIN GPIO_PB5
|
||||
/* JTAG TDI & LED3 */
|
||||
#define GPIO_14_PIN GPIO_PB6
|
||||
/* JTAG TDO & LED2 */
|
||||
#define GPIO_15_PIN GPIO_PB7
|
||||
/* UART1 TX */
|
||||
#define GPIO_16_PIN GPIO_PC0
|
||||
/* UART1 RX */
|
||||
#define GPIO_17_PIN GPIO_PC1
|
||||
/* I2C SDA */
|
||||
#define GPIO_18_PIN GPIO_PC2
|
||||
/* I2C SCL */
|
||||
#define GPIO_19_PIN GPIO_PC3
|
||||
/* SSI1 MicroSD CLK */
|
||||
#define GPIO_20_PIN GPIO_PC4
|
||||
/* SSI1 MicroSD MOSI */
|
||||
#define GPIO_21_PIN GPIO_PC5
|
||||
/* SSI1 MicroSD MISO */
|
||||
#define GPIO_22_PIN GPIO_PC6
|
||||
/* CC1200 Reset */
|
||||
#define GPIO_23_PIN GPIO_PC7
|
||||
/* GPIO */
|
||||
#define GPIO_24_PIN GPIO_PD0
|
||||
/* Power Management enable */
|
||||
#define GPIO_25_PIN GPIO_PD1
|
||||
/* RF SWITCH */
|
||||
#define GPIO_26_PIN GPIO_PD2
|
||||
/* RTCC INT1 */
|
||||
#define GPIO_27_PIN GPIO_PD3
|
||||
/* LED1 */
|
||||
#define GPIO_28_PIN GPIO_PD4
|
||||
/* External WDT */
|
||||
#define GPIO_29_PIN GPIO_PD5
|
||||
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -1,38 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Loci Controls Inc.
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
* directory for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup cpu_cc2538
|
||||
* @{
|
||||
*
|
||||
* @file cc2538-gpio.c
|
||||
* @brief cc2538 GPIO controller driver implementation
|
||||
*
|
||||
* @author Ian Martin <ian@locicontrols.com>
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "cc2538_gpio.h"
|
||||
|
||||
void cc2538_gpio_port_init(cc2538_gpio_t* gpio_port) {
|
||||
/* Disable power-up interrupts */
|
||||
gpio_port->PI_IEN = 0;
|
||||
|
||||
/* Disable normal interrupts */
|
||||
gpio_port->IE = 0;
|
||||
|
||||
/* Clear any pending interrupts */
|
||||
gpio_port->IC = 0xff;
|
||||
}
|
||||
|
||||
void cc2538_gpio_init(void) {
|
||||
cc2538_gpio_port_init(GPIO_A);
|
||||
cc2538_gpio_port_init(GPIO_B);
|
||||
cc2538_gpio_port_init(GPIO_C);
|
||||
cc2538_gpio_port_init(GPIO_D);
|
||||
}
|
@ -47,8 +47,6 @@ void cpu_init(void)
|
||||
SYS_CTRL->I_MAP = 1;
|
||||
/* initialize the clock system */
|
||||
cpu_clock_init();
|
||||
/* initialize the GPIO controller */
|
||||
cc2538_gpio_init();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -122,6 +122,11 @@ enum {
|
||||
*/
|
||||
#define gpio_dir_input(gpio_num) ( GPIO_NUM_TO_DEV(gpio_num)->DIR &= ~GPIO_PIN_MASK(GPIO_BIT_NUM(gpio_num)) )
|
||||
|
||||
/**
|
||||
* @brief Read the value of the given pin
|
||||
*
|
||||
* @param[in] gpio_num GPIO number (0-31)
|
||||
*/
|
||||
#define cc2538_gpio_read(gpio_num) ( (GPIO_NUM_TO_DEV(gpio_num)->DATA >> GPIO_BIT_NUM(gpio_num)) & 1 )
|
||||
|
||||
/**
|
||||
@ -218,14 +223,8 @@ typedef struct {
|
||||
* @brief IOC port component registers
|
||||
*/
|
||||
typedef struct {
|
||||
cc2538_reg_t PA_SEL[8]; /**< Port A SEL register */
|
||||
cc2538_reg_t PB_SEL[8]; /**< Port B SEL register */
|
||||
cc2538_reg_t PC_SEL[8]; /**< Port C SEL register */
|
||||
cc2538_reg_t PD_SEL[8]; /**< Port D SEL register */
|
||||
cc2538_reg_t PA_OVER[8]; /**< Port A OVER register */
|
||||
cc2538_reg_t PB_OVER[8]; /**< Port B OVER register */
|
||||
cc2538_reg_t PC_OVER[8]; /**< Port C OVER register */
|
||||
cc2538_reg_t PD_OVER[8]; /**< Port D OVER register */
|
||||
cc2538_reg_t SEL[32]; /**< Port A to D SEL registers */
|
||||
cc2538_reg_t OVER[32]; /**< Port A OVER register */
|
||||
} cc2538_ioc_t;
|
||||
|
||||
/**
|
||||
@ -283,19 +282,6 @@ typedef struct {
|
||||
#define IOC ((cc2538_ioc_t *)0x400d4000) /**< IOC instance */
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @brief Initialize a GPIO port.
|
||||
* @details Initializes the port to a default state, disables interrupts and
|
||||
* clears any pending interrupts.
|
||||
* @param[in] gpio_port A pointer to the port's instance, e.g. "GPIO_A".
|
||||
*/
|
||||
void cc2538_gpio_port_init(cc2538_gpio_t* gpio_port);
|
||||
|
||||
/**
|
||||
* @brief Initialize all four GPIO ports.
|
||||
*/
|
||||
void cc2538_gpio_init(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* end extern "C" */
|
||||
#endif
|
||||
|
@ -117,6 +117,9 @@ typedef struct {
|
||||
cc2538_reg_t SYNC; /**< GPTIMER Synchronize */
|
||||
cc2538_reg_t RESERVED2; /**< Reserved word */
|
||||
|
||||
/**
|
||||
* @brief Interrupt mask control
|
||||
*/
|
||||
union {
|
||||
cc2538_reg_t IMR; /**< GPTIMER Interrupt Mask */
|
||||
struct {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Freie Universität Berlin
|
||||
* Copyright (C) 2015-2016 Freie Universität Berlin
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
@ -40,14 +40,15 @@ extern "C" {
|
||||
*/
|
||||
#define HAVE_GPIO_T
|
||||
typedef uint32_t gpio_t;
|
||||
|
||||
#define GPIO_PIN(port_num, bit_num) GPIO_PXX_TO_NUM(port_num, bit_num)
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @brief Definition of a fitting UNDEF value
|
||||
* @brief Define a custom GPIO_PIN macro
|
||||
*
|
||||
* For the CC2538, we use OR the gpio ports base register address with the
|
||||
* actual pin number.
|
||||
*/
|
||||
#define GPIO_UNDEF (0xffffffff)
|
||||
#define GPIO_PIN(port, pin) (gpio_t)(((uint32_t)GPIO_A + (port << 12)) | pin)
|
||||
|
||||
/**
|
||||
* @brief declare needed generic SPI functions
|
||||
@ -57,6 +58,24 @@ typedef uint32_t gpio_t;
|
||||
#define PERIPH_SPI_NEEDS_TRANSFER_REGS
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @brief Override the default GPIO mode settings
|
||||
* @{
|
||||
*/
|
||||
#define HAVE_GPIO_MODE_T
|
||||
typedef enum {
|
||||
GPIO_IN = ((uint8_t)0x00), /**< input, no pull */
|
||||
GPIO_IN_PD = ((uint8_t)IOC_OVERRIDE_PDE), /**< input, pull-down */
|
||||
GPIO_IN_PU = ((uint8_t)IOC_OVERRIDE_PUE), /**< input, pull-up */
|
||||
GPIO_OUT = ((uint8_t)IOC_OVERRIDE_OE), /**< output */
|
||||
GPIO_OD = (0xff), /**< not supported */
|
||||
GPIO_OD_PU = (0xff) /**< not supported */
|
||||
} gpio_mode_t;
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @brief I2C configuration options
|
||||
*/
|
||||
typedef struct {
|
||||
gpio_t scl_pin; /**< pin used for SCL */
|
||||
gpio_t sda_pin; /**< pin used for SDA */
|
||||
@ -64,8 +83,8 @@ typedef struct {
|
||||
|
||||
/**
|
||||
* @brief SPI configuration data structure
|
||||
* @{
|
||||
*/
|
||||
#define HAVE_PERIPH_SPI_CONF_T
|
||||
typedef struct {
|
||||
cc2538_ssi_t *dev; /**< SSI device */
|
||||
gpio_t mosi_pin; /**< pin used for MOSI */
|
||||
@ -73,6 +92,7 @@ typedef struct {
|
||||
gpio_t sck_pin; /**< pin used for SCK */
|
||||
gpio_t cs_pin; /**< pin used for CS */
|
||||
} periph_spi_conf_t;
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @brief Timer configuration data
|
||||
|
@ -1,19 +1,21 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Loci Controls Inc.
|
||||
* 2016 Freie Universität Berlin
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser General
|
||||
* Public License v2.1. See the file LICENSE in the top level directory for more
|
||||
* details.
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
* directory for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @ingroup driver_periph
|
||||
* @ingroup cpu_cc2538
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief Low-level GPIO driver implementation
|
||||
*
|
||||
* @author Ian Martin <ian@locicontrols.com>
|
||||
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@ -22,584 +24,187 @@
|
||||
|
||||
#include "cpu.h"
|
||||
#include "periph/gpio.h"
|
||||
#include "periph_conf.h"
|
||||
|
||||
/**
|
||||
* @brief Generate a bit mask in which only the specified bit is high.
|
||||
*
|
||||
* @param[in] n Number of the bit to set high in the mask.
|
||||
*
|
||||
* @return A bit mask in which bit n is high.
|
||||
*/
|
||||
#define BIT(n) ( 1 << (n) )
|
||||
#define GPIO_MASK (0xfffff000)
|
||||
#define PORTNUM_MASK (0x00007000)
|
||||
#define PORTNUM_SHIFT (12U)
|
||||
#define PIN_MASK (0x00000007)
|
||||
#define MODE_NOTSUP (0xff)
|
||||
|
||||
/**
|
||||
* @brief Checks a bit in enable_lut to determine if a GPIO is enabled
|
||||
*
|
||||
* @param[in] dev RIOT GPIO device number
|
||||
*
|
||||
* @return 0 or 1 indicating if the specified GPIO is enabled
|
||||
*/
|
||||
#define gpio_enabled(dev) ( (enable_lut >> (dev)) & 1 )
|
||||
|
||||
static gpio_isr_ctx_t gpio_config[GPIO_NUMOF];
|
||||
|
||||
const uint32_t enable_lut = 0
|
||||
#if GPIO_0_EN
|
||||
| BIT(0)
|
||||
#endif
|
||||
#if GPIO_1_EN
|
||||
| BIT(1)
|
||||
#endif
|
||||
#if GPIO_2_EN
|
||||
| BIT(2)
|
||||
#endif
|
||||
#if GPIO_3_EN
|
||||
| BIT(3)
|
||||
#endif
|
||||
#if GPIO_4_EN
|
||||
| BIT(4)
|
||||
#endif
|
||||
#if GPIO_5_EN
|
||||
| BIT(5)
|
||||
#endif
|
||||
#if GPIO_6_EN
|
||||
| BIT(6)
|
||||
#endif
|
||||
#if GPIO_7_EN
|
||||
| BIT(7)
|
||||
#endif
|
||||
#if GPIO_8_EN
|
||||
| BIT(8)
|
||||
#endif
|
||||
#if GPIO_9_EN
|
||||
| BIT(9)
|
||||
#endif
|
||||
#if GPIO_10_EN
|
||||
| BIT(10)
|
||||
#endif
|
||||
#if GPIO_11_EN
|
||||
| BIT(11)
|
||||
#endif
|
||||
#if GPIO_12_EN
|
||||
| BIT(12)
|
||||
#endif
|
||||
#if GPIO_13_EN
|
||||
| BIT(13)
|
||||
#endif
|
||||
#if GPIO_14_EN
|
||||
| BIT(14)
|
||||
#endif
|
||||
#if GPIO_15_EN
|
||||
| BIT(15)
|
||||
#endif
|
||||
#if GPIO_16_EN
|
||||
| BIT(16)
|
||||
#endif
|
||||
#if GPIO_17_EN
|
||||
| BIT(17)
|
||||
#endif
|
||||
#if GPIO_18_EN
|
||||
| BIT(18)
|
||||
#endif
|
||||
#if GPIO_19_EN
|
||||
| BIT(19)
|
||||
#endif
|
||||
#if GPIO_20_EN
|
||||
| BIT(20)
|
||||
#endif
|
||||
#if GPIO_21_EN
|
||||
| BIT(21)
|
||||
#endif
|
||||
#if GPIO_22_EN
|
||||
| BIT(22)
|
||||
#endif
|
||||
#if GPIO_23_EN
|
||||
| BIT(23)
|
||||
#endif
|
||||
#if GPIO_24_EN
|
||||
| BIT(24)
|
||||
#endif
|
||||
#if GPIO_25_EN
|
||||
| BIT(25)
|
||||
#endif
|
||||
#if GPIO_26_EN
|
||||
| BIT(26)
|
||||
#endif
|
||||
#if GPIO_27_EN
|
||||
| BIT(27)
|
||||
#endif
|
||||
#if GPIO_28_EN
|
||||
| BIT(28)
|
||||
#endif
|
||||
#if GPIO_29_EN
|
||||
| BIT(29)
|
||||
#endif
|
||||
#if GPIO_30_EN
|
||||
| BIT(30)
|
||||
#endif
|
||||
#if GPIO_31_EN
|
||||
| BIT(31)
|
||||
#endif
|
||||
;
|
||||
|
||||
const unsigned int pin_lut[] = {
|
||||
#if GPIO_0_EN
|
||||
[ 0] = GPIO_0_PIN,
|
||||
#endif
|
||||
#if GPIO_1_EN
|
||||
[ 1] = GPIO_1_PIN,
|
||||
#endif
|
||||
#if GPIO_2_EN
|
||||
[ 2] = GPIO_2_PIN,
|
||||
#endif
|
||||
#if GPIO_3_EN
|
||||
[ 3] = GPIO_3_PIN,
|
||||
#endif
|
||||
#if GPIO_4_EN
|
||||
[ 4] = GPIO_4_PIN,
|
||||
#endif
|
||||
#if GPIO_5_EN
|
||||
[ 5] = GPIO_5_PIN,
|
||||
#endif
|
||||
#if GPIO_6_EN
|
||||
[ 6] = GPIO_6_PIN,
|
||||
#endif
|
||||
#if GPIO_7_EN
|
||||
[ 7] = GPIO_7_PIN,
|
||||
#endif
|
||||
#if GPIO_8_EN
|
||||
[ 8] = GPIO_8_PIN,
|
||||
#endif
|
||||
#if GPIO_9_EN
|
||||
[ 9] = GPIO_9_PIN,
|
||||
#endif
|
||||
#if GPIO_10_EN
|
||||
[10] = GPIO_10_PIN,
|
||||
#endif
|
||||
#if GPIO_11_EN
|
||||
[11] = GPIO_11_PIN,
|
||||
#endif
|
||||
#if GPIO_12_EN
|
||||
[12] = GPIO_12_PIN,
|
||||
#endif
|
||||
#if GPIO_13_EN
|
||||
[13] = GPIO_13_PIN,
|
||||
#endif
|
||||
#if GPIO_14_EN
|
||||
[14] = GPIO_14_PIN,
|
||||
#endif
|
||||
#if GPIO_15_EN
|
||||
[15] = GPIO_15_PIN,
|
||||
#endif
|
||||
#if GPIO_16_EN
|
||||
[16] = GPIO_16_PIN,
|
||||
#endif
|
||||
#if GPIO_17_EN
|
||||
[17] = GPIO_17_PIN,
|
||||
#endif
|
||||
#if GPIO_18_EN
|
||||
[18] = GPIO_18_PIN,
|
||||
#endif
|
||||
#if GPIO_19_EN
|
||||
[19] = GPIO_19_PIN,
|
||||
#endif
|
||||
#if GPIO_20_EN
|
||||
[20] = GPIO_20_PIN,
|
||||
#endif
|
||||
#if GPIO_21_EN
|
||||
[21] = GPIO_21_PIN,
|
||||
#endif
|
||||
#if GPIO_22_EN
|
||||
[22] = GPIO_22_PIN,
|
||||
#endif
|
||||
#if GPIO_23_EN
|
||||
[23] = GPIO_23_PIN,
|
||||
#endif
|
||||
#if GPIO_24_EN
|
||||
[24] = GPIO_24_PIN,
|
||||
#endif
|
||||
#if GPIO_25_EN
|
||||
[25] = GPIO_25_PIN,
|
||||
#endif
|
||||
#if GPIO_26_EN
|
||||
[26] = GPIO_26_PIN,
|
||||
#endif
|
||||
#if GPIO_27_EN
|
||||
[27] = GPIO_27_PIN,
|
||||
#endif
|
||||
#if GPIO_28_EN
|
||||
[28] = GPIO_28_PIN,
|
||||
#endif
|
||||
#if GPIO_29_EN
|
||||
[29] = GPIO_29_PIN,
|
||||
#endif
|
||||
#if GPIO_30_EN
|
||||
[30] = GPIO_30_PIN,
|
||||
#endif
|
||||
#if GPIO_31_EN
|
||||
[31] = GPIO_31_PIN,
|
||||
#endif
|
||||
};
|
||||
|
||||
static const uint8_t reverse_pin_lut[] = {
|
||||
#if GPIO_0_EN
|
||||
[GPIO_0_PIN] = 0,
|
||||
#endif
|
||||
#if GPIO_1_EN
|
||||
[GPIO_1_PIN] = 1,
|
||||
#endif
|
||||
#if GPIO_2_EN
|
||||
[GPIO_2_PIN] = 2,
|
||||
#endif
|
||||
#if GPIO_3_EN
|
||||
[GPIO_3_PIN] = 3,
|
||||
#endif
|
||||
#if GPIO_4_EN
|
||||
[GPIO_4_PIN] = 4,
|
||||
#endif
|
||||
#if GPIO_5_EN
|
||||
[GPIO_5_PIN] = 5,
|
||||
#endif
|
||||
#if GPIO_6_EN
|
||||
[GPIO_6_PIN] = 6,
|
||||
#endif
|
||||
#if GPIO_7_EN
|
||||
[GPIO_7_PIN] = 7,
|
||||
#endif
|
||||
#if GPIO_8_EN
|
||||
[GPIO_8_PIN] = 8,
|
||||
#endif
|
||||
#if GPIO_9_EN
|
||||
[GPIO_9_PIN] = 9,
|
||||
#endif
|
||||
#if GPIO_10_EN
|
||||
[GPIO_10_PIN] = 10,
|
||||
#endif
|
||||
#if GPIO_11_EN
|
||||
[GPIO_11_PIN] = 11,
|
||||
#endif
|
||||
#if GPIO_12_EN
|
||||
[GPIO_12_PIN] = 12,
|
||||
#endif
|
||||
#if GPIO_13_EN
|
||||
[GPIO_13_PIN] = 13,
|
||||
#endif
|
||||
#if GPIO_14_EN
|
||||
[GPIO_14_PIN] = 14,
|
||||
#endif
|
||||
#if GPIO_15_EN
|
||||
[GPIO_15_PIN] = 15,
|
||||
#endif
|
||||
#if GPIO_16_EN
|
||||
[GPIO_16_PIN] = 16,
|
||||
#endif
|
||||
#if GPIO_17_EN
|
||||
[GPIO_17_PIN] = 17,
|
||||
#endif
|
||||
#if GPIO_18_EN
|
||||
[GPIO_18_PIN] = 18,
|
||||
#endif
|
||||
#if GPIO_19_EN
|
||||
[GPIO_19_PIN] = 19,
|
||||
#endif
|
||||
#if GPIO_20_EN
|
||||
[GPIO_20_PIN] = 20,
|
||||
#endif
|
||||
#if GPIO_21_EN
|
||||
[GPIO_21_PIN] = 21,
|
||||
#endif
|
||||
#if GPIO_22_EN
|
||||
[GPIO_22_PIN] = 22,
|
||||
#endif
|
||||
#if GPIO_23_EN
|
||||
[GPIO_23_PIN] = 23,
|
||||
#endif
|
||||
#if GPIO_24_EN
|
||||
[GPIO_24_PIN] = 24,
|
||||
#endif
|
||||
#if GPIO_25_EN
|
||||
[GPIO_25_PIN] = 25,
|
||||
#endif
|
||||
#if GPIO_26_EN
|
||||
[GPIO_26_PIN] = 26,
|
||||
#endif
|
||||
#if GPIO_27_EN
|
||||
[GPIO_27_PIN] = 27,
|
||||
#endif
|
||||
#if GPIO_28_EN
|
||||
[GPIO_28_PIN] = 28,
|
||||
#endif
|
||||
#if GPIO_29_EN
|
||||
[GPIO_29_PIN] = 29,
|
||||
#endif
|
||||
#if GPIO_30_EN
|
||||
[GPIO_30_PIN] = 30,
|
||||
#endif
|
||||
#if GPIO_31_EN
|
||||
[GPIO_31_PIN] = 31,
|
||||
#endif
|
||||
};
|
||||
|
||||
int gpio_init(gpio_t dev, gpio_mode_t mode)
|
||||
static inline cc2538_gpio_t *gpio(gpio_t pin)
|
||||
{
|
||||
int pin;
|
||||
return (cc2538_gpio_t *)(pin & GPIO_MASK);
|
||||
}
|
||||
|
||||
if (!gpio_enabled(dev)) {
|
||||
static inline int port_num(gpio_t pin)
|
||||
{
|
||||
return (int)((pin & PORTNUM_MASK) >> PORTNUM_SHIFT) - 1;
|
||||
}
|
||||
|
||||
static inline int pin_num(gpio_t pin)
|
||||
{
|
||||
return (int)(pin & PIN_MASK);
|
||||
}
|
||||
|
||||
static inline uint32_t pin_mask(gpio_t pin)
|
||||
{
|
||||
return (1 << (pin & PIN_MASK));
|
||||
}
|
||||
|
||||
static inline int pp_num(gpio_t pin)
|
||||
{
|
||||
return (port_num(pin) * 8) + pin_num(pin);
|
||||
}
|
||||
|
||||
static gpio_isr_ctx_t isr_ctx[4][8];
|
||||
|
||||
int gpio_init(gpio_t pin, gpio_mode_t mode)
|
||||
{
|
||||
/* check if mode is valid */
|
||||
if (mode == MODE_NOTSUP) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
pin = pin_lut[dev];
|
||||
gpio_software_control(pin);
|
||||
|
||||
switch (mode) {
|
||||
case GPIO_IN:
|
||||
gpio_dir_input(pin);
|
||||
/* configure the pin's pull resistor state */
|
||||
IOC_PXX_OVER[pin] = (IOC_OVERRIDE_DIS);
|
||||
/* disable any alternate function and any eventual interrupts */
|
||||
gpio(pin)->IE &= ~pin_mask(pin);
|
||||
gpio(pin)->AFSEL &= ~pin_mask(pin);
|
||||
/* configure pull configuration */
|
||||
IOC->OVER[pp_num(pin)] = mode;
|
||||
|
||||
/* set pin direction */
|
||||
if (mode == IOC_OVERRIDE_OE) {
|
||||
gpio(pin)->DIR |= pin_mask(pin);
|
||||
}
|
||||
else {
|
||||
gpio(pin)->DIR &= ~pin_mask(pin);
|
||||
}
|
||||
/* clear pin */
|
||||
gpio(pin)->DATA &= ~pin_mask(pin);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
|
||||
gpio_cb_t cb, void *arg)
|
||||
{
|
||||
if (gpio_init(pin, mode) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* store the callback information for later: */
|
||||
isr_ctx[port_num(pin)][pin_num(pin)].cb = cb;
|
||||
isr_ctx[port_num(pin)][pin_num(pin)].arg = arg;
|
||||
|
||||
/* enable power-up interrupts for this GPIO port: */
|
||||
SYS_CTRL->IWE |= port_num(pin);
|
||||
|
||||
/* configure the active flank(s) */
|
||||
gpio(pin)->IS &= ~pin_mask(pin);
|
||||
switch(flank) {
|
||||
case GPIO_FALLING:
|
||||
gpio(pin)->IBE &= ~pin_mask(pin);
|
||||
gpio(pin)->IEV &= ~pin_mask(pin);
|
||||
gpio(pin)->P_EDGE_CTRL |= (1 << pp_num(pin));
|
||||
break;
|
||||
case GPIO_IN_PD:
|
||||
gpio_dir_input(pin);
|
||||
/* configure the pin's pull resistor state */
|
||||
IOC_PXX_OVER[pin] = (IOC_OVERRIDE_PDE);
|
||||
case GPIO_RISING:
|
||||
gpio(pin)->IBE &= ~pin_mask(pin);
|
||||
gpio(pin)->IEV |= pin_mask(pin);
|
||||
gpio(pin)->P_EDGE_CTRL &= (1 << pp_num(pin));
|
||||
break;
|
||||
case GPIO_IN_PU:
|
||||
gpio_dir_input(pin);
|
||||
/* configure the pin's pull resistor state */
|
||||
IOC_PXX_OVER[pin] = (IOC_OVERRIDE_PUE);
|
||||
break;
|
||||
case GPIO_OUT:
|
||||
gpio_dir_output(pin);
|
||||
/* configure the pin's pull resistor state */
|
||||
IOC_PXX_OVER[pin] = (IOC_OVERRIDE_OE);
|
||||
case GPIO_BOTH:
|
||||
gpio(pin)->IBE |= pin_mask(pin);
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_init_int(gpio_t dev, gpio_mode_t mode, gpio_flank_t flank,
|
||||
gpio_cb_t cb, void *arg)
|
||||
{
|
||||
int res, pin, irq_num;
|
||||
uint32_t mask;
|
||||
cc2538_gpio_t* instance;
|
||||
|
||||
/* Note: gpio_init() also checks if the gpio is enabled. */
|
||||
res = gpio_init(dev, mode);
|
||||
if (res < 0) {
|
||||
return res;
|
||||
}
|
||||
|
||||
/* Store the callback information for later: */
|
||||
gpio_config[dev].cb = cb;
|
||||
gpio_config[dev].arg = arg;
|
||||
|
||||
pin = pin_lut[dev];
|
||||
mask = GPIO_PIN_MASK(GPIO_BIT_NUM(pin));
|
||||
|
||||
instance = GPIO_NUM_TO_DEV(pin);
|
||||
|
||||
/* Enable power-up interrupts for this GPIO port: */
|
||||
SYS_CTRL_IWE |= BIT(GPIO_NUM_TO_PORT_NUM(pin));
|
||||
|
||||
switch(flank) {
|
||||
case GPIO_FALLING:
|
||||
instance->IBE &= ~mask; /**< Not both edges */
|
||||
instance->IEV &= ~mask; /**< Falling edge */
|
||||
instance->P_EDGE_CTRL |= BIT(pin); /**< Falling edge power-up interrupt */
|
||||
break;
|
||||
|
||||
case GPIO_RISING:
|
||||
instance->IBE &= ~mask; /**< Not both edges */
|
||||
instance->IEV |= mask; /**< Rising edge */
|
||||
instance->P_EDGE_CTRL &= ~BIT(pin); /**< Rising edge power-up interrupt */
|
||||
break;
|
||||
|
||||
case GPIO_BOTH:
|
||||
instance->IBE = mask; /**< Both edges */
|
||||
break;
|
||||
}
|
||||
|
||||
instance->IS &= ~mask; /**< Edge triggered (as opposed to level-triggered) */
|
||||
instance->IC |= mask; /**< Clear any preexisting interrupt state */
|
||||
instance->PI_IEN |= BIT(pin); /**< Enable power-up interrupts for this pin */
|
||||
|
||||
/* Set interrupt priority for the whole GPIO port: */
|
||||
irq_num = GPIO_PORT_A_IRQn + GPIO_NUM_TO_PORT_NUM(pin);
|
||||
NVIC_SetPriority(irq_num, GPIO_IRQ_PRIO);
|
||||
|
||||
/* Enable interrupts for the whole GPIO port: */
|
||||
NVIC_EnableIRQ(irq_num);
|
||||
|
||||
/* Enable interrupts for the specific pin: */
|
||||
instance->IE |= mask;
|
||||
/* reset interrupt status */
|
||||
gpio(pin)->IC = pin_mask(pin);
|
||||
gpio(pin)->PI_IEN |= (1 << pp_num(pin));
|
||||
/* enable global interrupt for the selected GPIO port */
|
||||
NVIC_EnableIRQ(GPIO_PORT_A_IRQn + port_num(pin));
|
||||
/* unmask pin interrupt */
|
||||
gpio(pin)->IE |= pin_mask(pin);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void gpio_irq_enable(gpio_t dev)
|
||||
void gpio_irq_enable(gpio_t pin)
|
||||
{
|
||||
if (gpio_enabled(dev)) {
|
||||
int pin = pin_lut[dev];
|
||||
GPIO_NUM_TO_DEV(pin)->IE |= GPIO_PIN_MASK(GPIO_BIT_NUM(pin));
|
||||
}
|
||||
gpio(pin)->IE |= pin_mask(pin);
|
||||
}
|
||||
|
||||
void gpio_irq_disable(gpio_t dev)
|
||||
void gpio_irq_disable(gpio_t pin)
|
||||
{
|
||||
if (gpio_enabled(dev)) {
|
||||
int pin = pin_lut[dev];
|
||||
GPIO_NUM_TO_DEV(pin)->IE &= ~GPIO_PIN_MASK(GPIO_BIT_NUM(pin));
|
||||
}
|
||||
gpio(pin)->IE &= ~pin_mask(pin);
|
||||
}
|
||||
|
||||
int gpio_read(gpio_t dev)
|
||||
int gpio_read(gpio_t pin)
|
||||
{
|
||||
int pin;
|
||||
|
||||
if (!gpio_enabled(dev)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
pin = pin_lut[dev];
|
||||
return (GPIO_NUM_TO_DEV(pin)->DATA >> GPIO_BIT_NUM(pin)) & 1;
|
||||
return (int)(gpio(pin)->DATA & pin_mask(pin));
|
||||
}
|
||||
|
||||
void gpio_set(gpio_t dev)
|
||||
void gpio_set(gpio_t pin)
|
||||
{
|
||||
int pin;
|
||||
|
||||
if (!gpio_enabled(dev)) {
|
||||
return;
|
||||
}
|
||||
|
||||
pin = pin_lut[dev];
|
||||
GPIO_NUM_TO_DEV(pin)->DATA |= GPIO_PIN_MASK(GPIO_BIT_NUM(pin));
|
||||
gpio(pin)->DATA |= pin_mask(pin);
|
||||
}
|
||||
|
||||
void gpio_clear(gpio_t dev)
|
||||
void gpio_clear(gpio_t pin)
|
||||
{
|
||||
int pin;
|
||||
|
||||
if (!gpio_enabled(dev)) {
|
||||
return;
|
||||
}
|
||||
|
||||
pin = pin_lut[dev];
|
||||
GPIO_NUM_TO_DEV(pin)->DATA &= ~GPIO_PIN_MASK(GPIO_BIT_NUM(pin));
|
||||
gpio(pin)->DATA &= ~pin_mask(pin);
|
||||
}
|
||||
|
||||
void gpio_toggle(gpio_t dev)
|
||||
void gpio_toggle(gpio_t pin)
|
||||
{
|
||||
if (gpio_read(dev)) {
|
||||
gpio_clear(dev);
|
||||
}
|
||||
else {
|
||||
gpio_set(dev);
|
||||
}
|
||||
gpio(pin)->DATA ^= pin_mask(pin);
|
||||
}
|
||||
|
||||
void gpio_write(gpio_t dev, int value)
|
||||
void gpio_write(gpio_t pin, int value)
|
||||
{
|
||||
if (value) {
|
||||
gpio_set(dev);
|
||||
gpio(pin)->DATA |= pin_mask(pin);
|
||||
}
|
||||
else {
|
||||
gpio_clear(dev);
|
||||
gpio(pin)->DATA &= ~pin_mask(pin);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void handle_isr(cc2538_gpio_t *gpio, int port_num)
|
||||
{
|
||||
uint32_t state = gpio->MIS;
|
||||
gpio->IC = 0x000000ff;
|
||||
gpio->IRQ_DETECT_ACK = 0x000000ff;
|
||||
|
||||
for (int i = 0; i < GPIO_BITS_PER_PORT; i++) {
|
||||
if (state & (1 << i)) {
|
||||
isr_ctx[port_num][i].cb(isr_ctx[port_num][i].arg);
|
||||
}
|
||||
}
|
||||
|
||||
cortexm_isr_end();
|
||||
}
|
||||
|
||||
/** @brief Interrupt service routine for Port A */
|
||||
void isr_gpioa(void)
|
||||
{
|
||||
int mis, bit;
|
||||
gpio_isr_ctx_t* state;
|
||||
|
||||
/* Latch and clear the interrupt status early on: */
|
||||
mis = GPIO_A->MIS;
|
||||
GPIO_A->IC = 0x000000ff;
|
||||
GPIO_A->IRQ_DETECT_ACK = 0x000000ff;
|
||||
|
||||
for (bit = 0; bit < GPIO_BITS_PER_PORT; bit++) {
|
||||
if (mis & 1) {
|
||||
state = gpio_config + reverse_pin_lut[GPIO_PXX_TO_NUM(PORT_A, bit)];
|
||||
state->cb(state->arg);
|
||||
}
|
||||
|
||||
mis >>= 1;
|
||||
}
|
||||
|
||||
cortexm_isr_end();
|
||||
handle_isr(GPIO_A, 0);
|
||||
}
|
||||
|
||||
/** @brief Interrupt service routine for Port B */
|
||||
void isr_gpiob(void)
|
||||
{
|
||||
int mis, bit;
|
||||
gpio_isr_ctx_t* state;
|
||||
|
||||
/* Latch and clear the interrupt status early on: */
|
||||
mis = GPIO_B->MIS;
|
||||
GPIO_B->IC = 0x000000ff;
|
||||
GPIO_B->IRQ_DETECT_ACK = 0x0000ff00;
|
||||
|
||||
for (bit = 0; bit < GPIO_BITS_PER_PORT; bit++) {
|
||||
if (mis & 1) {
|
||||
state = gpio_config + reverse_pin_lut[GPIO_PXX_TO_NUM(PORT_B, bit)];
|
||||
state->cb(state->arg);
|
||||
}
|
||||
|
||||
mis >>= 1;
|
||||
}
|
||||
|
||||
cortexm_isr_end();
|
||||
handle_isr(GPIO_B, 1);
|
||||
}
|
||||
|
||||
/** @brief Interrupt service routine for Port C */
|
||||
void isr_gpioc(void)
|
||||
{
|
||||
int mis, bit;
|
||||
gpio_isr_ctx_t* state;
|
||||
|
||||
/* Latch and clear the interrupt status early on: */
|
||||
mis = GPIO_C->MIS;
|
||||
GPIO_C->IC = 0x000000ff;
|
||||
GPIO_C->IRQ_DETECT_ACK = 0x00ff0000;
|
||||
|
||||
for (bit = 0; bit < GPIO_BITS_PER_PORT; bit++) {
|
||||
if (mis & 1) {
|
||||
state = gpio_config + reverse_pin_lut[GPIO_PXX_TO_NUM(PORT_C, bit)];
|
||||
state->cb(state->arg);
|
||||
}
|
||||
|
||||
mis >>= 1;
|
||||
}
|
||||
|
||||
cortexm_isr_end();
|
||||
handle_isr(GPIO_C, 2);
|
||||
}
|
||||
|
||||
/** @brief Interrupt service routine for Port D */
|
||||
void isr_gpiod(void)
|
||||
{
|
||||
int mis, bit;
|
||||
gpio_isr_ctx_t* state;
|
||||
|
||||
/* Latch and clear the interrupt status early on: */
|
||||
mis = GPIO_D->MIS;
|
||||
GPIO_D->IC = 0x000000ff;
|
||||
GPIO_D->IRQ_DETECT_ACK = 0xff000000;
|
||||
|
||||
for (bit = 0; bit < GPIO_BITS_PER_PORT; bit++) {
|
||||
if (mis & 1) {
|
||||
state = gpio_config + reverse_pin_lut[GPIO_PXX_TO_NUM(PORT_D, bit)];
|
||||
state->cb(state->arg);
|
||||
}
|
||||
|
||||
mis >>= 1;
|
||||
}
|
||||
|
||||
cortexm_isr_end();
|
||||
handle_isr(GPIO_D, 3);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user