/**
 * \file
 *
 * \brief SAMG55 Xplained Pro board definition
 *
 * Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
 *
 * \asf_license_start
 *
 * \page License
 *
 * Subject to your compliance with these terms, you may use Microchip
 * software and any derivatives exclusively with Microchip products.
 * It is your responsibility to comply with third party license terms applicable
 * to your use of third party software (including open source software) that
 * may accompany Microchip software.
 *
 * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
 * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
 * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
 * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
 * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
 * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
 * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
 * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT
 * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
 * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
 * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
 *
 * \asf_license_stop
 *
 */
/*
 * Support and FAQ: visit <a href="https://www.microchip.com/support/">Microchip Support</a>
 */

#ifndef SAMG55_XPLAINED_PRO_H_INCLUDED
#define SAMG55_XPLAINED_PRO_H_INCLUDED

#include <conf_board.h>
#include <compiler.h>

/**
 * \ingroup group_common_boards
 * \defgroup samg55_xplained_pro_group SAMG55 Xplained Pro board
 *
 * @{
 */

void system_board_init(void);

/**
 * \defgroup samg55_config_group Configuration
 *
 * Symbols to use for configuring the board and its initialization.
 *
 * @{
 */
#ifdef __DOXYGEN__

/* ! \name Initialization */
/* @{ */

/**
 * \def CONF_BOARD_KEEP_WATCHDOG_AT_INIT
 * \brief If defined, the watchdog will remain enabled
 *
 * If this symbol is defined, the watchdog is left running with its current
 * configuration. Otherwise, it is disabled during board initialization.
 */
# ifndef CONF_BOARD_KEEP_WATCHDOG_AT_INIT
#  define CONF_BOARD_KEEP_WATCHDOG_AT_INIT
# endif

/* @} */

#endif /* __DOXYGEN__ */
/**@} */

/**
 * \defgroup samg55_xplained_pro_features_group Features
 *
 * Symbols that describe features and capabilities of the board.
 *
 * @{
 */

/** Name string macro */
#define BOARD_NAME                "SAMG55_XPLAINED_PRO"

/** \name Resonator definitions
 *  @{ */
#define BOARD_FREQ_SLCK_XTAL      (32768U)
#define BOARD_FREQ_SLCK_BYPASS    (32768U)
#define BOARD_FREQ_MAINCK_XTAL    0 /* Not Mounted */
#define BOARD_FREQ_MAINCK_BYPASS  0 /* Not Mounted */
#define BOARD_MCK                 CHIP_FREQ_CPU_MAX
/*TBD startup time needs to be adjusted according to measurements */
#define BOARD_OSC_STARTUP_US      15625

/** @} */

/** \name LED0 definitions
 *  @{ */
#define LED0_GPIO     (PIO_PA6_IDX)
#define LED0_FLAGS    (PIO_OUTPUT_1 | PIO_DEFAULT)

#define LED0_PIN                  IOPORT_CREATE_PIN(PIOA, 6)
#define LED0_ACTIVE_LEVEL         false
#define LED0_INACTIVE_LEVEL       !LED0_ACTIVE_LEVEL
/** @} */

/** \name SW0 definitions
 *  @{ */
#define SW0_PIN                   IOPORT_CREATE_PIN(PIOA, 2)
#define SW0_ACTIVE                false
#define SW0_INACTIVE              !SW0_ACTIVE
#define SW0_SUPC_INPUT            2
/** @} */

/**
 * Wrapper macros for SW0, to ensure common naming across all Xplained Pro
 * boards.
 */
#define PIN_SW0      {PIO_PA2, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE}
#define PIN_SW0_MASK PIO_PA2
#define PIN_SW0_PIO  PIOA
#define PIN_SW0_ID   ID_PIOA
#define PIN_SW0_TYPE PIO_INPUT
#define PIN_SW0_ATTR (PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE)
//@}

/**
 * \name LED #0 definitions
 *
 * Wrapper macros for LED0, to ensure common naming across all Xplained Pro
 * boards.
 *
 *  @{ */
#define LED_0_NAME                "LED0 (yellow)"
#define LED_0_PIN                 LED0_PIN
#define LED_0_ACTIVE              LED0_ACTIVE_LEVEL
#define LED_0_INACTIVE            LED0_INACTIVE_LEVEL

