XMC4xxx: Add framework and definitions for GPIO support

This commit is contained in:
Gregory Nutt 2017-03-17 11:18:24 -06:00
parent 042b33414a
commit d2d54b4ae7
6 changed files with 349 additions and 14 deletions

View File

@ -1,7 +1,7 @@
/************************************************************************************
* arch/arm/src/xmc4/chip/xmc4_ports.h
*
* Copyright (C /*2017 Gregory Nutt. All rights reserved.
* Copyright (C) 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Reference: XMC4500 Reference Manual V1.5 2014-07 Microcontrollers.
@ -27,17 +27,17 @@
* 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
* 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
* 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.
*
* May include some logic from sample code provided by Infineon:
*
* Copyright (C /*2011-2015 Infineon Technologies AG. All rights reserved.
* Copyright (C) 2011-2015 Infineon Technologies AG. All rights reserved.
*
* Infineon Technologies AG (Infineon /*is supplying this software for use with
* Infineon Technologies AG (Infineon) is supplying this software for use with
* Infineon's microcontrollers. This file can be freely distributed within
* development tools that are supporting such microcontrollers.
*
@ -258,18 +258,31 @@
#define OMR_PR(n) (1 << ((n) + 16))
/* Basic port input/output field values */
/* Director Input */
/* Direct Input */
#define IOCR_NOPULL 0 /* No internal pull device active */
#define IOCR_PULLDOWN 1 /* Internal pull-down device active */
#define IOCR_PULLUP 2 /* Internal pull-down device active */
#define IOCR_CONT 3 /* No internal pull device active; Pn_OUTx
#define IOCR_INPUT_NOPULL 0 /* No internal pull device active */
#define IOCR_INPUT_PULLDOWN 1 /* Internal pull-down device active */
#define IOCR_INPUT_PULLUP 2 /* Internal pull-down device active */
#define IOCR_INPUT_CONT 3 /* No internal pull device active; Pn_OUTx
* continuously samples the input value */
/* Any of the above may be OR'ed with */
/* Any of the above input configurations may be OR'ed with */
/* Inverted Input */
#define IOCR_INVERT 4 /* Inverted input */
#define IOCR_INPUT_INVERT 4 /* Inverted input modifier */
/* Push-pull Output (direct input) */
#define IOCR_OUTPUT 16 /* General-purpose output */
#define IOCR_OUTPUT_ALT1 17 /* Alternate output function 1 */
#define IOCR_OUTPUT_ALT2 18 /* Alternate output function 2 */
#define IOCR_OUTPUT_ALT3 19 /* Alternate output function 3 */
#define IOCR_OUTPUT_ALT4 20 /* Alternate output function 4 */
/* Any of the above may be OR'ed with */
/* Open drain output */
#define IOCR_OUTPUT_OPENDRAIN 8 /* Output drain output modifier */
/* Port Input/Output Control Register 0 */

View File

@ -0,0 +1,98 @@
/****************************************************************************
* arch/arm/src/xmc4/xmc4_gpio.c
*
* Copyright (C) 2017 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <arch/board/board.h>
#include <assert.h>
#include <errno.h>
#include <nuttx/arch.h>
#include "up_arch.h"
#include "up_internal.h"
#include "chip/xmc4_ports.h"
#include "xmc4_gpio.h"
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: xmc4_gpio_config
*
* Description:
* Configure a PIN based on bit-encoded description of the pin,
* 'pincconfig'.
*
****************************************************************************/
int xmc4_gpio_config(gpioconfig_t pinconfig)
{
#warning Missing logic
return -EINVAL;
}
/****************************************************************************
* Name: xmc4_gpio_write
*
* Description:
* Write one or zero to the PORT pin selected by 'pinconfig'
*
****************************************************************************/
void xmc4_gpio_write(gpioconfig_t pinconfig, bool value)
{
#warning Missing logic
}
/****************************************************************************
* Name: xmc4_gpio_read
*
* Description:
* Read one or zero from the PORT pin selected by 'pinconfig'
*
****************************************************************************/
bool xmc4_gpio_read(gpioconfig_t pinconfig)
{
#warning Missing logic
return false;
}

View File

