/******************************************************************************
*  Filename:       gpio.h
*  Revised:        2015-12-07 16:22:56 +0100 (Mon, 07 Dec 2015)
*  Revision:       45269
*
*  Description:    Defines and prototypes for the GPIO.
*
*  Copyright (c) 2015 - 2016, Texas Instruments Incorporated
*  All rights reserved.
*
*  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 of the ORGANIZATION 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 HOLDER 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.
*
******************************************************************************/

//*****************************************************************************
//
//! \addtogroup peripheral_group
//! @{
//! \addtogroup gpio_api
//! @{
//
//*****************************************************************************

#ifndef __GPIO_H__
#define __GPIO_H__

//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif

#include <stdint.h>
#include <inc/hw_types.h>
#include <inc/hw_memmap.h>
#include <inc/hw_gpio.h>
#include <driverlib/debug.h>

//*****************************************************************************
//
// Check for legal range of variable dioNumber
//
//*****************************************************************************
#ifdef DRIVERLIB_DEBUG
#include <inc/hw_fcfg1.h>
#include <driverlib/chipinfo.h>

static bool
dioNumberLegal( uint32_t dioNumber )
{
    uint32_t ioCount =
        (( HWREG( FCFG1_BASE + FCFG1_O_IOCONF ) &
            FCFG1_IOCONF_GPIO_CNT_M ) >>
            FCFG1_IOCONF_GPIO_CNT_S ) ;

    //
    // Special handling of CC13xx 7x7, where IO_CNT = 30 and legal range is 1..30
    // for all other chips legal range is 0..(dioNumber-1)
    //
    if (( ioCount == 30 ) && ChipInfo_ChipFamilyIsCC13xx() ) {
        return (( dioNumber > 0 ) && ( dioNumber <= ioCount ));
    } else {
        return ( dioNumber < ioCount );
    }
}
#endif

//*****************************************************************************
//
// The following values define the bit field for the GPIO DIOs.
//
//*****************************************************************************
#define GPIO_DIO_0_MASK         0x00000001  // GPIO DIO 0 mask
#define GPIO_DIO_1_MASK         0x00000002  // GPIO DIO 1 mask
#define GPIO_DIO_2_MASK         0x00000004  // GPIO DIO 2 mask
#define GPIO_DIO_3_MASK         0x00000008  // GPIO DIO 3 mask
#define GPIO_DIO_4_MASK         0x00000010  // GPIO DIO 4 mask
#define GPIO_DIO_5_MASK         0x00000020  // GPIO DIO 5 mask
#define GPIO_DIO_6_MASK         0x00000040  // GPIO DIO 6 mask
#define GPIO_DIO_7_MASK         0x00000080  // GPIO DIO 7 mask
#define GPIO_DIO_8_MASK         0x00000100  // GPIO DIO 8 mask
#define GPIO_DIO_9_MASK         0x00000200  // GPIO DIO 9 mask
#define GPIO_DIO_10_MASK        0x00000400  // GPIO DIO 10 mask
#define GPIO_DIO_11_MASK        0x00000800  // GPIO DIO 11 mask
#define GPIO_DIO_12_MASK        0x00001000  // GPIO DIO 12 mask
#define GPIO_DIO_13_MASK        0x00002000  // GPIO DIO 13 mask
#define GPIO_DIO_14_MASK        0x00004000  // GPIO DIO 14 mask
#define GPIO_DIO_15_MASK        0x00008000  // GPIO DIO 15 mask
#define GPIO_DIO_16_MASK        0x00010000  // GPIO DIO 16 mask
#define GPIO_DIO_17_MASK        0x00020000  // GPIO DIO 17 mask
#define GPIO_DIO_18_MASK        0x00040000  // GPIO DIO 18 mask
#define GPIO_DIO_19_MASK        0x00080000  // GPIO DIO 19 mask
#define GPIO_DIO_20_MASK        0x00100000  // GPIO DIO 20 mask
#define GPIO_DIO_21_MASK        0x00200000  // GPIO DIO 21 mask
#define GPIO_DIO_22_MASK        0x00400000  // GPIO DIO 22 mask
#define GPIO_DIO_23_MASK        0x00800000  // GPIO DIO 23 mask
#define GPIO_DIO_24_MASK        0x01000000  // GPIO DIO 24 mask
#define GPIO_DIO_25_MASK        0x02000000  // GPIO DIO 25 mask
#define GPIO_DIO_26_MASK        0x04000000  // GPIO DIO 26 mask
#define GPIO_DIO_27_MASK        0x08000000  // GPIO DIO 27 mask
#define GPIO_DIO_28_MASK        0x10000000  // GPIO DIO 28 mask
#define GPIO_DIO_29_MASK        0x20000000  // GPIO DIO 29 mask
#define GPIO_DIO_30_MASK        0x40000000  // GPIO DIO 30 mask
#define GPIO_DIO_31_MASK        0x80000000  // GPIO DIO 31 mask
#define GPIO_DIO_ALL_MASK       0xFFFFFFFF  // GPIO all DIOs mask