#define PIN_LED_0      {PIO_PA16, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT}
#define PIN_LED_0_MASK PIO_PA16
#define PIN_LED_0_PIO  PIOA
#define PIN_LED_0_ID   ID_PIOA
#define PIN_LED_0_TYPE PIO_OUTPUT_1
#define PIN_LED_0_ATTR PIO_DEFAULT
/** @} */

/** Number of on-board LEDs */
#define LED_COUNT                 1

/**
 * \name Button #0 definitions
 *
 * Wrapper macros for SW0, to ensure common naming across all Xplained Pro
 * boards.
 *
 *  @{ */
#define BUTTON_0_NAME             "SW0"
#define BUTTON_0_PIN              SW0_PIN
#define BUTTON_0_ACTIVE           SW0_ACTIVE
#define BUTTON_0_INACTIVE         SW0_INACTIVE
#define BUTTON_0_SUPC_INPUT       SW0_SUPC_INPUT

#define PUSHBUTTON_1_NAME    "SW0"
#define PIN_PUSHBUTTON_1 {PIO_PA2, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE}
#define PIN_PUSHBUTTON_1_MASK PIO_PA2
#define PIN_PUSHBUTTON_1_PIO  PIOA
#define PIN_PUSHBUTTON_1_ID   ID_PIOA
#define PIN_PUSHBUTTON_1_TYPE PIO_INPUT
#define PIN_PUSHBUTTON_1_ATTR PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE
/** @} */

/** Number of on-board buttons */
#define BUTTON_COUNT 1

#if defined(CONF_BOARD_UART_CONSOLE)
#define CONSOLE_UART               USART7
#define CONSOLE_UART_ID            ID_FLEXCOM7
/** USART7 pins (TXD7 and RXD7) definitions, PA27,28. */
#define PINS_USART7        (PIO_PA27B_RXD7| PIO_PA28B_TXD7)
#define PINS_USART7_FLAGS  (IOPORT_MODE_MUX_B)

#define PINS_USART7_PORT   IOPORT_PIOA
#define PINS_USART7_MASK   (PIO_PA27B_RXD7 | PIO_PA28B_TXD7)
#define PINS_USART7_PIO    PIOA
#define PINS_USART7_ID     ID_PIOA
#define PINS_USART7_TYPE   PIO_PERIPH_B
#define PINS_USART7_ATTR   PIO_DEFAULT
#endif

/** PCK1 pin definition (PA17) */
#define PIN_PCK1         (PIO_PA17_IDX)
#define PIN_PCK1_MUX     (IOPORT_MODE_MUX_B)
#define PIN_PCK1_FLAGS   (IOPORT_MODE_MUX_B)
#define PIN_PCK1_PORT    IOPORT_PIOA
#define PIN_PCK1_MASK    PIO_PA17B_PCK1
#define PIN_PCK1_PIO     PIOA
#define PIN_PCK1_ID      ID_PIOA
#define PIN_PCK1_TYPE    PIO_PERIPH_B
#define PIN_PCK1_ATTR    PIO_DEFAULT

#define PIN_TC0_TIOA0         (PIO_PA0_IDX)
#define PIN_TC0_TIOA0_MUX     (IOPORT_MODE_MUX_B)
#define PIN_TC0_TIOA0_FLAGS   (PIO_PERIPH_B | PIO_DEFAULT)

#define PIN_TC0_TIOA1         (PIO_PA23_IDX)
#define PIN_TC0_TIOA1_MUX     (IOPORT_MODE_MUX_B)
#define PIN_TC0_TIOA1_FLAGS   (PIO_PERIPH_B | PIO_DEFAULT)
//! \name SPI
//@{
/** SPI MISO pin definition. */
#define SPI_MISO_GPIO         (PIO_PA12_IDX)
#define SPI_MISO_FLAGS       (IOPORT_MODE_MUX_A)
/** SPI MOSI pin definition. */
#define SPI_MOSI_GPIO         (PIO_PA13_IDX)
#define SPI_MOSI_FLAGS       (IOPORT_MODE_MUX_A)
/** SPI SPCK pin definition. */
#define SPI_SPCK_GPIO         (PIO_PA14_IDX)
#define SPI_SPCK_FLAGS       (IOPORT_MODE_MUX_A)

