/*******************************************************************************
 * (c) Copyright 2008 Actel Corporation.  All rights reserved.
 * 
 *  SmartFusion Microcontroller Subsystem GPIO bare metal software driver public
 *  API.
 *
 * SVN $Revision: 1751 $
 * SVN $Date: 2009-12-11 15:05:48 +0000 (Fri, 11 Dec 2009) $
 */

/*=========================================================================*//**
  @mainpage SmartFusion MSS GPIO Bare Metal Driver.

  @section intro_sec Introduction
  The SmartFusion Microcontroller Subsystem (MSS) includes a block of 32 general
  purpose input/outputs (GPIO).
  This software driver provides a set of functions for controlling the MSS GPIO
  block as part of a bare metal system where no operating system is available.
  This driver can be adapted for use as part of an operating system but the
  implementation of the adaptation layer between this driver and the operating
  system's driver model is outside the scope of this driver.
  
  @section hw_dependencies Hardware Flow Dependencies
  The configuration of all features of the MSS GPIOs is covered by this driver
  with the exception of the SmartFusion IOMUX configuration. SmartFusion allows
  multiple non-concurrent use of some external pins through IOMUX configuration.
  This feature allows optimizing external pin usage by assigning external pins
  for usage by either the microcontroller subsystem or the FPGA fabric.
  The MSS GPIO ports 0 to 15 are always connected to external pins but GPIO ports
  16 to 31 are routed through IOMUX to the SmartFusion device external pins.
  These IOMUX are configured using the MSS Configurator tool.
  Make sure the MSS GPIOs 16 to 31 are enabled in the MSS Configurator tool if
  you wish to use them
  
  @section theory_op Theory of Operation
  The MSS GPIO driver uses the SmartFusion "Cortex Microcontroler Software
  Interface Standard - Peripheral Access Layer" (CMSIS-PAL) to access MSS hardware
  registers. You must ensure that the SmartFusion CMSIS-PAL is either included
  in the software toolchain used to build your project or is included in your
  project. The most up-to-date SmartFusion CMSIS-PAL files can be obtained using
  the Actel Firmware Catalog.
  
  The MSS GPIO driver functions are grouped into the following categories:
    - Initiliazation
    - Configuration
    - Reading and setting GPIO state
    - Interrupt control
  
  The MSS GPIO driver is initialized through a call to the GPIO_init() function.
  The GPIO_init() function must be called before any other GPIO driver functions
  can be called.
  
  Each GPIO port is individually configured through a call to the
  MSS_GPIO_config() function. Configuration includes deciding if a GPIO port
  will be used as an input, an output or both. GPIO ports configured as inputs can be
  further configured to generate interrupts based on the input's state.
  Interrupts can be level or edge sensitive.
  
  The state of the GPIO ports can be read and set using the following functions:
    - MSS_GPIO_get_inputs()
    - MSS_GPIO_get_outputs()
    - MSS_GPIO_set_outputs()
    - MSS_GPIO_set_output()
    - MSS_GPIO_drive_inout()
    
  Interrupts generated by GPIO ports configured as inputs are controlled using
  the following functions:
    - MSS_GPIO_enable_irq()
    - MSS_GPIO_disable_irq()
    - MSS_GPIO_clear_irq()
  
 *//*=========================================================================*/
#ifndef MSS_GPIO_H_
#define MSS_GPIO_H_