//*****************************************************************************
//
// Define constants that shall be passed as the outputEnableValue parameter to
// GPIO_setOutputEnableDio() and will be returned from the function
// GPIO_getOutputEnableDio().
//
//*****************************************************************************
#define GPIO_OUTPUT_DISABLE     0x00000000  // DIO output is disabled
#define GPIO_OUTPUT_ENABLE      0x00000001  // DIO output is enabled

//*****************************************************************************
//
// API Functions and prototypes
//
//*****************************************************************************

//*****************************************************************************
//
//! \brief Reads a specific DIO.
//!
//! \param dioNumber specifies the DIO to read (0-31).
//!
//! \return Returns 0 or 1 reflecting the input value of the specified DIO.
//!
//! \sa \ref GPIO_readMultiDio(), \ref GPIO_writeDio(), \ref GPIO_writeMultiDio()
//
//*****************************************************************************
__STATIC_INLINE uint32_t
GPIO_readDio( uint32_t dioNumber )
{
    //
    // Check the arguments.
    //
    ASSERT( dioNumberLegal( dioNumber ));

    //
    // Return the input value from the specified DIO.
    //
    return (( HWREG( GPIO_BASE + GPIO_O_DIN31_0 ) >> dioNumber ) & 1 );
}

//*****************************************************************************
//
//! \brief Reads the input value for the specified DIOs.
//!
//! This function returns the the input value for multiple DIOs.
//! The value returned is not shifted and hence matches the corresponding dioMask bits.
//!
//! \param dioMask is the bit-mask representation of the DIOs to read.
//! The parameter must be a bitwise OR'ed combination of the following:
//! - \ref GPIO_DIO_0_MASK
//! - ...
//! - \ref GPIO_DIO_31_MASK
//!
//! \return Returns a bit vector reflecting the input value of the corresponding DIOs.
//! - 0 : Corresponding DIO is low.
//! - 1 : Corresponding DIO is high.
//!
//! \sa \ref GPIO_readDio(), \ref GPIO_writeDio(), \ref GPIO_writeMultiDio()
//
//*****************************************************************************
__STATIC_INLINE uint32_t
GPIO_readMultiDio( uint32_t dioMask )
{
    //
    // Check the arguments.
    //
    ASSERT( dioMask & GPIO_DIO_ALL_MASK );

    //
    // Return the input value from the specified DIOs.
    //
    return ( HWREG( GPIO_BASE + GPIO_O_DIN31_0 ) & dioMask );
}