/** SPI chip select 0 pin definition. */
#define SPI_NPCS0_GPIO        (PIO_PA11_IDX)
#define SPI_NPCS0_FLAGS      (IOPORT_MODE_MUX_A)
/** SPI chip select 1 pin definition. */
#define SPI_NPCS1_GPIO        (PIO_PA5_IDX)
#define SPI_NPCS1_FLAGS      (IOPORT_MODE_MUX_B)
//@}

/** \name Extension header #1 pin definitions
 *  @{
 */
#define EXT1_PIN_3                IOPORT_CREATE_PIN(PIOA, 17)
#define EXT1_PIN_4                IOPORT_CREATE_PIN(PIOA, 18)
#define EXT1_PIN_5                IOPORT_CREATE_PIN(PIOA, 26)
#define EXT1_PIN_6                IOPORT_CREATE_PIN(PIOA, 25)
#define EXT1_PIN_7                IOPORT_CREATE_PIN(PIOA, 0)
#define EXT1_PIN_8                IOPORT_CREATE_PIN(PIOA, 23)
#define EXT1_PIN_9                IOPORT_CREATE_PIN(PIOA, 24)
#define EXT1_PIN_10               IOPORT_CREATE_PIN(PIOA, 29)
#define EXT1_PIN_11               IOPORT_CREATE_PIN(PIOB, 10)
#define EXT1_PIN_12               IOPORT_CREATE_PIN(PIOB, 11)
#define EXT1_PIN_13               IOPORT_CREATE_PIN(PIOA, 9)
#define EXT1_PIN_14               IOPORT_CREATE_PIN(PIOA, 10)
#define EXT1_PIN_15               IOPORT_CREATE_PIN(PIOA, 11)
#define EXT1_PIN_16               IOPORT_CREATE_PIN(PIOA, 13)
#define EXT1_PIN_17               IOPORT_CREATE_PIN(PIOA, 12)
#define EXT1_PIN_18               IOPORT_CREATE_PIN(PIOA, 14)
/** @} */

/** \name Extension header #1 pin definitions by function
 *  @{
 */
#define EXT1_PIN_ADC_0            EXT1_PIN_3
#define EXT1_PIN_ADC_1            EXT1_PIN_4
#define EXT1_PIN_GPIO_0           EXT1_PIN_5
#define EXT1_PIN_GPIO_1           EXT1_PIN_6
#define EXT1_PIN_PWM_0            EXT1_PIN_7
#define EXT1_PIN_PWM_1            EXT1_PIN_8
#define EXT1_PIN_IRQ              EXT1_PIN_9
#define EXT1_PIN_I2C_SDA          EXT1_PIN_11
#define EXT1_PIN_I2C_SCL          EXT1_PIN_12
#define EXT1_PIN_UART_RX          EXT1_PIN_13
#define EXT1_PIN_UART_TX          EXT1_PIN_14
#define EXT1_PIN_SPI_SS_1         EXT1_PIN_10
#define EXT1_PIN_SPI_SS_0         EXT1_PIN_15
#define EXT1_PIN_SPI_MOSI         EXT1_PIN_16
#define EXT1_PIN_SPI_MISO         EXT1_PIN_17
#define EXT1_PIN_SPI_SCK          EXT1_PIN_18
/** @} */

/** \name Extension header #1 ADC definitions
 *  @{
 */
#define EXT1_ADC_MODULE           ADC
#define EXT1_ADC_0_CHANNEL        0
#define EXT1_ADC_1_CHANNEL        1
/** @} */

/** \name Extension header #1 PWM definitions
 *  @{
 */
#define EXT1_PWM_MODULE           TC0
#define EXT1_PWM_0_CHANNEL        0
#define EXT1_PWM_0_MUX            IOPORT_MODE_MUX_B
#define EXT1_PWM_1_CHANNEL        1
#define EXT1_PWM_1_MUX            IOPORT_MODE_MUX_B
/** @} */

/** \name Extension header #1 IRQ/External interrupt definitions
 *  @{
 */
#define EXT1_IRQ_MODULE           SUPC
#define EXT1_IRQ_INPUT            11
/** @} */

/** \name Extension header #1 I2C definitions
 *  @{
 */
#define EXT1_TWI_MODULE           TWI4
#define EXT1_TWI_TWD_MUX          IOPORT_MODE_MUX_B
#define EXT1_TWI_TWCK_MUX         IOPORT_MODE_MUX_B
/** @} */

