From 7d59e70ab7ccbfea8213e0b3d889d775f7dbe4fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Mon, 17 Aug 2015 13:11:40 +0200 Subject: [PATCH] kinetis_common: Refactor GPIO implementation This is a rewrite of the Kinetis GPIO driver which follows the refactored API in [1]. Pins are specified using the GPIO_PIN(PORT_x, y) macro, e.g. GPIO_PIN(PORT_E, 25) for the PTE25 pin. The interrupt pin handling is now implemented as a linked list, this is more memory efficient, but with a minor variation in interrupt latency depending on in what order the pins were initialized at runtime. Because the linked list entries are taken from a shared pool, there is also the possibility of running out of available configuration slots, define the preprocessor macro GPIO_INT_POOL_SIZE in periph_conf.h if you need more than 16 pins configured for interrupts in the same application. [1]: https://github.com/RIOT-OS/RIOT/pull/3095 --- boards/frdm-k64f/include/board.h | 24 +- boards/frdm-k64f/include/periph_conf.h | 55 +- boards/mulle/include/board.h | 40 +- boards/mulle/include/periph_conf.h | 313 +--- boards/pba-d-01-kw2x/include/board.h | 22 +- boards/pba-d-01-kw2x/include/periph_conf.h | 211 +-- cpu/k60/include/cpu_conf.h | 30 +- cpu/k60/vector.c | 20 +- cpu/k64f/include/cpu_conf.h | 24 + cpu/kinetis_common/gpio.c | 1889 +++----------------- cpu/kinetis_common/include/periph_cpu.h | 63 +- cpu/kw2x/cpu.c | 29 +- cpu/kw2x/include/cpu_conf.h | 40 +- 13 files changed, 452 insertions(+), 2308 deletions(-) diff --git a/boards/frdm-k64f/include/board.h b/boards/frdm-k64f/include/board.h index 1acbfd4358d81..28ae56ae0bc00 100644 --- a/boards/frdm-k64f/include/board.h +++ b/boards/frdm-k64f/include/board.h @@ -48,9 +48,9 @@ extern "C" * @name LED pin definitions * @{ */ -#define LED_R_PORT_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTB_MASK)) /**< Clock Enable for PORTD*/ -#define LED_G_PORT_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTE_MASK)) /**< Clock Enable for PORTD*/ -#define LED_B_PORT_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTB_MASK)) /**< Clock Enable for PORTA*/ +#define LED_R_PORT_CLKEN() (PORTB_CLOCK_GATE = 1) /**< Clock Enable for PORTD*/ +#define LED_G_PORT_CLKEN() (PORTE_CLOCK_GATE = 1) /**< Clock Enable for PORTE*/ +#define LED_B_PORT_CLKEN() (PORTB_CLOCK_GATE = 1) /**< Clock Enable for PORTB*/ #define LED_R_PORT PORTB /**< PORT for Red LED*/ #define LED_R_GPIO GPIOB /**< GPIO-Device for Red LED*/ #define LED_G_PORT PORTE /**< PORT for Green LED*/ @@ -66,15 +66,15 @@ extern "C" * @name Macros for controlling the on-board LEDs. * @{ */ -#define LED_B_ON (LED_B_GPIO->PCOR |= (1 << LED_B_PIN)) -#define LED_B_OFF (LED_B_GPIO->PSOR |= (1 << LED_B_PIN)) -#define LED_B_TOGGLE (LED_B_GPIO->PTOR |= (1 << LED_B_PIN)) -#define LED_G_ON (LED_G_GPIO->PCOR |= (1 << LED_G_PIN)) -#define LED_G_OFF (LED_G_GPIO->PSOR |= (1 << LED_G_PIN)) -#define LED_G_TOGGLE (LED_G_GPIO->PTOR |= (1 << LED_G_PIN)) -#define LED_R_ON (LED_R_GPIO->PCOR |= (1 << LED_R_PIN)) -#define LED_R_OFF (LED_R_GPIO->PSOR |= (1 << LED_R_PIN)) -#define LED_R_TOGGLE (LED_R_GPIO->PTOR |= (1 << LED_R_PIN)) +#define LED_B_ON (LED_B_GPIO->PCOR = (1 << LED_B_PIN)) +#define LED_B_OFF (LED_B_GPIO->PSOR = (1 << LED_B_PIN)) +#define LED_B_TOGGLE (LED_B_GPIO->PTOR = (1 << LED_B_PIN)) +#define LED_G_ON (LED_G_GPIO->PCOR = (1 << LED_G_PIN)) +#define LED_G_OFF (LED_G_GPIO->PSOR = (1 << LED_G_PIN)) +#define LED_G_TOGGLE (LED_G_GPIO->PTOR = (1 << LED_G_PIN)) +#define LED_R_ON (LED_R_GPIO->PCOR = (1 << LED_R_PIN)) +#define LED_R_OFF (LED_R_GPIO->PSOR = (1 << LED_R_PIN)) +#define LED_R_TOGGLE (LED_R_GPIO->PTOR = (1 << LED_R_PIN)) /* for compatability to other boards */ #define LED_GREEN_ON LED_G_ON diff --git a/boards/frdm-k64f/include/periph_conf.h b/boards/frdm-k64f/include/periph_conf.h index d57839f96c31a..6343feb661344 100644 --- a/boards/frdm-k64f/include/periph_conf.h +++ b/boards/frdm-k64f/include/periph_conf.h @@ -258,60 +258,7 @@ extern "C" * @name GPIO configuration * @{ */ -#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_IRQ_PRIO 1 -#define ISR_PORT_A isr_porta -#define ISR_PORT_B isr_portb -#define ISR_PORT_C isr_portc -#define ISR_PORT_D isr_portd - -/* GPIO channel 0 config */ -#define GPIO_0_DEV GPIOB /* LED_R */ -#define GPIO_0_PORT PORTB -#define GPIO_0_PORT_BASE PORTB_BASE -#define GPIO_0_PIN 22 -#define GPIO_0_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTB_MASK)) -#define GPIO_0_IRQ PORTB_IRQn -/* GPIO channel 1 config */ -#define GPIO_1_DEV GPIOE /* LED_G */ -#define GPIO_1_PORT PORTE -#define GPIO_1_PORT_BASE PORTE_BASE -#define GPIO_1_PIN 26 -#define GPIO_1_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTE_MASK)) -#define GPIO_1_IRQ PORTE_IRQn -/* GPIO channel 2 config */ -#define GPIO_2_DEV GPIOB /* LED_B */ -#define GPIO_2_PORT PORTB -#define GPIO_2_PORT_BASE PORTB_BASE -#define GPIO_2_PIN 21 -#define GPIO_2_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTB_MASK)) -#define GPIO_2_IRQ PORTB_IRQn -/* GPIO channel 3 config */ -#define GPIO_3_DEV GPIOC /* SW2 */ -#define GPIO_3_PORT PORTC -#define GPIO_3_PORT_BASE PORTC_BASE -#define GPIO_3_PIN 6 -#define GPIO_3_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTC_MASK)) -#define GPIO_3_IRQ PORTC_IRQn -/* GPIO channel 4 config */ -#define GPIO_4_DEV GPIOB /* A0 (Arduino Headers) */ -#define GPIO_4_PORT PORTB -#define GPIO_4_PORT_BASE PORTB_BASE -#define GPIO_4_PIN 2 -#define GPIO_4_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTB_MASK)) -#define GPIO_4_IRQ PORTB_IRQn -/* GPIO channel 5 config */ -#define GPIO_5_DEV GPIOB /* A1 (Arduino Headers) */ -#define GPIO_5_PORT PORTB -#define GPIO_5_PORT_BASE PORTB_BASE -#define GPIO_5_PIN 3 -#define GPIO_5_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTB_MASK)) -#define GPIO_5_IRQ PORTB_IRQn +#define GPIO_IRQ_PRIO CPU_DEFAULT_IRQ_PRIO /** @} */ /** diff --git a/boards/mulle/include/board.h b/boards/mulle/include/board.h index ed939493793d4..028c66b8bcafb 100644 --- a/boards/mulle/include/board.h +++ b/boards/mulle/include/board.h @@ -47,15 +47,15 @@ * @{ */ -#define LED_RED_GPIO GPIO_0 -#define LED_RED_PORT GPIO_0_DEV -#define LED_RED_PIN GPIO_0_PIN -#define LED_YELLOW_GPIO GPIO_1 -#define LED_YELLOW_PORT GPIO_1_DEV -#define LED_YELLOW_PIN GPIO_1_PIN -#define LED_GREEN_GPIO GPIO_2 -#define LED_GREEN_PORT GPIO_2_DEV -#define LED_GREEN_PIN GPIO_2_PIN +#define LED_RED_PORT PTC +#define LED_RED_PIN 15 +#define LED_RED_GPIO GPIO_PIN(PORT_C, LED_RED_PIN) +#define LED_YELLOW_PORT PTC +#define LED_YELLOW_PIN 14 +#define LED_YELLOW_GPIO GPIO_PIN(PORT_C, LED_YELLOW_PIN) +#define LED_GREEN_PORT PTC +#define LED_GREEN_PIN 13 +#define LED_GREEN_GPIO GPIO_PIN(PORT_C, LED_GREEN_PIN) /** @} */ @@ -92,11 +92,11 @@ void board_init(void); * @{ */ #define AT86RF231_SPI SPI_0 -#define AT86RF231_CS GPIO_14 -#define AT86RF231_INT GPIO_12 +#define AT86RF231_CS GPIO_PIN(PORT_D, 4) +#define AT86RF231_INT GPIO_PIN(PORT_B, 9) /** @todo work around missing RESET pin on Mulle v0.6x */ -#define AT86RF231_RESET GPIO_5 -#define AT86RF231_SLEEP GPIO_13 +#define AT86RF231_RESET GPIO_PIN(PORT_C, 12) +#define AT86RF231_SLEEP GPIO_PIN(PORT_E, 6) #define AT86RF231_SPI_CLK SPI_SPEED_5MHZ /** @} */ @@ -105,9 +105,9 @@ void board_init(void); * @{ */ -#define LIS3DH_INT1 GPIO_3 -#define LIS3DH_INT2 GPIO_4 -#define LIS3DH_CS GPIO_15 +#define LIS3DH_INT1 GPIO_PIN(PORT_C, 18) +#define LIS3DH_INT2 GPIO_PIN(PORT_C, 17) +#define LIS3DH_CS GPIO_PIN(PORT_D, 0) #define LIS3DH_SPI SPI_2 /** @} */ @@ -116,9 +116,9 @@ void board_init(void); * @name Mulle power control configuration */ /** @{ */ -#define MULLE_POWER_AVDD GPIO_6 /**< AVDD enable pin */ -#define MULLE_POWER_VPERIPH GPIO_7 /**< VPERIPH enable pin */ -#define MULLE_POWER_VSEC GPIO_5 /**< VSEC enable pin */ +#define MULLE_POWER_AVDD GPIO_PIN(PORT_B, 17) /**< AVDD enable pin */ +#define MULLE_POWER_VPERIPH GPIO_PIN(PORT_D, 7) /**< VPERIPH enable pin */ +#define MULLE_POWER_VSEC GPIO_PIN(PORT_B, 16) /**< VSEC enable pin */ /** @} */ /** @@ -127,7 +127,7 @@ void board_init(void); /** @{ */ /** FRAM SPI bus, SPI_2 in RIOT is mapped to hardware bus SPI0, see periph_conf.h */ #define MULLE_NVRAM_SPI_DEV SPI_2 -#define MULLE_NVRAM_SPI_CS GPIO_16 /**< FRAM CS pin */ +#define MULLE_NVRAM_SPI_CS GPIO_PIN(PORT_D, 6) /**< FRAM CS pin */ #define MULLE_NVRAM_CAPACITY 512 /**< FRAM size, in bytes */ #define MULLE_NVRAM_SPI_ADDRESS_COUNT 1 /**< FRAM addressing size, in bytes */ /** @} */ diff --git a/boards/mulle/include/periph_conf.h b/boards/mulle/include/periph_conf.h index b4572d5c9e3e0..11467b5abecee 100644 --- a/boards/mulle/include/periph_conf.h +++ b/boards/mulle/include/periph_conf.h @@ -63,7 +63,7 @@ extern "C" #define TIMER_NUMOF (1U) #define TIMER_0_EN 1 #define TIMER_1_EN 0 -#define TIMER_IRQ_PRIO 1 +#define TIMER_IRQ_PRIO CPU_DEFAULT_IRQ_PRIO #define TIMER_BASE PIT #define TIMER_MAX_VALUE (0xffffffff) #define TIMER_CLOCK SystemBusClock @@ -94,7 +94,7 @@ extern "C" #define UART_2_EN 0 #define UART_3_EN 0 #define UART_4_EN 0 -#define UART_IRQ_PRIO 1 +#define UART_IRQ_PRIO CPU_DEFAULT_IRQ_PRIO /* UART 0 device configuration */ #define UART_0_DEV UART1 @@ -301,7 +301,7 @@ extern "C" #define SPI_0_CLKDIS() (BITBAND_REG32(SIM->SCGC6, SIM_SCGC6_SPI0_SHIFT) = 0) #define SPI_0_IRQ MULLE_PASTE_PARTS(SPI, SPI_0_INDEX, _IRQn) #define SPI_0_IRQ_HANDLER MULLE_PASTE_PARTS(isr_spi, SPI_0_INDEX, ) -#define SPI_0_IRQ_PRIO 1 +#define SPI_0_IRQ_PRIO CPU_DEFAULT_IRQ_PRIO #define SPI_0_FREQ SystemBusClock /* SPI 0 pin configuration */ #define SPI_0_SCK_PORT PORTD @@ -335,7 +335,7 @@ extern "C" #define SPI_1_CLKDIS() (BITBAND_REG32(SIM->SCGC6, SIM_SCGC6_SPI1_SHIFT) = 0) #define SPI_1_IRQ MULLE_PASTE_PARTS(SPI, SPI_1_INDEX, _IRQn) #define SPI_1_IRQ_HANDLER MULLE_PASTE_PARTS(isr_spi, SPI_1_INDEX, ) -#define SPI_1_IRQ_PRIO 1 +#define SPI_1_IRQ_PRIO CPU_DEFAULT_IRQ_PRIO #define SPI_1_FREQ SystemBusClock /* SPI 0 pin configuration */ #define SPI_1_SCK_PORT PORTE @@ -369,7 +369,7 @@ extern "C" #define SPI_2_CLKDIS() (BITBAND_REG32(SIM->SCGC6, SIM_SCGC6_SPI0_SHIFT) = 0) #define SPI_2_IRQ MULLE_PASTE_PARTS(SPI, SPI_2_INDEX, _IRQn) /* #define SPI_2_IRQ_HANDLER MULLE_PASTE_PARTS(isr_spi, SPI_2_INDEX, ) */ -#define SPI_2_IRQ_PRIO 1 +#define SPI_2_IRQ_PRIO CPU_DEFAULT_IRQ_PRIO #define SPI_2_FREQ SystemBusClock /* SPI 2 pin configuration, must be the same as the other RIOT device using this * hardware module */ @@ -429,7 +429,7 @@ extern "C" #define I2C_CLK SystemBusClock #define I2C_0_EN 1 #define I2C_1_EN 0 -#define I2C_IRQ_PRIO 1 +#define I2C_IRQ_PRIO CPU_DEFAULT_IRQ_PRIO /** * @name I2C baud rate configuration * @{ @@ -468,304 +468,7 @@ extern "C" * @name GPIO configuration * @{ */ -#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_IRQ_PRIO 1 - -/* GPIO channel 0 config */ -/* Red LED */ -#define GPIO_0_PORT PORTC -#define GPIO_0_PORT_BASE PORTC_BASE -#define GPIO_0_DEV PTC -#define GPIO_0_PIN 15 -#define GPIO_0_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT) = 1) -#define GPIO_0_IRQ PORTC_IRQn -#define GPIO_0_ISR isr_portc_pin_detect - -/* GPIO channel 1 config */ -/* Yellow LED */ -#define GPIO_1_PORT PORTC -#define GPIO_1_PORT_BASE PORTC_BASE -#define GPIO_1_DEV PTC -#define GPIO_1_PIN 14 -#define GPIO_1_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT) = 1) -#define GPIO_1_IRQ PORTC_IRQn -#define GPIO_1_ISR isr_portc_pin_detect - -/* GPIO channel 2 config */ -/* Green LED */ -#define GPIO_2_PORT PORTC -#define GPIO_2_PORT_BASE PORTC_BASE -#define GPIO_2_DEV PTC -#define GPIO_2_PIN 13 -#define GPIO_2_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT) = 1) -#define GPIO_2_IRQ PORTC_IRQn -#define GPIO_2_ISR isr_portc_pin_detect - -/* GPIO channel 3 config */ -/* LIS3DH INT1 */ -#define GPIO_3_PORT PORTC -#define GPIO_3_PORT_BASE PORTC_BASE -#define GPIO_3_DEV PTC -#define GPIO_3_PIN 18 -#define GPIO_3_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT) = 1) -#define GPIO_3_IRQ PORTC_IRQn -#define GPIO_3_ISR isr_portc_pin_detect - -/* GPIO channel 4 config */ -/* LIS3DH INT2 */ -#define GPIO_4_PORT PORTC -#define GPIO_4_PORT_BASE PORTC_BASE -#define GPIO_4_DEV PTC -#define GPIO_4_PIN 17 -#define GPIO_4_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT) = 1) -#define GPIO_4_IRQ PORTC_IRQn -#define GPIO_4_ISR isr_portc_pin_detect - -/* GPIO channel 5 config */ -/* VSEC enable */ -#define GPIO_5_PORT PORTB -#define GPIO_5_PORT_BASE PORTB_BASE -#define GPIO_5_DEV PTB -#define GPIO_5_PIN 16 -#define GPIO_5_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTB_SHIFT) = 1) -#define GPIO_5_IRQ PORTB_IRQn -#define GPIO_5_ISR isr_portb_pin_detect - -/* GPIO channel 6 config */ -/* AVDD enable */ -#define GPIO_6_PORT PORTB -#define GPIO_6_PORT_BASE PORTB_BASE -#define GPIO_6_DEV PTB -#define GPIO_6_PIN 17 -#define GPIO_6_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTB_SHIFT) = 1) -#define GPIO_6_IRQ PORTB_IRQn -#define GPIO_6_ISR isr_portb_pin_detect - -/* GPIO channel 7 config */ -/* VPERIPH enable */ -#define GPIO_7_PORT PORTD -#define GPIO_7_PORT_BASE PORTD_BASE -#define GPIO_7_DEV PTD -#define GPIO_7_PIN 7 -#define GPIO_7_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTD_SHIFT) = 1) -#define GPIO_7_IRQ PORTD_IRQn -#define GPIO_7_ISR isr_portd_pin_detect - -/* GPIO channel 8 config */ -/* MC34673 enable */ -#define GPIO_8_PORT PORTB -#define GPIO_8_PORT_BASE PORTB_BASE -#define GPIO_8_DEV PTB -#define GPIO_8_PIN 23 -#define GPIO_8_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTB_SHIFT) = 1) -#define GPIO_8_IRQ PORTB_IRQn -#define GPIO_8_ISR isr_portb_pin_detect - -/* GPIO channel 9 config */ -/* MC34673 CHG */ -#define GPIO_9_PORT PORTB -#define GPIO_9_PORT_BASE PORTB_BASE -#define GPIO_9_DEV PTB -#define GPIO_9_PIN 22 -#define GPIO_9_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTB_SHIFT) = 1) -#define GPIO_9_IRQ PORTB_IRQn -#define GPIO_9_ISR isr_portb_pin_detect - -/* GPIO channel 10 config */ -/* MC34673 PPR */ -#define GPIO_10_PORT PORTB -#define GPIO_10_PORT_BASE PORTB_BASE -#define GPIO_10_DEV PTB -#define GPIO_10_PIN 21 -#define GPIO_10_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTB_SHIFT) = 1) -#define GPIO_10_IRQ PORTB_IRQn -#define GPIO_10_ISR isr_portb_pin_detect - -/* GPIO channel 11 config */ -/* MC34673 FAST */ -#define GPIO_11_PORT PORTB -#define GPIO_11_PORT_BASE PORTB_BASE -#define GPIO_11_DEV PTB -#define GPIO_11_PIN 20 -#define GPIO_11_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTB_SHIFT) = 1) -#define GPIO_11_IRQ PORTB_IRQn -#define GPIO_11_ISR isr_portb_pin_detect - -/* GPIO channel 12 config */ -/* AT86RF212 IRQ */ -#define GPIO_12_PORT PORTB -#define GPIO_12_PORT_BASE PORTB_BASE -#define GPIO_12_DEV PTB -#define GPIO_12_PIN 9 -#define GPIO_12_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTB_SHIFT) = 1) -#define GPIO_12_IRQ PORTB_IRQn -#define GPIO_12_ISR isr_portb_pin_detect - -/* GPIO channel 13 config */ -/* AT86RF212 SLP_TR */ -#define GPIO_13_PORT PORTE -#define GPIO_13_PORT_BASE PORTE_BASE -#define GPIO_13_DEV PTE -#define GPIO_13_PIN 6 -#define GPIO_13_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTE_SHIFT) = 1) -#define GPIO_13_IRQ PORTE_IRQn -#define GPIO_13_ISR isr_porte_pin_detect - -/* GPIO channel 14 config */ -/* AT86RF212 SS */ -#define GPIO_14_PORT PORTD -#define GPIO_14_PORT_BASE PORTD_BASE -#define GPIO_14_DEV PTD -#define GPIO_14_PIN 4 -#define GPIO_14_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTD_SHIFT) = 1) -#define GPIO_14_IRQ PORTD_IRQn -#define GPIO_14_ISR isr_portd_pin_detect - -/* GPIO channel 15 config */ -/* LIS3DH CS */ -#define GPIO_15_PORT PORTD -#define GPIO_15_PORT_BASE PORTD_BASE -#define GPIO_15_DEV PTD -#define GPIO_15_PIN 0 -#define GPIO_15_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTD_SHIFT) = 1) -#define GPIO_15_IRQ PORTD_IRQn -#define GPIO_15_ISR isr_portd_pin_detect - -/* GPIO channel 16 config */ -/* FM25L04B CS */ -#define GPIO_16_PORT PORTD -#define GPIO_16_PORT_BASE PORTD_BASE -#define GPIO_16_DEV PTD -#define GPIO_16_PIN 6 -#define GPIO_16_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTD_SHIFT) = 1) -#define GPIO_16_IRQ PORTD_IRQn -#define GPIO_16_ISR isr_portd_pin_detect - -/* GPIO channel 17 config */ -/* M25P16 CS */ -#define GPIO_17_PORT PORTD -#define GPIO_17_PORT_BASE PORTD_BASE -#define GPIO_17_DEV PTD -#define GPIO_17_PIN 5 -#define GPIO_17_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTD_SHIFT) = 1) -#define GPIO_17_IRQ PORTD_IRQn -#define GPIO_17_ISR isr_portd_pin_detect - -/* GPIO channel 18 config */ -/* General purpose expansion PTB18 */ -#define GPIO_18_PORT PORTB -#define GPIO_18_PORT_BASE PORTB_BASE -#define GPIO_18_DEV PTB -#define GPIO_18_PIN 18 -#define GPIO_18_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTB_SHIFT) = 1) -#define GPIO_18_IRQ PORTB_IRQn -#define GPIO_18_ISR isr_portb_pin_detect - -/* GPIO channel 19 config */ -/* General purpose expansion PTB19 */ -#define GPIO_19_PORT PORTB -#define GPIO_19_PORT_BASE PORTB_BASE -#define GPIO_19_DEV PTB -#define GPIO_19_PIN 19 -#define GPIO_19_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTB_SHIFT) = 1) -#define GPIO_19_IRQ PORTB_IRQn -#define GPIO_19_ISR isr_portb_pin_detect - -/* GPIO channel 20 config */ -/* General purpose expansion PTC0 */ -#define GPIO_20_PORT PORTC -#define GPIO_20_PORT_BASE PORTC_BASE -#define GPIO_20_DEV PTC -#define GPIO_20_PIN 0 -#define GPIO_20_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT) = 1) -#define GPIO_20_IRQ PORTC_IRQn -#define GPIO_20_ISR isr_portc_pin_detect - -/* GPIO channel 21 config */ -/* General purpose expansion PTC1 */ -#define GPIO_21_PORT PORTC -#define GPIO_21_PORT_BASE PORTC_BASE -#define GPIO_21_DEV PTC -#define GPIO_21_PIN 1 -#define GPIO_21_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT) = 1) -#define GPIO_21_IRQ PORTC_IRQn -#define GPIO_21_ISR isr_portc_pin_detect - -/* GPIO channel 22 config */ -/* General purpose expansion PTC2 */ -#define GPIO_22_PORT PORTC -#define GPIO_22_PORT_BASE PORTC_BASE -#define GPIO_22_DEV PTC -#define GPIO_22_PIN 2 -#define GPIO_22_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT) = 1) -#define GPIO_22_IRQ PORTC_IRQn -#define GPIO_22_ISR isr_portc_pin_detect - -/* GPIO channel 23 config */ -/* General purpose expansion PTC5 */ -#define GPIO_23_PORT PORTC -#define GPIO_23_PORT_BASE PORTC_BASE -#define GPIO_23_DEV PTC -#define GPIO_23_PIN 5 -#define GPIO_23_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT) = 1) -#define GPIO_23_IRQ PORTC_IRQn -#define GPIO_23_ISR isr_portc_pin_detect - -/* GPIO channel 24 config */ -/* General purpose expansion PTC6 */ -#define GPIO_24_PORT PORTC -#define GPIO_24_PORT_BASE PORTC_BASE -#define GPIO_24_DEV PTC -#define GPIO_24_PIN 6 -#define GPIO_24_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT) = 1) -#define GPIO_24_IRQ PORTC_IRQn -#define GPIO_24_ISR isr_portc_pin_detect - -/* GPIO channel 25 config */ -/* General purpose expansion PTC7 */ -#define GPIO_25_PORT PORTC -#define GPIO_25_PORT_BASE PORTC_BASE -#define GPIO_25_DEV PTC -#define GPIO_25_PIN 7 -#define GPIO_25_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT) = 1) -#define GPIO_25_IRQ PORTC_IRQn -#define GPIO_25_ISR isr_portc_pin_detect - -/* GPIO channel 26 config */ -/* General purpose expansion PTE4 */ -#define GPIO_26_PORT PORTE -#define GPIO_26_PORT_BASE PORTE_BASE -#define GPIO_26_DEV PTE -#define GPIO_26_PIN 4 -#define GPIO_26_CLKEN() (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTE_SHIFT) = 1) -#define GPIO_26_IRQ PORTE_IRQn -#define GPIO_26_ISR isr_porte_pin_detect +#define GPIO_IRQ_PRIO CPU_DEFAULT_IRQ_PRIO /** @} */ @@ -782,7 +485,7 @@ extern "C" * @{ */ #define RTT_NUMOF (1U) -#define RTT_IRQ_PRIO 1 +#define RTT_IRQ_PRIO CPU_DEFAULT_IRQ_PRIO #define RTT_IRQ RTC_IRQn #define RTT_ISR isr_rtc_alarm #define RTT_DEV RTC diff --git a/boards/pba-d-01-kw2x/include/board.h b/boards/pba-d-01-kw2x/include/board.h index e2af5f2cde854..5258efa2a265a 100644 --- a/boards/pba-d-01-kw2x/include/board.h +++ b/boards/pba-d-01-kw2x/include/board.h @@ -66,15 +66,15 @@ extern "C" * @name Macros for controlling the on-board LEDs. * @{ */ -#define LED_B_ON (LED_B_GPIO->PCOR |= (1 << LED_B_PIN)) -#define LED_B_OFF (LED_B_GPIO->PSOR |= (1 << LED_B_PIN)) -#define LED_B_TOGGLE (LED_B_GPIO->PTOR |= (1 << LED_B_PIN)) -#define LED_G_ON (LED_G_GPIO->PCOR |= (1 << LED_G_PIN)) -#define LED_G_OFF (LED_G_GPIO->PSOR |= (1 << LED_G_PIN)) -#define LED_G_TOGGLE (LED_G_GPIO->PTOR |= (1 << LED_G_PIN)) -#define LED_R_ON (LED_R_GPIO->PCOR |= (1 << LED_R_PIN)) -#define LED_R_OFF (LED_R_GPIO->PSOR |= (1 << LED_R_PIN)) -#define LED_R_TOGGLE (LED_R_GPIO->PTOR |= (1 << LED_R_PIN)) +#define LED_B_ON (LED_B_GPIO->PCOR = (1 << LED_B_PIN)) +#define LED_B_OFF (LED_B_GPIO->PSOR = (1 << LED_B_PIN)) +#define LED_B_TOGGLE (LED_B_GPIO->PTOR = (1 << LED_B_PIN)) +#define LED_G_ON (LED_G_GPIO->PCOR = (1 << LED_G_PIN)) +#define LED_G_OFF (LED_G_GPIO->PSOR = (1 << LED_G_PIN)) +#define LED_G_TOGGLE (LED_G_GPIO->PTOR = (1 << LED_G_PIN)) +#define LED_R_ON (LED_R_GPIO->PCOR = (1 << LED_R_PIN)) +#define LED_R_OFF (LED_R_GPIO->PSOR = (1 << LED_R_PIN)) +#define LED_R_TOGGLE (LED_R_GPIO->PTOR = (1 << LED_R_PIN)) /* for compatability to other boards */ #define LED_GREEN_ON LED_G_ON @@ -90,8 +90,8 @@ extern "C" @{ */ #define KW2XRF_SPI (SPI_1) -#define KW2XRF_CS (GPIO_24) -#define KW2XRF_INT (GPIO_23) +#define KW2XRF_CS (GPIO_PIN(KW2XDRF_PORT, KW2XDRF_PCS0_PIN)) +#define KW2XRF_INT (GPIO_PIN(KW2XDRF_PORT, KW2XDRF_IRQ_PIN)) #define KW2XRF_SPI_SPEED (SPI_SPEED_10MHZ) #define KW2XRF_SHARED_SPI 0 /** @}*/ diff --git a/boards/pba-d-01-kw2x/include/periph_conf.h b/boards/pba-d-01-kw2x/include/periph_conf.h index 221e915203d95..c52c253f59739 100644 --- a/boards/pba-d-01-kw2x/include/periph_conf.h +++ b/boards/pba-d-01-kw2x/include/periph_conf.h @@ -247,7 +247,7 @@ extern "C" #define SPI_1_FREQ (48e6) /* SPI 1 pin1configuration */ -#define SPI_1_PORT KW2XDRF_PORT +#define SPI_1_PORT KW2XDRF_PORT_DEV #define SPI_1_PORT_CLKEN() KW2XDRF_PORT_CLKEN(); #define SPI_1_AF KW2XDRF_PIN_AF @@ -303,214 +303,7 @@ extern "C" * @name GPIO configuration * @{ */ -#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 0 -#define GPIO_7_EN 0 -#define GPIO_8_EN 0 /* I2CSDA */ -#define GPIO_9_EN 0 /* I2CSCL */ -#define GPIO_10_EN 0 -#define GPIO_11_EN 0 -#define GPIO_12_EN 0 -#define GPIO_13_EN 0 /* USB VOUT 3V3 */ -#define GPIO_14_EN 0 /* USB VREGIN */ -#define GPIO_15_EN 0 -#define GPIO_16_EN 0 -#define GPIO_17_EN 0 -#define GPIO_18_EN 0 -#define GPIO_19_EN 0 /* SPI0_CS0 */ -#define GPIO_20_EN 0 /* SPI0_CLK */ -#define GPIO_21_EN 0 /* SPI0_MOSI */ -#define GPIO_22_EN 0 /* SPI0_MISO */ -#define GPIO_23_EN 1 /* KW2XRF INT */ -#define GPIO_24_EN 1 /* KW2XRF CS */ -#define GPIO_IRQ_PRIO 1 -#define ISR_PORT_A isr_porta -#define ISR_PORT_B isr_portb -#define ISR_PORT_C isr_portc -#define ISR_PORT_D isr_portd - -/* GPIO channel 0 config */ -#define GPIO_0_DEV GPIOD /* DIO9; extension connecotr D9; LED_G */ -#define GPIO_0_PORT PORTD -#define GPIO_0_PORT_BASE PORTD_BASE -#define GPIO_0_PIN 4 -#define GPIO_0_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTD_MASK)) -#define GPIO_0_IRQ PORTD_IRQn -/* GPIO channel 1 config */ -#define GPIO_1_DEV GPIOD /* DIO11; extension connecotr D5; LED_R */ -#define GPIO_1_PORT PORTD -#define GPIO_1_PORT_BASE PORTD_BASE -#define GPIO_1_PIN 6 -#define GPIO_1_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTD_MASK)) -#define GPIO_1_IRQ PORTD_IRQn -/* GPIO channel 2 config */ -#define GPIO_2_DEV GPIOA /* DIO27; extension connecotr D3; LED_B */ -#define GPIO_2_PORT PORTA -#define GPIO_2_PORT_BASE PORTA_BASE -#define GPIO_2_PIN 4 -#define GPIO_2_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTA_MASK)) -#define GPIO_2_IRQ PORTA_IRQn -/* GPIO channel 3 config */ -#define GPIO_3_DEV GPIOD /* DIO06; extension connecotr --; User_Button */ -#define GPIO_3_PORT PORTD -#define GPIO_3_PORT_BASE PORTD_BASE -#define GPIO_3_PIN 1 -#define GPIO_3_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTD_MASK)) -#define GPIO_3_IRQ PORTD_IRQn -/* GPIO channel 4 config */ -#define GPIO_4_DEV GPIOE /* DIO17; extension connecotr D2 */ -#define GPIO_4_PORT PORTE -#define GPIO_4_PORT_BASE PORTE_BASE -#define GPIO_4_PIN 4 -#define GPIO_4_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTE_MASK)) -#define GPIO_4_IRQ PORTE_IRQn -/* GPIO channel 5 config */ -#define GPIO_5_DEV GPIOA /* DIO29; extension connecotr D4 */ -#define GPIO_5_PORT PORTA -#define GPIO_5_PORT_BASE PORTA_BASE -#define GPIO_5_PIN 19 -#define GPIO_5_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTA_MASK)) -#define GPIO_5_IRQ PORTA_IRQn -/* GPIO channel 6 config */ -#define GPIO_6_DEV GPIOD /* DIO10; extension connecotr A3 */ -#define GPIO_6_PORT PORTD -#define GPIO_6_PORT_BASE PORTD_BASE -#define GPIO_6_PIN 5 -#define GPIO_6_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTD_MASK)) -#define GPIO_6_IRQ PORTD_IRQn -/* GPIO channel 7 config */ -#define GPIO_7_DEV GPIOD /* DIO12; extension connecotr A2 */ -#define GPIO_7_PORT PORTD -#define GPIO_7_PORT_BASE PORTD_BASE -#define GPIO_7_PIN 7 -#define GPIO_7_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTD_MASK)) -#define GPIO_7_IRQ PORTD_IRQn -/* GPIO channel 8 config */ -#define GPIO_8_DEV GPIOE /* DIO13; extension connecotr A4; I2CSDA */ -#define GPIO_8_PORT PORTE -#define GPIO_8_PORT_BASE PORTE_BASE -#define GPIO_8_PIN 0 -#define GPIO_8_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTE_MASK)) -#define GPIO_8_IRQ PORTE_IRQn -/* GPIO channel 9 config */ -#define GPIO_9_DEV GPIOE /* DIO14; extension connecotr A5; I2CSCL */ -#define GPIO_9_PORT PORTE -#define GPIO_9_PORT_BASE PORTE_BASE -#define GPIO_9_PIN 1 -#define GPIO_9_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTE_MASK)) -#define GPIO_9_IRQ PORTE_IRQn -/* GPIO channel 10 config */ -#define GPIO_10_DEV GPIOE /* DIO15; extension connecotr A0 */ -#define GPIO_10_PORT PORTE -#define GPIO_10_PORT_BASE PORTE_BASE -#define GPIO_10_PIN 2 -#define GPIO_10_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTE_MASK)) -#define GPIO_10_IRQ PORTE_IRQn -/* GPIO channel 11 config */ -#define GPIO_11_DEV GPIOE /* DIO16; extension connecotr A1 */ -#define GPIO_11_PORT PORTE -#define GPIO_11_PORT_BASE PORTE_BASE -#define GPIO_11_PIN 3 -#define GPIO_11_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTE_MASK)) -#define GPIO_11_IRQ PORTE_IRQn -/* GPIO channel 12 config */ -#define GPIO_12_DEV GPIOD /* DIO7; extension connecotr D0; UART2_RX */ -#define GPIO_12_PORT PORTD -#define GPIO_12_PORT_BASE PORTD_BASE -#define GPIO_12_PIN 2 -#define GPIO_12_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTD_MASK)) -#define GPIO_12_IRQ PORTD_IRQn -/* GPIO channel 13 config */ -#define GPIO_13_DEV GPIOE /* DIO20; extension connecotr D14, USB OUT3V3 */ -#define GPIO_13_PORT PORTE -#define GPIO_13_PORT_BASE PORTE_BASE -#define GPIO_13_PIN 18 -#define GPIO_13_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTE_MASK)) -#define GPIO_13_IRQ PORTE_IRQn -/* GPIO channel 14 config */ -#define GPIO_14_DEV GPIOE /* DIO21; extension connecotr D15, USB VREGIN */ -#define GPIO_14_PORT PORTE -#define GPIO_14_PORT_BASE PORTE_BASE -#define GPIO_14_PIN 19 -#define GPIO_14_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTE_MASK)) -#define GPIO_14_IRQ PORTE_IRQn -/* GPIO channel 15 config */ -#define GPIO_15_DEV GPIOA /* DIO24; extension connecotr D7 */ -#define GPIO_15_PORT PORTA -#define GPIO_15_PORT_BASE PORTA_BASE -#define GPIO_15_PIN 1 -#define GPIO_15_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTA_MASK)) -#define GPIO_15_IRQ PORTA_IRQn -/* GPIO channel 16 config */ -#define GPIO_16_DEV GPIOA /* DIO25; extension connecotr D6 */ -#define GPIO_16_PORT PORTA -#define GPIO_16_PORT_BASE PORTA_BASE -#define GPIO_16_PIN 2 -#define GPIO_16_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTA_MASK)) -#define GPIO_16_IRQ PORTA_IRQn -/* GPIO channel 17 config */ -#define GPIO_17_DEV GPIOA /* DIO28; extension connecotr D8 */ -#define GPIO_17_PORT PORTA -#define GPIO_17_PORT_BASE PORTA_BASE -#define GPIO_17_PIN 18 -#define GPIO_17_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTA_MASK)) -#define GPIO_17_IRQ PORTA_IRQn -/* GPIO channel 18 config */ -#define GPIO_18_DEV GPIOD /* DIO8; extension connecotr D1; UART2_TX */ -#define GPIO_18_PORT PORTD -#define GPIO_18_PORT_BASE PORTD_BASE -#define GPIO_18_PIN 3 -#define GPIO_18_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTD_MASK)) -#define GPIO_18_IRQ PORTD_IRQn -/* GPIO channel 19 config */ -#define GPIO_19_DEV GPIOC /* DIO2; extension connecotr D10; SPI0_CS0 */ -#define GPIO_19_PORT PORTC -#define GPIO_19_PORT_BASE PORTC_BASE -#define GPIO_19_PIN 4 -#define GPIO_19_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTC_MASK)) -#define GPIO_19_IRQ PORTC_IRQn -/* GPIO channel 20 config */ -#define GPIO_20_DEV GPIOC /* DIO3; extension connecotr D13; SPI0_CLK */ -#define GPIO_20_PORT PORTC -#define GPIO_20_PORT_BASE PORTC_BASE -#define GPIO_20_PIN 5 -#define GPIO_20_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTC_MASK)) -#define GPIO_20_IRQ PORTC_IRQn -/* GPIO channel 21 config */ -#define GPIO_21_DEV GPIOC /* DIO4; extension connecotr D11; SPI0_MOSI */ -#define GPIO_21_PORT PORTC -#define GPIO_21_PORT_BASE PORTC_BASE -#define GPIO_21_PIN 6 -#define GPIO_21_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTC_MASK)) -#define GPIO_21_IRQ PORTC_IRQn -/* GPIO channel 22 config */ -#define GPIO_22_DEV GPIOC /* DIO5; extension connecotr D12; SPI0_MISO */ -#define GPIO_22_PORT PORTC -#define GPIO_22_PORT_BASE PORTC_BASE -#define GPIO_22_PIN 7 -#define GPIO_22_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTC_MASK)) -#define GPIO_22_IRQ PORTC_IRQn -/* GPIO channel 23 config */ -#define GPIO_23_DEV KW2XDRF_GPIO -#define GPIO_23_PORT KW2XDRF_PORT -#define GPIO_23_PORT_BASE KW2XDRF_PORT_BASE -#define GPIO_23_PIN KW2XDRF_IRQ_PIN -#define GPIO_23_CLKEN() KW2XDRF_PORT_CLKEN() -#define GPIO_23_IRQ KW2XDRF_PORT_IRQn -#define GPIO_KW2XDRF GPIO_23 -/* GPIO channel 24 config */ -#define GPIO_24_DEV KW2XDRF_GPIO -#define GPIO_24_PORT KW2XDRF_PORT -#define GPIO_24_PORT_BASE KW2XDRF_PORT_BASE -#define GPIO_24_PIN KW2XDRF_PCS0_PIN -#define GPIO_24_CLKEN() KW2XDRF_PORT_CLKEN() -#define GPIO_24_IRQ KW2XDRF_PORT_IRQn -#define KW2XRF_CS_GPIO GPIO_24 +#define GPIO_IRQ_PRIO CPU_DEFAULT_IRQ_PRIO /** @} */ /** diff --git a/cpu/k60/include/cpu_conf.h b/cpu/k60/include/cpu_conf.h index 8de9af9cb5234..a0731e5c2c818 100644 --- a/cpu/k60/include/cpu_conf.h +++ b/cpu/k60/include/cpu_conf.h @@ -70,6 +70,14 @@ extern "C" #define CPU_FLASH_BASE (0x00000000) /** @} */ +/** + * @name Length and address for reading CPU_ID (named UID in Freescale documents) + * @{ + */ +#define CPUID_ID_LEN (16) +#define CPUID_ID_PTR ((void *)(&(SIM->UIDH))) +/** @} */ + /** * @name GPIO pin mux function numbers */ @@ -86,12 +94,13 @@ extern "C" #define PIN_INTERRUPT_EDGE 0b1011 /** @} */ -/** - * @name Length and address for reading CPU_ID (named UID in Freescale documents) - * @{ - */ -#define CPUID_ID_LEN (16) -#define CPUID_ID_PTR ((void *)(&(SIM->UIDH))) +/** @name PORT module clock gates */ +/** @{ */ +#define PORTA_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTA_SHIFT)) +#define PORTB_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTB_SHIFT)) +#define PORTC_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT)) +#define PORTD_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTD_SHIFT)) +#define PORTE_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTE_SHIFT)) /** @} */ /** @@ -245,15 +254,6 @@ typedef enum llwu_wakeup_pin { /** @} */ -/** @name K60 PORT ISR names - * @{ */ -#define ISR_PORT_A isr_porta_pin_detect -#define ISR_PORT_B isr_portb_pin_detect -#define ISR_PORT_C isr_portc_pin_detect -#define ISR_PORT_D isr_portd_pin_detect -#define ISR_PORT_E isr_porte_pin_detect -/** @} */ - /** * @name Bit band macros * @{ diff --git a/cpu/k60/vector.c b/cpu/k60/vector.c index 80f1732f190ef..630a57e48e349 100644 --- a/cpu/k60/vector.c +++ b/cpu/k60/vector.c @@ -139,11 +139,11 @@ WEAK_DEFAULT void isr_tsi(void); WEAK_DEFAULT void isr_mcg(void); WEAK_DEFAULT void isr_lptmr0(void); /* void dummy_handler(void); */ -WEAK_DEFAULT void isr_porta_pin_detect(void); -WEAK_DEFAULT void isr_portb_pin_detect(void); -WEAK_DEFAULT void isr_portc_pin_detect(void); -WEAK_DEFAULT void isr_portd_pin_detect(void); -WEAK_DEFAULT void isr_porte_pin_detect(void); +WEAK_DEFAULT void isr_porta(void); +WEAK_DEFAULT void isr_portb(void); +WEAK_DEFAULT void isr_portc(void); +WEAK_DEFAULT void isr_portd(void); +WEAK_DEFAULT void isr_porte(void); /* void dummy_handler(void); */ /* void dummy_handler(void); */ WEAK_DEFAULT void isr_software(void); @@ -261,11 +261,11 @@ const void *interrupt_vector[] = { (void*) isr_mcg, (void*) isr_lptmr0, (void*) dummy_handler, - (void*) isr_porta_pin_detect, - (void*) isr_portb_pin_detect, - (void*) isr_portc_pin_detect, - (void*) isr_portd_pin_detect, - (void*) isr_porte_pin_detect, + (void*) isr_porta, + (void*) isr_portb, + (void*) isr_portc, + (void*) isr_portd, + (void*) isr_porte, (void*) dummy_handler, (void*) dummy_handler, (void*) isr_software, /* Vector 110 */ diff --git a/cpu/k64f/include/cpu_conf.h b/cpu/k64f/include/cpu_conf.h index b1efad4d4c27a..49c11ed11643c 100644 --- a/cpu/k64f/include/cpu_conf.h +++ b/cpu/k64f/include/cpu_conf.h @@ -56,6 +56,30 @@ extern "C" */ #define CPUID_ID_PTR ((void *)(&(SIM_UIDH))) +/** + * @name GPIO pin mux function numbers + */ +/** @{ */ +#define PIN_MUX_FUNCTION_ANALOG 0 +#define PIN_MUX_FUNCTION_GPIO 1 +/** @} */ +/** + * @name GPIO interrupt flank settings + */ +/** @{ */ +#define PIN_INTERRUPT_RISING 0b1001 +#define PIN_INTERRUPT_FALLING 0b1010 +#define PIN_INTERRUPT_EDGE 0b1011 +/** @} */ + +/** @name PORT module clock gates */ +/** @{ */ +#define PORTA_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTA_SHIFT)) +#define PORTB_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTB_SHIFT)) +#define PORTC_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT)) +#define PORTD_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTD_SHIFT)) +#define PORTE_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTE_SHIFT)) +/** @} */ /** * @brief MCU specific Low Power Timer settings. diff --git a/cpu/kinetis_common/gpio.c b/cpu/kinetis_common/gpio.c index 10174649298b8..4efc4ef6f5f2d 100644 --- a/cpu/kinetis_common/gpio.c +++ b/cpu/kinetis_common/gpio.c @@ -19,7 +19,7 @@ * @author Hauke Petersen * @author Johann Fischer * @author Jonas Remmert - * @author Joakim Nohlgård * * @} */ @@ -27,6 +27,8 @@ #include "cpu.h" #include "sched.h" #include "thread.h" +#include "utlist.h" +#include "mutex.h" #include "periph/gpio.h" #include "periph_conf.h" @@ -41,332 +43,142 @@ #define PIN_MUX_FUNCTION_GPIO 1 #endif -#ifndef PIN_INTERRUPT_RISING -#define PIN_INTERRUPT_RISING 0x9 -#endif - -#ifndef PIN_INTERRUPT_FALLING -#define PIN_INTERRUPT_FALLING 0xa -#endif - -#ifndef PIN_INTERRUPT_EDGE -#define PIN_INTERRUPT_EDGE 0xb -#endif - /** - * @brief Look up table entry for a GPIO configuration + * @brief Linked list entry for interrupt configurations. */ -typedef struct kinetis_gpio_lut_entry { - PORT_Type* port; /**< PORT module */ - GPIO_Type* gpio; /**< GPIO module */ - uint8_t pin; /**< Pin number within the port */ -} kinetis_gpio_lut_entry_t; - -typedef struct { +typedef struct gpio_int_config_entry { + struct gpio_int_config_entry* next; /**< pointer to next entry */ gpio_cb_t cb; /**< callback called from GPIO interrupt */ void *arg; /**< argument passed to the callback */ uint32_t irqc; /**< remember interrupt configuration between disable/enable */ -} gpio_state_t; + uint8_t pin; /**< pin number within the port */ +} gpio_int_config_entry_t; -static const kinetis_gpio_lut_entry_t kinetis_gpio_lut[GPIO_NUMOF] = { -#if GPIO_0_EN - { .port = GPIO_0_PORT, .gpio = GPIO_0_DEV, .pin = GPIO_0_PIN }, -#endif -#if GPIO_1_EN - { .port = GPIO_1_PORT, .gpio = GPIO_1_DEV, .pin = GPIO_1_PIN }, -#endif -#if GPIO_2_EN - { .port = GPIO_2_PORT, .gpio = GPIO_2_DEV, .pin = GPIO_2_PIN }, -#endif -#if GPIO_3_EN - { .port = GPIO_3_PORT, .gpio = GPIO_3_DEV, .pin = GPIO_3_PIN }, -#endif -#if GPIO_4_EN - { .port = GPIO_4_PORT, .gpio = GPIO_4_DEV, .pin = GPIO_4_PIN }, -#endif -#if GPIO_5_EN - { .port = GPIO_5_PORT, .gpio = GPIO_5_DEV, .pin = GPIO_5_PIN }, -#endif -#if GPIO_6_EN - { .port = GPIO_6_PORT, .gpio = GPIO_6_DEV, .pin = GPIO_6_PIN }, -#endif -#if GPIO_7_EN - { .port = GPIO_7_PORT, .gpio = GPIO_7_DEV, .pin = GPIO_7_PIN }, -#endif -#if GPIO_8_EN - { .port = GPIO_8_PORT, .gpio = GPIO_8_DEV, .pin = GPIO_8_PIN }, -#endif -#if GPIO_9_EN - { .port = GPIO_9_PORT, .gpio = GPIO_9_DEV, .pin = GPIO_9_PIN }, -#endif -#if GPIO_10_EN - { .port = GPIO_10_PORT, .gpio = GPIO_10_DEV, .pin = GPIO_10_PIN }, -#endif -#if GPIO_11_EN - { .port = GPIO_11_PORT, .gpio = GPIO_11_DEV, .pin = GPIO_11_PIN }, -#endif -#if GPIO_12_EN - { .port = GPIO_12_PORT, .gpio = GPIO_12_DEV, .pin = GPIO_12_PIN }, -#endif -#if GPIO_13_EN - { .port = GPIO_13_PORT, .gpio = GPIO_13_DEV, .pin = GPIO_13_PIN }, -#endif -#if GPIO_14_EN - { .port = GPIO_14_PORT, .gpio = GPIO_14_DEV, .pin = GPIO_14_PIN }, -#endif -#if GPIO_15_EN - { .port = GPIO_15_PORT, .gpio = GPIO_15_DEV, .pin = GPIO_15_PIN }, -#endif -#if GPIO_16_EN - { .port = GPIO_16_PORT, .gpio = GPIO_16_DEV, .pin = GPIO_16_PIN }, -#endif -#if GPIO_17_EN - { .port = GPIO_17_PORT, .gpio = GPIO_17_DEV, .pin = GPIO_17_PIN }, -#endif -#if GPIO_18_EN - { .port = GPIO_18_PORT, .gpio = GPIO_18_DEV, .pin = GPIO_18_PIN }, -#endif -#if GPIO_19_EN - { .port = GPIO_19_PORT, .gpio = GPIO_19_DEV, .pin = GPIO_19_PIN }, -#endif -#if GPIO_20_EN - { .port = GPIO_20_PORT, .gpio = GPIO_20_DEV, .pin = GPIO_20_PIN }, -#endif -#if GPIO_21_EN - { .port = GPIO_21_PORT, .gpio = GPIO_21_DEV, .pin = GPIO_21_PIN }, -#endif -#if GPIO_22_EN - { .port = GPIO_22_PORT, .gpio = GPIO_22_DEV, .pin = GPIO_22_PIN }, -#endif -#if GPIO_23_EN - { .port = GPIO_23_PORT, .gpio = GPIO_23_DEV, .pin = GPIO_23_PIN }, -#endif -#if GPIO_24_EN - { .port = GPIO_24_PORT, .gpio = GPIO_24_DEV, .pin = GPIO_24_PIN }, -#endif -#if GPIO_25_EN - { .port = GPIO_25_PORT, .gpio = GPIO_25_DEV, .pin = GPIO_25_PIN }, -#endif -#if GPIO_26_EN - { .port = GPIO_26_PORT, .gpio = GPIO_26_DEV, .pin = GPIO_26_PIN }, -#endif -#if GPIO_27_EN - { .port = GPIO_27_PORT, .gpio = GPIO_27_DEV, .pin = GPIO_27_PIN }, -#endif -#if GPIO_28_EN - { .port = GPIO_28_PORT, .gpio = GPIO_28_DEV, .pin = GPIO_28_PIN }, -#endif -#if GPIO_29_EN - { .port = GPIO_29_PORT, .gpio = GPIO_29_DEV, .pin = GPIO_29_PIN }, -#endif -#if GPIO_30_EN - { .port = GPIO_30_PORT, .gpio = GPIO_30_DEV, .pin = GPIO_30_PIN }, -#endif -#if GPIO_31_EN - { .port = GPIO_31_PORT, .gpio = GPIO_31_DEV, .pin = GPIO_31_PIN }, -#endif -}; +/* Linked list of interrupt handlers for each port. + * Using a linked list saves memory when less than 80% of all GPIO pins on the + * CPU are configured for interrupts, which is true for (almost) all real world + * applications. */ +static gpio_int_config_entry_t* gpio_interrupts[PORT_NUMOF]; -/** - * @brief Unified IRQ handler shared by all interrupt routines - * - * @param[in] dev the device that triggered the interrupt - */ -static inline void irq_handler(gpio_t dev); +static mutex_t int_config_lock = MUTEX_INIT; -/** - * @brief Hold one callback function pointer for each gpio device +/* Maximum number of simultaneously enabled GPIO interrupts. Each pool entry + * uses 20 bytes of RAM. */ -static gpio_state_t config[GPIO_NUMOF]; - -int gpio_init(gpio_t dev, gpio_dir_t dir, gpio_pp_t pushpull) -{ - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - GPIO_0_CLKEN(); - break; -#endif -#if GPIO_1_EN - case GPIO_1: - GPIO_1_CLKEN(); - break; -#endif -#if GPIO_2_EN - case GPIO_2: - GPIO_2_CLKEN(); - break; +#ifndef GPIO_INT_POOL_SIZE +#define GPIO_INT_POOL_SIZE 16 #endif -#if GPIO_3_EN - case GPIO_3: - GPIO_3_CLKEN(); - break; -#endif -#if GPIO_4_EN - case GPIO_4: - GPIO_4_CLKEN(); - break; -#endif -#if GPIO_5_EN - case GPIO_5: - GPIO_5_CLKEN(); - break; -#endif -#if GPIO_6_EN - case GPIO_6: - GPIO_6_CLKEN(); - break; -#endif -#if GPIO_7_EN +/* Pool of linked list entries which can be used by any port configuration. + * Rationale: Avoid dynamic memory inside low level periph drivers. */ +gpio_int_config_entry_t config_pool[GPIO_INT_POOL_SIZE]; - case GPIO_7: - GPIO_7_CLKEN(); - break; -#endif -#if GPIO_8_EN +static PORT_Type * const _port_ptrs[] = PORT_BASE_PTRS; +static GPIO_Type * const _gpio_ptrs[] = GPIO_BASE_PTRS; - case GPIO_8: - GPIO_8_CLKEN(); - break; -#endif -#if GPIO_9_EN +static inline uint32_t _port_num(gpio_t dev) { + return (uint32_t)((dev & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT); +} - case GPIO_9: - GPIO_9_CLKEN(); - break; -#endif -#if GPIO_10_EN +static inline uint8_t _pin_num(gpio_t dev) { + return (uint8_t)((dev & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT); +} - case GPIO_10: - GPIO_10_CLKEN(); - break; -#endif -#if GPIO_11_EN +static inline PORT_Type *_port(gpio_t dev) { + return _port_ptrs[_port_num(dev)]; +} - case GPIO_11: - GPIO_11_CLKEN(); - break; -#endif -#if GPIO_12_EN +static inline GPIO_Type *_gpio(gpio_t dev) { + return _gpio_ptrs[_port_num(dev)]; +} - case GPIO_12: - GPIO_12_CLKEN(); - break; -#endif -#if GPIO_13_EN +static void _clear_interrupt_config(gpio_t dev) { + gpio_int_config_entry_t* entry = NULL; + uint8_t pin_number = _pin_num(dev); + mutex_lock(&int_config_lock); + /* Search for the given pin in the port's interrupt configuration */ + LL_SEARCH_SCALAR(gpio_interrupts[_port_num(dev)], entry, pin, pin_number); + if (entry != NULL) { + LL_DELETE(gpio_interrupts[_port_num(dev)], entry); + /* pin == 0 means the entry is available */ + entry->pin = 0; + } + mutex_unlock(&int_config_lock); +} - case GPIO_13: - GPIO_13_CLKEN(); - break; -#endif -#if GPIO_14_EN +static gpio_int_config_entry_t* _allocate_interrupt_config(uint8_t port) { + gpio_int_config_entry_t* ret = NULL; - case GPIO_14: - GPIO_14_CLKEN(); + mutex_lock(&int_config_lock); + for (uint8_t i = 0; i < GPIO_INT_POOL_SIZE; ++i) { + if (config_pool[i].pin == 0) { + /* temporarily set pin to something non-zero until the proper pin + * number is set by the init code */ + config_pool[i].pin = 200; + ret = &config_pool[i]; + LL_PREPEND(gpio_interrupts[port], ret); break; -#endif -#if GPIO_15_EN + } + } + mutex_unlock(&int_config_lock); - case GPIO_15: - GPIO_15_CLKEN(); - break; -#endif -#if GPIO_16_EN + return ret; +} - case GPIO_16: - GPIO_16_CLKEN(); +int gpio_init(gpio_t dev, gpio_dir_t dir, gpio_pp_t pushpull) +{ + switch (_port_num(dev)) { +#ifdef PORTA_BASE + case PORT_A: + PORTA_CLOCK_GATE = 1; break; #endif -#if GPIO_17_EN - case GPIO_17: - GPIO_17_CLKEN(); +#ifdef PORTB_BASE + case PORT_B: + PORTB_CLOCK_GATE = 1; break; #endif -#if GPIO_18_EN - case GPIO_18: - GPIO_18_CLKEN(); - break; -#endif -#if GPIO_19_EN - case GPIO_19: - GPIO_19_CLKEN(); - break; -#endif -#if GPIO_20_EN - case GPIO_20: - GPIO_20_CLKEN(); - break; -#endif -#if GPIO_21_EN - case GPIO_21: - GPIO_21_CLKEN(); - break; -#endif -#if GPIO_22_EN - case GPIO_22: - GPIO_22_CLKEN(); - break; -#endif -#if GPIO_23_EN - case GPIO_23: - GPIO_23_CLKEN(); +#ifdef PORTC_BASE + case PORT_C: + PORTC_CLOCK_GATE = 1; break; #endif -#if GPIO_24_EN - case GPIO_24: - GPIO_24_CLKEN(); - break; -#endif -#if GPIO_25_EN - case GPIO_25: - GPIO_25_CLKEN(); - break; -#endif -#if GPIO_26_EN - case GPIO_26: - GPIO_26_CLKEN(); - break; -#endif -#if GPIO_27_EN - case GPIO_27: - GPIO_27_CLKEN(); - break; -#endif -#if GPIO_28_EN - case GPIO_28: - GPIO_28_CLKEN(); + +#ifdef PORTD_BASE + case PORT_D: + PORTD_CLOCK_GATE = 1; break; #endif -#if GPIO_29_EN - case GPIO_29: - GPIO_29_CLKEN(); + +#ifdef PORTE_BASE + case PORT_E: + PORTE_CLOCK_GATE = 1; break; #endif -#if GPIO_30_EN - case GPIO_30: - GPIO_30_CLKEN(); + +#ifdef PORTF_BASE + case PORT_F: + PORTF_CLOCK_GATE = 1; break; #endif -#if GPIO_31_EN - case GPIO_31: - GPIO_31_CLKEN(); + +#ifdef PORTG_BASE + case PORT_G: + PORTG_CLOCK_GATE = 1; break; #endif + default: return -1; } - uint8_t pin = kinetis_gpio_lut[dev].pin; - PORT_Type *port = kinetis_gpio_lut[dev].port; - GPIO_Type *gpio = kinetis_gpio_lut[dev].gpio; + uint8_t pin = _pin_num(dev); + PORT_Type *port = _port(dev); + GPIO_Type *gpio = _gpio(dev); - /* Clear interrupt config */ - config[dev].cb = NULL; - config[dev].arg = NULL; - config[dev].irqc = 0; + _clear_interrupt_config(dev); /* Reset all pin control settings for the pin */ /* Switch to analog input function while fiddling with the settings, to be safe. */ @@ -387,11 +199,11 @@ int gpio_init(gpio_t dev, gpio_dir_t dir, gpio_pp_t pushpull) } if (dir == GPIO_DIR_OUT) { - gpio->PDDR |= GPIO_PDDR_PDD(1 << pin); /* set pin to output mode */ - gpio->PCOR |= GPIO_PCOR_PTCO(1 << pin); /* set output to low */ + BITBAND_REG32(gpio->PDDR, pin) = 1; /* set pin to output mode */ + gpio->PCOR = GPIO_PCOR_PTCO(1 << pin); /* set output to low */ } else { - gpio->PDDR &= ~(GPIO_PDDR_PDD(1 << pin)); /* set pin to input mode */ + BITBAND_REG32(gpio->PDDR, pin) = 0; /* set pin to input mode */ } /* Select GPIO function for the pin */ @@ -403,6 +215,7 @@ int gpio_init(gpio_t dev, gpio_dir_t dir, gpio_pp_t pushpull) int gpio_init_int(gpio_t dev, gpio_pp_t pushpull, gpio_flank_t flank, gpio_cb_t cb, void *arg) { int res; + IRQn_Type irqn; res = gpio_init(dev, GPIO_DIR_IN, pushpull); @@ -410,259 +223,66 @@ int gpio_init_int(gpio_t dev, gpio_pp_t pushpull, gpio_flank_t flank, gpio_cb_t return res; } - switch (dev) { -#if GPIO_0_EN - case GPIO_0: - NVIC_SetPriority(GPIO_0_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_0_IRQ); - break; -#endif -#if GPIO_1_EN - case GPIO_1: - NVIC_SetPriority(GPIO_1_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_1_IRQ); - break; -#endif -#if GPIO_2_EN - case GPIO_2: - NVIC_SetPriority(GPIO_2_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_2_IRQ); - break; -#endif -#if GPIO_3_EN - - case GPIO_3: - NVIC_SetPriority(GPIO_3_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_3_IRQ); - break; -#endif -#if GPIO_4_EN - - case GPIO_4: - NVIC_SetPriority(GPIO_4_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_4_IRQ); - break; -#endif -#if GPIO_5_EN - - case GPIO_5: - NVIC_SetPriority(GPIO_5_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_5_IRQ); - break; -#endif -#if GPIO_6_EN - - case GPIO_6: - NVIC_SetPriority(GPIO_6_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_6_IRQ); - break; -#endif -#if GPIO_7_EN - - case GPIO_7: - NVIC_SetPriority(GPIO_7_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_7_IRQ); + switch (_port_num(dev)) { +#ifdef PORTA_BASE + case PORT_A: + irqn = PORTA_IRQn; break; #endif -#if GPIO_8_EN - case GPIO_8: - NVIC_SetPriority(GPIO_8_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_8_IRQ); +#ifdef PORTB_BASE + case PORT_B: + irqn = PORTB_IRQn; break; #endif -#if GPIO_9_EN - case GPIO_9: - NVIC_SetPriority(GPIO_9_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_9_IRQ); +#ifdef PORTC_BASE + case PORT_C: + irqn = PORTC_IRQn; break; #endif -#if GPIO_10_EN - case GPIO_10: - NVIC_SetPriority(GPIO_10_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_10_IRQ); +#ifdef PORTD_BASE + case PORT_D: + irqn = PORTD_IRQn; break; #endif -#if GPIO_11_EN - case GPIO_11: - NVIC_SetPriority(GPIO_11_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_11_IRQ); +#ifdef PORTE_BASE + case PORT_E: + irqn = PORTE_IRQn; break; #endif -#if GPIO_12_EN - case GPIO_12: - NVIC_SetPriority(GPIO_12_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_12_IRQ); +#ifdef PORTF_BASE + case PORT_F: + irqn = PORTF_IRQn; break; #endif -#if GPIO_13_EN - case GPIO_13: - NVIC_SetPriority(GPIO_13_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_13_IRQ); +#ifdef PORTG_BASE + case PORT_G: + irqn = PORTG_IRQn; break; #endif -#if GPIO_14_EN - case GPIO_14: - NVIC_SetPriority(GPIO_14_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_14_IRQ); - break; -#endif -#if GPIO_15_EN - - case GPIO_15: - NVIC_SetPriority(GPIO_15_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_15_IRQ); - break; -#endif -#if GPIO_16_EN - - case GPIO_16: - NVIC_SetPriority(GPIO_16_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_16_IRQ); - break; -#endif -#if GPIO_17_EN - - case GPIO_17: - NVIC_SetPriority(GPIO_17_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_17_IRQ); - break; -#endif -#if GPIO_18_EN - - case GPIO_18: - NVIC_SetPriority(GPIO_18_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_18_IRQ); - break; -#endif -#if GPIO_19_EN - - case GPIO_19: - NVIC_SetPriority(GPIO_19_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_19_IRQ); - break; -#endif -#if GPIO_20_EN - - case GPIO_20: - NVIC_SetPriority(GPIO_20_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_20_IRQ); - break; -#endif -#if GPIO_21_EN - - case GPIO_21: - NVIC_SetPriority(GPIO_21_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_21_IRQ); - break; -#endif -#if GPIO_22_EN - - case GPIO_22: - NVIC_SetPriority(GPIO_22_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_22_IRQ); - break; -#endif -#if GPIO_23_EN - - case GPIO_23: - NVIC_SetPriority(GPIO_23_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_23_IRQ); - break; -#endif -#if GPIO_24_EN - - case GPIO_24: - NVIC_SetPriority(GPIO_24_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_24_IRQ); - break; -#endif -#if GPIO_25_EN - - case GPIO_25: - NVIC_SetPriority(GPIO_25_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_25_IRQ); - break; -#endif -#if GPIO_26_EN - - case GPIO_26: - NVIC_SetPriority(GPIO_26_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_26_IRQ); - break; -#endif -#if GPIO_27_EN - - case GPIO_27: - NVIC_SetPriority(GPIO_27_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_27_IRQ); - break; -#endif -#if GPIO_28_EN - - case GPIO_28: - NVIC_SetPriority(GPIO_28_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_28_IRQ); - break; -#endif -#if GPIO_29_EN - - case GPIO_29: - NVIC_SetPriority(GPIO_29_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_29_IRQ); - break; -#endif -#if GPIO_30_EN - - case GPIO_30: - NVIC_SetPriority(GPIO_30_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_30_IRQ); - break; -#endif -#if GPIO_31_EN - case GPIO_31: - NVIC_SetPriority(GPIO_31_IRQ, GPIO_IRQ_PRIO); - NVIC_EnableIRQ(GPIO_31_IRQ); - break; -#endif default: return -1; } - uint8_t pin = kinetis_gpio_lut[dev].pin; - PORT_Type *port = kinetis_gpio_lut[dev].port; - - /* set callback */ - config[dev].cb = cb; - config[dev].arg = arg; - + uint32_t irqc; /* configure the active edges */ switch (flank) { case GPIO_RISING: - port->PCR[pin] &= ~(PORT_PCR_IRQC_MASK); /* Disable interrupt */ - port->PCR[pin] |= PORT_PCR_ISF_MASK; /* Clear interrupt flag */ - port->PCR[pin] |= PORT_PCR_IRQC(PIN_INTERRUPT_RISING); /* Enable interrupt */ - config[dev].irqc = PORT_PCR_IRQC(PIN_INTERRUPT_RISING); + irqc = PORT_PCR_IRQC(PIN_INTERRUPT_RISING); break; case GPIO_FALLING: - port->PCR[pin] &= ~(PORT_PCR_IRQC_MASK); /* Disable interrupt */ - port->PCR[pin] |= PORT_PCR_ISF_MASK; /* Clear interrupt flag */ - port->PCR[pin] |= PORT_PCR_IRQC(PIN_INTERRUPT_FALLING); /* Enable interrupt */ - config[dev].irqc = PORT_PCR_IRQC(PIN_INTERRUPT_FALLING); + irqc = PORT_PCR_IRQC(PIN_INTERRUPT_FALLING); break; case GPIO_BOTH: - port->PCR[pin] &= ~(PORT_PCR_IRQC_MASK); /* Disable interrupt */ - port->PCR[pin] |= PORT_PCR_ISF_MASK; /* Clear interrupt flag */ - port->PCR[pin] |= PORT_PCR_IRQC(PIN_INTERRUPT_EDGE); /* Enable interrupt */ - config[dev].irqc = PORT_PCR_IRQC(PIN_INTERRUPT_EDGE); + irqc = PORT_PCR_IRQC(PIN_INTERRUPT_EDGE); break; default: @@ -670,1209 +290,168 @@ int gpio_init_int(gpio_t dev, gpio_pp_t pushpull, gpio_flank_t flank, gpio_cb_t return -1; } + gpio_int_config_entry_t* config = _allocate_interrupt_config(_port_num(dev)); + if (config == NULL) { + /* No free interrupt config entries */ + return -1; + } + + /* Enable port interrupts in the NVIC */ + NVIC_SetPriority(irqn, GPIO_IRQ_PRIO); + NVIC_EnableIRQ(irqn); + + uint8_t pin = _pin_num(dev); + PORT_Type *port = _port(dev); + + config->cb = cb; + config->arg = arg; + config->irqc = irqc; + /* Allow the callback to be found by the IRQ handler by setting the proper + * pin number */ + config->pin = pin; + + port->PCR[pin] &= ~(PORT_PCR_IRQC_MASK); /* Disable interrupt */ + BITBAND_REG32(port->PCR[pin], PORT_PCR_ISF_SHIFT) = 1; /* Clear interrupt flag */ + port->PCR[pin] |= config->irqc; /* Enable interrupt */ + return 0; } void gpio_irq_enable(gpio_t dev) { - if ((unsigned int)dev >= GPIO_NUMOF) { - DEBUG("gpio_t out of range: %d >= %d\n", dev, GPIO_NUMOF); + /* Restore saved state */ + PORT_Type *port = _port(dev); + gpio_int_config_entry_t* entry = NULL; + uint8_t pin_number = _pin_num(dev); + mutex_lock(&int_config_lock); + /* Search for the given pin in the port's interrupt configuration */ + LL_SEARCH_SCALAR(gpio_interrupts[_port_num(dev)], entry, pin, pin_number); + uint32_t irqc = entry->irqc; + mutex_unlock(&int_config_lock); + if (entry == NULL) { + /* Pin has not been configured for interrupts */ return; } - uint8_t pin = kinetis_gpio_lut[dev].pin; - PORT_Type *port = kinetis_gpio_lut[dev].port; - - /* Restore saved state */ - port->PCR[pin] &= ~(PORT_PCR_IRQC_MASK); - port->PCR[pin] |= PORT_PCR_IRQC_MASK & config[dev].irqc; + port->PCR[pin_number] &= ~(PORT_PCR_IRQC_MASK); + port->PCR[pin_number] |= irqc; } void gpio_irq_disable(gpio_t dev) { - if ((unsigned int)dev >= GPIO_NUMOF) { - DEBUG("gpio_t out of range: %d >= %d\n", dev, GPIO_NUMOF); + /* Save irqc state before disabling to allow enabling with the same trigger + * settings later. */ + PORT_Type *port = _port(dev); + uint8_t pin_number = _pin_num(dev); + uint32_t irqc = PORT_PCR_IRQC_MASK & port->PCR[pin_number]; + gpio_int_config_entry_t* entry = NULL; + mutex_lock(&int_config_lock); + /* Search for the given pin in the port's interrupt configuration */ + LL_SEARCH_SCALAR(gpio_interrupts[_port_num(dev)], entry, pin, pin_number); + if (entry == NULL) { + /* Pin has not been configured for interrupts */ + mutex_unlock(&int_config_lock); return; } - uint8_t pin = kinetis_gpio_lut[dev].pin; - PORT_Type *port = kinetis_gpio_lut[dev].port; - - /* Save irqc state before disabling to allow enabling with the same trigger settings later. */ - config[dev].irqc = PORT_PCR_IRQC_MASK & port->PCR[pin]; - port->PCR[pin] &= ~(PORT_PCR_IRQC_MASK); + entry->irqc = irqc; + mutex_unlock(&int_config_lock); + port->PCR[pin_number] &= ~(PORT_PCR_IRQC_MASK); } int gpio_read(gpio_t dev) { - if ((unsigned int)dev >= GPIO_NUMOF) { - DEBUG("gpio_t out of range: %d >= %d\n", dev, GPIO_NUMOF); - return -1; - } - uint8_t pin = kinetis_gpio_lut[dev].pin; - GPIO_Type *gpio = kinetis_gpio_lut[dev].gpio; - - if (gpio->PDDR & GPIO_PDDR_PDD(1 << pin)) { /* if configured as output */ - /* read output data register */ - return gpio->PDOR & GPIO_PDOR_PDO(1 << pin); - } - else { - /* else read input data register */ - return gpio->PDIR & GPIO_PDIR_PDI(1 << pin); - } + return ((_gpio(dev)->PDIR & GPIO_PDIR_PDI(1 << _pin_num(dev))) ? 1 : 0); } void gpio_set(gpio_t dev) { - if ((unsigned int)dev >= GPIO_NUMOF) { - DEBUG("gpio_t out of range: %d >= %d\n", dev, GPIO_NUMOF); - return; - } - kinetis_gpio_lut[dev].gpio->PSOR = (1 << kinetis_gpio_lut[dev].pin); + _gpio(dev)->PSOR = (1 << _pin_num(dev)); } void gpio_clear(gpio_t dev) { - if ((unsigned int)dev >= GPIO_NUMOF) { - DEBUG("gpio_t out of range: %d >= %d\n", dev, GPIO_NUMOF); - return; - } - kinetis_gpio_lut[dev].gpio->PCOR = (1 << kinetis_gpio_lut[dev].pin); + _gpio(dev)->PCOR = (1 << _pin_num(dev)); } void gpio_toggle(gpio_t dev) { - if ((unsigned int)dev >= GPIO_NUMOF) { - DEBUG("gpio_t out of range: %d >= %d\n", dev, GPIO_NUMOF); - return; - } - kinetis_gpio_lut[dev].gpio->PTOR = (1 << kinetis_gpio_lut[dev].pin); + _gpio(dev)->PTOR = (1 << _pin_num(dev)); } void gpio_write(gpio_t dev, int value) { if (value) { - gpio_set(dev); + _gpio(dev)->PSOR = (1 << _pin_num(dev)); } else { - gpio_clear(dev); + _gpio(dev)->PCOR = (1 << _pin_num(dev)); } } -static inline void irq_handler(gpio_t dev) +static inline void irq_handler(uint8_t port_num) { - config[dev].cb(config[dev].arg); + gpio_int_config_entry_t *entry; + PORT_Type *port = _port_ptrs[port_num]; + uint32_t isf = port->ISFR; /* Interrupt status flags */ + LL_FOREACH(gpio_interrupts[port_num], entry) { + if (isf & (1 << entry->pin)) { + if (entry->cb != NULL) { + entry->cb(entry->arg); + } + } + } + /* Clear interrupt flags */ + port->ISFR = isf; if (sched_context_switch_request) { thread_yield(); } } - -/* the following interrupt handlers are quite ugly, the preprocessor is used to - * insert only the relevant checks in each isr, however, in the source all of - * the ISRs contain all GPIO checks... - */ -#define GPIO_ISR_TEMPLATE(gpio) \ - if (gpio##_PORT->ISFR & PORT_ISFR_ISF(1 << gpio##_PIN)) { \ - irq_handler(gpio); \ - /* clear status bit by writing a 1 to it */ \ - gpio##_PORT->ISFR = PORT_ISFR_ISF(1 << gpio##_PIN); \ - } - -/* Generate the below part with: (in bash or zsh) -for p in $(seq 8 | tr 123456789 abcdefghi); do echo -n " -#if PORT$(echo $p | tr '[:lower:]' '[:upper:]')_BASE -void ISR_PORT_${p}(void) +#ifdef PORTA_BASE +void isr_porta(void) { -"; for f in $(seq 0 31); do echo -n " -#if GPIO_${f}_EN && (GPIO_${f}_PORT_BASE == PORT$(echo $p | tr '[:lower:]' '[:upper:]')_BASE) - GPIO_ISR_TEMPLATE(GPIO_${f}) -#endif -"; done; -echo -n " + irq_handler(PORT_A); } -#endif // PORT$(echo $p | tr '[:lower:]' '[:upper:]')_BASE -"; done > gpio-isr.c -*/ - -/* Script generated code below. */ -/* -------------------------------------------------------------------------- */ +#endif /* PORTA_BASE */ -#if PORTA_BASE -void ISR_PORT_A(void) +#ifdef PORTB_BASE +void isr_portb(void) { + irq_handler(PORT_B); +} +#endif /* ISR_PORT_B */ -#if GPIO_0_EN && (GPIO_0_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_0) -#endif - -#if GPIO_1_EN && (GPIO_1_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_1) -#endif - -#if GPIO_2_EN && (GPIO_2_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_2) -#endif - -#if GPIO_3_EN && (GPIO_3_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_3) -#endif - -#if GPIO_4_EN && (GPIO_4_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_4) -#endif - -#if GPIO_5_EN && (GPIO_5_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_5) -#endif - -#if GPIO_6_EN && (GPIO_6_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_6) -#endif - -#if GPIO_7_EN && (GPIO_7_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_7) -#endif - -#if GPIO_8_EN && (GPIO_8_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_8) -#endif - -#if GPIO_9_EN && (GPIO_9_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_9) -#endif - -#if GPIO_10_EN && (GPIO_10_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_10) -#endif - -#if GPIO_11_EN && (GPIO_11_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_11) -#endif - -#if GPIO_12_EN && (GPIO_12_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_12) -#endif - -#if GPIO_13_EN && (GPIO_13_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_13) -#endif - -#if GPIO_14_EN && (GPIO_14_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_14) -#endif - -#if GPIO_15_EN && (GPIO_15_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_15) -#endif +#ifdef PORTC_BASE +void isr_portc(void) +{ + irq_handler(PORT_C); +} +#endif /* ISR_PORT_C */ -#if GPIO_16_EN && (GPIO_16_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_16) -#endif +#ifdef PORTD_BASE +void isr_portd(void) +{ + irq_handler(PORT_D); +} +#endif /* ISR_PORT_D */ -#if GPIO_17_EN && (GPIO_17_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_17) -#endif +#ifdef PORTE_BASE +void isr_porte(void) +{ + irq_handler(PORT_E); +} +#endif /* ISR_PORT_E */ -#if GPIO_18_EN && (GPIO_18_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_18) -#endif +#ifdef PORTF_BASE +void isr_portf(void) +{ + irq_handler(PORT_F); +} +#endif /* ISR_PORT_F */ -#if GPIO_19_EN && (GPIO_19_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_19) -#endif - -#if GPIO_20_EN && (GPIO_20_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_20) -#endif - -#if GPIO_21_EN && (GPIO_21_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_21) -#endif - -#if GPIO_22_EN && (GPIO_22_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_22) -#endif - -#if GPIO_23_EN && (GPIO_23_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_23) -#endif - -#if GPIO_24_EN && (GPIO_24_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_24) -#endif - -#if GPIO_25_EN && (GPIO_25_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_25) -#endif - -#if GPIO_26_EN && (GPIO_26_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_26) -#endif - -#if GPIO_27_EN && (GPIO_27_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_27) -#endif - -#if GPIO_28_EN && (GPIO_28_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_28) -#endif - -#if GPIO_29_EN && (GPIO_29_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_29) -#endif - -#if GPIO_30_EN && (GPIO_30_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_30) -#endif - -#if GPIO_31_EN && (GPIO_31_PORT_BASE == PORTA_BASE) - GPIO_ISR_TEMPLATE(GPIO_31) -#endif - -} -#endif /* PORTA_BASE */ - -#if PORTB_BASE -void ISR_PORT_B(void) -{ - -#if GPIO_0_EN && (GPIO_0_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_0) -#endif - -#if GPIO_1_EN && (GPIO_1_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_1) -#endif - -#if GPIO_2_EN && (GPIO_2_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_2) -#endif - -#if GPIO_3_EN && (GPIO_3_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_3) -#endif - -#if GPIO_4_EN && (GPIO_4_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_4) -#endif - -#if GPIO_5_EN && (GPIO_5_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_5) -#endif - -#if GPIO_6_EN && (GPIO_6_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_6) -#endif - -#if GPIO_7_EN && (GPIO_7_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_7) -#endif - -#if GPIO_8_EN && (GPIO_8_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_8) -#endif - -#if GPIO_9_EN && (GPIO_9_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_9) -#endif - -#if GPIO_10_EN && (GPIO_10_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_10) -#endif - -#if GPIO_11_EN && (GPIO_11_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_11) -#endif - -#if GPIO_12_EN && (GPIO_12_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_12) -#endif - -#if GPIO_13_EN && (GPIO_13_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_13) -#endif - -#if GPIO_14_EN && (GPIO_14_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_14) -#endif - -#if GPIO_15_EN && (GPIO_15_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_15) -#endif - -#if GPIO_16_EN && (GPIO_16_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_16) -#endif - -#if GPIO_17_EN && (GPIO_17_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_17) -#endif - -#if GPIO_18_EN && (GPIO_18_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_18) -#endif - -#if GPIO_19_EN && (GPIO_19_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_19) -#endif - -#if GPIO_20_EN && (GPIO_20_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_20) -#endif - -#if GPIO_21_EN && (GPIO_21_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_21) -#endif - -#if GPIO_22_EN && (GPIO_22_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_22) -#endif - -#if GPIO_23_EN && (GPIO_23_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_23) -#endif - -#if GPIO_24_EN && (GPIO_24_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_24) -#endif - -#if GPIO_25_EN && (GPIO_25_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_25) -#endif - -#if GPIO_26_EN && (GPIO_26_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_26) -#endif - -#if GPIO_27_EN && (GPIO_27_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_27) -#endif - -#if GPIO_28_EN && (GPIO_28_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_28) -#endif - -#if GPIO_29_EN && (GPIO_29_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_29) -#endif - -#if GPIO_30_EN && (GPIO_30_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_30) -#endif - -#if GPIO_31_EN && (GPIO_31_PORT_BASE == PORTB_BASE) - GPIO_ISR_TEMPLATE(GPIO_31) -#endif - -} -#endif /* PORTB_BASE */ - -#if PORTC_BASE -void ISR_PORT_C(void) -{ - -#if GPIO_0_EN && (GPIO_0_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_0) -#endif - -#if GPIO_1_EN && (GPIO_1_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_1) -#endif - -#if GPIO_2_EN && (GPIO_2_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_2) -#endif - -#if GPIO_3_EN && (GPIO_3_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_3) -#endif - -#if GPIO_4_EN && (GPIO_4_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_4) -#endif - -#if GPIO_5_EN && (GPIO_5_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_5) -#endif - -#if GPIO_6_EN && (GPIO_6_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_6) -#endif - -#if GPIO_7_EN && (GPIO_7_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_7) -#endif - -#if GPIO_8_EN && (GPIO_8_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_8) -#endif - -#if GPIO_9_EN && (GPIO_9_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_9) -#endif - -#if GPIO_10_EN && (GPIO_10_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_10) -#endif - -#if GPIO_11_EN && (GPIO_11_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_11) -#endif - -#if GPIO_12_EN && (GPIO_12_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_12) -#endif - -#if GPIO_13_EN && (GPIO_13_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_13) -#endif - -#if GPIO_14_EN && (GPIO_14_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_14) -#endif - -#if GPIO_15_EN && (GPIO_15_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_15) -#endif - -#if GPIO_16_EN && (GPIO_16_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_16) -#endif - -#if GPIO_17_EN && (GPIO_17_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_17) -#endif - -#if GPIO_18_EN && (GPIO_18_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_18) -#endif - -#if GPIO_19_EN && (GPIO_19_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_19) -#endif - -#if GPIO_20_EN && (GPIO_20_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_20) -#endif - -#if GPIO_21_EN && (GPIO_21_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_21) -#endif - -#if GPIO_22_EN && (GPIO_22_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_22) -#endif - -#if GPIO_23_EN && (GPIO_23_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_23) -#endif - -#if GPIO_24_EN && (GPIO_24_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_24) -#endif - -#if GPIO_25_EN && (GPIO_25_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_25) -#endif - -#if GPIO_26_EN && (GPIO_26_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_26) -#endif - -#if GPIO_27_EN && (GPIO_27_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_27) -#endif - -#if GPIO_28_EN && (GPIO_28_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_28) -#endif - -#if GPIO_29_EN && (GPIO_29_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_29) -#endif - -#if GPIO_30_EN && (GPIO_30_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_30) -#endif - -#if GPIO_31_EN && (GPIO_31_PORT_BASE == PORTC_BASE) - GPIO_ISR_TEMPLATE(GPIO_31) -#endif - -} -#endif /* PORTC_BASE */ - -#if PORTD_BASE -void ISR_PORT_D(void) -{ - -#if GPIO_0_EN && (GPIO_0_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_0) -#endif - -#if GPIO_1_EN && (GPIO_1_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_1) -#endif - -#if GPIO_2_EN && (GPIO_2_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_2) -#endif - -#if GPIO_3_EN && (GPIO_3_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_3) -#endif - -#if GPIO_4_EN && (GPIO_4_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_4) -#endif - -#if GPIO_5_EN && (GPIO_5_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_5) -#endif - -#if GPIO_6_EN && (GPIO_6_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_6) -#endif - -#if GPIO_7_EN && (GPIO_7_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_7) -#endif - -#if GPIO_8_EN && (GPIO_8_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_8) -#endif - -#if GPIO_9_EN && (GPIO_9_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_9) -#endif - -#if GPIO_10_EN && (GPIO_10_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_10) -#endif - -#if GPIO_11_EN && (GPIO_11_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_11) -#endif - -#if GPIO_12_EN && (GPIO_12_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_12) -#endif - -#if GPIO_13_EN && (GPIO_13_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_13) -#endif - -#if GPIO_14_EN && (GPIO_14_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_14) -#endif - -#if GPIO_15_EN && (GPIO_15_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_15) -#endif - -#if GPIO_16_EN && (GPIO_16_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_16) -#endif - -#if GPIO_17_EN && (GPIO_17_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_17) -#endif - -#if GPIO_18_EN && (GPIO_18_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_18) -#endif - -#if GPIO_19_EN && (GPIO_19_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_19) -#endif - -#if GPIO_20_EN && (GPIO_20_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_20) -#endif - -#if GPIO_21_EN && (GPIO_21_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_21) -#endif - -#if GPIO_22_EN && (GPIO_22_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_22) -#endif - -#if GPIO_23_EN && (GPIO_23_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_23) -#endif - -#if GPIO_24_EN && (GPIO_24_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_24) -#endif - -#if GPIO_25_EN && (GPIO_25_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_25) -#endif - -#if GPIO_26_EN && (GPIO_26_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_26) -#endif - -#if GPIO_27_EN && (GPIO_27_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_27) -#endif - -#if GPIO_28_EN && (GPIO_28_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_28) -#endif - -#if GPIO_29_EN && (GPIO_29_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_29) -#endif - -#if GPIO_30_EN && (GPIO_30_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_30) -#endif - -#if GPIO_31_EN && (GPIO_31_PORT_BASE == PORTD_BASE) - GPIO_ISR_TEMPLATE(GPIO_31) -#endif - -} -#endif /* PORTD_BASE */ - -#if PORTE_BASE -void ISR_PORT_E(void) -{ - -#if GPIO_0_EN && (GPIO_0_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_0) -#endif - -#if GPIO_1_EN && (GPIO_1_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_1) -#endif - -#if GPIO_2_EN && (GPIO_2_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_2) -#endif - -#if GPIO_3_EN && (GPIO_3_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_3) -#endif - -#if GPIO_4_EN && (GPIO_4_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_4) -#endif - -#if GPIO_5_EN && (GPIO_5_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_5) -#endif - -#if GPIO_6_EN && (GPIO_6_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_6) -#endif - -#if GPIO_7_EN && (GPIO_7_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_7) -#endif - -#if GPIO_8_EN && (GPIO_8_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_8) -#endif - -#if GPIO_9_EN && (GPIO_9_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_9) -#endif - -#if GPIO_10_EN && (GPIO_10_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_10) -#endif - -#if GPIO_11_EN && (GPIO_11_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_11) -#endif - -#if GPIO_12_EN && (GPIO_12_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_12) -#endif - -#if GPIO_13_EN && (GPIO_13_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_13) -#endif - -#if GPIO_14_EN && (GPIO_14_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_14) -#endif - -#if GPIO_15_EN && (GPIO_15_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_15) -#endif - -#if GPIO_16_EN && (GPIO_16_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_16) -#endif - -#if GPIO_17_EN && (GPIO_17_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_17) -#endif - -#if GPIO_18_EN && (GPIO_18_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_18) -#endif - -#if GPIO_19_EN && (GPIO_19_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_19) -#endif - -#if GPIO_20_EN && (GPIO_20_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_20) -#endif - -#if GPIO_21_EN && (GPIO_21_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_21) -#endif - -#if GPIO_22_EN && (GPIO_22_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_22) -#endif - -#if GPIO_23_EN && (GPIO_23_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_23) -#endif - -#if GPIO_24_EN && (GPIO_24_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_24) -#endif - -#if GPIO_25_EN && (GPIO_25_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_25) -#endif - -#if GPIO_26_EN && (GPIO_26_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_26) -#endif - -#if GPIO_27_EN && (GPIO_27_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_27) -#endif - -#if GPIO_28_EN && (GPIO_28_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_28) -#endif - -#if GPIO_29_EN && (GPIO_29_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_29) -#endif - -#if GPIO_30_EN && (GPIO_30_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_30) -#endif - -#if GPIO_31_EN && (GPIO_31_PORT_BASE == PORTE_BASE) - GPIO_ISR_TEMPLATE(GPIO_31) -#endif - -} -#endif /* PORTE_BASE */ - -#if PORTF_BASE -void ISR_PORT_F(void) -{ - -#if GPIO_0_EN && (GPIO_0_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_0) -#endif - -#if GPIO_1_EN && (GPIO_1_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_1) -#endif - -#if GPIO_2_EN && (GPIO_2_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_2) -#endif - -#if GPIO_3_EN && (GPIO_3_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_3) -#endif - -#if GPIO_4_EN && (GPIO_4_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_4) -#endif - -#if GPIO_5_EN && (GPIO_5_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_5) -#endif - -#if GPIO_6_EN && (GPIO_6_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_6) -#endif - -#if GPIO_7_EN && (GPIO_7_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_7) -#endif - -#if GPIO_8_EN && (GPIO_8_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_8) -#endif - -#if GPIO_9_EN && (GPIO_9_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_9) -#endif - -#if GPIO_10_EN && (GPIO_10_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_10) -#endif - -#if GPIO_11_EN && (GPIO_11_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_11) -#endif - -#if GPIO_12_EN && (GPIO_12_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_12) -#endif - -#if GPIO_13_EN && (GPIO_13_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_13) -#endif - -#if GPIO_14_EN && (GPIO_14_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_14) -#endif - -#if GPIO_15_EN && (GPIO_15_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_15) -#endif - -#if GPIO_16_EN && (GPIO_16_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_16) -#endif - -#if GPIO_17_EN && (GPIO_17_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_17) -#endif - -#if GPIO_18_EN && (GPIO_18_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_18) -#endif - -#if GPIO_19_EN && (GPIO_19_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_19) -#endif - -#if GPIO_20_EN && (GPIO_20_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_20) -#endif - -#if GPIO_21_EN && (GPIO_21_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_21) -#endif - -#if GPIO_22_EN && (GPIO_22_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_22) -#endif - -#if GPIO_23_EN && (GPIO_23_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_23) -#endif - -#if GPIO_24_EN && (GPIO_24_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_24) -#endif - -#if GPIO_25_EN && (GPIO_25_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_25) -#endif - -#if GPIO_26_EN && (GPIO_26_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_26) -#endif - -#if GPIO_27_EN && (GPIO_27_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_27) -#endif - -#if GPIO_28_EN && (GPIO_28_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_28) -#endif - -#if GPIO_29_EN && (GPIO_29_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_29) -#endif - -#if GPIO_30_EN && (GPIO_30_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_30) -#endif - -#if GPIO_31_EN && (GPIO_31_PORT_BASE == PORTF_BASE) - GPIO_ISR_TEMPLATE(GPIO_31) -#endif - -} -#endif /* PORTF_BASE */ - -#if PORTG_BASE -void ISR_PORT_G(void) +#ifdef PORTG_BASE +void isr_portg(void) { - -#if GPIO_0_EN && (GPIO_0_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_0) -#endif - -#if GPIO_1_EN && (GPIO_1_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_1) -#endif - -#if GPIO_2_EN && (GPIO_2_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_2) -#endif - -#if GPIO_3_EN && (GPIO_3_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_3) -#endif - -#if GPIO_4_EN && (GPIO_4_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_4) -#endif - -#if GPIO_5_EN && (GPIO_5_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_5) -#endif - -#if GPIO_6_EN && (GPIO_6_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_6) -#endif - -#if GPIO_7_EN && (GPIO_7_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_7) -#endif - -#if GPIO_8_EN && (GPIO_8_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_8) -#endif - -#if GPIO_9_EN && (GPIO_9_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_9) -#endif - -#if GPIO_10_EN && (GPIO_10_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_10) -#endif - -#if GPIO_11_EN && (GPIO_11_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_11) -#endif - -#if GPIO_12_EN && (GPIO_12_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_12) -#endif - -#if GPIO_13_EN && (GPIO_13_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_13) -#endif - -#if GPIO_14_EN && (GPIO_14_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_14) -#endif - -#if GPIO_15_EN && (GPIO_15_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_15) -#endif - -#if GPIO_16_EN && (GPIO_16_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_16) -#endif - -#if GPIO_17_EN && (GPIO_17_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_17) -#endif - -#if GPIO_18_EN && (GPIO_18_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_18) -#endif - -#if GPIO_19_EN && (GPIO_19_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_19) -#endif - -#if GPIO_20_EN && (GPIO_20_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_20) -#endif - -#if GPIO_21_EN && (GPIO_21_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_21) -#endif - -#if GPIO_22_EN && (GPIO_22_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_22) -#endif - -#if GPIO_23_EN && (GPIO_23_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_23) -#endif - -#if GPIO_24_EN && (GPIO_24_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_24) -#endif - -#if GPIO_25_EN && (GPIO_25_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_25) -#endif - -#if GPIO_26_EN && (GPIO_26_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_26) -#endif - -#if GPIO_27_EN && (GPIO_27_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_27) -#endif - -#if GPIO_28_EN && (GPIO_28_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_28) -#endif - -#if GPIO_29_EN && (GPIO_29_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_29) -#endif - -#if GPIO_30_EN && (GPIO_30_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_30) -#endif - -#if GPIO_31_EN && (GPIO_31_PORT_BASE == PORTG_BASE) - GPIO_ISR_TEMPLATE(GPIO_31) -#endif - -} -#endif /* PORTG_BASE */ - -#if PORTH_BASE -void ISR_PORT_H(void) -{ - -#if GPIO_0_EN && (GPIO_0_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_0) -#endif - -#if GPIO_1_EN && (GPIO_1_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_1) -#endif - -#if GPIO_2_EN && (GPIO_2_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_2) -#endif - -#if GPIO_3_EN && (GPIO_3_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_3) -#endif - -#if GPIO_4_EN && (GPIO_4_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_4) -#endif - -#if GPIO_5_EN && (GPIO_5_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_5) -#endif - -#if GPIO_6_EN && (GPIO_6_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_6) -#endif - -#if GPIO_7_EN && (GPIO_7_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_7) -#endif - -#if GPIO_8_EN && (GPIO_8_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_8) -#endif - -#if GPIO_9_EN && (GPIO_9_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_9) -#endif - -#if GPIO_10_EN && (GPIO_10_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_10) -#endif - -#if GPIO_11_EN && (GPIO_11_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_11) -#endif - -#if GPIO_12_EN && (GPIO_12_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_12) -#endif - -#if GPIO_13_EN && (GPIO_13_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_13) -#endif - -#if GPIO_14_EN && (GPIO_14_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_14) -#endif - -#if GPIO_15_EN && (GPIO_15_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_15) -#endif - -#if GPIO_16_EN && (GPIO_16_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_16) -#endif - -#if GPIO_17_EN && (GPIO_17_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_17) -#endif - -#if GPIO_18_EN && (GPIO_18_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_18) -#endif - -#if GPIO_19_EN && (GPIO_19_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_19) -#endif - -#if GPIO_20_EN && (GPIO_20_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_20) -#endif - -#if GPIO_21_EN && (GPIO_21_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_21) -#endif - -#if GPIO_22_EN && (GPIO_22_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_22) -#endif - -#if GPIO_23_EN && (GPIO_23_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_23) -#endif - -#if GPIO_24_EN && (GPIO_24_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_24) -#endif - -#if GPIO_25_EN && (GPIO_25_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_25) -#endif - -#if GPIO_26_EN && (GPIO_26_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_26) -#endif - -#if GPIO_27_EN && (GPIO_27_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_27) -#endif - -#if GPIO_28_EN && (GPIO_28_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_28) -#endif - -#if GPIO_29_EN && (GPIO_29_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_29) -#endif - -#if GPIO_30_EN && (GPIO_30_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_30) -#endif - -#if GPIO_31_EN && (GPIO_31_PORT_BASE == PORTH_BASE) - GPIO_ISR_TEMPLATE(GPIO_31) -#endif - + irq_handler(PORT_G); } -#endif /* PORTH_BASE */ +#endif /* ISR_PORT_G */ diff --git a/cpu/kinetis_common/include/periph_cpu.h b/cpu/kinetis_common/include/periph_cpu.h index ee093418fd58a..b0927710ebc36 100644 --- a/cpu/kinetis_common/include/periph_cpu.h +++ b/cpu/kinetis_common/include/periph_cpu.h @@ -25,7 +25,68 @@ extern "C" { #endif -/* nothing to do here, yet */ +/** + * @brief Overwrite the default gpio_t type definition + * @{ + */ +#define HAVE_GPIO_T +typedef uint16_t gpio_t; +/** @} */ + +/** + * @brief Definition of a fitting UNDEF value + */ +#define GPIO_UNDEF (0xffff) + +#define GPIO_PORT_SHIFT (8) +#define GPIO_PORT_MASK (0xff << (GPIO_PORT_SHIFT)) +#define GPIO_PIN_SHIFT (0) +#define GPIO_PIN_MASK (0xff << (GPIO_PIN_SHIFT)) + +/** + * @brief Define a CPU specific GPIO pin generator macro + */ +#define GPIO_PIN(port, pin) ((port << GPIO_PORT_SHIFT) | pin) + +/** + * @brief Override values for pull register configuration + * @{ + */ +#define HAVE_GPIO_PP_T +typedef enum { + GPIO_NOPULL = 4, /**< do not use internal pull resistors */ + GPIO_PULLUP = 9, /**< enable internal pull-up resistor */ + GPIO_PULLDOWN = 8 /**< enable internal pull-down resistor */ +} gpio_pp_t; +/** @} */ + +/** + * @brief Override flank configuration values + * @{ + */ +#define HAVE_GPIO_FLANK_T +typedef enum { + GPIO_LOGIC_ZERO = 0x8, /**< interrupt on logic zero */ + GPIO_RISING = 0x9, /**< emit interrupt on rising flank */ + GPIO_FALLING = 0xa, /**< emit interrupt on falling flank */ + GPIO_BOTH = 0xb, /**< emit interrupt on both flanks */ + GPIO_LOGIC_ONE = 0xc, /**< interrupt on logic one */ +} gpio_flank_t; +/** @} */ + +/** + * @brief Available ports on the Kinetis family + */ +enum { + PORT_A = 0, /**< port A */ + PORT_B = 1, /**< port B */ + PORT_C = 2, /**< port C */ + PORT_D = 3, /**< port D */ + PORT_E = 4, /**< port E */ + PORT_F = 5, /**< port F */ + PORT_G = 6, /**< port G */ + PORT_NUMOF +}; #ifdef __cplusplus } diff --git a/cpu/kw2x/cpu.c b/cpu/kw2x/cpu.c index 888c7adca25d2..1844e1312f900 100644 --- a/cpu/kw2x/cpu.c +++ b/cpu/kw2x/cpu.c @@ -40,27 +40,32 @@ void cpu_init(void) static inline void modem_clock_init(void) { - SIM->SCGC5 |= (SIM_SCGC5_PORTC_MASK); - SIM->SCGC5 |= (SIM_SCGC5_PORTB_MASK); /* Use the CLK_OUT of the modem as the clock source. */ + + /* Enable GPIO clock gates */ + KW2XDRF_PORT_CLKEN(); + KW2XDRF_CLK_CTRL_CLKEN(); + /* Modem RST_B is connected to PTB19 and can be used to reset the modem. */ - PORTB->PCR[19] = PORT_PCR_MUX(1); - GPIOB->PDDR |= (1 << 19); - GPIOB->PCOR |= (1 << 19); + KW2XDRF_PORT_DEV->PCR[KW2XDRF_RST_PIN] = PORT_PCR_MUX(1); + BITBAND_REG32(KW2XDRF_GPIO->PDDR, KW2XDRF_RST_PIN) = 1; + KW2XDRF_GPIO->PCOR = (1 << KW2XDRF_RST_PIN); + /* Modem GPIO5 is connected to PTC0 and can be used to select CLK_OUT frequency, */ /* set PTC0 high for CLK_OUT=32.787kHz and low for CLK_OUT=4MHz. */ - PORTC->PCR[0] = PORT_PCR_MUX(1); - GPIOC->PDDR |= (1 << 0); - GPIOC->PCOR |= (1 << 0); + KW2XDRF_CLK_CTRL_PORT_DEV->PCR[KW2XDRF_CLK_CTRL_PIN] = PORT_PCR_MUX(1); + BITBAND_REG32(KW2XDRF_CLK_CTRL_GPIO->PDDR, KW2XDRF_CLK_CTRL_PIN) = 1; + KW2XDRF_CLK_CTRL_GPIO->PCOR = (1 << KW2XDRF_CLK_CTRL_PIN); + /* Modem IRQ_B is connected to PTB3, modem interrupt request to the MCU. */ - PORTB->PCR[KW2XDRF_IRQ_PIN] = PORT_PCR_MUX(1); - GPIOB->PDDR &= ~(1 << KW2XDRF_IRQ_PIN); + KW2XDRF_PORT_DEV->PCR[KW2XDRF_IRQ_PIN] = PORT_PCR_MUX(1); + BITBAND_REG32(KW2XDRF_GPIO->PDDR, KW2XDRF_IRQ_PIN) = 0; /* release the reset */ - GPIOB->PSOR |= (1 << 19); + KW2XDRF_GPIO->PSOR = (1 << KW2XDRF_RST_PIN); /* wait for modem IRQ_B interrupt request */ - while (GPIOB->PDIR & (1 << KW2XDRF_IRQ_PIN)); + while (KW2XDRF_GPIO->PDIR & (1 << KW2XDRF_IRQ_PIN)); } /** diff --git a/cpu/kw2x/include/cpu_conf.h b/cpu/kw2x/include/cpu_conf.h index 262c5e465b3a8..a16f6f55dc47a 100644 --- a/cpu/kw2x/include/cpu_conf.h +++ b/cpu/kw2x/include/cpu_conf.h @@ -61,6 +61,31 @@ extern "C" */ #define CPUID_ID_PTR ((void *)(&(SIM_UIDH))) +/** + * @name GPIO pin mux function numbers + */ +/** @{ */ +#define PIN_MUX_FUNCTION_ANALOG 0 +#define PIN_MUX_FUNCTION_GPIO 1 +/** @} */ +/** + * @name GPIO interrupt flank settings + */ +/** @{ */ +#define PIN_INTERRUPT_RISING 0b1001 +#define PIN_INTERRUPT_FALLING 0b1010 +#define PIN_INTERRUPT_EDGE 0b1011 +/** @} */ + +/** @name PORT module clock gates */ +/** @{ */ +#define PORTA_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTA_SHIFT)) +#define PORTB_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTB_SHIFT)) +#define PORTC_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTC_SHIFT)) +#define PORTD_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTD_SHIFT)) +#define PORTE_CLOCK_GATE (BITBAND_REG32(SIM->SCGC5, SIM_SCGC5_PORTE_SHIFT)) +/** @} */ + /** * @brief MCU specific Low Power Timer settings. */ @@ -75,18 +100,25 @@ extern "C" * * @{ */ -#define KW2XDRF_PORT_BASE PORTB_BASE /**< MCU Port connected to Modem*/ -#define KW2XDRF_PORT PORTB /**< MCU Port connected to Modem*/ +#define KW2XDRF_PORT_DEV PORTB /**< MCU Port connected to Modem*/ +#define KW2XDRF_PORT PORT_B /**< MCU Port connected to Modem*/ #define KW2XDRF_GPIO GPIOB /**< GPIO Device connected to Modem */ #define KW2XDRF_PORT_IRQn PORTB_IRQn -#define KW2XDRF_PORT_CLKEN() (SIM->SCGC5 |= (SIM_SCGC5_PORTB_MASK)) /**< Clock Enable for PORTB*/ +/** Clock Enable for PORTB*/ +#define KW2XDRF_PORT_CLKEN() (PORTB_CLOCK_GATE = 1) #define KW2XDRF_PIN_AF 2 /**< Pin Muxing Parameter for GPIO Device*/ #define KW2XDRF_PCS0_PIN 10 /**< SPI Slave Select Pin */ #define KW2XDRF_SCK_PIN 11 /**< SPI Clock Output Pin */ #define KW2XDRF_SOUT_PIN 16 /**< SPI Master Data Output Pin */ #define KW2XDRF_SIN_PIN 17 /**< SPI Master Data Input Pin */ - +#define KW2XDRF_RST_PIN 19 /**< Reset pin */ #define KW2XDRF_IRQ_PIN 3 /**< Modem's IRQ Output (activ low) */ +#define KW2XDRF_CLK_CTRL_PORT PORT_C /**< CLK_OUT control pin port */ +#define KW2XDRF_CLK_CTRL_PORT_DEV PORTC /**< CLK_OUT control pin PORT device */ +#define KW2XDRF_CLK_CTRL_GPIO GPIOC /**< CLK_OUT control pin GPIO device */ +#define KW2XDRF_CLK_CTRL_CLKEN() (PORTC_CLOCK_GATE = 1) +#define KW2XDRF_CLK_CTRL_PIN 0 /**< CLK_OUT control pin */ + /** @} */ #ifdef __cplusplus