//*****************************************************************************
//
//! \brief Writes a value to a specific DIO.
//!
//! \param dioNumber specifies the DIO to update (0-31).
//! \param value specifies the value to write
//! - 0 : Logic zero (low)
//! - 1 : Logic one (high)
//!
//! \return None
//!
//! \sa \ref GPIO_writeMultiDio(), \ref GPIO_readDio(), \ref GPIO_readMultiDio()
//
//*****************************************************************************
__STATIC_INLINE void
GPIO_writeDio( uint32_t dioNumber, uint32_t value )
{
    //
    // Check the arguments.
    //
    ASSERT( dioNumberLegal( dioNumber ));
    ASSERT(( value == 0 ) || ( value == 1 ));

    //
    // Write 0 or 1 to the byte indexed DOUT map
    //
    HWREGB( GPIO_BASE + dioNumber ) = value;
}

//*****************************************************************************
//
//! \brief Writes masked data to the specified DIOs.
//!
//! Enables for writing multiple bits simultaneously.
//! The value to write must be shifted so it matches the corresponding dioMask bits.
//!
//! \note Note that this is a read-modify-write operation and hence not atomic.
//!
//! \param dioMask is the bit-mask representation of the DIOs to write.
//! The parameter must be a bitwise OR'ed combination of the following:
//! - \ref GPIO_DIO_0_MASK
//! - ...
//! - \ref GPIO_DIO_31_MASK
//! \param bitVectoredValue holds the value to be written to the corresponding DIO-bits.
//!
//! \return None
//!
//! \sa \ref GPIO_writeDio(), \ref GPIO_readDio(), \ref GPIO_readMultiDio()
//
//*****************************************************************************
__STATIC_INLINE void
GPIO_writeMultiDio( uint32_t dioMask, uint32_t bitVectoredValue )
{
    //
    // Check the arguments.
    //
    ASSERT( dioMask & GPIO_DIO_ALL_MASK );

    HWREG( GPIO_BASE + GPIO_O_DOUT31_0 ) =
        ( HWREG( GPIO_BASE + GPIO_O_DOUT31_0 ) & ~dioMask ) |
        ( bitVectoredValue & dioMask );
}

//*****************************************************************************
//
//! \brief Sets a specific DIO to 1 (high).
//!
//! \param dioNumber specifies the DIO to set (0-31).
//!
//! \return None
//!
//! \sa \ref GPIO_setMultiDio(), \ref GPIO_clearDio(), \ref GPIO_clearMultiDio()
//
//*****************************************************************************
__STATIC_INLINE void
GPIO_setDio( uint32_t dioNumber )
{
    //
    // Check the arguments.
    //
    ASSERT( dioNumberLegal( dioNumber ));

    //
    // Set the specified DIO.
    //
    HWREG( GPIO_BASE + GPIO_O_DOUTSET31_0 ) = ( 1 << dioNumber );
}

//*****************************************************************************
//
//! \brief Sets the specified DIOs to 1 (high).
//!
//! \param dioMask is the bit-mask representation of the DIOs to set.
//! The parameter must be a bitwise OR'ed combination of the following:
//! - \ref GPIO_DIO_0_MASK
//! - ...
//! - \ref GPIO_DIO_31_MASK
//!
//! \return None
//!
//! \sa \ref GPIO_setDio(), \ref GPIO_clearDio(), \ref GPIO_clearMultiDio()
//
//*****************************************************************************
__STATIC_INLINE void
GPIO_setMultiDio( uint32_t dioMask )
{
    //
    // Check the arguments.
    //
    ASSERT( dioMask & GPIO_DIO_ALL_MASK );

    //
    // Set the DIOs.
    //
    HWREG( GPIO_BASE + GPIO_O_DOUTSET31_0 ) = dioMask;
}

//*****************************************************************************
//
//! \brief Clears a specific DIO to 0 (low).
//!
//! \param dioNumber specifies the DIO to clear (0-31).
//!
//! \return None
//!
//! \sa \ref GPIO_clearMultiDio(), \ref GPIO_setDio(), \ref GPIO_setMultiDio()
//
//*****************************************************************************
__STATIC_INLINE void
GPIO_clearDio( uint32_t dioNumber )
{
    //
    // Check the arguments.
    //
    ASSERT( dioNumberLegal( dioNumber ));

    //
    // Clear the specified DIO.
    //
    HWREG( GPIO_BASE + GPIO_O_DOUTCLR31_0 ) = ( 1 << dioNumber );
}