/** \name Extension header #1 UART definitions
 *  @{
 */
#define EXT1_UART_MODULE          USART0
#define EXT1_UART_RXD_MUX         IOPORT_MODE_MUX_A
#define EXT1_UART_TXD_MUX         IOPORT_MODE_MUX_A
/** @} */

/** \name Extension header #1 SPI definitions
 *  @{
 */
#define EXT1_SPI_MODULE           SPI5
#define EXT1_SPI_MISO_MUX         IOPORT_MODE_MUX_A
#define EXT1_SPI_MOSI_MUX         IOPORT_MODE_MUX_A
#define EXT1_SPI_SPCK_MUX         IOPORT_MODE_MUX_A
#define EXT1_SPI_NPCS0_MUX        IOPORT_MODE_MUX_A
/** @} */

/** \name Extension header #3 pin definitions
 *  @{
 */
#define EXT3_PIN_3                IOPORT_CREATE_PIN(PIOA, 19)
#define EXT3_PIN_4                IOPORT_CREATE_PIN(PIOA, 20)
#define EXT3_PIN_5                IOPORT_CREATE_PIN(PIOA, 30)
#define EXT3_PIN_6                IOPORT_CREATE_PIN(PIOB, 15)
#define EXT3_PIN_7                IOPORT_CREATE_PIN(PIOA, 1)
#define EXT3_PIN_8                IOPORT_CREATE_PIN(PIOB, 13)
#define EXT3_PIN_9                IOPORT_CREATE_PIN(PIOB, 3)
#define EXT3_PIN_10               IOPORT_CREATE_PIN(PIOA, 15)
#define EXT3_PIN_11               IOPORT_CREATE_PIN(PIOB, 8)
#define EXT3_PIN_12               IOPORT_CREATE_PIN(PIOB, 9)
#define EXT3_PIN_13               IOPORT_CREATE_PIN(PIOB, 1)
#define EXT3_PIN_14               IOPORT_CREATE_PIN(PIOB, 0)
#define EXT3_PIN_15               IOPORT_CREATE_PIN(PIOA, 5)
#define EXT3_PIN_16               IOPORT_CREATE_PIN(PIOA, 13)
#define EXT3_PIN_17               IOPORT_CREATE_PIN(PIOA, 12)
#define EXT3_PIN_18               IOPORT_CREATE_PIN(PIOA, 14)
/** @} */

/** \name Extension header #3 pin definitions by function
 *  @{
 */
#define EXT3_PIN_ADC_0            EXT3_PIN_3
#define EXT3_PIN_ADC_1            EXT3_PIN_4
#define EXT3_PIN_GPIO_0           EXT3_PIN_5
#define EXT3_PIN_PWM_0            EXT3_PIN_7
#define EXT3_PIN_IRQ              EXT3_PIN_9
#define EXT3_PIN_I2C_SDA          EXT3_PIN_11
#define EXT3_PIN_I2C_SCL          EXT3_PIN_12
#define EXT3_PIN_UART_RX          EXT3_PIN_13
#define EXT3_PIN_UART_TX          EXT3_PIN_14
#define EXT3_PIN_SPI_SS_1         EXT3_PIN_10
#define EXT3_PIN_SPI_SS_0         EXT3_PIN_15
#define EXT3_PIN_SPI_MOSI         EXT3_PIN_16
#define EXT3_PIN_SPI_MISO         EXT3_PIN_17
#define EXT3_PIN_SPI_SCK          EXT3_PIN_18
/** @} */

/** \name Extension header #3 ADC definitions
 *  @{
 */
#define EXT3_ADC_MODULE           ADC
#define EXT3_ADC_0_CHANNEL        2
#define EXT3_ADC_1_CHANNEL        3
/** @} */

/** \name Extension header #3 PWM definitions
 *  @{
 */
#define EXT3_PWM_MODULE           TC2
#define EXT3_PWM_0_CHANNEL        0
#define EXT3_PWM_0_MUX            IOPORT_MODE_MUX_A
/** @} */

/** \name Extension header #3 IRQ/External interrupt definitions
 *  @{
 */
#define EXT3_IRQ_MODULE           SUPC
#define EXT3_IRQ_INPUT            10
/** @} */