#ifdef __cplusplus
extern "C" {
#endif 

#include "../../CMSIS/a2fxxxm3.h"

/*-------------------------------------------------------------------------*//**
  The mss_gpio_id_t enumeration is used to identify GPIOs as part of the
  parameter to functions:
    - MSS_GPIO_config(),
    - MSS_GPIO_drive_inout(),
    - MSS_GPIO_enable_irq(),
    - MSS_GPIO_disable_irq(),
    - MSS_GPIO_clear_irq()
 */
typedef enum __mss_gpio_id_t
{
    MSS_GPIO_0 = 0,
    MSS_GPIO_1 = 1,
    MSS_GPIO_2 = 2,
    MSS_GPIO_3 = 3,
    MSS_GPIO_4 = 4,
    MSS_GPIO_5 = 5,
    MSS_GPIO_6 = 6,
    MSS_GPIO_7 = 7,
    MSS_GPIO_8 = 8,
    MSS_GPIO_9 = 9,
    MSS_GPIO_10 = 10,
    MSS_GPIO_11 = 11,
    MSS_GPIO_12 = 12,
    MSS_GPIO_13 = 13,
    MSS_GPIO_14 = 14,
    MSS_GPIO_15 = 15,
    MSS_GPIO_16 = 16,
    MSS_GPIO_17 = 17,
    MSS_GPIO_18 = 18,
    MSS_GPIO_19 = 19,
    MSS_GPIO_20 = 20,
    MSS_GPIO_21 = 21,
    MSS_GPIO_22 = 22,
    MSS_GPIO_23 = 23,
    MSS_GPIO_24 = 24,
    MSS_GPIO_25 = 25,
    MSS_GPIO_26 = 26,
    MSS_GPIO_27 = 27,
    MSS_GPIO_28 = 28,
    MSS_GPIO_29 = 29,
    MSS_GPIO_30 = 30,
    MSS_GPIO_31 = 31
} mss_gpio_id_t;

/*-------------------------------------------------------------------------*//**
  GPIO ports definitions used to identify GPIOs as part of the parameter to
  function MSS_GPIO_set_outputs().
  These definitions can also be used to identity GPIO through logical
  operations on the return value of function MSS_GPIO_get_inputs().
 */
#define MSS_GPIO_0_MASK		    0x00000001UL
#define MSS_GPIO_1_MASK		    0x00000002UL
#define MSS_GPIO_2_MASK         0x00000004UL
#define MSS_GPIO_3_MASK	        0x00000008UL
#define MSS_GPIO_4_MASK	        0x00000010UL
#define MSS_GPIO_5_MASK	        0x00000020UL
#define MSS_GPIO_6_MASK	        0x00000040UL
#define MSS_GPIO_7_MASK	        0x00000080UL
#define MSS_GPIO_8_MASK	        0x00000100UL
#define MSS_GPIO_9_MASK		    0x00000200UL
#define MSS_GPIO_10_MASK		0x00000400UL
#define MSS_GPIO_11_MASK		0x00000800UL
#define MSS_GPIO_12_MASK		0x00001000UL
#define MSS_GPIO_13_MASK		0x00002000UL
#define MSS_GPIO_14_MASK		0x00004000UL
#define MSS_GPIO_15_MASK		0x00008000UL
#define MSS_GPIO_16_MASK		0x00010000UL
#define MSS_GPIO_17_MASK		0x00020000UL
#define MSS_GPIO_18_MASK		0x00040000UL
#define MSS_GPIO_19_MASK		0x00080000UL
#define MSS_GPIO_20_MASK		0x00100000UL
#define MSS_GPIO_21_MASK		0x00200000UL
#define MSS_GPIO_22_MASK		0x00400000UL
#define MSS_GPIO_23_MASK		0x00800000UL
#define MSS_GPIO_24_MASK		0x01000000UL
#define MSS_GPIO_25_MASK		0x02000000UL
#define MSS_GPIO_26_MASK		0x04000000UL
#define MSS_GPIO_27_MASK		0x08000000UL
#define MSS_GPIO_28_MASK		0x10000000UL
#define MSS_GPIO_29_MASK		0x20000000UL
#define MSS_GPIO_30_MASK		0x40000000UL
#define MSS_GPIO_31_MASK		0x80000000UL

/*-------------------------------------------------------------------------*//**
 * GPIO modes
 */
#define MSS_GPIO_INPUT_MODE              0x0000000002UL
#define MSS_GPIO_OUTPUT_MODE             0x0000000005UL
#define MSS_GPIO_INOUT_MODE              0x0000000003UL

/*-------------------------------------------------------------------------*//**
 * Possible GPIO inputs interrupt configurations.
 */
#define MSS_GPIO_IRQ_LEVEL_HIGH			0x0000000000UL
#define MSS_GPIO_IRQ_LEVEL_LOW			0x0000000020UL
#define MSS_GPIO_IRQ_EDGE_POSITIVE		0x0000000040UL
#define MSS_GPIO_IRQ_EDGE_NEGATIVE		0x0000000060UL
#define MSS_GPIO_IRQ_EDGE_BOTH			0x0000000080UL

/*-------------------------------------------------------------------------*//**
 * Possible states for GPIO configured as INOUT.
 */
typedef enum mss_gpio_inout_state
{
    MSS_GPIO_DRIVE_LOW = 0,
    MSS_GPIO_DRIVE_HIGH,
    MSS_GPIO_HIGH_Z
} mss_gpio_inout_state_t;

/*-------------------------------------------------------------------------*//**
  The MSS_GPIO_init() function initializes the SmartFusion MSS GPIO block. It
  resets the MSS GPIO hardware block and it also clears any pending MSS GPIO
  interrupts in the Cortex-M3 interrupt controller.
  
   @return
    none.
 */
void MSS_GPIO_init( void );

/*-------------------------------------------------------------------------*//**
  The MSS_GPIO_config() function is used to configure an individual
  GPIO port.
 
  @param port_id
    The port_id parameter identifies the GPIO port to be configured.
    An enumeration item of the form MSS_GPIO_n where n is the number of the GPIO
    port is used to identify the GPIO port. For example MSS_GPIO_0 identifies
    the first GPIO port and MSS_GPIO_31 the last one.
    
  @param config
    The config parameter specifies the configuration to be applied to the GPIO
    port identified by the port_id parameter. It is a logical OR of the required
    I/O mode and the required interrupt mode. The interrupt mode is not relevant
    if the GPIO is configured as an output only.
       These I/O mode constants are allowed:
           - MSS_GPIO_INPUT_MODE
           - MSS_GPIO_OUTPUT_MODE
           - MSS_GPIO_INOUT_MODE
       These interrupt mode constants are allowed:
           - MSS_GPIO_IRQ_LEVEL_HIGH
           - MSS_GPIO_IRQ_LEVEL_LOW
           - MSS_GPIO_IRQ_EDGE_POSITIVE
           - MSS_GPIO_IRQ_EDGE_NEGATIVE
           - MSS_GPIO_IRQ_EDGE_BOTH
  
   @return
    none.

  Example:
  The following call will configure GPIO 4 as an input generating interrupts on
  a low to high transition of the input:
  @code
  MSS_GPIO_config( MSS_GPIO_4, MSS_GPIO_INPUT_MODE | MSS_GPIO_IRQ_EDGE_POSITIVE );
  @endcode
 */
void MSS_GPIO_config
(
    mss_gpio_id_t port_id,
    uint32_t config
);

/*-------------------------------------------------------------------------*//**
  The MSS_GPIO_set_outputs() function is used to set the state of all GPIO
  ports configured as outputs.
 
  @param value
    The value parameter specifies the state of the GPIO ports configured as
    outputs. It is a bit mask of the form (MSS_GPIO_n_MASK | MSS_GPIO_m_MASK) where n
    and m are numbers identifying GPIOs.
    For example (MSS_GPIO_0_MASK | MSS_GPIO_1_MASK | MSS_GPIO_2_MASK ) specifies
    that the first, second and third GPIOs' must be set high and all other
    outputs set low.
    The driver provides 32 mask constants, MSS_GPIO_0_MASK to MSS_GPIO_31_MASK
    inclusive, for this purpose.
  
  @return
    none.

  Example 1:
    Set GPIOs outputs 0 and 8 high and all other GPIO outputs low.
    @code
        MSS_GPIO_set_outputs( MSS_GPIO_0_MASK | MSS_GPIO_8_MASK );
    @endcode

  Example 2:
    Set GPIOs outputs 2 and 4 low without affecting other GPIO outputs.
    @code
        uint32_t gpio_outputs;
        gpio_outputs = MSS_GPIO_get_outputs();
        gpio_outputs &= ~( MSS_GPIO_2_MASK | MSS_GPIO_4_MASK );
        MSS_GPIO_set_outputs(  gpio_outputs );
    @endcode

  @see MSS_GPIO_get_outputs()
 */
static __INLINE void
MSS_GPIO_set_outputs
(
   uint32_t value
)
{
    GPIO->GPIO_OUT = value;
}

/*-------------------------------------------------------------------------*//**
  The MSS_GPIO_set_output() function is used to set the state of a single GPIO
  port configured as output.
 
  @param port_id
    The port_id parameter identifies the GPIO port that is to have its output set.
    An enumeration item of the form MSS_GPIO_n where n is the number of the GPIO
    port is used to identify the GPIO port. For example MSS_GPIO_0 identifies the
    first GPIO port and MSS_GPIO_31 the last one.
  
  @param value
    The value parameter specifies the desired state for the GPIO output. A value
    of 0 will set the output low and a value of 1 will set the output high.
  
  @return
    none.
 */
void MSS_GPIO_set_output
(
    mss_gpio_id_t       port_id,
    uint8_t             value
);

/*-------------------------------------------------------------------------*//**
  The MSS_GPIO_get_inputs() function is used to read the current state of all
  GPIO ports confgured as inputs.
 
  @return
    This function returns a 32 bit unsigned integer where each bit represents
    the state of a GPIO input. The least significant bit represents the state of
    GPIO input 0 and the most significant bit the state of GPIO input 31.

  Example:
    Read and assign the current state of the GPIO outputs to a variable.
    @code
        uint32_t gpio_inputs;
        gpio_inputs = MSS_GPIO_get_inputs();
    @endcode
 */
static __INLINE uint32_t
MSS_GPIO_get_inputs( void )
{
    return GPIO->GPIO_IN;
}

/*-------------------------------------------------------------------------*//**
  The MSS_GPIO_get_outputs() function is used to read the current state of all
  GPIO ports confgured as outputs.
 
  @return
     This function returns a 32 bit unsigned integer where each bit represents
     the state of a GPIO output. The least significant bit represents the state
     of GPIO output 0 and the most significant bit the state of GPIO output 31.

  Example:
    Read and assign the current state of the GPIO outputs to a variable.
    @code
        uint32_t gpio_outputs;
        gpio_outputs = MSS_GPIO_get_outputs();
    @endcode
 */
static __INLINE uint32_t
MSS_GPIO_get_outputs( void )
{
    return GPIO->GPIO_OUT;
}

/*-------------------------------------------------------------------------*//**
  The MSS_GPIO_drive_inout() function is used to set the output state of a single
  GPIO port configured as an INOUT. An INOUT GPIO can be in one of three states:
    - high
    - low
    - high impedance
  An INOUT output would typically be used where several devices can drive the
  state of a shared signal line. The high and low states are equivalent to the
  high and low states of a GPIO configured as output. The high impedance state
  is used to prevent the GPIO from driving its output state onto the signal line,
  while at the same time allowing the input state of the GPIO to be read
 
  @param port_id
    The port_id parameter identifies the GPIO port for which you want to change
    the output state.
    An enumeration item of the form MSS_GPIO_n where n is the number of the GPIO
    port is used to identify the GPIO port. For example MSS_GPIO_0 identifies
    the first GPIO port and MSS_GPIO_31 the last one.
    
  @param inout_state
    The inout_state parameter specifies the state of the GPIO port identified by
    the port_id parameter. Allowed values of type mss_gpio_inout_state_t are:
                           - MSS_GPIO_DRIVE_HIGH
                           - MSS_GPIO_DRIVE_LOW
                           - MSS_GPIO_HIGH_Z (high impedance)

  @return
    none.

  Example:
    The call to MSS_GPIO_drive_inout() below will set the GPIO 7 output to the
    high impedance state.
    @code
    MSS_GPIO_drive_inout( MSS_GPIO_7, MSS_GPIO_HIGH_Z );
    @endcode
 */
void MSS_GPIO_drive_inout
(
    mss_gpio_id_t           port_id,
    mss_gpio_inout_state_t  inout_state
);

/*-------------------------------------------------------------------------*//**
  The MSS_GPIO_enable_irq() function is used to enable interrupt generation
  for the specified GPIO input. Interrupts are generated based on the state of
  the GPIO input and the interrupt mode configured for it by MSS_GPIO_config().
 
  @param port_id
    The port_id parameter identifies the GPIO port for which you want to enable
    interrupt generation.
    An enumeration item of the form MSS_GPIO_n where n is the number of the GPIO
    port is used to identify the GPIO port. For example MSS_GPIO_0 identifies the
    first GPIO port and MSS_GPIO_31 the last one.
    
  @return
    none.

  Example:
    The call to MSS_GPIO_enable_irq() below will allow GPIO 8 to generate
    interrupts.
    @code
    MSS_GPIO_enable_irq( MSS_GPIO_8 );
    @endcode
 */
void MSS_GPIO_enable_irq
(
    mss_gpio_id_t port_id
);

/*-------------------------------------------------------------------------*//**
  The MSS_GPIO_disable_irq() function is used to disable interrupt generation
  for the specified GPIO input.
 
  @param port_id
    The port_id parameter identifies the GPIO port for which you want to disable
    interrupt generation.
    An enumeration item of the form MSS_GPIO_n where n is the number of the GPIO
    port is used to identify the GPIO port. For example MSS_GPIO_0 identifies the
    first GPIO port and MSS_GPIO_31 the last one.
 
  @return
    none.

  Example:
    The call to MSS_GPIO_disable_irq() below will prevent GPIO 8 from generating
    interrupts.
    @code
    MSS_GPIO_disable_irq( MSS_GPIO_8 );
    @endcode
 */
void MSS_GPIO_disable_irq
(
    mss_gpio_id_t port_id
);

/*-------------------------------------------------------------------------*//**
  The MSS_GPIO_clear_irq() function is used to clear a pending interrupt from
  the specified GPIO input.
  Note: The MSS_GPIO_clear_irq() function must be called as part of any GPIO
  interrupt service routine (ISR) in order to prevent the same interrupt event
  retriggering a call to the GPIO ISR. The function also clears the interrupt
  in the Cortex-M3 interrupt controller through a call to NVIC_ClearPendingIRQ().
 
  @param port_id
    The port_id parameter identifies the GPIO input for which you want to clear the
    interrupt.
    An enumeration item of the form MSS_GPIO_n where n is the number of the GPIO
    port is used to identify the GPIO port. For example MSS_GPIO_0 identifies the
    first GPIO port and MSS_GPIO_31 the last one.
    
  @return
    none.

  Example:
    The example below demonstrates the use of the MSS_GPIO_clear_irq() function
    as part of the GPIO 9 interrupt service routine.  
    @code
    void GPIO9_IRQHandler( void )
    {
        do_interrupt_processing();
        
        MSS_GPIO_clear_irq( MSS_GPIO_9 );
    }
    @endcode
 */
void MSS_GPIO_clear_irq
(
    mss_gpio_id_t port_id
);

#ifdef __cplusplus
}
#endif

#endif /* MSS_GPIO_H_ */