//*****************************************************************************
//
//! \brief Clears the specified DIOs to 0 (low).
//!
//! \param dioMask is the bit-mask representation of the DIOs to clear.
//! The parameter must be a bitwise OR'ed combination of the following:
//! - \ref GPIO_DIO_0_MASK
//! - ...
//! - \ref GPIO_DIO_31_MASK
//!
//! \return None
//!
//! \sa \ref GPIO_clearDio(), \ref GPIO_setDio(), \ref GPIO_setMultiDio()
//
//*****************************************************************************
__STATIC_INLINE void
GPIO_clearMultiDio( uint32_t dioMask )
{
    //
    // Check the arguments.
    //
    ASSERT( dioMask & GPIO_DIO_ALL_MASK );

    //
    // Clear the DIOs.
    //
    HWREG( GPIO_BASE + GPIO_O_DOUTCLR31_0 ) = dioMask;
}

//*****************************************************************************
//
//! \brief Toggles a specific DIO.
//!
//! \param dioNumber specifies the DIO to toggle (0-31).
//!
//! \return None
//!
//! \sa \ref GPIO_toggleMultiDio()
//
//*****************************************************************************
__STATIC_INLINE void
GPIO_toggleDio( uint32_t dioNumber )
{
    //
    // Check the arguments.
    //
    ASSERT( dioNumberLegal( dioNumber ));

    //
    // Toggle the specified DIO.
    //
    HWREG( GPIO_BASE + GPIO_O_DOUTTGL31_0 ) = ( 1 << dioNumber );
}

//*****************************************************************************
//
//! \brief Toggles the specified DIOs.
//!
//! \param dioMask is the bit-mask representation of the DIOs to toggle.
//! The parameter must be a bitwise OR'ed combination of the following:
//! - \ref GPIO_DIO_0_MASK
//! - ...
//! - \ref GPIO_DIO_31_MASK
//!
//! \return None
//!
//! \sa \ref GPIO_toggleDio()
//
//*****************************************************************************
__STATIC_INLINE void
GPIO_toggleMultiDio( uint32_t dioMask )
{
    //
    // Check the arguments.
    //
    ASSERT( dioMask & GPIO_DIO_ALL_MASK );

    //
    // Toggle the DIOs.
    //
    HWREG( GPIO_BASE + GPIO_O_DOUTTGL31_0 ) = dioMask;
}

//*****************************************************************************
//
//! \brief Gets the output enable status of a specific DIO.
//!
//! This function returns the output enable status for the specified DIO.
//! The DIO can be configured as either input or output under software control.
//!
//! \param dioNumber specifies the DIO to get the output enable setting from (0-31).
//!
//! \return Returns one of the enumerated data types (0 or 1):
//! - \ref GPIO_OUTPUT_DISABLE : DIO output is disabled.
//! - \ref GPIO_OUTPUT_ENABLE  : DIO output is enabled.
//!
//! \sa \ref GPIO_getOutputEnableMultiDio(), \ref GPIO_setOutputEnableDio(), \ref GPIO_setOutputEnableMultiDio()
//
//*****************************************************************************
__STATIC_INLINE uint32_t
GPIO_getOutputEnableDio( uint32_t dioNumber )
{
    //
    // Check the arguments.
    //
    ASSERT( dioNumberLegal( dioNumber ));

    //
    // Return the output enable status for the specified DIO.
    //
    return (( HWREG( GPIO_BASE + GPIO_O_DOE31_0 ) >> dioNumber ) & 1 );
}