/** \name Extension header #3 I2C definitions
 *  @{
 */
#define EXT3_TWI_MODULE           TWI1
#define EXT3_TWI_TWD_MUX          IOPORT_MODE_MUX_A
#define EXT3_TWI_TWCK_MUX         IOPORT_MODE_MUX_A
/** @} */

/** \name Extension header #3 UART definitions
 *  @{
 */
#define EXT3_UART_MODULE          UART0
#define EXT3_UART_RXD_MUX         IOPORT_MODE_MUX_A
#define EXT3_UART_TXD_MUX         IOPORT_MODE_MUX_A
/** @} */

/** \name Extension header #3 SPI definitions
 *  @{
 */
#define EXT3_SPI_MODULE           SPI5
#define EXT3_SPI_MISO_MUX         IOPORT_MODE_MUX_A
#define EXT3_SPI_MOSI_MUX         IOPORT_MODE_MUX_A
#define EXT3_SPI_SPCK_MUX         IOPORT_MODE_MUX_A
#define EXT3_SPI_NPCS1_MUX        IOPORT_MODE_MUX_B
/** @} */

/** \name Extension header #4 pin definitions
 *  @{
 */
#define EXT4_PIN_5                IOPORT_CREATE_PIN(PIOA, 31)
#define EXT4_PIN_9                IOPORT_CREATE_PIN(PIOB, 14)
#define EXT4_PIN_11               IOPORT_CREATE_PIN(PIOB, 10)
#define EXT4_PIN_12               IOPORT_CREATE_PIN(PIOB, 11)
/** @} */

/** \name Extension header #4 pin definitions by function
 *  @{
 */
#define EXT4_PIN_GPIO_0           EXT3_PIN_5
#define EXT4_PIN_IRQ              EXT3_PIN_9
#define EXT4_PIN_I2C_SDA          EXT3_PIN_11
#define EXT4_PIN_I2C_SCL          EXT3_PIN_12
/** @} */

/** \name Extension header #4 IRQ/External interrupt definitions
 *  @{
 */
#define EXT4_IRQ_MODULE           SUPC
#define EXT4_IRQ_INPUT            14
/** @} */

/** \name Extension header #4 TWI definitions
 *  @{
 */
#define EXT4_TWI_MODULE           TWI1
#define EXT4_TWI_TWD_MUX          IOPORT_MODE_MUX_A
#define EXT4_TWI_TWCK_MUX         IOPORT_MODE_MUX_A
/** @} */

/** \name Embedded debugger GPIO interface definitions
 * @{
 */
#define EDBG_GPIO0_PIN            IOPORT_CREATE_PIN(PIOA, 15)
#define EDBG_GPIO1_PIN            IOPORT_CREATE_PIN(PIOB, 3)
#define EDBG_GPIO2_PIN            IOPORT_CREATE_PIN(PIOB, 4)
#define EDBG_GPIO3_PIN            IOPROT_CREATE_PIN(PIOB, 9)
/** @} */

/** \name Embedded debugger USART interface definitions
 * @{
 */
#define EDBG_UART_MODULE          USART
#define EDBG_UART_RX_PIN          IOPORT_CREATE_PIN(PIOA, 5)
#define EDBG_UART_RX_MUX          IOPORT_MODE_MUX_A
#define EDBG_UART_TX_PIN          IOPORT_CREATE_PIN(PIOA, 6)
#define EDBG_UART_TX_MUX          IOPORT_MODE_MUX_A
/** @} */

/** \name Embedded debugger I2C interface definitions
 * @{
 */
#define EDBG_TWI_MODULE           TWI1
#define EDBG_TWI_TWD_MUX          IOPORT_MODE_MUX_A
#define EDBG_TWI_TWCK_MUX         IOPORT_MODE_MUX_A
/** @} */

/** \name Embedded debugger CDC Gateway USART interface definitions
 * @{
 */
#define EDBG_CDC_UART_MODULE      UART0
#define EDBG_CDC_UART_RX_PIN      IOPORT_CREATE_PIN(PIOA, 9)
#define EDBG_CDC_UART_RX_MUX      IOPORT_MODE_MUX_A
#define EDBG_CDC_UART_TX_PIN      IOPORT_CREATE_PIN(PIOA, 10)
#define EDBG_CDC_UART_TX_MUX      IOPORT_MODE_MUX_A
/** @} */

