summaryrefslogtreecommitdiff
path: root/nuttx
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx')
-rw-r--r--nuttx/ChangeLog2
-rw-r--r--nuttx/arch/arm/src/kl/chip/k25z128_pinmux.h2
-rw-r--r--nuttx/arch/arm/src/kl/chip/kl_gpio.h628
-rw-r--r--nuttx/arch/arm/src/kl/chip/kl_memorymap.h2
-rw-r--r--nuttx/arch/arm/src/kl/kl_clockconfig.c2
-rw-r--r--nuttx/arch/arm/src/kl/kl_clockconfig.h87
-rw-r--r--nuttx/arch/arm/src/kl/kl_dma.h231
-rw-r--r--nuttx/arch/arm/src/kl/kl_gpio.c392
-rw-r--r--nuttx/arch/arm/src/kl/kl_gpio.h342
-rw-r--r--nuttx/arch/arm/src/kl/kl_internal.h775
-rw-r--r--nuttx/arch/arm/src/kl/kl_irq.h16
-rw-r--r--nuttx/arch/arm/src/kl/kl_lowputc.c3
-rw-r--r--nuttx/arch/arm/src/kl/kl_lowputc.h44
-rw-r--r--nuttx/arch/arm/src/kl/kl_serial.c2
-rw-r--r--nuttx/arch/arm/src/kl/kl_spi.h142
-rw-r--r--nuttx/arch/arm/src/kl/kl_start.c3
-rw-r--r--nuttx/configs/freedom-kl25z/src/freedom-kl25z.h6
-rw-r--r--nuttx/configs/freedom-kl25z/src/kl_led.c8
18 files changed, 1038 insertions, 1649 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index 119d77280..8b8c3152d 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -4661,3 +4661,5 @@
(2013-5-2).
* drivers/mtd/mtd_partition.c: Fix a few bugs and add support for the
(option) byte write method (2013-5-3).
+ * arch/arm/src/kl: Repartitioning of definitions in headef files
+ from Alan Carvalho de Assis (2013-5-3).
diff --git a/nuttx/arch/arm/src/kl/chip/k25z128_pinmux.h b/nuttx/arch/arm/src/kl/chip/k25z128_pinmux.h
index e11e0c8a6..597b55581 100644
--- a/nuttx/arch/arm/src/kl/chip/k25z128_pinmux.h
+++ b/nuttx/arch/arm/src/kl/chip/k25z128_pinmux.h
@@ -312,7 +312,7 @@
#define PIN_I2C0_SDA_4 (PIN_ALT5 | PIN_PORTE | PIN25)
#define PIN_CMP0_IN5 (PIN_ANALOG | PIN_PORTE | PIN29)
-#define PIN_ADC0_SE4A (PIN_ANALOG | PIN_PORTE | PIN29)
+#define PIN_ADC0_SE4B (PIN_ANALOG | PIN_PORTE | PIN29)
#define PIN_TPM0_CH2_4 (PIN_ALT3 | PIN_PORTE | PIN29)
#define PIN_TPM_CLKIN0_4 (PIN_ALT4 | PIN_PORTE | PIN29)
diff --git a/nuttx/arch/arm/src/kl/chip/kl_gpio.h b/nuttx/arch/arm/src/kl/chip/kl_gpio.h
index 64b1cad4b..997e1d1ce 100644
--- a/nuttx/arch/arm/src/kl/chip/kl_gpio.h
+++ b/nuttx/arch/arm/src/kl/chip/kl_gpio.h
@@ -1,5 +1,5 @@
-/********************************************************************************************
- * arch/arm/src/nuc1xx/chip/nuc_gpio.h
+/************************************************************************************
+ * arch/arm/src/kl/chip/kl_gpio.h
*
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
@@ -31,526 +31,130 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- ********************************************************************************************/
+ ************************************************************************************/
#ifndef __ARCH_ARM_SRC_KL_CHIP_KL_GPIO_H
#define __ARCH_ARM_SRC_KL_CHIP_KL_GPIO_H
-/********************************************************************************************
+/************************************************************************************
* Included Files
- ********************************************************************************************/
-
-#include <nuttx/config.h>
+ ************************************************************************************/
#include "chip.h"
-/********************************************************************************************
- * Pre-processor Definitions
- ********************************************************************************************/
-/* Register offsets *************************************************************************/
-
-#define KL_GPIO_PORTA 0
-#define KL_GPIO_PORTB 1
-#define KL_GPIO_PORTC 2
-#define KL_GPIO_PORTD 3
-#define KL_GPIO_PORTE 4
-
-#define KL_GPIO_NPORTS 5
-
-/* GPIO control registers */
-
-#define KL_GPIO_CTRL_OFFSET(n) (0x0000 + ((n) << 6))
-#define KL_GPIOA_CTRL_OFFSET (0x0000 + ((KL_GPIO_PORTA) << 6))
-#define KL_GPIOB_CTRL_OFFSET (0x0000 + ((KL_GPIO_PORTB) << 6))
-#define KL_GPIOC_CTRL_OFFSET (0x0000 + ((KL_GPIO_PORTC) << 6))
-#define KL_GPIOD_CTRL_OFFSET (0x0000 + ((KL_GPIO_PORTD) << 6))
-#define KL_GPIOE_CTRL_OFFSET (0x0000 + ((KL_GPIO_PORTE) << 6))
-
-#define KL_GPIO_PMD_OFFSET 0x0000 /* GPIO port pin I/O mode control */
-#define KL_GPIO_OFFD_OFFSET 0x0004 /* GPIO port pin digital input path disable control */
-#define KL_GPIO_DOUT_OFFSET 0x0008 /* GPIO port data output value */
-#define KL_GPIO_DMASK_OFFSET 0x000c /* GPIO port data output write mask */
-#define KL_GPIO_PIN_OFFSET 0x0010 /* GPIO port pin value */
-#define KL_GPIO_DBEN_OFFSET 0x0014 /* GPIO port de-bounce enable */
-#define KL_GPIO_IMD_OFFSET 0x0018 /* GPIO port interrupt mode control */
-#define KL_GPIO_IEN_OFFSET 0x001c /* GPIO port interrupt enable */
-#define KL_GPIO_ISRC_OFFSET 0x0020 /* GPIO port interrupt source flag */
-
-/* GPIO port A control registers */
-
-#define KL_GPIOA_PMD_OFFSET (KL_GPIOA_CTRL_OFFSET+KL_GPIO_PMD_OFFSET)
-#define KL_GPIOA_OFFD_OFFSET (KL_GPIOA_CTRL_OFFSET+KL_GPIO_OFFD_OFFSET)
-#define KL_GPIOA_DOUT_OFFSET (KL_GPIOA_CTRL_OFFSET+KL_GPIO_DOUT_OFFSET)
-#define KL_GPIOA_DMASK_OFFSET (KL_GPIOA_CTRL_OFFSET+KL_GPIO_DMASK_OFFSET)
-#define KL_GPIOA_PIN_OFFSET (KL_GPIOA_CTRL_OFFSET+KL_GPIO_PIN_OFFSET)
-#define KL_GPIOA_DBEN_OFFSET (KL_GPIOA_CTRL_OFFSET+KL_GPIO_DBEN_OFFSET)
-#define KL_GPIOA_IMD_OFFSET (KL_GPIOA_CTRL_OFFSET+KL_GPIO_IMD_OFFSET)
-#define KL_GPIOA_IEN_OFFSET (KL_GPIOA_CTRL_OFFSET+KL_GPIO_IEN_OFFSET)
-#define KL_GPIOA_ISRC_OFFSET (KL_GPIOA_CTRL_OFFSET+KL_GPIO_ISRC_OFFSET)
-
-/* GPIO port B control registers */
-
-#define KL_GPIOB_PMD_OFFSET (KL_GPIOB_CTRL_OFFSET+KL_GPIO_PMD_OFFSET)
-#define KL_GPIOB_OFFD_OFFSET (KL_GPIOB_CTRL_OFFSET+KL_GPIO_OFFD_OFFSET)
-#define KL_GPIOB_DOUT_OFFSET (KL_GPIOB_CTRL_OFFSET+KL_GPIO_DOUT_OFFSET)
-#define KL_GPIOB_DMASK_OFFSET (KL_GPIOB_CTRL_OFFSET+KL_GPIO_DMASK_OFFSET)
-#define KL_GPIOB_PIN_OFFSET (KL_GPIOB_CTRL_OFFSET+KL_GPIO_PIN_OFFSET)
-#define KL_GPIOB_DBEN_OFFSET (KL_GPIOB_CTRL_OFFSET+KL_GPIO_DBEN_OFFSET)
-#define KL_GPIOB_IMD_OFFSET (KL_GPIOB_CTRL_OFFSET+KL_GPIO_IMD_OFFSET)
-#define KL_GPIOB_IEN_OFFSET (KL_GPIOB_CTRL_OFFSET+KL_GPIO_IEN_OFFSET)
-#define KL_GPIOB_ISRC_OFFSET (KL_GPIOB_CTRL_OFFSET+KL_GPIO_ISRC_OFFSET)
-
-/* GPIO port C control registers */
-
-#define KL_GPIOC_PMD_OFFSET (KL_GPIOC_CTRL_OFFSET+KL_GPIO_PMD_OFFSET)
-#define KL_GPIOC_OFFD_OFFSET (KL_GPIOC_CTRL_OFFSET+KL_GPIO_OFFD_OFFSET)
-#define KL_GPIOC_DOUT_OFFSET (KL_GPIOC_CTRL_OFFSET+KL_GPIO_DOUT_OFFSET)
-#define KL_GPIOC_DMASK_OFFSET (KL_GPIOC_CTRL_OFFSET+KL_GPIO_DMASK_OFFSET)
-#define KL_GPIOC_PIN_OFFSET (KL_GPIOC_CTRL_OFFSET+KL_GPIO_PIN_OFFSET)
-#define KL_GPIOC_DBEN_OFFSET (KL_GPIOC_CTRL_OFFSET+KL_GPIO_DBEN_OFFSET)
-#define KL_GPIOC_IMD_OFFSET (KL_GPIOC_CTRL_OFFSET+KL_GPIO_IMD_OFFSET)
-#define KL_GPIOC_IEN_OFFSET (KL_GPIOC_CTRL_OFFSET+KL_GPIO_IEN_OFFSET)
-#define KL_GPIOC_ISRC_OFFSET (KL_GPIOC_CTRL_OFFSET+KL_GPIO_ISRC_OFFSET)
-
-/* GPIO port D control registers */
-
-#define KL_GPIOD_PMD_OFFSET (KL_GPIOD_CTRL_OFFSET+KL_GPIO_PMD_OFFSET)
-#define KL_GPIOD_OFFD_OFFSET (KL_GPIOD_CTRL_OFFSET+KL_GPIO_OFFD_OFFSET)
-#define KL_GPIOD_DOUT_OFFSET (KL_GPIOD_CTRL_OFFSET+KL_GPIO_DOUT_OFFSET)
-#define KL_GPIOD_DMASK_OFFSET (KL_GPIOD_CTRL_OFFSET+KL_GPIO_DMASK_OFFSET)
-#define KL_GPIOD_PIN_OFFSET (KL_GPIOD_CTRL_OFFSET+KL_GPIO_PIN_OFFSET)
-#define KL_GPIOD_DBEN_OFFSET (KL_GPIOD_CTRL_OFFSET+KL_GPIO_DBEN_OFFSET)
-#define KL_GPIOD_IMD_OFFSET (KL_GPIOD_CTRL_OFFSET+KL_GPIO_IMD_OFFSET)
-#define KL_GPIOD_IEN_OFFSET (KL_GPIOD_CTRL_OFFSET+KL_GPIO_IEN_OFFSET)
-#define KL_GPIOD_ISRC_OFFSET (KL_GPIOD_CTRL_OFFSET+KL_GPIO_ISRC_OFFSET)
-
-/* GPIO port E control registers */
-
-#define KL_GPIOE_PMD_OFFSET (KL_GPIOE_CTRL_OFFSET+KL_GPIO_PMD_OFFSET)
-#define KL_GPIOE_OFFD_OFFSET (KL_GPIOE_CTRL_OFFSET+KL_GPIO_OFFD_OFFSET)
-#define KL_GPIOE_DOUT_OFFSET (KL_GPIOE_CTRL_OFFSET+KL_GPIO_DOUT_OFFSET)
-#define KL_GPIOE_DMASK_OFFSET (KL_GPIOE_CTRL_OFFSET+KL_GPIO_DMASK_OFFSET)
-#define KL_GPIOE_PIN_OFFSET (KL_GPIOE_CTRL_OFFSET+KL_GPIO_PIN_OFFSET)
-#define KL_GPIOE_DBEN_OFFSET (KL_GPIOE_CTRL_OFFSET+KL_GPIO_DBEN_OFFSET)
-#define KL_GPIOE_IMD_OFFSET (KL_GPIOE_CTRL_OFFSET+KL_GPIO_IMD_OFFSET)
-#define KL_GPIOE_IEN_OFFSET (KL_GPIOE_CTRL_OFFSET+KL_GPIO_IEN_OFFSET)
-#define KL_GPIOE_ISRC_OFFSET (KL_GPIOE_CTRL_OFFSET+KL_GPIO_ISRC_OFFSET)
-
-/* Debounce control registers */
-
-#define KL_GPIO_DBNCECON_OFFSEt 0x0180 /* De-bounce cycle control register */
-
-/* GPIO port data I/O register offsets */
-
-#define KL_PORT_DATAIO_OFFSET(p) (0x0200 + ((p)<< 6))
-# define KL_PORTA_DATAIO_OFFSET (0x0200 + ((KL_GPIO_PORTA) << 6))
-# define KL_PORTB_DATAIO_OFFSET (0x0200 + ((KL_GPIO_PORTB) << 6))
-# define KL_PORTC_DATAIO_OFFSET (0x0200 + ((KL_GPIO_PORTC) << 6))
-# define KL_PORTD_DATAIO_OFFSET (0x0200 + ((KL_GPIO_PORTD) << 6))
-# define KL_PORTE_DATAIO_OFFSET (0x0200 + ((KL_GPIO_PORTE) << 6))
-
-/* GPIO port pin data I/O register offsets */
-
-#define KL_PORT_PIN_OFFSET(n) ((n) << 2)
-# define KL_PORT_PIN0_OFFSET (0 << 2)
-# define KL_PORT_PIN1_OFFSET (1 << 2)
-# define KL_PORT_PIN2_OFFSET (2 << 2)
-# define KL_PORT_PIN3_OFFSET (3 << 2)
-# define KL_PORT_PIN4_OFFSET (4 << 2)
-# define KL_PORT_PIN5_OFFSET (5 << 2)
-# define KL_PORT_PIN6_OFFSET (16 << 2)
-# define KL_PORT_PIN7_OFFSET (17 << 2)
-# define KL_PORT_PIN8_OFFSET (18 << 2)
-# define KL_PORT_PIN9_OFFSET (19 << 2)
-# define KL_PORT_PIN10_OFFSET (10 << 2)
-# define KL_PORT_PIN11_OFFSET (11 << 2)
-# define KL_PORT_PIN12_OFFSET (12 << 2)
-# define KL_PORT_PIN13_OFFSET (13 << 2)
-# define KL_PORT_PIN14_OFFSET (14 << 2)
-# define KL_PORT_PIN15_OFFSET (15 << 2)
-
-#define KL_PORT_PDIO_OFFSET(p,n) (KL_PORT_DATAIO_OFFSET(p)+KL_PORT_PIN_OFFSET(n))
-
-/* GPIO PA Pin Data Input/Output */
-
-#define KL_PORTA_PDIO_OFFSET(n) (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN_OFFSET(n))
-# define KL_PA1_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA2_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA3_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA4_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA5_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA6_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA7_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA8_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA9_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA10_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA11_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA12_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA13_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA14_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PA15_PDIO_OFFSET (KL_PORTA_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-
-/* GPIO PB Pin Data Input/Output */
-
-#define KL_PORTB_PDIO_OFFSET(n) (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN_OFFSET(n))
-# define KL_PB1_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB2_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB3_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB4_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB5_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB6_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB7_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB8_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB9_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB10_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB11_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB12_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB13_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB14_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PB15_PDIO_OFFSET (KL_PORTB_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-
-/* GPIO PC Pin Data Input/Output */
-
-#define KL_PORTC_PDIO_OFFSET(n) (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN_OFFSET(n))
-# define KL_PC1_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC2_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC3_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC4_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC5_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC6_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC7_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC8_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC9_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC10_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC11_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC12_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC13_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC14_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PC15_PDIO_OFFSET (KL_PORTC_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-
-/* GPIO PD Pin Data Input/Output */
-
-#define KL_PORTD_PDIO_OFFSET(n) (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN_OFFSET(n))
-# define KL_PD1_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD2_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD3_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD4_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD5_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD6_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD7_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD8_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD9_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD10_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD11_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD12_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD13_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD14_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-# define KL_PD15_PDIO_OFFSET (KL_PORTD_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-
-/* GPIO PE Pin Data Input/Output */
-
-#define KL_PORTE_PDIO_OFFSET(n) (KL_PORTE_DATAIO_OFFSET+KL_PORT_PIN_OFFSET(n))
-# define KL_PE5_PDIO_OFFSET (KL_PORTE_DATAIO_OFFSET+KL_PORT_PIN0_OFFSET)
-
-/* Register addresses ***********************************************************************/
-
-/* GPIO control registers */
-
-#define KL_GPIO_CTRL_BASE(n) (KL_GPIO_BASE+KL_GPIO_CTRL_OFFSET(n))
-#define KL_GPIOA_CTRL_BASE (KL_GPIO_BASE+KL_GPIOA_CTRL_OFFSET)
-#define KL_GPIOB_CTRL_BASE (KL_GPIO_BASE+KL_GPIOB_CTRL_OFFSET)
-#define KL_GPIOC_CTRL_BASE (KL_GPIO_BASE+KL_GPIOC_CTRL_OFFSET)
-#define KL_GPIOD_CTRL_BASE (KL_GPIO_BASE+KL_GPIOD_CTRL_OFFSET)
-#define KL_GPIOE_CTRL_BASE (KL_GPIO_BASE+KL_GPIOE_CTRL_OFFSET)
-
-/* GPIO port A control registers */
-
-#define KL_GPIOA_PMD (KL_GPIO_BASE+KL_GPIOA_PMD_OFFSET)
-#define KL_GPIOA_OFFD (KL_GPIO_BASE+KL_GPIOA_OFFD_OFFSET)
-#define KL_GPIOA_DOUT (KL_GPIO_BASE+KL_GPIOA_DOUT_OFFSET)
-#define KL_GPIOA_DMASK (KL_GPIO_BASE+KL_GPIOA_DMASK_OFFSET)
-#define KL_GPIOA_PIN (KL_GPIO_BASE+KL_GPIOA_PIN_OFFSET)
-#define KL_GPIOA_DBEN (KL_GPIO_BASE+KL_GPIOA_DBEN_OFFSET)
-#define KL_GPIOA_IMD (KL_GPIO_BASE+KL_GPIOA_IMD_OFFSET)
-#define KL_GPIOA_IEN (KL_GPIO_BASE+KL_GPIOA_IEN_OFFSET)
-#define KL_GPIOA_ISRC (KL_GPIO_BASE+KL_GPIOA_ISRC_OFFSET)
-
-/* GPIO port B control registers */
-
-#define KL_GPIOB_PMD (KL_GPIO_BASE+KL_GPIOB_PMD_OFFSET)
-#define KL_GPIOB_OFFD (KL_GPIO_BASE+KL_GPIOB_OFFD_OFFSET)
-#define KL_GPIOB_DOUT (KL_GPIO_BASE+KL_GPIOB_DOUT_OFFSET)
-#define KL_GPIOB_DMASK (KL_GPIO_BASE+KL_GPIOB_DMASK_OFFSET)
-#define KL_GPIOB_PIN (KL_GPIO_BASE+KL_GPIOB_PIN_OFFSET)
-#define KL_GPIOB_DBEN (KL_GPIO_BASE+KL_GPIOB_DBEN_OFFSET)
-#define KL_GPIOB_IMD (KL_GPIO_BASE+KL_GPIOB_IMD_OFFSET)
-#define KL_GPIOB_IEN (KL_GPIO_BASE+KL_GPIOB_IEN_OFFSET)
-#define KL_GPIOB_ISRC (KL_GPIO_BASE+KL_GPIOB_ISRC_OFFSET)
-
-/* GPIO port C control registers */
-
-#define KL_GPIOC_PMD (KL_GPIO_BASE+KL_GPIOC_PMD_OFFSET)
-#define KL_GPIOC_OFFD (KL_GPIO_BASE+KL_GPIOC_OFFD_OFFSET)
-#define KL_GPIOC_DOUT (KL_GPIO_BASE+KL_GPIOC_DOUT_OFFSET)
-#define KL_GPIOC_DMASK (KL_GPIO_BASE+KL_GPIOC_DMASK_OFFSET)
-#define KL_GPIOC_PIN (KL_GPIO_BASE+KL_GPIOC_PIN_OFFSET)
-#define KL_GPIOC_DBEN (KL_GPIO_BASE+KL_GPIOC_DBEN_OFFSET)
-#define KL_GPIOC_IMD (KL_GPIO_BASE+KL_GPIOC_IMD_OFFSET)
-#define KL_GPIOC_IEN (KL_GPIO_BASE+KL_GPIOC_IEN_OFFSET)
-#define KL_GPIOC_ISRC (KL_GPIO_BASE+KL_GPIOC_ISRC_OFFSET)
-
-/* GPIO port D control registers */
-
-#define KL_GPIOD_PMD (KL_GPIO_BASE+KL_GPIOD_PMD_OFFSET)
-#define KL_GPIOD_OFFD (KL_GPIO_BASE+KL_GPIOD_OFFD_OFFSET)
-#define KL_GPIOD_DOUT (KL_GPIO_BASE+KL_GPIOD_DOUT_OFFSET)
-#define KL_GPIOD_DMASK (KL_GPIO_BASE+KL_GPIOD_DMASK_OFFSET)
-#define KL_GPIOD_PIN (KL_GPIO_BASE+KL_GPIOD_PIN_OFFSET)
-#define KL_GPIOD_DBEN (KL_GPIO_BASE+KL_GPIOD_DBEN_OFFSET)
-#define KL_GPIOD_IMD (KL_GPIO_BASE+KL_GPIOD_IMD_OFFSET)
-#define KL_GPIOD_IEN (KL_GPIO_BASE+KL_GPIOD_IEN_OFFSET)
-#define KL_GPIOD_ISRC (KL_GPIO_BASE+KL_GPIOD_ISRC_OFFSET)
-
-/* GPIO port E control registers */
-
-#define KL_GPIOE_PMD (KL_GPIO_BASE+KL_GPIOE_PMD_OFFSET)
-#define KL_GPIOE_OFFD (KL_GPIO_BASE+KL_GPIOE_OFFD_OFFSET)
-#define KL_GPIOE_DOUT (KL_GPIO_BASE+KL_GPIOE_DOUT_OFFSET)
-#define KL_GPIOE_DMASK (KL_GPIO_BASE+KL_GPIOE_DMASK_OFFSET)
-#define KL_GPIOE_PIN (KL_GPIO_BASE+KL_GPIOE_PIN_OFFSET)
-#define KL_GPIOE_DBEN (KL_GPIO_BASE+KL_GPIOE_DBEN_OFFSET)
-#define KL_GPIOE_IMD (KL_GPIO_BASE+KL_GPIOE_IMD_OFFSET)
-#define KL_GPIOE_IEN (KL_GPIO_BASE+KL_GPIOE_IEN_OFFSET)
-#define KL_GPIOE_ISRC (KL_GPIO_BASE+KL_GPIOE_ISRC_OFFSET)
-
-/* Debounce control registers */
-
-#define KL_GPIO_DBNCECON (KL_GPIO_BASE+KL_GPIO_DBNCECON_OFFSET)
-
-/* GPIO port data I/O register offsets */
-
-#define KL_PORT_DATAIO_BASE(p) (KL_GPIO_BASE+KL_PORT_DATAIO_OFFSET(p))
-# define KL_PORTA_DATAIO_BASE (KL_GPIO_BASE+KL_PORTA_DATAIO_OFFSET)
-# define KL_PORTB_DATAIO_BASE (KL_GPIO_BASE+KL_PORTB_DATAIO_OFFSET)
-# define KL_PORTC_DATAIO_BASE (KL_GPIO_BASE+KL_PORTC_DATAIO_OFFSET)
-# define KL_PORTD_DATAIO_BASE (KL_GPIO_BASE+KL_PORTD_DATAIO_OFFSET)
-# define KL_PORTE_DATAIO_BASE (KL_GPIO_BASE+KL_PORTE_DATAIO_OFFSET)
-
-#define KL_PORT_PDIO(p,n) (KL_GPIO_BASE+KL_PORT_PDIO_OFFSET(p,n))
-
-/* GPIO PA Pin Data Input/Output */
-
-#define KL_PORTA_PDIO(n) (KL_GPIO_BASE+KL_PORTA_PDIO_OFFSET(n))
-# define KL_PA1_PDIO (KL_GPIO_BASE+KL_PA1_PDIO_OFFSET)
-# define KL_PA2_PDIO (KL_GPIO_BASE+KL_PA2_PDIO_OFFSET)
-# define KL_PA3_PDIO (KL_GPIO_BASE+KL_PA3_PDIO_OFFSET)
-# define KL_PA4_PDIO (KL_GPIO_BASE+KL_PA4_PDIO_OFFSET)
-# define KL_PA5_PDIO (KL_GPIO_BASE+KL_PA5_PDIO_OFFSET)
-# define KL_PA6_PDIO (KL_GPIO_BASE+KL_PA6_PDIO_OFFSET)
-# define KL_PA7_PDIO (KL_GPIO_BASE+KL_PA7_PDIO_OFFSET)
-# define KL_PA8_PDIO (KL_GPIO_BASE+KL_PA8_PDIO_OFFSET)
-# define KL_PA9_PDIO (KL_GPIO_BASE+KL_PA9_PDIO_OFFSET)
-# define KL_PA10_PDIO (KL_GPIO_BASE+KL_PA10_PDIO_OFFSET)
-# define KL_PA11_PDIO (KL_GPIO_BASE+KL_PA11_PDIO_OFFSET)
-# define KL_PA12_PDIO (KL_GPIO_BASE+KL_PA12_PDIO_OFFSET)
-# define KL_PA13_PDIO (KL_GPIO_BASE+KL_PA13_PDIO_OFFSET)
-# define KL_PA14_PDIO (KL_GPIO_BASE+KL_PA14_PDIO_OFFSET)
-# define KL_PA15_PDIO (KL_GPIO_BASE+KL_PA15_PDIO_OFFSET)
-
-/* GPIO PB Pin Data Input/Output */
-
-#define KL_PORTB_PDIO(n) (KL_GPIO_BASE+KL_PORTB_PDIO_OFFSET(n))
-# define KL_PB1_PDIO (KL_GPIO_BASE+KL_PB1_PDIO_OFFSET)
-# define KL_PB2_PDIO (KL_GPIO_BASE+KL_PB2_PDIO_OFFSET)
-# define KL_PB3_PDIO (KL_GPIO_BASE+KL_PB3_PDIO_OFFSET)
-# define KL_PB4_PDIO (KL_GPIO_BASE+KL_PB4_PDIO_OFFSET)
-# define KL_PB5_PDIO (KL_GPIO_BASE+KL_PB5_PDIO_OFFSET)
-# define KL_PB6_PDIO (KL_GPIO_BASE+KL_PB6_PDIO_OFFSET)
-# define KL_PB7_PDIO (KL_GPIO_BASE+KL_PB7_PDIO_OFFSET)
-# define KL_PB8_PDIO (KL_GPIO_BASE+KL_PB8_PDIO_OFFSET)
-# define KL_PB9_PDIO (KL_GPIO_BASE+KL_PB9_PDIO_OFFSET)
-# define KL_PB10_PDIO (KL_GPIO_BASE+KL_PB10_PDIO_OFFSET)
-# define KL_PB11_PDIO (KL_GPIO_BASE+KL_PB11_PDIO_OFFSET)
-# define KL_PB12_PDIO (KL_GPIO_BASE+KL_PB12_PDIO_OFFSET)
-# define KL_PB13_PDIO (KL_GPIO_BASE+KL_PB13_PDIO_OFFSET)
-# define KL_PB14_PDIO (KL_GPIO_BASE+KL_PB14_PDIO_OFFSET)
-# define KL_PB15_PDIO (KL_GPIO_BASE+KL_PB15_PDIO_OFFSET)
-
-/* GPIO PC Pin Data Input/Output */
-
-#define KL_PORTC_PDIO(n) (KL_GPIO_BASE+KL_PORTC_PDIO_OFFSET(n))
-# define KL_PC1_PDIO (KL_GPIO_BASE+KL_PC1_PDIO_OFFSET)
-# define KL_PC2_PDIO (KL_GPIO_BASE+KL_PC2_PDIO_OFFSET)
-# define KL_PC3_PDIO (KL_GPIO_BASE+KL_PC3_PDIO_OFFSET)
-# define KL_PC4_PDIO (KL_GPIO_BASE+KL_PC4_PDIO_OFFSET)
-# define KL_PC5_PDIO (KL_GPIO_BASE+KL_PC5_PDIO_OFFSET)
-# define KL_PC6_PDIO (KL_GPIO_BASE+KL_PC6_PDIO_OFFSET)
-# define KL_PC7_PDIO (KL_GPIO_BASE+KL_PC7_PDIO_OFFSET)
-# define KL_PC8_PDIO (KL_GPIO_BASE+KL_PC8_PDIO_OFFSET)
-# define KL_PC9_PDIO (KL_GPIO_BASE+KL_PC9_PDIO_OFFSET)
-# define KL_PC10_PDIO (KL_GPIO_BASE+KL_PC10_PDIO_OFFSET)
-# define KL_PC11_PDIO (KL_GPIO_BASE+KL_PC11_PDIO_OFFSET)
-# define KL_PC12_PDIO (KL_GPIO_BASE+KL_PC12_PDIO_OFFSET)
-# define KL_PC13_PDIO (KL_GPIO_BASE+KL_PC13_PDIO_OFFSET)
-# define KL_PC14_PDIO (KL_GPIO_BASE+KL_PC14_PDIO_OFFSET)
-# define KL_PC15_PDIO (KL_GPIO_BASE+KL_PC15_PDIO_OFFSET)
-
-/* GPIO PD Pin Data Input/Output */
-
-#define KL_PORTD_PDIO(n) (KL_GPIO_BASE+KL_PORTD_PDIO_OFFSET(n))
-# define KL_PD1_PDIO (KL_GPIO_BASE+KL_PD1_PDIO_OFFSET)
-# define KL_PD2_PDIO (KL_GPIO_BASE+KL_PD2_PDIO_OFFSET)
-# define KL_PD3_PDIO (KL_GPIO_BASE+KL_PD3_PDIO_OFFSET)
-# define KL_PD4_PDIO (KL_GPIO_BASE+KL_PD4_PDIO_OFFSET)
-# define KL_PD5_PDIO (KL_GPIO_BASE+KL_PD5_PDIO_OFFSET)
-# define KL_PD6_PDIO (KL_GPIO_BASE+KL_PD6_PDIO_OFFSET)
-# define KL_PD7_PDIO (KL_GPIO_BASE+KL_PD7_PDIO_OFFSET)
-# define KL_PD8_PDIO (KL_GPIO_BASE+KL_PD8_PDIO_OFFSET)
-# define KL_PD9_PDIO (KL_GPIO_BASE+KL_PD9_PDIO_OFFSET)
-# define KL_PD10_PDIO (KL_GPIO_BASE+KL_PD10_PDIO_OFFSET)
-# define KL_PD11_PDIO (KL_GPIO_BASE+KL_PD11_PDIO_OFFSET)
-# define KL_PD12_PDIO (KL_GPIO_BASE+KL_PD12_PDIO_OFFSET)
-# define KL_PD13_PDIO (KL_GPIO_BASE+KL_PD13_PDIO_OFFSET)
-# define KL_PD14_PDIO (KL_GPIO_BASE+KL_PD14_PDIO_OFFSET)
-# define KL_PD15_PDIO (KL_GPIO_BASE+KL_PD15_PDIO_OFFSET)
-
-/* GPIO PE Pin Data Input/Output */
-
-#define KL_PORTE_PDIO(n) (KL_GPIO_BASE+KL_PORTE_PDIO_OFFSET(n))
-# define KL_PE5_PDIO (KL_GPIO_BASE+KL_PE5_PDIO_OFFSET)
-
-/* Register bit-field definitions ***********************************************************/
-
-/* GPIO port pin I/O mode control */
-
-#define GPIO_PMD_INPUT 0 /* Input */
-#define GPIO_PMD_OUTPUT 1 /* Push-pull output */
-#define GPIO_PMD_OPENDRAIN 2 /* Open drain output */
-#define GPIO_PMD_BIDI 3 /* Quasi bi-directional */
-
-#define GPIO_PMD_SHIFT(n) ((n) << 1) /* Bits 2n-2n+1: GPIOx Pin[n] mode control */
-#define GPIO_PMD_MASK(n) (3 << GPIO_PMD_SHIFT(n))
-# define GPIO_PMD(n,v) ((v) << GPIO_PMD_SHIFT(n))
-
-#define GPIO_PMD0_SHIFT (0) /* Bits 0-1: GPIOx Pin0 mode control */
-#define GPIO_PMD0_MASK (3 << GPIO_PMD0_SHIFT)
-# define GPIO_PMD0(v) ((v) << GPIO_PMD0_SHIFT)
-#define GPIO_PMD1_SHIFT (2) /* Bits 2-3: GPIOx Pin1 mode control */
-#define GPIO_PMD1_MASK (3 << GPIO_PMD1_SHIFT)
-# define GPIO_PMD1(v) ((v) << GPIO_PMD1_SHIFT)
-#define GPIO_PMD2_SHIFT (4) /* Bits 4-5: GPIOx Pin2 mode control */
-#define GPIO_PMD2_MASK (3 << GPIO_PMD2_SHIFT)
-# define GPIO_PMD2(v) ((v) << GPIO_PMD2_SHIFT)
-#define GPIO_PMD3_SHIFT (6) /* Bits 6-7: GPIOx Pin3 mode control */
-#define GPIO_PMD3_MASK (3 << GPIO_PMD3_SHIFT)
-# define GPIO_PMD3(v) ((v) << GPIO_PMD3_SHIFT)
-#define GPIO_PMD4_SHIFT (8) /* Bits 8-9: GPIOx Pin4 mode control */
-#define GPIO_PMD4_MASK (3 << GPIO_PMD4_SHIFT)
-# define GPIO_PMD4(v) ((v) << GPIO_PMD4_SHIFT)
-#define GPIO_PMD5_SHIFT (10) /* Bits 10-11: GPIOx Pin5 mode control */
-#define GPIO_PMD5_MASK (3 << GPIO_PMD5_SHIFT)
-# define GPIO_PMD5(v) ((v) << GPIO_PMD5_SHIFT)
-#define GPIO_PMD6_SHIFT (12) /* Bits 12-13: GPIOx Pin6 mode control */
-#define GPIO_PMD6_MASK (3 << GPIO_PMD6_SHIFT)
-# define GPIO_PMD6(v) ((v) << GPIO_PMD6_SHIFT)
-#define GPIO_PMD7_SHIFT (14) /* Bits 14-15: GPIOx Pin7 mode control */
-#define GPIO_PMD7_MASK (3 << GPIO_PMD7_SHIFT)
-# define GPIO_PMD7(v) ((v) << GPIO_PMD7_SHIFT)
-#define GPIO_PMD8_SHIFT (16) /* Bits 16-17: GPIOx Pin8 mode control */
-#define GPIO_PMD8_MASK (3 << GPIO_PMD8_SHIFT)
-# define GPIO_PMD8(v) ((v) << GPIO_PMD8_SHIFT)
-#define GPIO_PMD9_SHIFT (18) /* Bits 18-19: GPIOx Pin9 mode control */
-#define GPIO_PMD9_MASK (3 << GPIO_PMD9_SHIFT)
-# define GPIO_PMD9(v) ((v) << GPIO_PMD9_SHIFT)
-#define GPIO_PMD10_SHIFT (20) /* Bits 20-21: GPIOx Pin0 mode control */
-#define GPIO_PMD10_MASK (3 << GPIO_PMD10_SHIFT)
-# define GPIO_PMD10(v) ((v) << GPIO_PMD10_SHIFT)
-#define GPIO_PMD11_SHIFT (22) /* Bits 22-23: GPIOx Pin1 mode control */
-#define GPIO_PMD11_MASK (3 << GPIO_PMD11_SHIFT)
-# define GPIO_PMD11(v) ((v) << GPIO_PMD11_SHIFT)
-#define GPIO_PMD12_SHIFT (24) /* Bits 24-25: GPIOx Pin2 mode control */
-#define GPIO_PMD12_MASK (3 << GPIO_PMD12_SHIFT)
-# define GPIO_PMD12(v) ((v) << GPIO_PMD12_SHIFT)
-#define GPIO_PMD13_SHIFT (26) /* Bits 26-27: GPIOx Pin3 mode control */
-#define GPIO_PMD13_MASK (3 << GPIO_PMD13_SHIFT)
-# define GPIO_PMD13(v) ((v) << GPIO_PMD13_SHIFT)
-#define GPIO_PMD14_SHIFT (28) /* Bits 28-29: GPIOx Pin4 mode control */
-#define GPIO_PMD14_MASK (3 << GPIO_PMD14_SHIFT)
-# define GPIO_PMD14(v) ((v) << GPIO_PMD14_SHIFT)
-#define GPIO_PMD15_SHIFT (30) /* Bits 30-31: GPIOx Pin5 mode control */
-#define GPIO_PMD15_MASK (3 << GPIO_PMD15_SHIFT)
-# define GPIO_PMD15(v) ((v) << GPIO_PMD15_SHIFT)
-
-/* GPIO port pin digital input path disable control */
-
-#define GPIO_OFFD(n) (1 << (n)) /* Bit n: GPIOx Pin[n] digital input path disable control */
-
-/* GPIO port data output value */
-
-#define GPIO_DOUT(n) (1 << (n)) /* Bit n: GPIOx Pin[n] output value */
-
-/* GPIO port data output write mask */
-
-#define GPIO_DMASK(n) (1 << (n)) /* Bit n: GPIOx Pin[n] data output write mask */
-
-/* GPIO port pin value */
-
-#define GPIO_PIN(n) (1 << (n)) /* Bit n: GPIOx Pin[n] pin value */
-
-/* GPIO port de-bounce enable */
-
-#define GPIO_DBEN(n) (1 << (n)) /* Bit n: GPIOx Pin[n] input signal de-bounce enable */
-
-/* GPIO port interrupt mode control */
-
-#define GPIO_IMD(n) (1 << (n)) /* Bit n: GPIOx Pin[n] edge/level detection interrupt control */
-
-/* GPIO port interrupt enable */
-
-#define GPIO_IF_EN(n) (1 << (n)) /* Bit n: GPIOx Pin[n] interrupt enable low/falling */
-#define GPIO_IR_EN(n) (1 << ((n)+16)) /* Bit n: GPIOx Pin[n] interrupt enable high/rising */
-
-/* GPIO port interrupt source flag */
-
-#define GPIO_ISRC(n) (1 << (n)) /* Bit n: GPIOx Pin[n] interrupt source flag */
-
-/* De-bounce cycle control register */
-
-#define GPIO_DBNCECON_DBCLKSEL_SHIFT (0) /* Bits 0-3: De-bounce cycling count selection */
-#define GPIO_DBNCECON_DBCLKSEL_MASK (15 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_1 (0 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_2 (1 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_4 (2 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_8 (3 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_16 (4 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_32 (5 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_64 (6 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_128 (7 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_256 (8 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_512 (9 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_1024 (10 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_2048 (11 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_4096 (12 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_8102 (13 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_16384 (14 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-# define GPIO_DBNCECON_DBCLKSEL_32768 (15 << GPIO_DBNCECON_DBCLKSEL_SHIFT)
-#define GPIO_DBNCECON_DBCLKSRC (1 << 4) /* Bit 4: De-bounce counter clock source selection */
-#define GPIO_DBNCECON_ICLK_ON (1 << 5) /* Bit 5: Interrupt clock on mode */
-
-/* GPIO port data I/O registers */
-
-#define PORT_MASK (1) /* Bit 0: GPIOx Pin[n] data I/O */
-
-/********************************************************************************************
+/************************************************************************************
+ * Pre-processorDefinitions
+ ************************************************************************************/
+
+/* Register Offsets *****************************************************************/
+
+#define KL_GPIO_PDOR_OFFSET 0x0000 /* Port Data Output Register */
+#define KL_GPIO_PSOR_OFFSET 0x0004 /* Port Set Output Register */
+#define KL_GPIO_PCOR_OFFSET 0x0008 /* Port Clear Output Register */
+#define KL_GPIO_PTOR_OFFSET 0x000c /* Port Toggle Output Register */
+#define KL_GPIO_PDIR_OFFSET 0x0010 /* Port Data Input Register */
+#define KL_GPIO_PDDR_OFFSET 0x0014 /* Port Data Direction Register */
+
+/* Register Addresses ***************************************************************/
+
+#define KL_GPIO_PDOR(n) (KL_GPIO_BASE(n)+KL_GPIO_PDOR_OFFSET)
+#define KL_GPIO_PSOR(n) (KL_GPIO_BASE(n)+KL_GPIO_PSOR_OFFSET)
+#define KL_GPIO_PCOR(n) (KL_GPIO_BASE(n)+KL_GPIO_PCOR_OFFSET)
+#define KL_GPIO_PTOR(n) (KL_GPIO_BASE(n)+KL_GPIO_PTOR_OFFSET)
+#define KL_GPIO_PDIR(n) (KL_GPIO_BASE(n)+KL_GPIO_PDIR_OFFSET)
+#define KL_GPIO_PDDR(n) (KL_GPIO_BASE(n)+KL_GPIO_PDDR_OFFSET)
+
+#define KL_GPIOA_PDOR (KL_GPIOA_BASE+KL_GPIO_PDOR_OFFSET)
+#define KL_GPIOA_PSOR (KL_GPIOA_BASE+KL_GPIO_PSOR_OFFSET)
+#define KL_GPIOA_PCOR (KL_GPIOA_BASE+KL_GPIO_PCOR_OFFSET)
+#define KL_GPIOA_PTOR (KL_GPIOA_BASE+KL_GPIO_PTOR_OFFSET)
+#define KL_GPIOA_PDIR (KL_GPIOA_BASE+KL_GPIO_PDIR_OFFSET)
+#define KL_GPIOA_PDDR (KL_GPIOA_BASE+KL_GPIO_PDDR_OFFSET)
+
+#define KL_GPIOB_PDOR (KL_GPIOB_BASE+KL_GPIO_PDOR_OFFSET)
+#define KL_GPIOB_PSOR (KL_GPIOB_BASE+KL_GPIO_PSOR_OFFSET)
+#define KL_GPIOB_PCOR (KL_GPIOB_BASE+KL_GPIO_PCOR_OFFSET)
+#define KL_GPIOB_PTOR (KL_GPIOB_BASE+KL_GPIO_PTOR_OFFSET)
+#define KL_GPIOB_PDIR (KL_GPIOB_BASE+KL_GPIO_PDIR_OFFSET)
+#define KL_GPIOB_PDDR (KL_GPIOB_BASE+KL_GPIO_PDDR_OFFSET)
+
+#define KL_GPIOC_PDOR (KL_GPIOC_BASE+KL_GPIO_PDOR_OFFSET)
+#define KL_GPIOC_PSOR (KL_GPIOC_BASE+KL_GPIO_PSOR_OFFSET)
+#define KL_GPIOC_PCOR (KL_GPIOC_BASE+KL_GPIO_PCOR_OFFSET)
+#define KL_GPIOC_PTOR (KL_GPIOC_BASE+KL_GPIO_PTOR_OFFSET)
+#define KL_GPIOC_PDIR (KL_GPIOC_BASE+KL_GPIO_PDIR_OFFSET)
+#define KL_GPIOC_PDDR (KL_GPIOC_BASE+KL_GPIO_PDDR_OFFSET)
+
+#define KL_GPIOD_PDOR (KL_GPIOD_BASE+KL_GPIO_PDOR_OFFSET)
+#define KL_GPIOD_PSOR (KL_GPIOD_BASE+KL_GPIO_PSOR_OFFSET)
+#define KL_GPIOD_PCOR (KL_GPIOD_BASE+KL_GPIO_PCOR_OFFSET)
+#define KL_GPIOD_PTOR (KL_GPIOD_BASE+KL_GPIO_PTOR_OFFSET)
+#define KL_GPIOD_PDIR (KL_GPIOD_BASE+KL_GPIO_PDIR_OFFSET)
+#define KL_GPIOD_PDDR (KL_GPIOD_BASE+KL_GPIO_PDDR_OFFSET)
+
+#define KL_GPIOE_PDOR (KL_GPIOE_BASE+KL_GPIO_PDOR_OFFSET)
+#define KL_GPIOE_PSOR (KL_GPIOE_BASE+KL_GPIO_PSOR_OFFSET)
+#define KL_GPIOE_PCOR (KL_GPIOE_BASE+KL_GPIO_PCOR_OFFSET)
+#define KL_GPIOE_PTOR (KL_GPIOE_BASE+KL_GPIO_PTOR_OFFSET)
+#define KL_GPIOE_PDIR (KL_GPIOE_BASE+KL_GPIO_PDIR_OFFSET)
+#define KL_GPIOE_PDDR (KL_GPIOE_BASE+KL_GPIO_PDDR_OFFSET)
+
+/* Register Bit Definitions *********************************************************/
+
+/* Port Data Output Register */
+
+#define GPIO_PDOR(n) (1 << (n))
+
+/* Port Set Output Register */
+
+#define GPIO_PSOR(n) (1 << (n))
+
+/* Port Clear Output Register */
+
+#define GPIO_PCOR(n) (1 << (n))
+
+/* Port Toggle Output Register */
+
+#define GPIO_PTOR(n) (1 << (n))
+
+/* Port Data Input Register */
+
+#define GPIO_PDIR(n) (1 << (n))
+
+/* Port Data Direction Register */
+
+#define GPIO_PDDR(n) (1 << (n))
+
+/************************************************************************************
* Public Types
- ********************************************************************************************/
+ ************************************************************************************/
-/********************************************************************************************
- * Public Data
- ********************************************************************************************/
+/************************************************************************************
+ * Inline Functions
+ ************************************************************************************/
-/********************************************************************************************
- * Public Functions
- ********************************************************************************************/
+#ifndef __ASSEMBLY__
+/************************************************************************************
+ * Public Data
+ ************************************************************************************/
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/************************************************************************************
+ * Public Function Prototypes
+ ************************************************************************************/
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+#endif /* __ASSEMBLY__ */
#endif /* __ARCH_ARM_SRC_KL_CHIP_KL_GPIO_H */
diff --git a/nuttx/arch/arm/src/kl/chip/kl_memorymap.h b/nuttx/arch/arm/src/kl/chip/kl_memorymap.h
index 6978ae975..60e4542c7 100644
--- a/nuttx/arch/arm/src/kl/chip/kl_memorymap.h
+++ b/nuttx/arch/arm/src/kl/chip/kl_memorymap.h
@@ -65,7 +65,7 @@
/* 0x20100000 * -0x3fffffff Reserved */
# define KIP_AIPS_BASE 0x40000000 /* -0x4007ffff AIPS Peripherals */
/* 0x40080000 * -0x400fffff Reserved */
-# define KL_GPIO_BASE 0x400ff000 /* -0x400fffff General purpose input/output (GPIO) */
+# define KL_GPIO_BASE(n) (0x400ff000 + ((n) << 6))
/* 0x40100000 * -0x43ffffff Reserved */
# define KL_BME_BASE 0x44000000 /* -0x5fffffff Bit Manipulation Engine (BME) access
* to AIPS Peripherals for slots 0-127 */
diff --git a/nuttx/arch/arm/src/kl/kl_clockconfig.c b/nuttx/arch/arm/src/kl/kl_clockconfig.c
index b28c20ac2..700e87aa6 100644
--- a/nuttx/arch/arm/src/kl/kl_clockconfig.c
+++ b/nuttx/arch/arm/src/kl/kl_clockconfig.c
@@ -46,7 +46,7 @@
#include "up_arch.h"
#include "chip.h"
-#include "kl_internal.h"
+#include "kl_gpio.h"
#include "chip/kl_mcg.h"
#include "chip/kl_sim.h"
#include "chip/kl_osc.h"
diff --git a/nuttx/arch/arm/src/kl/kl_clockconfig.h b/nuttx/arch/arm/src/kl/kl_clockconfig.h
new file mode 100644
index 000000000..1de60d07a
--- /dev/null
+++ b/nuttx/arch/arm/src/kl/kl_clockconfig.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+ * arch/arm/src/kl/kl_gpio.h
+ *
+ * Copyright (C) 2013 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_ARM_SRC_KL_KL_CLOCKCONFIG_H
+#define __ARCH_ARM_SRC_KL_KL_CLOCKCONFIG_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include "kl_config.h"
+
+/****************************************************************************
+ * Pre-processor Declarations
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C" {
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: kl_clockconfig
+ *
+ * Description:
+ * Called to initialize the Kinetis chip. This does whatever setup is
+ * needed to put the MCU in a usable state. This includes the
+ * initialization of clocking using the settings in board.h.
+ *
+ ****************************************************************************/
+
+void kl_clockconfig(void);
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ARCH_ARM_SRC_KL_KL_CLOCKCONFIG_H */
diff --git a/nuttx/arch/arm/src/kl/kl_dma.h b/nuttx/arch/arm/src/kl/kl_dma.h
new file mode 100644
index 000000000..1e4860bd3
--- /dev/null
+++ b/nuttx/arch/arm/src/kl/kl_dma.h
@@ -0,0 +1,231 @@
+/****************************************************************************
+ * arch/arm/src/kl/kl_gpio.h
+ *
+ * Copyright (C) 2013 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_ARM_SRC_KL_KL_DMA_H
+#define __ARCH_ARM_SRC_KL_KL_DMA_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include "kl_config.h"
+
+/****************************************************************************
+ * Pre-processor Declarations
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C" {
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+typedef FAR void *DMA_HANDLE;
+typedef void (*dma_callback_t)(DMA_HANDLE handle, void *arg, int result);
+
+/* The following is used for sampling DMA registers when CONFIG DEBUG_DMA is selected */
+
+#ifdef CONFIG_DEBUG_DMA
+struct kl_dmaglobalregs_s
+{
+#warning "Missing logic"
+ /* Global Registers */
+};
+
+struct kl_dmachanregs_s
+{
+#warning "Missing logic"
+ /* Channel Registers */
+};
+
+struct kl_dmaregs_s
+{
+ /* Global Registers */
+
+ struct kl_dmaglobalregs_s gbl;
+
+ /* Channel Registers */
+
+ struct kl_dmachanregs_s ch;
+};
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: kl_dmainitialize
+ *
+ * Description:
+ * Initialize the GPDMA subsystem.
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_KL_DMA
+void kl_dmainitilaize(void);
+#endif
+
+/****************************************************************************
+ * Name: kl_dmachannel
+ *
+ * Description:
+ * Allocate a DMA channel. This function sets aside a DMA channel and
+ * gives the caller exclusive access to the DMA channel.
+ *
+ * Returned Value:
+ * One success, this function returns a non-NULL, void* DMA channel
+ * handle. NULL is returned on any failure. This function can fail only
+ * if no DMA channel is available.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_KL_DMA
+DMA_HANDLE kl_dmachannel(void);
+#endif
+
+/****************************************************************************
+ * Name: kl_dmafree
+ *
+ * Description:
+ * Release a DMA channel. NOTE: The 'handle' used in this argument must
+ * NEVER be used again until kl_dmachannel() is called again to re-gain
+ * a valid handle.
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_KL_DMA
+void kl_dmafree(DMA_HANDLE handle);
+#endif
+
+/****************************************************************************
+ * Name: kl_dmasetup
+ *
+ * Description:
+ * Configure DMA for one transfer.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_KL_DMA
+int kl_dmarxsetup(DMA_HANDLE handle, uint32_t control, uint32_t config,
+ uint32_t srcaddr, uint32_t destaddr, size_t nbytes);
+#endif
+
+/****************************************************************************
+ * Name: kl_dmastart
+ *
+ * Description:
+ * Start the DMA transfer
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_KL_DMA
+int kl_dmastart(DMA_HANDLE handle, dma_callback_t callback, void *arg);
+#endif
+
+/****************************************************************************
+ * Name: kl_dmastop
+ *
+ * Description:
+ * Cancel the DMA. After kl_dmastop() is called, the DMA channel is
+ * reset and kl_dmasetup() must be called before kl_dmastart() can be
+ * called again
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_KL_DMA
+void kl_dmastop(DMA_HANDLE handle);
+#endif
+
+/****************************************************************************
+ * Name: kl_dmasample
+ *
+ * Description:
+ * Sample DMA register contents
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_KL_DMA
+#ifdef CONFIG_DEBUG_DMA
+void kl_dmasample(DMA_HANDLE handle, struct kl_dmaregs_s *regs);
+#else
+# define kl_dmasample(handle,regs)
+#endif
+#endif
+
+/****************************************************************************
+ * Name: kl_dmadump
+ *
+ * Description:
+ * Dump previously sampled DMA register contents
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_KL_DMA
+#ifdef CONFIG_DEBUG_DMA
+void kl_dmadump(DMA_HANDLE handle, const struct kl_dmaregs_s *regs,
+ const char *msg);
+#else
+# define kl_dmadump(handle,regs,msg)
+#endif
+#endif
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ARCH_ARM_SRC_KL_KL_DMA_H */
diff --git a/nuttx/arch/arm/src/kl/kl_gpio.c b/nuttx/arch/arm/src/kl/kl_gpio.c
index 4062bd6d9..78d49e0c9 100644
--- a/nuttx/arch/arm/src/kl/kl_gpio.c
+++ b/nuttx/arch/arm/src/kl/kl_gpio.c
@@ -1,7 +1,7 @@
/****************************************************************************
- * arch/arm/src/kl/kl_gpio.c
+ * arch/arm/src/kl/kl_pin.c
*
- * Copyright (C) 2013 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@@ -38,17 +38,15 @@
****************************************************************************/
#include <nuttx/config.h>
+#include <arch/board/board.h>
-#include <stdint.h>
#include <assert.h>
-#include <debug.h>
+#include <errno.h>
-#include <arch/kl/chip.h>
+#include <nuttx/arch.h>
#include "up_arch.h"
-
-#include "chip.h"
-#include "chip/kl_gpio.h"
+#include "up_internal.h"
#include "kl_gpio.h"
@@ -57,6 +55,10 @@
****************************************************************************/
/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
* Private Functions
****************************************************************************/
@@ -68,150 +70,150 @@
* Name: kl_configgpio
*
* Description:
- * Configure a GPIO pin based on bit-encoded description of the pin.
- * Once it is configured as Alternative (GPIO_ALT|GPIO_CNF_AFPP|...)
- * function, it must be unconfigured with kl_unconfiggpio() with
- * the same cfgset first before it can be set to non-alternative function.
- *
- * Returns:
- * OK on success
- * ERROR on invalid port, or when pin is locked as ALT function.
+ * Configure a PIN based on bit-encoded description of the pin. NOTE that
+ * DMA/interrupts are disabled at the initial PIN configuratin.
*
****************************************************************************/
-int kl_configgpio(gpio_cfgset_t cfgset)
+int kl_configgpio(uint32_t cfgset)
{
- uintptr_t base;
- uint32_t regaddr;
- uint32_t regval;
- uint32_t isrc;
- uint32_t imd;
- uint32_t ien;
- uint32_t value;
- int port;
- int pin;
-
- /* Decode the port and pin. Use the port number to get the GPIO base
- * address.
- */
-
- port = (cfgset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT;
- pin = (cfgset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT;
-
- DEBUGASSERT((unsigned)port <= KL_GPIO_PORTE);
- base = KL_GPIO_CTRL_BASE(port);
-
- /* Set the the GPIO PMD register */
-
- regaddr = base + KL_GPIO_PMD_OFFSET;
- regval = getreg32(regaddr);
- regval &= ~GPIO_PMD_MASK(pin);
-
- switch (cfgset & GPIO_MODE_MASK)
- {
- default:
- case GPIO_INPUT: /* Input */
- value = GPIO_PMD_INPUT;
- break;
-
- case GPIO_OUTPUT: /* Push-pull output */
- value = GPIO_PMD_OUTPUT;
- break;
-
- case GPIO_OPENDRAIN: /* Open drain output */
- value = GPIO_PMD_OPENDRAIN;
- break;
-
- case GPIO_BIDI: /* Quasi bi-directional */
- value = GPIO_PMD_BIDI;
- break;
- }
-
- regval |= GPIO_PMD(pin, value);
- putreg32(regval, regaddr);
+ uintptr_t base;
+ uint32_t regval;
+ unsigned int port;
+ unsigned int pin;
+ unsigned int mode;
- /* Check if we need to disable the digital input path */
+ /* Get the port number and pin number */
- regaddr = base + KL_GPIO_OFFD_OFFSET;
- regval = getreg32(regaddr);
- regval &= ~GPIO_OFFD(pin);
+ port = (cfgset & _PIN_PORT_MASK) >> _PIN_PORT_SHIFT;
+ pin = (cfgset & _PIN_MASK) >> _PIN_SHIFT;
- if ((cfgset & GPIO_ANALOG) != 0)
+ DEBUGASSERT(port < KL_NPORTS);
+ if (port < KL_NPORTS)
{
- regval |= GPIO_OFFD(pin);
+ /* Get the base address of PORT block for this port */
+
+ base = KL_PORT_BASE(port);
+
+ /* Get the port mode */
+
+ mode = (cfgset & _PIN_MODE_MASK) >> _PIN_MODE_SHIFT;
+
+ /* Special case analog port mode. In this case, not of the digital
+ * options are applicable.
+ */
+
+ if (mode == _PIN_MODE_ANALOG)
+ {
+ /* Set the analog mode with all digital options zeroed */
+
+ regval = PORT_PCR_MUX_ANALOG | PORT_PCR_IRQC_DISABLED;
+ putreg32(regval, base + KL_PORT_PCR_OFFSET(pin));
+ }
+ else
+ {
+ /* Configure the digital pin options */
+
+ regval = (mode << PORT_PCR_MUX_SHIFT);
+ if ((cfgset & _PIN_IO_MASK) == _PIN_INPUT)
+ {
+ /* Handle input-only digital options */
+ /* Check for pull-up or pull-down */
+
+ if ((cfgset & _PIN_INPUT_PULLMASK) == _PIN_INPUT_PULLDOWN)
+ {
+ regval |= PORT_PCR_PE;
+ }
+ else if ((cfgset & _PIN_INPUT_PULLMASK) == _PIN_INPUT_PULLUP)
+ {
+ regval |= (PORT_PCR_PE | PORT_PCR_PS);
+ }
+ }
+ else
+ {
+ /* Handle output-only digital options */
+ /* Check for slow slew rate setting */
+
+ if ((cfgset & _PIN_OUTPUT_SLEW_MASK) == _PIN_OUTPUT_SLOW)
+ {
+ regval |= PORT_PCR_SRE;
+ }
+
+ /* Check for open drain output */
+
+ if ((cfgset & _PIN_OUTPUT_OD_MASK) == _PIN_OUTPUT_OPENDRAIN)
+ {
+ regval |= PORT_PCR_ODE;
+ }
+
+ /* Check for high drive output */
+
+ if ((cfgset & _PIN_OUTPUT_DRIVE_MASK) == _PIN_OUTPUT_HIGHDRIVE)
+ {
+ regval |= PORT_PCR_DSE;
+ }
+ }
+
+ /* Check for passive filter enable. Passive Filter configuration
+ * is valid in all digital pin muxing modes.
+ */
+
+ if ((cfgset & PIN_PASV_FILTER) != 0)
+ {
+ regval |= PORT_PCR_PFE;
+ }
+
+ /* Set the digital mode with all of the selected options */
+
+ putreg32(regval, base + KL_PORT_PCR_OFFSET(pin));
+
+ /* Check for digital filter enable. Digital Filter configuration
+ * is valid in all digital pin muxing modes.
+ */
+
+ regval = getreg32(base + KL_PORT_DFER_OFFSET);
+ if ((cfgset & PIN_DIG_FILTER) != 0)
+ {
+ regval |= (1 << pin);
+ }
+ else
+ {
+ regval &= ~(1 << pin);
+ }
+ putreg32(regval, base + KL_PORT_DFER_OFFSET);
+
+ /* Additional configuration for the case of Alternative 1 (GPIO) modes */
+
+ if (mode == _PIN_MODE_GPIO)
+ {
+ /* Set the GPIO port direction */
+
+ base = KL_GPIO_BASE(port);
+ regval = getreg32(base + KL_GPIO_PDDR_OFFSET);
+ if ((cfgset & _PIN_IO_MASK) == _PIN_INPUT)
+ {
+ /* Select GPIO input */
+
+ regval &= ~(1 << pin);
+ putreg32(regval, base + KL_GPIO_PDDR_OFFSET);
+ }
+ else /* if ((cfgset & _PIN_IO_MASK) == _PIN_OUTPUT) */
+ {
+ /* Select GPIO input */
+
+ regval |= (1 << pin);
+ putreg32(regval, base + KL_GPIO_PDDR_OFFSET);
+
+ /* Set the initial value of the GPIO output */
+
+ kl_gpiowrite(cfgset, ((cfgset & GPIO_OUTPUT_ONE) != 0));
+ }
+ }
+ }
+
+ return OK;
}
-
- putreg32(regval, regaddr);
-
- /* Check if we need to enable debouncing */
-
- regaddr = base + KL_GPIO_DBEN_OFFSET;
- regval = getreg32(regaddr);
- regval &= ~GPIO_DBEN(pin);
-
- if ((cfgset & GPIO_DEBOUNCE) != 0)
- {
- regval |= GPIO_DBEN(pin);
- }
-
- putreg32(regval, regaddr);
-
- /* Configure interrupting pins */
-
- isrc = getreg32(base + KL_GPIO_ISRC_OFFSET);
- isrc &= ~GPIO_ISRC(pin);
-
- imd = getreg32(base + KL_GPIO_IMD_OFFSET);
- imd &= ~GPIO_IMD(pin);
-
- ien = getreg32(base + KL_GPIO_IEN_OFFSET);
- ien &= ~(GPIO_IF_EN(pin) | GPIO_IR_EN(pin));
-
- switch (cfgset & GPIO_INTERRUPT_MASK)
- {
- case GPIO_INTERRUPT_RISING_EDGE:
- isrc |= GPIO_ISRC(pin);
- ien |= GPIO_IR_EN(pin);
- break;
-
- case GPIO_INTERRUPT_FALLING_EDGE:
- isrc |= GPIO_ISRC(pin);
- ien |= GPIO_IF_EN(pin);
- break;
-
- case GPIO_INTERRUPT_BOTH_EDGES:
- isrc |= GPIO_ISRC(pin);
- ien |= (GPIO_IF_EN(pin) | GPIO_IR_EN(pin));
- break;
-
- case GPIO_INTERRUPT_HIGH_LEVEL:
- isrc |= GPIO_ISRC(pin);
- imd |= GPIO_IMD(pin);
- ien |= GPIO_IR_EN(pin);
- break;
-
- case GPIO_INTERRUPT_LOW_LEVEL:
- isrc |= GPIO_ISRC(pin);
- imd |= GPIO_IMD(pin);
- ien |= GPIO_IF_EN(pin);
- break;
-
- default:
- break;
- }
-
- putreg32(ien, base + KL_GPIO_IEN_OFFSET);
- putreg32(imd, base + KL_GPIO_IMD_OFFSET);
- putreg32(isrc, base + KL_GPIO_ISRC_OFFSET);
-
- /* If the pin is an output, set the initial output value */
-
- if ((cfgset & GPIO_MODE_MASK) == GPIO_OUTPUT)
- {
- kl_gpiowrite(cfgset, (cfgset & GPIO_OUTPUT_SET) != 0);
- }
-
- return 0;
+ return -EINVAL;
}
/****************************************************************************
@@ -222,48 +224,38 @@ int kl_configgpio(gpio_cfgset_t cfgset)
*
****************************************************************************/
-void kl_gpiowrite(gpio_cfgset_t pinset, bool value)
+void kl_gpiowrite(uint32_t pinset, bool value)
{
-#ifndef KL_LOW
- irqstate_t flags;
- uintptr_t base;
-#endif
- int port;
- int pin;
-
- /* Decode the port and pin. Use the port number to get the GPIO base
- * address.
- */
+ uintptr_t base;
+ unsigned int port;
+ unsigned int pin;
- port = (pinset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT;
- pin = (pinset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT;
+ DEBUGASSERT((pinset & _PIN_MODE_MASK) == _PIN_MODE_GPIO);
+ DEBUGASSERT((pinset & _PIN_IO_MASK) == _PIN_OUTPUT);
- DEBUGASSERT((unsigned)port <= KL_GPIO_PORTE);
+ /* Get the port number and pin number */
- /* Only the low density K25Z100/120 chips support bit-band access to GPIO
- * pins.
- */
+ port = (pinset & _PIN_PORT_MASK) >> _PIN_PORT_SHIFT;
+ pin = (pinset & _PIN_MASK) >> _PIN_SHIFT;
-#ifdef KL_LOW
- putreg32((uint32_t)value, KL_PORT_PDIO(port, pin));
-#else
- /* Get the base address of the GPIO port registers */
-
- base = KL_GPIO_CTRL_BASE(port);
-
- /* Disable interrupts -- the following operations must be atomic */
-
- flags = irqsave();
-
- /* Allow writing only to the selected pin in the DOUT register */
+ DEBUGASSERT(port < KL_NPORTS);
+ if (port < KL_NPORTS)
+ {
+ /* Get the base address of GPIO block for this port */
- putreg32(~(1 << pin), base + KL_GPIO_DMASK_OFFSET);
+ base = KL_GPIO_BASE(port);
- /* Set the pin to the selected value and re-enable interrupts */
+ /* Set or clear the output */
- putreg32(((uint32_t)value << pin), base + KL_GPIO_DOUT_OFFSET);
- irqrestore(flags);
-#endif
+ if (value)
+ {
+ putreg32((1 << pin), base + KL_GPIO_PSOR_OFFSET);
+ }
+ else
+ {
+ putreg32((1 << pin), base + KL_GPIO_PCOR_OFFSET);
+ }
+ }
}
/****************************************************************************
@@ -274,36 +266,34 @@ void kl_gpiowrite(gpio_cfgset_t pinset, bool value)
*
****************************************************************************/
-bool kl_gpioread(gpio_cfgset_t pinset)
+bool kl_gpioread(uint32_t pinset)
{
-#ifndef KL_LOW
- uintptr_t base;
-#endif
- int port;
- int pin;
-
- /* Decode the port and pin. Use the port number to get the GPIO base
- * address.
- */
+ uintptr_t base;
+ uint32_t regval;
+ unsigned int port;
+ unsigned int pin;
+ bool ret = false;
- port = (pinset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT;
- pin = (pinset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT;
+ DEBUGASSERT((pinset & _PIN_MODE_MASK) == _PIN_MODE_GPIO);
+ DEBUGASSERT((pinset & _PIN_IO_MASK) == _PIN_INPUT);
- DEBUGASSERT((unsigned)port <= KL_GPIO_PORTE);
+ /* Get the port number and pin number */
- /* Only the low density K25Z100/120 chips support bit-band access to GPIO
- * pins.
- */
+ port = (pinset & _PIN_PORT_MASK) >> _PIN_PORT_SHIFT;
+ pin = (pinset & _PIN_MASK) >> _PIN_SHIFT;
-#ifdef KL_LOW
- return (getreg32(KL_PORT_PDIO(port, pin)) & PORT_MASK) != 0;
-#else
- /* Get the base address of the GPIO port registers */
+ DEBUGASSERT(port < KL_NPORTS);
+ if (port < KL_NPORTS)
+ {
+ /* Get the base address of GPIO block for this port */
- base = KL_GPIO_CTRL_BASE(port);
+ base = KL_GPIO_BASE(port);
- /* Return the state of the selected pin */
+ /* return the state of the pin */
- return (getreg32(base + KL_GPIO_PIN_OFFSET) & (1 << pin)) != 0;
-#endif
+ regval = getreg32(base + KL_GPIO_PDIR_OFFSET);
+ ret = ((regval & (1 << pin)) != 0);
+ }
+ return ret;
}
+
diff --git a/nuttx/arch/arm/src/kl/kl_gpio.h b/nuttx/arch/arm/src/kl/kl_gpio.h
index 02cb0643a..17f947a4f 100644
--- a/nuttx/arch/arm/src/kl/kl_gpio.h
+++ b/nuttx/arch/arm/src/kl/kl_gpio.h
@@ -42,137 +42,253 @@
#include <nuttx/config.h>
-#ifndef __ASSEMBLY__
-# include <stdint.h>
-# include <stdbool.h>
-#endif
+#include <stdbool.h>
#include <nuttx/irq.h>
-#include "chip.h"
+#include "kl_config.h"
#include "chip/kl_gpio.h"
+#include "chip/kl_port.h"
/****************************************************************************
* Pre-processor Declarations
****************************************************************************/
-
-/* Bit-encoded input to kl_configgpio() */
-
-/* 16-bit Encoding:
+/* Bit-encoded input to kl_pinconfig() *****************************************/
+/* General form (32-bits, only 22 bits are unused in the encoding):
*
- * 1111 1100 0000 0000
- * 5432 1098 7654 3210
- * ---- ---- ---- ----
- * MMAD III. VPPP BBBB
+ * oooo mmmv iiii ifd- ---- -ppp ---b bbbb
*/
-/* GPIO mode:
+/* Bits 25-31: 7 bits are used to encode the basic pin configuration:
*
- * 1111 1100 0000 0000
- * 5432 1098 7654 3210
- * ---- ---- ---- ----
- * MM.. .... .... ....
+ * oooo mmm- ---- ---- ---- ---- ---- ----
+ * oooommm:
+ * | `--- mmm: mode
+ * `------- oooo: options (may be combined)
*/
-#define GPIO_MODE_SHIFT (14) /* Bits 14-15: GPIO mode */
-#define GPIO_MODE_MASK (3 << GPIO_MODE_SHIFT)
-# define GPIO_INPUT (0 << GPIO_MODE_SHIFT) /* Input */
-# define GPIO_OUTPUT (1 << GPIO_MODE_SHIFT) /* Push-pull output */
-# define GPIO_OPENDRAIN (2 << GPIO_MODE_SHIFT) /* Open drain output */
-# define GPIO_BIDI (3 << GPIO_MODE_SHIFT) /* Quasi bi-directional */
+#define _PIN_MODE_SHIFT (25) /* Bits 25-27: Pin mode */
+#define _PIN_MODE_MASK (7 << _PIN_MODE_SHIFT)
+#define _PIN_OPTIONS_SHIFT (28) /* Bits 28-31: Pin mode options */
+#define _PIN_OPTIONS_MASK (15 << _PIN_OPTIONS_SHIFT)
-/* GPIO analog: If the pin is an analog input, then it would be necessary to
- * disable the digital input
- *
- * 1111 1100 0000 0000
- * 5432 1098 7654 3210
- * ---- ---- ---- ----
- * ..A. .... .... ....
+/* Port Modes */
+
+#define _PIN_MODE_ANALOG (0 << _PIN_MODE_SHIFT) /* 000 Pin Disabled (Analog) */
+#define _PIN_MODE_GPIO (1 << _PIN_MODE_SHIFT) /* 001 Alternative 1 (GPIO) */
+#define _PIN_MODE_ALT2 (2 << _PIN_MODE_SHIFT) /* 010 Alternative 2 */
+#define _PIN_MODE_ALT3 (3 << _PIN_MODE_SHIFT) /* 011 Alternative 3 */
+#define _PIN_MODE_ALT4 (4 << _PIN_MODE_SHIFT) /* 100 Alternative 4 */
+#define _PIN_MODE_ALT5 (5 << _PIN_MODE_SHIFT) /* 101 Alternative 5 */
+#define _PIN_MODE_ALT6 (6 << _PIN_MODE_SHIFT) /* 110 Alternative 6 */
+#define _PIN_MODE_ALT7 (7 << _PIN_MODE_SHIFT) /* 111 Alternative 7 */
+
+/* Options for all digital modes (Alternatives 1-7). None of the digital
+ * options apply if the analog mode is selected.
*/
-#define GPIO_ANALOG (1 << 13) /* Bit 13: Disable digital input */
+#define _PIN_IO_MASK (1 << _PIN_OPTIONS_SHIFT) /* xxx1 Digital input/output mask */
+#define _PIN_INPUT (0 << _PIN_OPTIONS_SHIFT) /* xxx0 Digital input */
+#define _PIN_OUTPUT (1 << _PIN_OPTIONS_SHIFT) /* xxx1 Digital output */
+
+#define _PIN_INPUT_PULLMASK (7 << _PIN_OPTIONS_SHIFT) /* x111 Mask for pull-up or -down bits */
+#define _PIN_INPUT_PULLDOWN (2 << _PIN_OPTIONS_SHIFT) /* x010 Input with internal pull-down resistor */
+#define _PIN_INPUT_PULLUP (6 << _PIN_OPTIONS_SHIFT) /* x110 Input with internal pull-up resistor */
+
+#define _PIN_OUTPUT_SLEW_MASK (3 << _PIN_OPTIONS_SHIFT) /* xx11 Mask to test for slow slew rate */
+#define _PIN_OUTPUT_FAST (1 << _PIN_OPTIONS_SHIFT) /* xx01 Output with fast slew rate */
+#define _PIN_OUTPUT_SLOW (3 << _PIN_OPTIONS_SHIFT) /* xx11 Output with slow slew rate */
+#define _PIN_OUTPUT_OD_MASK (5 << _PIN_OPTIONS_SHIFT) /* x1x1 Mask to test for open drain */
+#define _PIN_OUTPUT_OPENDRAIN (5 << _PIN_OPTIONS_SHIFT) /* x1x1 Output with open drain enabled */
+#define _PIN_OUTPUT_DRIVE_MASK (9 << _PIN_OPTIONS_SHIFT) /* 1xx1 Mask to test for high drive strengh */
+#define _PIN_OUTPUT_LOWDRIVE (1 << _PIN_OPTIONS_SHIFT) /* 0xx1 Output with low drive strength */
+#define _PIN_OUTPUT_HIGHDRIVE (9 << _PIN_OPTIONS_SHIFT) /* 1xx1 Output with high drive strength */
+
+/* End-user pin modes and configurations. Notes: (1) None of the digital options
+ * are available for the analog mode, (2) digital settings may be combined (OR'ed)
+ * provided that input-only and output-only options are not intermixed.
+ */
-/* De-bounce enable:
+#define PIN_ANALOG _PIN_MODE_ANALOG
+
+#define GPIO_INPUT (_PIN_MODE_GPIO | _PIN_INPUT)
+#define GPIO_PULLDOWN (_PIN_MODE_GPIO | _PIN_INPUT_PULLDOWN)
+#define GPIO_PULLUP (_PIN_MODE_GPIO | _PIN_INPUT_PULLUP)
+#define GPIO_OUTPUT (_PIN_MODE_GPIO | _PIN_OUTPUT)
+#define GPIO_FAST (_PIN_MODE_GPIO | _PIN_OUTPUT_FAST)
+#define GPIO_SLOW (_PIN_MODE_GPIO | _PIN_OUTPUT_SLOW)
+#define GPIO_OPENDRAIN (_PIN_MODE_GPIO | _PIN_OUTPUT_LOWDRIVE)
+#define GPIO_LOWDRIVE (_PIN_MODE_GPIO | _PIN_OUTPUT_OPENDRAIN)
+#define GPIO_HIGHDRIVE (_PIN_MODE_GPIO | _PIN_OUTPUT_HIGHDRIVE)
+
+#define PIN_ALT2 _PIN_MODE_ALT2
+#define PIN_ALT2_INPUT (_PIN_MODE_ALT2 | _PIN_INPUT)
+#define PIN_ALT2_PULLDOWN (_PIN_MODE_ALT2 | _PIN_INPUT_PULLDOWN)
+#define PIN_ALT2_PULLUP (_PIN_MODE_ALT2 | _PIN_INPUT_PULLUP)
+#define PIN_ALT2_OUTPUT (_PIN_MODE_ALT2 | _PIN_OUTPUT)
+#define PIN_ALT2_FAST (_PIN_MODE_ALT2 | _PIN_OUTPUT_FAST)
+#define PIN_ALT2_SLOW (_PIN_MODE_ALT2 | _PIN_OUTPUT_SLOW)
+#define PIN_ALT2_OPENDRAIN (_PIN_MODE_ALT2 | _PIN_OUTPUT_LOWDRIVE)
+#define PIN_ALT2_LOWDRIVE (_PIN_MODE_ALT2 | _PIN_OUTPUT_OPENDRAIN)
+#define PIN_ALT2_HIGHDRIVE (_PIN_MODE_ALT2 | _PIN_OUTPUT_HIGHDRIVE)
+
+#define PIN_ALT3 _PIN_MODE_ALT3
+#define PIN_ALT3_INPUT (_PIN_MODE_ALT3 | _PIN_INPUT)
+#define PIN_ALT3_PULLDOWN (_PIN_MODE_ALT3 | _PIN_INPUT_PULLDOWN)
+#define PIN_ALT3_PULLUP (_PIN_MODE_ALT3 | _PIN_INPUT_PULLUP)
+#define PIN_ALT3_OUTPUT (_PIN_MODE_ALT3 | _PIN_OUTPUT)
+#define PIN_ALT3_FAST (_PIN_MODE_ALT3 | _PIN_OUTPUT_FAST)
+#define PIN_ALT3_SLOW (_PIN_MODE_ALT3 | _PIN_OUTPUT_SLOW)
+#define PIN_ALT3_OPENDRAIN (_PIN_MODE_ALT3 | _PIN_OUTPUT_LOWDRIVE)
+#define PIN_ALT3_LOWDRIVE (_PIN_MODE_ALT3 | _PIN_OUTPUT_OPENDRAIN)
+#define PIN_ALT3_HIGHDRIVE (_PIN_MODE_ALT3 | _PIN_OUTPUT_HIGHDRIVE)
+
+#define PIN_ALT4 _PIN_MODE_ALT4
+#define PIN_ALT4_INPUT (_PIN_MODE_ALT4 | _PIN_INPUT)
+#define PIN_ALT4_PULLDOWN (_PIN_MODE_ALT4 | _PIN_INPUT_PULLDOWN)
+#define PIN_ALT4_PULLUP (_PIN_MODE_ALT4 | _PIN_INPUT_PULLUP)
+#define PIN_ALT4_OUTPUT (_PIN_MODE_ALT4 | _PIN_OUTPUT)
+#define PIN_ALT4_FAST (_PIN_MODE_ALT4 | _PIN_OUTPUT_FAST)
+#define PIN_ALT4_SLOW (_PIN_MODE_ALT4 | _PIN_OUTPUT_SLOW)
+#define PIN_ALT4_OPENDRAIN (_PIN_MODE_ALT4 | _PIN_OUTPUT_LOWDRIVE)
+#define PIN_ALT4_LOWDRIVE (_PIN_MODE_ALT4 | _PIN_OUTPUT_OPENDRAIN)
+#define PIN_ALT4_HIGHDRIVE (_PIN_MODE_ALT4 | _PIN_OUTPUT_HIGHDRIVE)
+
+#define PIN_ALT5 _PIN_MODE_ALT5
+#define PIN_ALT5_INPUT (_PIN_MODE_ALT5 | _PIN_INPUT)
+#define PIN_ALT5_PULLDOWN (_PIN_MODE_ALT5 | _PIN_INPUT_PULLDOWN)
+#define PIN_ALT5_PULLUP (_PIN_MODE_ALT5 | _PIN_INPUT_PULLUP)
+#define PIN_ALT5_OUTPUT (_PIN_MODE_ALT5 | _PIN_OUTPUT)
+#define PIN_ALT5_FAST (_PIN_MODE_ALT5 | _PIN_OUTPUT_FAST)
+#define PIN_ALT5_SLOW (_PIN_MODE_ALT5 | _PIN_OUTPUT_SLOW)
+#define PIN_ALT5_OPENDRAIN (_PIN_MODE_ALT5 | _PIN_OUTPUT_LOWDRIVE)
+#define PIN_ALT5_LOWDRIVE (_PIN_MODE_ALT5 | _PIN_OUTPUT_OPENDRAIN)
+#define PIN_ALT5_HIGHDRIVE (_PIN_MODE_ALT5 | _PIN_OUTPUT_HIGHDRIVE)
+
+#define PIN_ALT6 _PIN_MODE_ALT6
+#define PIN_ALT6_INPUT (_PIN_MODE_ALT6 | _PIN_INPUT)
+#define PIN_ALT6_PULLDOWN (_PIN_MODE_ALT6 | _PIN_INPUT_PULLDOWN)
+#define PIN_ALT6_PULLUP (_PIN_MODE_ALT6 | _PIN_INPUT_PULLUP)
+#define PIN_ALT6_OUTPUT (_PIN_MODE_ALT6 | _PIN_OUTPUT)
+#define PIN_ALT6_FAST (_PIN_MODE_ALT6 | _PIN_OUTPUT_FAST)
+#define PIN_ALT6_SLOW (_PIN_MODE_ALT6 | _PIN_OUTPUT_SLOW)
+#define PIN_ALT6_OPENDRAIN (_PIN_MODE_ALT6 | _PIN_OUTPUT_LOWDRIVE)
+#define PIN_ALT6_LOWDRIVE (_PIN_MODE_ALT6 | _PIN_OUTPUT_OPENDRAIN)
+#define PIN_ALT6_HIGHDRIVE (_PIN_MODE_ALT6 | _PIN_OUTPUT_HIGHDRIVE)
+
+#define PIN_ALT7 _PIN_MODE_ALT7
+#define PIN_ALT7_INPUT (_PIN_MODE_ALT7 | _PIN_INPUT)
+#define PIN_ALT7_PULLDOWN (_PIN_MODE_ALT7 | _PIN_INPUT_PULLDOWN)
+#define PIN_ALT7_PULLUP (_PIN_MODE_ALT7 | _PIN_INPUT_PULLUP)
+#define PIN_ALT7_OUTPUT (_PIN_MODE_ALT7 | _PIN_OUTPUT)
+#define PIN_ALT7_FAST (_PIN_MODE_ALT7 | _PIN_OUTPUT_FAST)
+#define PIN_ALT7_SLOW (_PIN_MODE_ALT7 | _PIN_OUTPUT_SLOW)
+#define PIN_ALT7_OPENDRAIN (_PIN_MODE_ALT7 | _PIN_OUTPUT_LOWDRIVE)
+#define PIN_ALT7_LOWDRIVE (_PIN_MODE_ALT7 | _PIN_OUTPUT_OPENDRAIN)
+#define PIN_ALT7_HIGHDRIVE (_PIN_MODE_ALT7 | _PIN_OUTPUT_HIGHDRIVE)
+
+/* The initial value for GPIO (Alternative 1 outputs):
*
- * 1111 1100 0000 0000
- * 5432 1098 7654 3210
- * ---- ---- ---- ----
- * ...D .... .... ....
+ * ---- ---v ---- ---- ---- ---- ---- ----
+ *
+ * Passive Filter and digital filter enable are valid in all digital pin
+ * muxing modes.
*/
-#define GPIO_DEBOUNCE (1 << 12) /* Bit 12: Debounce enable */
+#define GPIO_OUTPUT_ONE (1 << 24) /* Bit 24: 1:Initial output value=1 */
+#define GPIO_OUTPUT_ZER0 (0) /* Bit 24: 0:Initial output value=0 */
-/* Interrupt Controls:
+/* Five bits are used to incode DMA/interrupt options:
+ *
+ * ---- ---- iiii i--- ---- ---- ---- ----
*
- * 1111 1100 0000 0000
- * 5432 1098 7654 3210
- * ---- ---- ---- ----
- * .... III. .... ....
+ * The pin interrupt configuration is valid in all digital pin muxing modes
+ * (restricted to inputs).
*/
-#define GPIO_INTERRUPT_SHIFT (9) /* Bits 9-11: Interrupt controls */
-#define GPIO_INTERRUPT_MASK (7 << GPIO_INTERRUPT_SHIFT)
-# define GPIO_INTERRUPT_NONE (0 << GPIO_INTERRUPT_SHIFT)
-# define GPIO_INTERRUPT_RISING_EDGE (1 << GPIO_INTERRUPT_SHIFT)
-# define GPIO_INTERRUPT_FALLING_EDGE (2 << GPIO_INTERRUPT_SHIFT)
-# define GPIO_INTERRUPT_BOTH_EDGES (3 << GPIO_INTERRUPT_SHIFT)
-# define GPIO_INTERRUPT_HIGH_LEVEL (4 << GPIO_INTERRUPT_SHIFT)
-# define GPIO_INTERRUPT_LOW_LEVEL (5 << GPIO_INTERRUPT_SHIFT)
+#define _PIN_INT_SHIFT (20)
+#define _PIN_INT_MASK (31 << _PIN_INT_SHIFT)
+
+#define _PIN_INTDMA_MASK (3 << _PIN_INT_SHIFT)
+#define _PIN_INTDMA_NONE (0 << _PIN_INT_SHIFT)
+#define _PIN_DMA (1 << _PIN_INT_SHIFT)
+#define _PIN_INTERRUPT (2 << _PIN_INT_SHIFT)
+
+#define PIN_DMA_RISING (5 << _PIN_INT_SHIFT) /* 00101 DMA Request on rising edge */
+#define PIN_DMA_FALLING (9 << _PIN_INT_SHIFT) /* 01001 DMA Request on falling edge */
+#define PIN_DMA_BOTH (13 << _PIN_INT_SHIFT) /* 01101 DMA Request on either edge */
+#define PIN_INT_ZERO (2 << _PIN_INT_SHIFT) /* 00010 Interrupt when logic zero */
+#define PIN_INT_RISING (6 << _PIN_INT_SHIFT) /* 00110 Interrupt on rising edge */
+#define PIN_INT_FALLING (10 << _PIN_INT_SHIFT) /* 01010 Interrupt on falling edge */
+#define PIN_INT_BOTH (14 << _PIN_INT_SHIFT) /* 01110 Interrupt on either edge */
+#define PIN_INT_ONE (18 << _PIN_INT_SHIFT) /* 10010 Interrupt when logic one */
-/* If the pin is a GPIO digital output, then this identifies the initial output value.
+/* Two bits is used to enable the filter options:
*
- * 1111 1100 0000 0000
- * 5432 1098 7654 3210
- * ---- ---- ---- ----
- * .... .... V... ....
+ * ---- ---- ---- -fd- ---- ---- ---- ----
+ *
+ * Passive Filter and digital filter enable are valid in all digital pin
+ * muxing modes.
*/
-#define GPIO_OUTPUT_SET (1 << 7) /* Bit 7: If output, inital value of output */
-#define GPIO_OUTPUT_CLEAR (0)
-
-/* This identifies the GPIO port:
+#define PIN_PASV_FILTER (1 << 18) /* Bit 18: Enable passive filter */
+#define PIN_DIG_FILTER (1 << 17) /* Bit 17: Enable digital filter */
+
+/* Three bits are used to define the port number:
*
- * 1111 1100 0000 0000
- * 5432 1098 7654 3210
- * ---- ---- ---- ----
- * .... .... .PPP ....
+ * ---- ---- ---- ---- ---- -ppp ---- ----
*/
-#define GPIO_PORT_SHIFT 4 /* Bit 4-6: Port number */
-#define GPIO_PORT_MASK (7 << GPIO_PORT_SHIFT)
-# define GPIO_PORTA (0 << GPIO_PORT_SHIFT) /* GPIOA */
-# define GPIO_PORTB (1 << GPIO_PORT_SHIFT) /* GPIOB */
-# define GPIO_PORTC (2 << GPIO_PORT_SHIFT) /* GPIOC */
-# define GPIO_PORTD (3 << GPIO_PORT_SHIFT) /* GPIOD */
-# define GPIO_PORTE (4 << GPIO_PORT_SHIFT) /* GPIOE */
-#
+#define _PIN_PORT_SHIFT (8) /* Bits 8-10: port number */
+#define _PIN_PORT_MASK (7 << _PIN_PORT_SHIFT)
+
+#define PIN_PORTA (KL_PORTA << _PIN_PORT_SHIFT)
+#define PIN_PORTB (KL_PORTB << _PIN_PORT_SHIFT)
+#define PIN_PORTC (KL_PORTC << _PIN_PORT_SHIFT)
+#define PIN_PORTD (KL_PORTD << _PIN_PORT_SHIFT)
+#define PIN_PORTE (KL_PORTE << _PIN_PORT_SHIFT)
-/* This identifies the bit in the port:
+/* Five bits are used to define the pin number:
*
- * 1111 1100 0000 0000
- * 5432 1098 7654 3210
- * ---- ---- ---- ----
- * .... .... .... BBBB
+ * ---- ---- ---- ---- ---- ---- ---b bbbb
*/
-#define GPIO_PIN_SHIFT 0 /* Bits 0-3: GPIO number: 0-15 */
-#define GPIO_PIN_MASK (15 << GPIO_PIN_SHIFT)
-# define GPIO_PIN0 (0 << GPIO_PIN_SHIFT)
-# define GPIO_PIN1 (1 << GPIO_PIN_SHIFT)
-# define GPIO_PIN2 (2 << GPIO_PIN_SHIFT)
-# define GPIO_PIN3 (3 << GPIO_PIN_SHIFT)
-# define GPIO_PIN4 (4 << GPIO_PIN_SHIFT)
-# define GPIO_PIN5 (5 << GPIO_PIN_SHIFT)
-# define GPIO_PIN6 (6 << GPIO_PIN_SHIFT)
-# define GPIO_PIN7 (7 << GPIO_PIN_SHIFT)
-# define GPIO_PIN8 (8 << GPIO_PIN_SHIFT)
-# define GPIO_PIN9 (9 << GPIO_PIN_SHIFT)
-# define GPIO_PIN10 (10 << GPIO_PIN_SHIFT)
-# define GPIO_PIN11 (11 << GPIO_PIN_SHIFT)
-# define GPIO_PIN12 (12 << GPIO_PIN_SHIFT)
-# define GPIO_PIN13 (13 << GPIO_PIN_SHIFT)
-# define GPIO_PIN14 (14 << GPIO_PIN_SHIFT)
-# define GPIO_PIN15 (15 << GPIO_PIN_SHIFT)
+#define _PIN_SHIFT (0) /* Bits 0-4: port number */
+#define _PIN_MASK (31 << _PIN_SHIFT)
+
+#define PIN(n) ((n) << _PIN_SHIFT)
+#define PIN0 (0 << _PIN_SHIFT)
+#define PIN1 (1 << _PIN_SHIFT)
+#define PIN2 (2 << _PIN_SHIFT)
+#define PIN3 (3 << _PIN_SHIFT)
+#define PIN4 (4 << _PIN_SHIFT)
+#define PIN5 (5 << _PIN_SHIFT)
+#define PIN6 (6 << _PIN_SHIFT)
+#define PIN7 (7 << _PIN_SHIFT)
+#define PIN8 (8 << _PIN_SHIFT)
+#define PIN9 (9 << _PIN_SHIFT)
+#define PIN10 (10 << _PIN_SHIFT)
+#define PIN11 (11 << _PIN_SHIFT)
+#define PIN12 (12 << _PIN_SHIFT)
+#define PIN13 (13 << _PIN_SHIFT)
+#define PIN14 (14 << _PIN_SHIFT)
+#define PIN15 (15 << _PIN_SHIFT)
+#define PIN16 (16 << _PIN_SHIFT)
+#define PIN17 (17 << _PIN_SHIFT)
+#define PIN18 (18 << _PIN_SHIFT)
+#define PIN19 (19 << _PIN_SHIFT)
+#define PIN20 (20 << _PIN_SHIFT)
+#define PIN21 (21 << _PIN_SHIFT)
+#define PIN22 (22 << _PIN_SHIFT)
+#define PIN23 (23 << _PIN_SHIFT)
+#define PIN24 (24 << _PIN_SHIFT)
+#define PIN25 (25 << _PIN_SHIFT)
+#define PIN26 (26 << _PIN_SHIFT)
+#define PIN27 (27 << _PIN_SHIFT)
+#define PIN28 (28 << _PIN_SHIFT)
+#define PIN29 (29 << _PIN_SHIFT)
+#define PIN30 (30 << _PIN_SHIFT)
+#define PIN31 (31 << _PIN_SHIFT)
/****************************************************************************
* Public Types
@@ -202,18 +318,12 @@ extern "C" {
* Name: kl_configgpio
*
* Description:
- * Configure a GPIO pin based on bit-encoded description of the pin.
- * Once it is configured as Alternative (GPIO_ALT|GPIO_CNF_AFPP|...)
- * function, it must be unconfigured with kl_unconfiggpio() with
- * the same cfgset first before it can be set to non-alternative function.
- *
- * Returns:
- * OK on success
- * ERROR on invalid port, or when pin is locked as ALT function.
+ * Configure a PIN based on bit-encoded description of the pin. NOTE that
+ * DMA/interrupts are disabled at the initial PIN configuratin.
*
****************************************************************************/
-int kl_configgpio(gpio_cfgset_t cfgset);
+int kl_configgpio(uint32_t cfgset);
/****************************************************************************
* Name: kl_gpiowrite
@@ -223,7 +333,7 @@ int kl_configgpio(gpio_cfgset_t cfgset);
*
****************************************************************************/
-void kl_gpiowrite(gpio_cfgset_t pinset, bool value);
+void kl_gpiowrite(uint32_t pinset, bool value);
/****************************************************************************
* Name: kl_gpioread
@@ -233,27 +343,7 @@ void kl_gpiowrite(gpio_cfgset_t pinset, bool value);
*
****************************************************************************/
-bool kl_gpioread(gpio_cfgset_t pinset);
-
-/****************************************************************************
- * Function: kl_dumpgpio
- *
- * Description:
- * Dump all GPIO registers associated with the provided pin description
- * along with a descriptive messasge.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_DEBUG
-void kl_dumpgpio(gpio_cfgset_t pinset, const char *msg);
-#else
-# define kl_dumpgpio(p,m)
-#endif
-
-#undef EXTERN
-#if defined(__cplusplus)
-}
-#endif
+bool kl_gpioread(uint32_t pinset);
#endif /* __ASSEMBLY__ */
#endif /* __ARCH_ARM_SRC_KL_KINETIS_GPIO_H */
diff --git a/nuttx/arch/arm/src/kl/kl_internal.h b/nuttx/arch/arm/src/kl/kl_internal.h
deleted file mode 100644
index 467cb2ab6..000000000
--- a/nuttx/arch/arm/src/kl/kl_internal.h
+++ /dev/null
@@ -1,775 +0,0 @@
-/************************************************************************************
- * arch/arm/src/kl/kl_internal.h
- *
- * Copyright (C) 2013 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <gnutt@nuttx.org>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor the names of its contributors may be
- * used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ************************************************************************************/
-
-#ifndef __ARCH_ARM_SRC_KL_KL_INTERNAL_H
-#define __ARCH_ARM_SRC_KL_KL_INTERNAL_H
-
-/************************************************************************************
- * Included Files
- ************************************************************************************/
-
-#include <nuttx/config.h>
-#include <nuttx/compiler.h>
-
-#include <sys/types.h>
-#include <stdint.h>
-#include <stdbool.h>
-
-#include <nuttx/irq.h>
-
-#include "up_internal.h"
-#include "kl_config.h"
-#include "chip.h"
-#include "chip/kl_port.h"
-
-/************************************************************************************
- * Definitions
- ************************************************************************************/
-
-/* Configuration ********************************************************************/
-
-/* Bit-encoded input to kl_pinconfig() *****************************************/
-/* General form (32-bits, only 22 bits are unused in the encoding):
- *
- * oooo mmmv iiii ifd- ---- -ppp ---b bbbb
- */
-
-/* Bits 25-31: 7 bits are used to encode the basic pin configuration:
- *
- * oooo mmm- ---- ---- ---- ---- ---- ----
- * oooommm:
- * | `--- mmm: mode
- * `------- oooo: options (may be combined)
- */
-
-#define _PIN_MODE_SHIFT (25) /* Bits 25-27: Pin mode */
-#define _PIN_MODE_MASK (7 << _PIN_MODE_SHIFT)
-#define _PIN_OPTIONS_SHIFT (28) /* Bits 28-31: Pin mode options */
-#define _PIN_OPTIONS_MASK (15 << _PIN_OPTIONS_SHIFT)
-
-/* Port Modes */
-
-#define _PIN_MODE_ANALOG (0 << _PIN_MODE_SHIFT) /* 000 Pin Disabled (Analog) */
-#define _PIN_MODE_GPIO (1 << _PIN_MODE_SHIFT) /* 001 Alternative 1 (GPIO) */
-#define _PIN_MODE_ALT2 (2 << _PIN_MODE_SHIFT) /* 010 Alternative 2 */
-#define _PIN_MODE_ALT3 (3 << _PIN_MODE_SHIFT) /* 011 Alternative 3 */
-#define _PIN_MODE_ALT4 (4 << _PIN_MODE_SHIFT) /* 100 Alternative 4 */
-#define _PIN_MODE_ALT5 (5 << _PIN_MODE_SHIFT) /* 101 Alternative 5 */
-#define _PIN_MODE_ALT6 (6 << _PIN_MODE_SHIFT) /* 110 Alternative 6 */
-#define _PIN_MODE_ALT7 (7 << _PIN_MODE_SHIFT) /* 111 Alternative 7 */
-
-/* Options for all digital modes (Alternatives 1-7). None of the digital
- * options apply if the analog mode is selected.
- */
-
-#define _PIN_IO_MASK (1 << _PIN_OPTIONS_SHIFT) /* xxx1 Digital input/output mask */
-#define _PIN_INPUT (0 << _PIN_OPTIONS_SHIFT) /* xxx0 Digital input */
-#define _PIN_OUTPUT (1 << _PIN_OPTIONS_SHIFT) /* xxx1 Digital output */
-
-#define _PIN_INPUT_PULLMASK (7 << _PIN_OPTIONS_SHIFT) /* x111 Mask for pull-up or -down bits */
-#define _PIN_INPUT_PULLDOWN (2 << _PIN_OPTIONS_SHIFT) /* x010 Input with internal pull-down resistor */
-#define _PIN_INPUT_PULLUP (6 << _PIN_OPTIONS_SHIFT) /* x110 Input with internal pull-up resistor */
-
-#define _PIN_OUTPUT_SLEW_MASK (3 << _PIN_OPTIONS_SHIFT) /* xx11 Mask to test for slow slew rate */
-#define _PIN_OUTPUT_FAST (1 << _PIN_OPTIONS_SHIFT) /* xx01 Output with fast slew rate */
-#define _PIN_OUTPUT_SLOW (3 << _PIN_OPTIONS_SHIFT) /* xx11 Output with slow slew rate */
-#define _PIN_OUTPUT_OD_MASK (5 << _PIN_OPTIONS_SHIFT) /* x1x1 Mask to test for open drain */
-#define _PIN_OUTPUT_OPENDRAIN (5 << _PIN_OPTIONS_SHIFT) /* x1x1 Output with open drain enabled */
-#define _PIN_OUTPUT_DRIVE_MASK (9 << _PIN_OPTIONS_SHIFT) /* 1xx1 Mask to test for high drive strengh */
-#define _PIN_OUTPUT_LOWDRIVE (1 << _PIN_OPTIONS_SHIFT) /* 0xx1 Output with low drive strength */
-#define _PIN_OUTPUT_HIGHDRIVE (9 << _PIN_OPTIONS_SHIFT) /* 1xx1 Output with high drive strength */
-
-/* End-user pin modes and configurations. Notes: (1) None of the digital options
- * are available for the analog mode, (2) digital settings may be combined (OR'ed)
- * provided that input-only and output-only options are not intermixed.
- */
-
-#define PIN_ANALOG _PIN_MODE_ANALOG
-
-#define GPIO_INPUT (_PIN_MODE_GPIO | _PIN_INPUT)
-#define GPIO_PULLDOWN (_PIN_MODE_GPIO | _PIN_INPUT_PULLDOWN)
-#define GPIO_PULLUP (_PIN_MODE_GPIO | _PIN_INPUT_PULLUP)
-#define GPIO_OUTPUT (_PIN_MODE_GPIO | _PIN_OUTPUT)
-#define GPIO_FAST (_PIN_MODE_GPIO | _PIN_OUTPUT_FAST)
-#define GPIO_SLOW (_PIN_MODE_GPIO | _PIN_OUTPUT_SLOW)
-#define GPIO_OPENDRAIN (_PIN_MODE_GPIO | _PIN_OUTPUT_LOWDRIVE)
-#define GPIO_LOWDRIVE (_PIN_MODE_GPIO | _PIN_OUTPUT_OPENDRAIN)
-#define GPIO_HIGHDRIVE (_PIN_MODE_GPIO | _PIN_OUTPUT_HIGHDRIVE)
-
-#define PIN_ALT2 _PIN_MODE_ALT2
-#define PIN_ALT2_INPUT (_PIN_MODE_ALT2 | _PIN_INPUT)
-#define PIN_ALT2_PULLDOWN (_PIN_MODE_ALT2 | _PIN_INPUT_PULLDOWN)
-#define PIN_ALT2_PULLUP (_PIN_MODE_ALT2 | _PIN_INPUT_PULLUP)
-#define PIN_ALT2_OUTPUT (_PIN_MODE_ALT2 | _PIN_OUTPUT)
-#define PIN_ALT2_FAST (_PIN_MODE_ALT2 | _PIN_OUTPUT_FAST)
-#define PIN_ALT2_SLOW (_PIN_MODE_ALT2 | _PIN_OUTPUT_SLOW)
-#define PIN_ALT2_OPENDRAIN (_PIN_MODE_ALT2 | _PIN_OUTPUT_LOWDRIVE)
-#define PIN_ALT2_LOWDRIVE (_PIN_MODE_ALT2 | _PIN_OUTPUT_OPENDRAIN)
-#define PIN_ALT2_HIGHDRIVE (_PIN_MODE_ALT2 | _PIN_OUTPUT_HIGHDRIVE)
-
-#define PIN_ALT3 _PIN_MODE_ALT3
-#define PIN_ALT3_INPUT (_PIN_MODE_ALT3 | _PIN_INPUT)
-#define PIN_ALT3_PULLDOWN (_PIN_MODE_ALT3 | _PIN_INPUT_PULLDOWN)
-#define PIN_ALT3_PULLUP (_PIN_MODE_ALT3 | _PIN_INPUT_PULLUP)
-#define PIN_ALT3_OUTPUT (_PIN_MODE_ALT3 | _PIN_OUTPUT)
-#define PIN_ALT3_FAST (_PIN_MODE_ALT3 | _PIN_OUTPUT_FAST)
-#define PIN_ALT3_SLOW (_PIN_MODE_ALT3 | _PIN_OUTPUT_SLOW)
-#define PIN_ALT3_OPENDRAIN (_PIN_MODE_ALT3 | _PIN_OUTPUT_LOWDRIVE)
-#define PIN_ALT3_LOWDRIVE (_PIN_MODE_ALT3 | _PIN_OUTPUT_OPENDRAIN)
-#define PIN_ALT3_HIGHDRIVE (_PIN_MODE_ALT3 | _PIN_OUTPUT_HIGHDRIVE)
-
-#define PIN_ALT4 _PIN_MODE_ALT4
-#define PIN_ALT4_INPUT (_PIN_MODE_ALT4 | _PIN_INPUT)
-#define PIN_ALT4_PULLDOWN (_PIN_MODE_ALT4 | _PIN_INPUT_PULLDOWN)
-#define PIN_ALT4_PULLUP (_PIN_MODE_ALT4 | _PIN_INPUT_PULLUP)
-#define PIN_ALT4_OUTPUT (_PIN_MODE_ALT4 | _PIN_OUTPUT)
-#define PIN_ALT4_FAST (_PIN_MODE_ALT4 | _PIN_OUTPUT_FAST)
-#define PIN_ALT4_SLOW (_PIN_MODE_ALT4 | _PIN_OUTPUT_SLOW)
-#define PIN_ALT4_OPENDRAIN (_PIN_MODE_ALT4 | _PIN_OUTPUT_LOWDRIVE)
-#define PIN_ALT4_LOWDRIVE (_PIN_MODE_ALT4 | _PIN_OUTPUT_OPENDRAIN)
-#define PIN_ALT4_HIGHDRIVE (_PIN_MODE_ALT4 | _PIN_OUTPUT_HIGHDRIVE)
-
-#define PIN_ALT5 _PIN_MODE_ALT5
-#define PIN_ALT5_INPUT (_PIN_MODE_ALT5 | _PIN_INPUT)
-#define PIN_ALT5_PULLDOWN (_PIN_MODE_ALT5 | _PIN_INPUT_PULLDOWN)
-#define PIN_ALT5_PULLUP (_PIN_MODE_ALT5 | _PIN_INPUT_PULLUP)
-#define PIN_ALT5_OUTPUT (_PIN_MODE_ALT5 | _PIN_OUTPUT)
-#define PIN_ALT5_FAST (_PIN_MODE_ALT5 | _PIN_OUTPUT_FAST)
-#define PIN_ALT5_SLOW (_PIN_MODE_ALT5 | _PIN_OUTPUT_SLOW)
-#define PIN_ALT5_OPENDRAIN (_PIN_MODE_ALT5 | _PIN_OUTPUT_LOWDRIVE)
-#define PIN_ALT5_LOWDRIVE (_PIN_MODE_ALT5 | _PIN_OUTPUT_OPENDRAIN)
-#define PIN_ALT5_HIGHDRIVE (_PIN_MODE_ALT5 | _PIN_OUTPUT_HIGHDRIVE)
-
-#define PIN_ALT6 _PIN_MODE_ALT6
-#define PIN_ALT6_INPUT (_PIN_MODE_ALT6 | _PIN_INPUT)
-#define PIN_ALT6_PULLDOWN (_PIN_MODE_ALT6 | _PIN_INPUT_PULLDOWN)
-#define PIN_ALT6_PULLUP (_PIN_MODE_ALT6 | _PIN_INPUT_PULLUP)
-#define PIN_ALT6_OUTPUT (_PIN_MODE_ALT6 | _PIN_OUTPUT)
-#define PIN_ALT6_FAST (_PIN_MODE_ALT6 | _PIN_OUTPUT_FAST)
-#define PIN_ALT6_SLOW (_PIN_MODE_ALT6 | _PIN_OUTPUT_SLOW)
-#define PIN_ALT6_OPENDRAIN (_PIN_MODE_ALT6 | _PIN_OUTPUT_LOWDRIVE)
-#define PIN_ALT6_LOWDRIVE (_PIN_MODE_ALT6 | _PIN_OUTPUT_OPENDRAIN)
-#define PIN_ALT6_HIGHDRIVE (_PIN_MODE_ALT6 | _PIN_OUTPUT_HIGHDRIVE)
-
-#define PIN_ALT7 _PIN_MODE_ALT7
-#define PIN_ALT7_INPUT (_PIN_MODE_ALT7 | _PIN_INPUT)
-#define PIN_ALT7_PULLDOWN (_PIN_MODE_ALT7 | _PIN_INPUT_PULLDOWN)
-#define PIN_ALT7_PULLUP (_PIN_MODE_ALT7 | _PIN_INPUT_PULLUP)
-#define PIN_ALT7_OUTPUT (_PIN_MODE_ALT7 | _PIN_OUTPUT)
-#define PIN_ALT7_FAST (_PIN_MODE_ALT7 | _PIN_OUTPUT_FAST)
-#define PIN_ALT7_SLOW (_PIN_MODE_ALT7 | _PIN_OUTPUT_SLOW)
-#define PIN_ALT7_OPENDRAIN (_PIN_MODE_ALT7 | _PIN_OUTPUT_LOWDRIVE)
-#define PIN_ALT7_LOWDRIVE (_PIN_MODE_ALT7 | _PIN_OUTPUT_OPENDRAIN)
-#define PIN_ALT7_HIGHDRIVE (_PIN_MODE_ALT7 | _PIN_OUTPUT_HIGHDRIVE)
-
-/* The initial value for GPIO (Alternative 1 outputs):
- *
- * ---- ---v ---- ---- ---- ---- ---- ----
- *
- * Passive Filter and digital filter enable are valid in all digital pin
- * muxing modes.
- */
-
-#define GPIO_OUTPUT_ONE (1 << 24) /* Bit 24: 1:Initial output value=1 */
-#define GPIO_OUTPUT_ZER0 (0) /* Bit 24: 0:Initial output value=0 */
-
-/* Five bits are used to incode DMA/interrupt options:
- *
- * ---- ---- iiii i--- ---- ---- ---- ----
- *
- * The pin interrupt configuration is valid in all digital pin muxing modes
- * (restricted to inputs).
- */
-
-#define _PIN_INT_SHIFT (20)
-#define _PIN_INT_MASK (31 << _PIN_INT_SHIFT)
-
-#define _PIN_INTDMA_MASK (3 << _PIN_INT_SHIFT)
-#define _PIN_INTDMA_NONE (0 << _PIN_INT_SHIFT)
-#define _PIN_DMA (1 << _PIN_INT_SHIFT)
-#define _PIN_INTERRUPT (2 << _PIN_INT_SHIFT)
-
-#define PIN_DMA_RISING (5 << _PIN_INT_SHIFT) /* 00101 DMA Request on rising edge */
-#define PIN_DMA_FALLING (9 << _PIN_INT_SHIFT) /* 01001 DMA Request on falling edge */
-#define PIN_DMA_BOTH (13 << _PIN_INT_SHIFT) /* 01101 DMA Request on either edge */
-#define PIN_INT_ZERO (2 << _PIN_INT_SHIFT) /* 00010 Interrupt when logic zero */
-#define PIN_INT_RISING (6 << _PIN_INT_SHIFT) /* 00110 Interrupt on rising edge */
-#define PIN_INT_FALLING (10 << _PIN_INT_SHIFT) /* 01010 Interrupt on falling edge */
-#define PIN_INT_BOTH (14 << _PIN_INT_SHIFT) /* 01110 Interrupt on either edge */
-#define PIN_INT_ONE (18 << _PIN_INT_SHIFT) /* 10010 Interrupt when logic one */
-
-/* Two bits is used to enable the filter options:
- *
- * ---- ---- ---- -fd- ---- ---- ---- ----
- *
- * Passive Filter and digital filter enable are valid in all digital pin
- * muxing modes.
- */
-
-#define PIN_PASV_FILTER (1 << 18) /* Bit 18: Enable passive filter */
-#define PIN_DIG_FILTER (1 << 17) /* Bit 17: Enable digital filter */
-
-/* Three bits are used to define the port number:
- *
- * ---- ---- ---- ---- ---- -ppp ---- ----
- */
-
-#define _PIN_PORT_SHIFT (8) /* Bits 8-10: port number */
-#define _PIN_PORT_MASK (7 << _PIN_PORT_SHIFT)
-
-#define PIN_PORTA (KL_PORTA << _PIN_PORT_SHIFT)
-#define PIN_PORTB (KL_PORTB << _PIN_PORT_SHIFT)
-#define PIN_PORTC (KL_PORTC << _PIN_PORT_SHIFT)
-#define PIN_PORTD (KL_PORTD << _PIN_PORT_SHIFT)
-#define PIN_PORTE (KL_PORTE << _PIN_PORT_SHIFT)
-
-/* Five bits are used to define the pin number:
- *
- * ---- ---- ---- ---- ---- ---- ---b bbbb
- */
-
-#define _PIN_SHIFT (0) /* Bits 0-4: port number */
-#define _PIN_MASK (31 << _PIN_SHIFT)
-
-#define PIN(n) ((n) << _PIN_SHIFT)
-#define PIN0 (0 << _PIN_SHIFT)
-#define PIN1 (1 << _PIN_SHIFT)
-#define PIN2 (2 << _PIN_SHIFT)
-#define PIN3 (3 << _PIN_SHIFT)
-#define PIN4 (4 << _PIN_SHIFT)
-#define PIN5 (5 << _PIN_SHIFT)
-#define PIN6 (6 << _PIN_SHIFT)
-#define PIN7 (7 << _PIN_SHIFT)
-#define PIN8 (8 << _PIN_SHIFT)
-#define PIN9 (9 << _PIN_SHIFT)
-#define PIN10 (10 << _PIN_SHIFT)
-#define PIN11 (11 << _PIN_SHIFT)
-#define PIN12 (12 << _PIN_SHIFT)
-#define PIN13 (13 << _PIN_SHIFT)
-#define PIN14 (14 << _PIN_SHIFT)
-#define PIN15 (15 << _PIN_SHIFT)
-#define PIN16 (16 << _PIN_SHIFT)
-#define PIN17 (17 << _PIN_SHIFT)
-#define PIN18 (18 << _PIN_SHIFT)
-#define PIN19 (19 << _PIN_SHIFT)
-#define PIN20 (20 << _PIN_SHIFT)
-#define PIN21 (21 << _PIN_SHIFT)
-#define PIN22 (22 << _PIN_SHIFT)
-#define PIN23 (23 << _PIN_SHIFT)
-#define PIN24 (24 << _PIN_SHIFT)
-#define PIN25 (25 << _PIN_SHIFT)
-#define PIN26 (26 << _PIN_SHIFT)
-#define PIN27 (27 << _PIN_SHIFT)
-#define PIN28 (28 << _PIN_SHIFT)
-#define PIN29 (29 << _PIN_SHIFT)
-#define PIN30 (30 << _PIN_SHIFT)
-#define PIN31 (31 << _PIN_SHIFT)
-
-/************************************************************************************
- * Public Types
- ************************************************************************************/
-
-typedef FAR void *DMA_HANDLE;
-typedef void (*dma_callback_t)(DMA_HANDLE handle, void *arg, int result);
-
-/* The following is used for sampling DMA registers when CONFIG DEBUG_DMA is selected */
-
-#ifdef CONFIG_DEBUG_DMA
-struct kl_dmaglobalregs_s
-{
-#warning "Missing logic"
- /* Global Registers */
-};
-
-struct kl_dmachanregs_s
-{
-#warning "Missing logic"
- /* Channel Registers */
-};
-
-struct kl_dmaregs_s
-{
- /* Global Registers */
-
- struct kl_dmaglobalregs_s gbl;
-
- /* Channel Registers */
-
- struct kl_dmachanregs_s ch;
-};
-#endif
-
-/************************************************************************************
- * Inline Functions
- ************************************************************************************/
-
-#ifndef __ASSEMBLY__
-
-/************************************************************************************
- * Public Data
- ************************************************************************************/
-
-#undef EXTERN
-#if defined(__cplusplus)
-#define EXTERN extern "C"
-extern "C"
-{
-#else
-#define EXTERN extern
-#endif
-
-/************************************************************************************
- * Public Function Prototypes
- ************************************************************************************/
-
-/************************************************************************************
- * Name: kl_clockconfig
- *
- * Description:
- * Called to initialize the Kinetis chip. This does whatever setup is needed to
- * put the MCU in a usable state. This includes the initialization of clocking
- * using the settings in board.h.
- *
- ************************************************************************************/
-
-void kl_clockconfig(void);
-
-/************************************************************************************
- * Name: kl_lowsetup
- *
- * Description:
- * Called at the very beginning of _start. Performs low level initialization
- * including setup of the console UART. This UART done early so that the serial
- * console is available for debugging very early in the boot sequence.
- *
- ************************************************************************************/
-
-void kl_lowsetup(void);
-
-/******************************************************************************
- * Name: kl_uartreset
- *
- * Description:
- * Reset a UART.
- *
- ******************************************************************************/
-
-#ifdef HAVE_UART_DEVICE
-void kl_uartreset(uintptr_t uart_base);
-#endif
-
-/******************************************************************************
- * Name: kl_uartconfigure
- *
- * Description:
- * Configure a UART as a RS-232 UART.
- *
- ******************************************************************************/
-
-#ifdef HAVE_UART_DEVICE
-void kl_uartconfigure(uintptr_t uart_base, uint32_t baud, uint32_t clock,
- unsigned int parity, unsigned int nbits);
-#endif
-
-/************************************************************************************
- * Name: kl_wddisable
- *
- * Description:
- * Disable the watchdog timer
- *
- ************************************************************************************/
-
-void kl_wddisable(void);
-
-/************************************************************************************
- * Name: kl_pinconfig
- *
- * Description:
- * Configure a pin based on bit-encoded description of the pin.
- *
- ************************************************************************************/
-
-int kl_pinconfig(uint32_t cfgset);
-
-/************************************************************************************
- * Name: kl_pinfilter
- *
- * Description:
- * Configure the digital filter associated with a port. The digital filter
- * capabilities of the PORT module are available in all digital pin muxing modes.
- *
- * Input parmeters:
- * port - See KL_PORTn definitions in kl_port.h
- * lpo - true: Digital Filters are clocked by the bus clock
- * false: Digital Filters are clocked by the 1 kHz LPO clock
- * width - Filter Length
- *
- ************************************************************************************/
-
-int kl_pinfilter(unsigned int port, bool lpo, unsigned int width);
-
-/************************************************************************************
- * Name: kl_gpiowrite
- *
- * Description:
- * Write one or zero to the selected GPIO pin
- *
- ************************************************************************************/
-
-void kl_gpiowrite(uint32_t pinset, bool value);
-
-/************************************************************************************
- * Name: kl_gpioread
- *
- * Description:
- * Read one or zero from the selected GPIO pin
- *
- ************************************************************************************/
-
-bool kl_gpioread(uint32_t pinset);
-
-/************************************************************************************
- * Name: kl_pinirqinitialize
- *
- * Description:
- * Initialize logic to support a second level of interrupt decoding for GPIO pins.
- *
- ************************************************************************************/
-
-#ifdef CONFIG_GPIO_IRQ
-void kl_pinirqinitialize(void);
-#else
-# define kl_pinirqinitialize()
-#endif
-
-/************************************************************************************
- * Name: kl_pinirqattach
- *
- * Description:
- * Attach a pin interrupt handler. The normal initalization sequence is:
- *
- * 1. Call kl_pinconfig() to configure the interrupting pin (pin interrupts
- * will be disabled.
- * 2. Call kl_pinirqattach() to attach the pin interrupt handling function.
- * 3. Call kl_pinirqenable() to enable interrupts on the pin.
- *
- * Parameters:
- * - pinset: Pin configuration
- * - pinisr: Pin interrupt service routine
- *
- * Returns:
- * The previous value of the interrupt handler function pointer. This value may,
- * for example, be used to restore the previous handler when multiple handlers are
- * used.
- *
- ************************************************************************************/
-
-xcpt_t kl_pinirqattach(uint32_t pinset, xcpt_t pinisr);
-
-/************************************************************************************
- * Name: kl_pinirqenable
- *
- * Description:
- * Enable the interrupt for specified pin IRQ
- *
- ************************************************************************************/
-
-#ifdef CONFIG_GPIO_IRQ
-void kl_pinirqenable(uint32_t pinset);
-#else
-# define kl_pinirqenable(pinset)
-#endif
-
-/************************************************************************************
- * Name: kl_pinirqdisable
- *
- * Description:
- * Disable the interrupt for specified pin
- *
- ************************************************************************************/
-
-#ifdef CONFIG_GPIO_IRQ
-void kl_pinirqdisable(uint32_t pinset);
-#else
-# define kl_pinirqdisable(pinset)
-#endif
-
-/************************************************************************************
- * Name: kl_pindmaenable
- *
- * Description:
- * Enable DMA for specified pin
- *
- ************************************************************************************/
-
-#ifdef CONFIG_KL_DMA
-void kl_pindmaenable(uint32_t pinset);
-#endif
-
-/************************************************************************************
- * Name: kl_pindmadisable
- *
- * Description:
- * Disable DMA for specified pin
- *
- ************************************************************************************/
-
-#ifdef CONFIG_KL_DMA
-void kl_pindmadisable(uint32_t pinset);
-#endif
-
-/************************************************************************************
- * Function: kl_pindump
- *
- * Description:
- * Dump all GPIO registers associated with the base address of the provided pinset.
- *
- ************************************************************************************/
-
-#ifdef CONFIG_DEBUG_GPIO
-int kl_pindump(uint32_t pinset, const char *msg);
-#else
-# define kl_pindump(p,m)
-#endif
-
-/************************************************************************************
- * Name: kl_clrpend
- *
- * Description:
- * Clear a pending interrupt at the NVIC. This does not seem to be required
- * for most interrupts.
- *
- ************************************************************************************/
-
-void kl_clrpend(int irq);
-
-/************************************************************************************
- * Name: kl_spi[n]select, kl_spi[n]status, and kl_spi[n]cmddata
- *
- * Description:
- * These external functions must be provided by board-specific logic. They are
- * implementations of the select, status, and cmddata methods of the SPI interface
- * defined by struct spi_ops_s (see include/nuttx/spi.h). All other methods
- * including up_spiinitialize()) are provided by common Kinetis logic. To use
- * this common SPI logic on your board:
- *
- * 1. Provide logic in kl_boardinitialize() to configure SPI chip select
- * pins.
- * 2. Provide kl_spi[n]select() and kl_spi[n]status() functions
- * in your board-specific logic. These functions will perform chip selection
- * and status operations using GPIOs in the way your board is configured.
- * 2. If CONFIG_SPI_CMDDATA is defined in the NuttX configuration, provide
- * kl_spi[n]cmddata() functions in your board-specific logic. These
- * functions will perform cmd/data selection operations using GPIOs in the way
- * your board is configured.
- * 3. Add a call to up_spiinitialize() in your low level application
- * initialization logic
- * 4. The handle returned by up_spiinitialize() may then be used to bind the
- * SPI driver to higher level logic (e.g., calling
- * mmcsd_spislotinitialize(), for example, will bind the SPI driver to
- * the SPI MMC/SD driver).
- *
- ************************************************************************************/
-
-struct spi_dev_s;
-enum spi_dev_e;
-
-#ifdef CONFIG_KL_SPI0
-void kl_spi0select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected);
-uint8_t kl_spi0status(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
-#ifdef CONFIG_SPI_CMDDATA
-int kl_spi0cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd);
-#endif
-#endif
-#ifdef CONFIG_KL_SPI1
-void kl_spi1select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected);
-uint8_t kl_spi1status(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
-#ifdef CONFIG_SPI_CMDDATA
-int kl_spi1cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd);
-#endif
-#endif
-#ifdef CONFIG_KL_SPI2
-void kl_spi2select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected);
-uint8_t kl_spi2status(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
-#ifdef CONFIG_SPI_CMDDATA
-int kl_spi2cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd);
-#endif
-#endif
-
-/****************************************************************************
- * Name: ssp_flush
- *
- * Description:
- * Flush and discard any words left in the RX fifo. This can be called
- * from spi[n]select after a device is deselected (if you worry about such
- * things).
- *
- * Input Parameters:
- * dev - Device-specific state data
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-#if defined(CONFIG_KL_SPI0) || defined(CONFIG_KL_SPI0) || defined(CONFIG_KL_SPI2)
-struct spi_dev_s;
-void spi_flush(FAR struct spi_dev_s *dev);
-#endif
-
-/****************************************************************************
- * Name: kl_dmainitialize
- *
- * Description:
- * Initialize the GPDMA subsystem.
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-#ifdef CONFIG_KL_DMA
-void kl_dmainitilaize(void);
-#endif
-
-/****************************************************************************
- * Name: kl_dmachannel
- *
- * Description:
- * Allocate a DMA channel. This function sets aside a DMA channel and
- * gives the caller exclusive access to the DMA channel.
- *
- * Returned Value:
- * One success, this function returns a non-NULL, void* DMA channel
- * handle. NULL is returned on any failure. This function can fail only
- * if no DMA channel is available.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_KL_DMA
-DMA_HANDLE kl_dmachannel(void);
-#endif
-
-/****************************************************************************
- * Name: kl_dmafree
- *
- * Description:
- * Release a DMA channel. NOTE: The 'handle' used in this argument must
- * NEVER be used again until kl_dmachannel() is called again to re-gain
- * a valid handle.
- *
- * Returned Value:
- * None
- *
- ****************************************************************************/
-
-#ifdef CONFIG_KL_DMA
-void kl_dmafree(DMA_HANDLE handle);
-#endif
-
-/****************************************************************************
- * Name: kl_dmasetup
- *
- * Description:
- * Configure DMA for one transfer.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_KL_DMA
-int kl_dmarxsetup(DMA_HANDLE handle, uint32_t control, uint32_t config,
- uint32_t srcaddr, uint32_t destaddr, size_t nbytes);
-#endif
-
-/****************************************************************************
- * Name: kl_dmastart
- *
- * Description:
- * Start the DMA transfer
- *
- ****************************************************************************/
-
-#ifdef CONFIG_KL_DMA
-int kl_dmastart(DMA_HANDLE handle, dma_callback_t callback, void *arg);
-#endif
-
-/****************************************************************************
- * Name: kl_dmastop
- *
- * Description:
- * Cancel the DMA. After kl_dmastop() is called, the DMA channel is
- * reset and kl_dmasetup() must be called before kl_dmastart() can be
- * called again
- *
- ****************************************************************************/
-
-#ifdef CONFIG_KL_DMA
-void kl_dmastop(DMA_HANDLE handle);
-#endif
-
-/****************************************************************************
- * Name: kl_dmasample
- *
- * Description:
- * Sample DMA register contents
- *
- ****************************************************************************/
-
-#ifdef CONFIG_KL_DMA
-#ifdef CONFIG_DEBUG_DMA
-void kl_dmasample(DMA_HANDLE handle, struct kl_dmaregs_s *regs);
-#else
-# define kl_dmasample(handle,regs)
-#endif
-#endif
-
-/****************************************************************************
- * Name: kl_dmadump
- *
- * Description:
- * Dump previously sampled DMA register contents
- *
- ****************************************************************************/
-
-#ifdef CONFIG_KL_DMA
-#ifdef CONFIG_DEBUG_DMA
-void kl_dmadump(DMA_HANDLE handle, const struct kl_dmaregs_s *regs,
- const char *msg);
-#else
-# define kl_dmadump(handle,regs,msg)
-#endif
-#endif
-
-#endif /* __ASSEMBLY__ */
-#endif /* __ARCH_ARM_SRC_KL_KL_INTERNAL_H */
diff --git a/nuttx/arch/arm/src/kl/kl_irq.h b/nuttx/arch/arm/src/kl/kl_irq.h
index 089cd60bd..ee5de9309 100644
--- a/nuttx/arch/arm/src/kl/kl_irq.h
+++ b/nuttx/arch/arm/src/kl/kl_irq.h
@@ -54,6 +54,16 @@
* Public Data
************************************************************************************/
+#ifndef __ASSEMBLY__
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C" {
+#else
+#define EXTERN extern
+#endif
+
/************************************************************************************
* Inline Functions
************************************************************************************/
@@ -62,4 +72,10 @@
* Public Functions
************************************************************************************/
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
#endif /* __ARCH_ARM_SRC_KL_KINETIS_IRQ_H */
diff --git a/nuttx/arch/arm/src/kl/kl_lowputc.c b/nuttx/arch/arm/src/kl/kl_lowputc.c
index 5f2242969..27675a017 100644
--- a/nuttx/arch/arm/src/kl/kl_lowputc.c
+++ b/nuttx/arch/arm/src/kl/kl_lowputc.c
@@ -49,7 +49,8 @@
#include "kl_config.h"
#include "kl_lowputc.h"
-#include "kl_internal.h"
+#include "kl_gpio.h"
+
#include "chip/kl_uart.h"
#include "chip/kl_sim.h"
#include "chip/kl_port.h"
diff --git a/nuttx/arch/arm/src/kl/kl_lowputc.h b/nuttx/arch/arm/src/kl/kl_lowputc.h
index b30544e0f..ab9df0ce4 100644
--- a/nuttx/arch/arm/src/kl/kl_lowputc.h
+++ b/nuttx/arch/arm/src/kl/kl_lowputc.h
@@ -74,48 +74,50 @@ extern "C"
* Name: kl_lowsetup
*
* Description:
- * Called at the very beginning of _start. Performs low level initialization.
+ * Called at the very beginning of _start. Performs low level initialization
+ * including setup of the console UART. This UART done early so that the serial
+ * console is available for debugging very early in the boot sequence.
*
************************************************************************************/
void kl_lowsetup(void);
-/****************************************************************************
- * Name: kl_setbaud
+/************************************************************************************
+ * Name: kl_uartreset
*
* Description:
- * Set the BAUD divxisor for the selected UART
- *
- * Mode DIV_X_EN DIV_X_ONE Divider X BRD (Baud rate equation)
- * -------------------------------------------------------------
- * 0 Disable 0 B A UART_CLK / [16 * (A+2)]
- * 1 Enable 0 B A UART_CLK / [(B+1) * (A+2)] , B must >= 8
- * 2 Enable 1 Don't care A UART_CLK / (A+2), A must >=3
+ * Reset a UART.
*
- * Here we assume that the default clock source for the UART modules is
- * the external high speed crystal.
- *
- *****************************************************************************/
+ ************************************************************************************/
-#ifdef HAVE_UART
-void kl_setbaud(uintptr_t base, uint32_t baud);
+#ifdef HAVE_UART_DEVICE
+void kl_uartreset(uintptr_t uart_base);
#endif
-/****************************************************************************
+/************************************************************************************
* Name: kl_lowputc
*
* Description:
* Output one character to the UART using a simple polling method.
*
- *****************************************************************************/
+ ************************************************************************************/
#ifdef HAVE_SERIAL_CONSOLE
void kl_lowputc(uint32_t ch);
#endif
-void kl_uartconfigure(uintptr_t uart_base, uint32_t baud,
- uint32_t clock, unsigned int parity,
- unsigned int nbits);
+/************************************************************************************
+ * Name: kl_uartconfigure
+ *
+ * Description:
+ * Configure a UART as a RS-232 UART.
+ *
+ ************************************************************************************/
+
+#ifdef HAVE_UART_DEVICE
+void kl_uartconfigure(uintptr_t uart_base, uint32_t baud, uint32_t clock,
+ unsigned int parity, unsigned int nbits);
+#endif
#undef EXTERN
#if defined(__cplusplus)
diff --git a/nuttx/arch/arm/src/kl/kl_serial.c b/nuttx/arch/arm/src/kl/kl_serial.c
index 290192dcd..a2f3918c7 100644
--- a/nuttx/arch/arm/src/kl/kl_serial.c
+++ b/nuttx/arch/arm/src/kl/kl_serial.c
@@ -61,9 +61,9 @@
#include "kl_config.h"
#include "kl_lowputc.h"
#include "chip.h"
+#include "kl_gpio.h"
#include "chip/kl_uart.h"
-#include "kl_internal.h"
/****************************************************************************
* Pre-processor Definitions
diff --git a/nuttx/arch/arm/src/kl/kl_spi.h b/nuttx/arch/arm/src/kl/kl_spi.h
new file mode 100644
index 000000000..e6252a488
--- /dev/null
+++ b/nuttx/arch/arm/src/kl/kl_spi.h
@@ -0,0 +1,142 @@
+/****************************************************************************
+ * arch/arm/src/kl/kl_gpio.h
+ *
+ * Copyright (C) 2013 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_ARM_SRC_KL_KL_SPI_H
+#define __ARCH_ARM_SRC_KL_KL_SPI_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/****************************************************************************
+ * Pre-processor Declarations
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C" {
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/************************************************************************************
+ * Name: kl_spi[n]select, kl_spi[n]status, and kl_spi[n]cmddata
+ *
+ * Description:
+ * These external functions must be provided by board-specific logic. They are
+ * implementations of the select, status, and cmddata methods of the SPI interface
+ * defined by struct spi_ops_s (see include/nuttx/spi.h). All other methods
+ * including up_spiinitialize()) are provided by common Kinetis logic. To use
+ * this common SPI logic on your board:
+ *
+ * 1. Provide logic in kl_boardinitialize() to configure SPI chip select
+ * pins.
+ * 2. Provide kl_spi[n]select() and kl_spi[n]status() functions
+ * in your board-specific logic. These functions will perform chip selection
+ * and status operations using GPIOs in the way your board is configured.
+ * 2. If CONFIG_SPI_CMDDATA is defined in the NuttX configuration, provide
+ * kl_spi[n]cmddata() functions in your board-specific logic. These
+ * functions will perform cmd/data selection operations using GPIOs in the way
+ * your board is configured.
+ * 3. Add a call to up_spiinitialize() in your low level application
+ * initialization logic
+ * 4. The handle returned by up_spiinitialize() may then be used to bind the
+ * SPI driver to higher level logic (e.g., calling
+ * mmcsd_spislotinitialize(), for example, will bind the SPI driver to
+ * the SPI MMC/SD driver).
+ *
+ ************************************************************************************/
+
+struct spi_dev_s;
+enum spi_dev_e;
+
+#ifdef CONFIG_KL_SPI0
+void kl_spi0select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected);
+uint8_t kl_spi0status(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
+#ifdef CONFIG_SPI_CMDDATA
+int kl_spi0cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd);
+#endif
+#endif
+#ifdef CONFIG_KL_SPI1
+void kl_spi1select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected);
+uint8_t kl_spi1status(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
+#ifdef CONFIG_SPI_CMDDATA
+int kl_spi1cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd);
+#endif
+#endif
+#ifdef CONFIG_KL_SPI2
+void kl_spi2select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected);
+uint8_t kl_spi2status(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
+#ifdef CONFIG_SPI_CMDDATA
+int kl_spi2cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd);
+#endif
+#endif
+
+/****************************************************************************
+ * Name: ssp_flush
+ *
+ * Description:
+ * Flush and discard any words left in the RX fifo. This can be called
+ * from spi[n]select after a device is deselected (if you worry about such
+ * things).
+ *
+ * Input Parameters:
+ * dev - Device-specific state data
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+#if defined(CONFIG_KL_SPI0) || defined(CONFIG_KL_SPI0) || defined(CONFIG_KL_SPI2)
+struct spi_dev_s;
+void spi_flush(FAR struct spi_dev_s *dev);
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ARCH_ARM_SRC_KL_KL_SPI_H */
diff --git a/nuttx/arch/arm/src/kl/kl_start.c b/nuttx/arch/arm/src/kl/kl_start.c
index be45a688d..ee411be83 100644
--- a/nuttx/arch/arm/src/kl/kl_start.c
+++ b/nuttx/arch/arm/src/kl/kl_start.c
@@ -53,9 +53,10 @@
#include "chip/kl_sim.h"
#include "kl_config.h"
+#include "kl_gpio.h"
#include "kl_lowputc.h"
#include "kl_userspace.h"
-#include "kl_internal.h"
+#include "kl_clockconfig.h"
/****************************************************************************
* Pre-processor Definitions
diff --git a/nuttx/configs/freedom-kl25z/src/freedom-kl25z.h b/nuttx/configs/freedom-kl25z/src/freedom-kl25z.h
index b387b5a55..cc2f35a84 100644
--- a/nuttx/configs/freedom-kl25z/src/freedom-kl25z.h
+++ b/nuttx/configs/freedom-kl25z/src/freedom-kl25z.h
@@ -79,9 +79,9 @@
* LED_IDLE K25Z1XX is in sleep mode (Optional, not used)
*/
-#define GPIO_LED_R (GPIO_OUTPUT | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN18)
-#define GPIO_LED_G (GPIO_OUTPUT | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN19)
-#define GPIO_LED_B (GPIO_OUTPUT | GPIO_OUTPUT_SET | GPIO_PORTD | GPIO_PIN1)
+#define GPIO_LED_R (GPIO_OUTPUT | PIN_PORTB | PIN18)
+#define GPIO_LED_G (GPIO_OUTPUT | PIN_PORTB | PIN19)
+#define GPIO_LED_B (GPIO_OUTPUT | PIN_PORTD | PIN1)
/* Button definitions ***************************************************************/
/* The Freedom KL25Z has no buttons */
diff --git a/nuttx/configs/freedom-kl25z/src/kl_led.c b/nuttx/configs/freedom-kl25z/src/kl_led.c
index ccd4b4f58..a71c56638 100644
--- a/nuttx/configs/freedom-kl25z/src/kl_led.c
+++ b/nuttx/configs/freedom-kl25z/src/kl_led.c
@@ -127,11 +127,9 @@
void kl_ledinit(void)
{
- led_dumpgpio("Before configuration");
- //kl_configgpio(GPIO_LED_R);
- //kl_configgpio(GPIO_LED_G);
- //kl_configgpio(GPIO_LED_B);
- led_dumpgpio("After configuration");
+ kl_configgpio(GPIO_LED_R);
+ kl_configgpio(GPIO_LED_G);
+ kl_configgpio(GPIO_LED_B);
}
/****************************************************************************