//*****************************************************************************
//
//! \brief Gets the output enable setting of the specified DIOs.
//!
//! This function returns the output enable setting for multiple DIOs.
//! The value returned is not shifted and hence matches the corresponding dioMask bits.
//!
//! \param dioMask is the bit-mask representation of the DIOs to return the output enable settings from.
//! The parameter must be a bitwise OR'ed combination of the following:
//! - \ref GPIO_DIO_0_MASK
//! - ...
//! - \ref GPIO_DIO_31_MASK
//!
//! \return Returns the output enable setting for multiple DIOs as a bit vector corresponding to the dioMask bits.
//! - 0 : Corresponding DIO is configured with output disabled.
//! - 1 : Corresponding DIO is configured with output enabled.
//!
//! \sa \ref GPIO_getOutputEnableDio(), \ref GPIO_setOutputEnableDio(), \ref GPIO_setOutputEnableMultiDio()
//
//*****************************************************************************
__STATIC_INLINE uint32_t
GPIO_getOutputEnableMultiDio( uint32_t dioMask )
{
    //
    // Check the arguments.
    //
    ASSERT( dioMask & GPIO_DIO_ALL_MASK );

    //
    // Return the output enable value for the specified DIOs.
    //
    return ( HWREG( GPIO_BASE + GPIO_O_DOE31_0 ) & dioMask );
}

//*****************************************************************************
//
//! \brief Sets output enable of a specific DIO.
//!
//! This function sets the GPIO output enable bit for the specified DIO.
//! The DIO can be configured as either input or output under software control.
//!
//! \param dioNumber specifies the DIO to configure (0-31).
//! \param outputEnableValue specifies the output enable setting of the specified DIO:
//! - \ref GPIO_OUTPUT_DISABLE : DIO output is disabled.
//! - \ref GPIO_OUTPUT_ENABLE  : DIO output is enabled.
//!
//! \return None
//!
//! \sa \ref GPIO_setOutputEnableMultiDio(), \ref GPIO_getOutputEnableDio(), \ref GPIO_getOutputEnableMultiDio()
//
//*****************************************************************************
__STATIC_INLINE void
GPIO_setOutputEnableDio( uint32_t dioNumber, uint32_t outputEnableValue )
{
    //
    // Check the arguments.
    //
    ASSERT( dioNumberLegal( dioNumber ));
    ASSERT(( outputEnableValue == GPIO_OUTPUT_DISABLE ) ||
           ( outputEnableValue == GPIO_OUTPUT_ENABLE  )    );

    //
    // Update the output enable bit for the specified DIO.
    //
    HWREGBITW( GPIO_BASE + GPIO_O_DOE31_0, dioNumber ) = outputEnableValue;
}

//*****************************************************************************
//
//! \brief Configures the output enable setting for all specified DIOs.
//!
//! This function configures the output enable setting for the specified DIOs.
//! The output enable setting must be shifted so it matches the corresponding dioMask bits.
//! The DIOs can be configured as either an input or output under software control.
//!
//! \note Note that this is a read-modify-write operation and hence not atomic.
//!
//! \param dioMask is the bit-mask representation of the DIOs on which to configure the
//! output enable setting. The parameter must be a bitwise OR'ed combination of the following:
//! - \ref GPIO_DIO_0_MASK
//! - ...
//! - \ref GPIO_DIO_31_MASK
//! \param bitVectoredOutputEnable holds the output enable setting the corresponding DIO-bits:
//! - 0 : Corresponding DIO is configured with output disabled.
//! - 1 : Corresponding DIO is configured with output enabled.
//!
//! \return None
//!
//! \sa \ref GPIO_setOutputEnableDio(), \ref GPIO_getOutputEnableDio(), \ref GPIO_getOutputEnableMultiDio()
//
//*****************************************************************************
__STATIC_INLINE void
GPIO_setOutputEnableMultiDio( uint32_t dioMask, uint32_t bitVectoredOutputEnable )
{
    //
    // Check the arguments.
    //
    ASSERT( dioMask & GPIO_DIO_ALL_MASK );

    HWREG( GPIO_BASE + GPIO_O_DOE31_0 ) =
        ( HWREG( GPIO_BASE + GPIO_O_DOE31_0 ) & ~dioMask ) |
        ( bitVectoredOutputEnable & dioMask );
}