//! \name OLED
//@{
/** OLED command/data select pin */
#define UG_2832HSWEG04_DATA_CMD_GPIO   (PIO_PA30_IDX)
/** OLED reset pin */
#define UG_2832HSWEG04_RESET_GPIO      (PIO_PA15_IDX)
/** OLED SPI configuration */
#define UG_2832HSWEG04_SS               1
#define UG_2832HSWEG04_BAUDRATE         5000000
//! \name OLED dimensions
//@{
#define LCD_WIDTH_PIXELS                (128)
#define LCD_HEIGHT_PIXELS               (32)
//@}
//@}

/** \name TWI
* @{
*/
/** TWI0 pin definitions */
#define TWI0_DATA_GPIO   PIO_PA9_IDX
#define TWI0_DATA_FLAGS  IOPORT_MODE_MUX_A
#define TWI0_CLK_GPIO    PIO_PA10_IDX
#define TWI0_CLK_FLAGS   IOPORT_MODE_MUX_A
/** TWI1 pin definitions */
#define TWI1_DATA_GPIO   PIO_PB2_IDX
#define TWI1_DATA_FLAGS  IOPORT_MODE_MUX_A
#define TWI1_CLK_GPIO    PIO_PB3_IDX
#define TWI1_CLK_FLAGS   IOPORT_MODE_MUX_A
/** TWI4 pin definitions */
#define TWI4_DATA_GPIO   EXT1_PIN_11
#define TWI4_DATA_FLAGS  IOPORT_MODE_MUX_A
#define TWI4_CLK_GPIO    EXT1_PIN_12
#define TWI4_CLK_FLAGS   IOPORT_MODE_MUX_A
/** TWI6 pin definitions */
#define TWI6_DATA_GPIO   EXT3_PIN_11
#define TWI6_DATA_FLAGS  IOPORT_MODE_MUX_B
#define TWI6_CLK_GPIO    EXT3_PIN_12
#define TWI6_CLK_FLAGS   IOPORT_MODE_MUX_B
/** @} */

/** \name USART
* @{
*/
/** USART0 pin definitions */
#define USART0_RXD_GPIO	  EXT1_PIN_13
#define USART0_RXD_FLAGS  IOPORT_MODE_MUX_A
#define USART0_TXD_GPIO   EXT1_PIN_14
#define USART0_TXD_FLAGS  IOPORT_MODE_MUX_A
#define USART0_SCK_GPIO   EXT3_PIN_14
#define USART0_SCK_FLAGS  IOPORT_MODE_MUX_A
#define USART0_CTS_GPIO   EXT1_PIN_6
#define USART0_CTS_FLAGS  IOPORT_MODE_MUX_A
#define USART0_RTS_GPIO   EXT1_PIN_5
#define USART0_RTS_FLAGS  IOPORT_MODE_MUX_A

/** USART6 pin definitions */
#define USART6_RXD_GPIO   EXT4_PIN_12
#define USART6_RXD_FLAGS  IOPORT_MODE_MUX_B
#define USART6_TXD_GPIO   EXT4_PIN_11
#define USART6_TXD_FLAGS  IOPORT_MODE_MUX_B
#define USART6_SCK_GPIO   EXT3_PIN_8
#define USART6_SCK_FLAGS  IOPORT_MODE_MUX_B
#define USART6_CTS_GPIO   EXT4_PIN_9
#define USART6_CTS_FLAGS  IOPORT_MODE_MUX_B
#define USART6_RTS_GPIO   EXT3_PIN_6
#define USART6_RTS_FLAGS  IOPORT_MODE_MUX_B
/** @} */

//! \name I2S0
//@{
/** I2S0 SCK pin definition. */
#define I2S0_SCK_GPIO        (PIO_PA0_IDX)
#define I2S0_SCK_FLAGS       (IOPORT_MODE_MUX_A)
/** I2S0 MCK pin definition. */
#define I2S0_MCK_GPIO        (PIO_PA4_IDX)
#define I2S0_MCK_FLAGS       (IOPORT_MODE_MUX_B)
/** I2S0 SDI pin definition. */
#define I2S0_SDI_GPIO        (PIO_PA2_IDX)
#define I2S0_SDI_FLAGS       (IOPORT_MODE_MUX_B)
/** I2S0 SDO pin definition. */
#define I2S0_SDO_GPIO        (PIO_PA3_IDX)
#define I2S0_SDO_FLAGS       (IOPORT_MODE_MUX_B)
/** I2S0 WS pin definition. */
#define I2S0_WS_GPIO         (PIO_PA1_IDX)
#define I2S0_WS_FLAGS        (IOPORT_MODE_MUX_A)
//@}