@ -0,0 +1,222 @@
/****************************************************************************
* arch/arm/src/xmc4/xmc4_gpio.h
*
* Copyright (C) 2017 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
#include <stdbool.h>
#include "chip/xmc4_ports.h"
/****************************************************************************
* Preprocessor Definitions
****************************************************************************/
/* 32-bit GIO encoding:
*
* .... TTTT TMDD DCC. .... .... PPPP BBBB
*/
/* This identifies the GPIO pint type:
*
* .... TTTT T... .... .... .... .... ....
*/
#define GPIO_PINTYPE_SHIFT (23) /* Bits 23-27: Pin type */
#define GPIO_PINTYPE_MASK (31 << GPIO_PINTYPE_SHIFT)
/* See chip/xmc4_ports.h for the IOCR definitions */
/* Direct input */
# define GPIO_INPUT_NOPULL (IOCR_INPUT_NOPULL << GPIO_PINTYPE_SHIFT)
# define GPIO_INPUT_PULLDOWN (IOCR_INPUT_PULLDOWN << GPIO_PINTYPE_SHIFT)
# define GPIO_INPUT_PULLUP (IOCR_INPUT_PULLUP << GPIO_PINTYPE_SHIFT)
# define GPIO_INPUT_CONT (IOCR_INPUT_CONT << GPIO_PINTYPE_SHIFT)
/* Push-pull Output (direct input) */
# define GPIO_OUTPUT (IOCR_OUTPUT << GPIO_PINTYPE_SHIFT)
# define GPIO_OUTPUT_ALT1 (IOCR_OUTPUT_ALT1 << GPIO_PINTYPE_SHIFT)
# define GPIO_OUTPUT_ALT2 (IOCR_OUTPUT_ALT2 << GPIO_PINTYPE_SHIFT)
# define GPIO_OUTPUT_ALT3 (IOCR_OUTPUT_ALT3 << GPIO_PINTYPE_SHIFT)
# define GPIO_OUTPUT_ALT4 (IOCR_OUTPUT_ALT4 << GPIO_PINTYPE_SHIFT)
# define _GPIO_OUTPUT_BIT (16 << GPIO_PINTYPE_SHIFT)
# define GPIO_ISINPUT(p) (((p) & _GPIO_OUTPUT_BIT) != 0)
# define GPIO_ISOUTPUT(p) (((p) & _GPIO_OUTPUT_BIT) == 0)
/* Pin type modifier:
*
* .... .... .M.. .... .... .... .... ....
*/
#define GPIO_INPUT_INVERT (1 << 22) /* Inverted input modifier */
#define GPIOS_OUTPUT_OPENDRAIN (1 << 22) /* Output drain output modifier */
/* Pad driver strength:
*
* .... .... ..DD D... .... .... .... ....
*/
#define GPIO_PADTYPE_SHIFT (19) /* Bits 19-21: Pad driver strength */
#define GPIO_PADTYPE_MASK (7 << GPIO_PADTYPE_SHIFT)
/* See chip/xmc4_ports.h for the PDR definitions */
/* Pad class A1: */
# define GPIO_PADA1_MEDIUM (PDR_PADA1_MEDIUM << GPIO_PADTYPE_SHIFT)
# define GPIO_PADA1_WEAK (PDR_PADA1_WEAK << GPIO_PADTYPE_SHIFT)
/* Pad class A1+: */
# define GPIO_PADA1P_STRONGSOFT (PDR_PADA1P_STRONGSOFT << GPIO_PADTYPE_SHIFT)
# define GPIO_PADA1P_STRONGSLOW (PDR_PADA1P_STRONGSLOW << GPIO_PADTYPE_SHIFT)
# define GPIO_PADA1P_MEDIUM (PDR_PADA1P_MEDIUM << GPIO_PADTYPE_SHIFT)
# define GPIO_PADA1P_WEAK (PDR_PADA1P_WEAK << GPIO_PADTYPE_SHIFT)
/* Pad class A2: */
# define GPIO_PADA2_STRONGSHARP (PDR_PADA2_STRONGSHARP << GPIO_PADTYPE_SHIFT)
# define GPIO_PADA2_STRONGMEDIUM (PDR_PADA2_STRONGMEDIUM << GPIO_PADTYPE_SHIFT)
# define GPIO_PADA2_STRONGSOFT (PDR_PADA2_STRONGSOFT << GPIO_PADTYPE_SHIFT)
# define GPIO_PADA2_MEDIUM (PDR_PADA2_MEDIUM << GPIO_PADTYPE_SHIFT)
# define GPIO_PADA2_WEAK (PDR_PADA2_WEAK << GPIO_PADTYPE_SHIFT)
/* Pin control:
*
* .... .... .... .CC. .... .... .... ....
*/
#define GPIO_PINCTRL_SHIFT (17) /* Bits 17-18: Pad driver strength */
#define GPIO_PINCTRL_MASK (3 << GPIO_PINCTRL_SHIFT)
/* See chip/xmc4_ports.h for the PDR definitions */
# define GPIO_PINCTRL_SOFTWARE (HWSEL_SOFTWARE << GPIO_PINCTRL_SHIFT)
# define GPIO_PINCTRL_OVERRIDE0 (HWSEL_OVERRIDE0 << GPIO_PINCTRL_SHIFT)
# define GPIO_PINCTRL_OVERRIDE1 (HWSEL_OVERRIDE1 << GPIO_PINCTRL_SHIFT)
/* This identifies the GPIO port:
*
* .... ... .... .... .... .... PPPP ....
*/
#define GPIO_PORT_SHIFT (4) /* Bit 4-7: Port number */
#define GPIO_PORT_MASK (7 << GPIO_PORT_SHIFT)
# define GPIO_PORT0 (0 << GPIO_PORT_SHIFT)
# define GPIO_PORT1 (1 << GPIO_PORT_SHIFT)
# define GPIO_PORT2 (2 << GPIO_PORT_SHIFT)
# define GPIO_PORT3 (3 << GPIO_PORT_SHIFT)
# define GPIO_PORT4 (4 << GPIO_PORT_SHIFT)
# define GPIO_PORT5 (5 << GPIO_PORT_SHIFT)
# define GPIO_PORT6 (6 << GPIO_PORT_SHIFT)
# define GPIO_PORT7 (7 << GPIO_PORT_SHIFT)
# define GPIO_PORT8 (8 << GPIO_PORT_SHIFT)
# define GPIO_PORT9 (9 << GPIO_PORT_SHIFT)
# define GPIO_PORT14 (14 << GPIO_PORT_SHIFT)
# define GPIO_PORT15 (15 << GPIO_PORT_SHIFT)
/* This identifies the bit in the port:
*
* ... ..... .... .... .... .... .... BBBB
*/
#define GPIO_PIN_SHIFT (0) /* Bits 0-3: GPIO pin: 0-15 */
#define GPIO_PIN_MASK (31 << 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)
/****************************************************************************
* Public Types
****************************************************************************/
/* This is a type large enought to hold all pin configuration bits. */
typedef uint32_t gpioconfig_t;
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: xmc4_gpio_config
*
* Description:
* Configure a PIN based on bit-encoded description of the pin,
* 'pincconfig'.
*
****************************************************************************/
int xmc4_gpio_config(gpioconfig_t pinconfig);
/****************************************************************************
* Name: xmc4_gpio_write
*
* Description:
* Write one or zero to the PORT pin selected by 'pinconfig'
*
****************************************************************************/
void xmc4_gpio_write(gpioconfig_t pinconfig, bool value);
/****************************************************************************
* Name: xmc4_gpio_read
*
* Description:
* Read one or zero from the PORT pin selected by 'pinconfig'
*
****************************************************************************/
bool xmc4_gpio_read(gpioconfig_t pinconfig);

View File

@ -48,7 +48,7 @@
#include "up_arch.h"
#include "xmc4_config.h"
#include "chip/xmc4_uart.h"
#include "chip/xmc4_usic.h"
#include "chip/xmc4_pinmux.h"
/****************************************************************************

View File

@ -59,7 +59,7 @@
#include "xmc4_config.h"
#include "chip.h"
#include "chip/xmc4_uart.h"
#include "chip/xmc4_usic.h"
/****************************************************************************
* Pre-processor Definitions

View File

@ -46,11 +46,13 @@
#include <nuttx/init.h>
#include <arch/board/board.h>
#include "nvic.h"
#include "up_arch.h"
#include "up_internal.h"
#include "chip/xmc4_flash.h"
#include "xmc4_userspace.h"
#include "xmc4_start.h"
#ifdef CONFIG_ARCH_FPU
# include "nvic.h"