//*****************************************************************************
//
//! \brief Gets the event status of a specific DIO.
//!
//! \param dioNumber specifies the DIO to get the event status from (0-31).
//!
//! \return Returns the current event status on the specified DIO.
//! - 0 : Non-triggered event.
//! - 1 : Triggered event.
//!
//! \sa \ref GPIO_getEventMultiDio(), \ref GPIO_clearEventDio(), \ref GPIO_clearEventMultiDio()
//
//*****************************************************************************
__STATIC_INLINE uint32_t
GPIO_getEventDio( uint32_t dioNumber )
{
    //
    // Check the arguments.
    //
    ASSERT( dioNumberLegal( dioNumber ));

    //
    // Return the event status for the specified DIO.
    //
    return (( HWREG( GPIO_BASE + GPIO_O_EVFLAGS31_0 ) >> dioNumber ) & 1 );
}

//*****************************************************************************
//
//! \brief Gets the event status of the specified DIOs.
//!
//! This function returns the event status for multiple DIOs.
//! The value returned is not shifted and hence matches the corresponding dioMask bits.
//!
//! \param dioMask is the bit-mask representation of the DIOs to get the
//! event status from (0-31).
//! The parameter must be a bitwise OR'ed combination of the following:
//! - \ref GPIO_DIO_0_MASK
//! - ...
//! - \ref GPIO_DIO_31_MASK
//!
//! \return Returns a bit vector with the current event status correspondig to the specified DIOs.
//! - 0 : Corresponding DIO has no triggered event.
//! - 1 : Corresponding DIO has a triggered event.
//!
//! \sa \ref GPIO_getEventDio(), \ref GPIO_clearEventDio(), \ref GPIO_clearEventMultiDio()
//
//*****************************************************************************
__STATIC_INLINE uint32_t
GPIO_getEventMultiDio( uint32_t dioMask )
{
    //
    // Check the arguments.
    //
    ASSERT( dioMask & GPIO_DIO_ALL_MASK );

    //
    // Return the event status for the specified DIO.
    //
    return ( HWREG( GPIO_BASE + GPIO_O_EVFLAGS31_0 ) & dioMask );
}

//*****************************************************************************
//
//! \brief Clears the IO event status of a specific DIO.
//!
//! \param dioNumber specifies the DIO on which to clear the event status (0-31).
//!
//! \return None
//!
//! \sa \ref GPIO_clearEventMultiDio(), \ref GPIO_getEventDio(), \ref GPIO_getEventMultiDio()
//
//*****************************************************************************
__STATIC_INLINE void
GPIO_clearEventDio( uint32_t dioNumber )
{
    //
    // Check the arguments.
    //
    ASSERT( dioNumberLegal( dioNumber ));

    //
    // Clear the event status for the specified DIO.
    //
    HWREG( GPIO_BASE + GPIO_O_EVFLAGS31_0 ) = ( 1 << dioNumber );
}

//*****************************************************************************
//
//! \brief Clears the IO event status on the specified DIOs.
//!
//! \param dioMask is the bit-mask representation of the DIOs on which to
//! clear the events status.
//! The parameter must be a bitwise OR'ed combination of the following:
//! - \ref GPIO_DIO_0_MASK
//! - ...
//! - \ref GPIO_DIO_31_MASK
//!
//! \return None
//!
//! \sa \ref GPIO_clearEventDio(), \ref GPIO_getEventDio(), \ref GPIO_getEventMultiDio()
//
//*****************************************************************************
__STATIC_INLINE void
GPIO_clearEventMultiDio( uint32_t dioMask )
{
    //
    // Check the arguments.
    //
    ASSERT( dioMask & GPIO_DIO_ALL_MASK );

    //
    // Clear the event status for the specified DIOs.
    //
    HWREG( GPIO_BASE + GPIO_O_EVFLAGS31_0 ) = dioMask;
}

//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif

#endif // __GPIO_H__

//*****************************************************************************
//
//! Close the Doxygen group.
//! @}
//! @}
//
//*****************************************************************************