//! \name I2S1
//@{
/** I2S1 SCK pin definition. */
#define I2S1_SCK_GPIO        (PIO_PA19_IDX)
#define I2S1_SCK_FLAGS       (IOPORT_MODE_MUX_B)
/** I2S1 MCK pin definition. */
#define I2S1_MCK_GPIO        (PIO_PA24_IDX)
#define I2S1_MCK_FLAGS       (IOPORT_MODE_MUX_A)
/** I2S1 SDI pin definition. */
#define I2S1_SDI_GPIO        (PIO_PA22_IDX)
#define I2S1_SDI_FLAGS       (IOPORT_MODE_MUX_B)
/** I2S1 SDO pin definition. */
#define I2S1_SDO_GPIO        (PIO_PA23_IDX)
#define I2S1_SDO_FLAGS       (IOPORT_MODE_MUX_A)
/** I2S1 WS pin definition. */
#define I2S1_WS_GPIO         (PIO_PA20_IDX)
#define I2S1_WS_FLAGS        (IOPORT_MODE_MUX_B)
//@}

//! \name IO1 button definitions */
//@{
/** Push button #1 definition. Attributes = pull-up + debounce + interrupt on rising edge. */
#define PUSHBUTTON_1_NAME    "SW0"
#define GPIO_PUSH_BUTTON_1   (PIO_PA2_IDX)
#define GPIO_PUSH_BUTTON_1_FLAGS    (PIO_INPUT | PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE)
//@}

//! \name Light Sensor
//@{
#define LIGHT_SENSOR_GPIO   PIO_PA17_IDX
#define LIGHT_SENSOR_FLAGS  PIO_INPUT
//@}

/** \name USB definitions
 * @{
 */
#define PIN_USB_VBUS    {PIO_PB4, PIOB, ID_PIOB, PIO_INPUT, PIO_PULLUP}
#define USB_VBUS_FLAGS    (PIO_INPUT | PIO_DEBOUNCE | PIO_IT_EDGE)
#define USB_VBUS_PIN_IRQn (PIOB_IRQn)
#define USB_VBUS_PIN      (PIO_PB4_IDX)
#define USB_VBUS_PIO_ID   (ID_PIOB)
#define USB_VBUS_PIO_MASK (PIO_PB4)

/** USB D- pin (System function) */
#define PIN_USB_DM      {PIO_PA21}
/** USB D+ pin (System function) */
#define PIN_USB_DP      {PIO_PA22}
/** @} */

//! \name IO1 SD card definitions */
//@{
#define SD_MMC_SPI_MEM_CNT          1
#define SD_MMC_0_CD_GPIO            (PIO_PA29_IDX)
#define SD_MMC_0_CD_DIR             (IOPORT_DIR_INPUT)
#define SD_MMC_0_CD_MODE            (IOPORT_MODE_PULLUP)
#define SD_MMC_0_CD_DETECT_VALUE    0
#define SD_MMC_SPI                  SPI5
#define SD_MMC_SPI_0_CS             0
#define SD_MMC_0_CD_PIO_ID          ID_PIOA
/**
 * Wrapper macros for IO1 SD, to ensure common naming across all Xplained Pro
 * boards.
 */
#define SD_MMC_0_CD_FLAGS           (PIO_INPUT | PIO_PULLUP)
#define SD_MMC_0_CD    {PIO_PA29, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE}
#define SD_MMC_0_CD_MASK PIO_PA29
#define SD_MMC_0_CD_PIO PIOA
#define SD_MMC_0_CD_ID ID_PIOA
#define SD_MMC_0_CD_TYPE PIO_INPUT
#define SD_MMC_0_CD_ATTR (PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_EDGE)
//@}

//! \name IO1 temperature sensor definitions */
//@{
#define BOARD_AT30TSE_TWI          TWI4
#define BOARD_AT30TSE_TWI_ID       ID_TWI4
#define BOARD_TWI_SPEED            (400000u)
#define BOARD_USING_AT30TSE        AT30TSE758
#ifndef BOARD_AT30TSE_DEVICE_ADDR
#define BOARD_AT30TSE_DEVICE_ADDR  0x07
#endif
//@}

//! \name OLED1 led definitions */
//@{
#define OLED1_LED1_PIN                  EXT3_PIN_7
#define OLED1_LED1_ACTIVE               false
#define OLED1_LED1_INACTIVE             !OLED1_LED1_ACTIVE

#define OLED1_LED2_PIN                  EXT3_PIN_8
#define OLED1_LED2_ACTIVE               false
#define OLED1_LED2_INACTIVE             !OLED1_LED2_ACTIVE

#define OLED1_LED3_PIN                  EXT3_PIN_6
#define OLED1_LED3_ACTIVE               false
#define OLED1_LED3_INACTIVE             !OLED1_LED3_ACTIVE
//@}

//! \name OLED1 button definitions */
//@{
/** Push button #1 definition. Attributes = pull-up + debounce + interrupt on rising edge. */
#define OLED1_PUSHBUTTON_1_NAME    "BUTTON 1"
#define OLED1_GPIO_PUSH_BUTTON_1   (PIO_PB3_IDX)
#define OLED1_GPIO_PUSH_BUTTON_1_FLAGS    (PIO_INPUT | PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE)

#define OLED1_PIN_PUSHBUTTON_1    {PIO_PB3, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE}
#define OLED1_PIN_PUSHBUTTON_1_MASK PIO_PB3
#define OLED1_PIN_PUSHBUTTON_1_PIO PIOB
#define OLED1_PIN_PUSHBUTTON_1_ID ID_PIOB
#define OLED1_PIN_PUSHBUTTON_1_TYPE PIO_INPUT
#define OLED1_PIN_PUSHBUTTON_1_ATTR (PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE)

/** Push button #2 definition. Attributes = pull-up + debounce + interrupt on rising edge. */
#define OLED1_PUSHBUTTON_2_NAME    "BUTTON 2"
#define OLED1_GPIO_PUSH_BUTTON_2   (PIO_PA19_IDX)
#define OLED1_GPIO_PUSH_BUTTON_2_FLAGS    (PIO_INPUT | PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE)

#define OLED1_PIN_PUSHBUTTON_2    {PIO_PA19, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE}
#define OLED1_PIN_PUSHBUTTON_2_MASK PIO_PA19
#define OLED1_PIN_PUSHBUTTON_2_PIO PIOA
#define OLED1_PIN_PUSHBUTTON_2_ID ID_PIOA
#define OLED1_PIN_PUSHBUTTON_2_TYPE PIO_INPUT
#define OLED1_PIN_PUSHBUTTON_2_ATTR (PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE)

/** Push button #3 definition. Attributes = pull-up + debounce + interrupt on rising edge. */
#define OLED1_PUSHBUTTON_3_NAME    "BUTTON 3"
#define OLED1_GPIO_PUSH_BUTTON_3   (PIO_PA20_IDX)
#define OLED1_GPIO_PUSH_BUTTON_3_FLAGS    (PIO_INPUT | PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE)

#define OLED1_PIN_PUSHBUTTON_3    {PIO_PA20, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE}
#define OLED1_PIN_PUSHBUTTON_3_MASK PIO_PA20
#define OLED1_PIN_PUSHBUTTON_3_PIO PIOA
#define OLED1_PIN_PUSHBUTTON_3_ID ID_PIOA
#define OLED1_PIN_PUSHBUTTON_3_TYPE PIO_INPUT
#define OLED1_PIN_PUSHBUTTON_3_ATTR (PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE)
//@}

//! \name PDM
//@{
/** PDM CLK pin definition. */
#define PDM_CLK_GPIO        (PIO_PA10_IDX)
#define PDM_CLK_FLAGS       (IOPORT_MODE_MUX_B)
/** PDM DAT pin definition. */
#define PDM_DAT_GPIO        (PIO_PA9_IDX)
#define PDM_DAT_FLAGS       (IOPORT_MODE_MUX_B)
//@}

/** @} */

/** @} */

#endif  /* SAMG55_XPLAINED_PRO_H_INCLUDED */
