/******************************************************************************
 *
 *  Copyright (C) 2001-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/
#ifndef UPIO_H
#define UPIO_H

/* Enumeration of UPIO features                                         */
/* Not all features enumerated here are supported by the hardware.      */
/* Use UPIO_Feature() to determine support of a particular feature.     */
enum
{
    /* LEDs */
    UPIO_FEAT_LED1,
    UPIO_FEAT_LED2,
    UPIO_FEAT_LED3,
    UPIO_FEAT_LED4,
    UPIO_FEAT_LED5,
    UPIO_FEAT_LED6,
    UPIO_FEAT_LED7,
    UPIO_FEAT_LED8,

    /* Switches */
    UPIO_FEAT_SWITCH1,
    UPIO_FEAT_SWITCH2,
    UPIO_FEAT_SWITCH3,
    UPIO_FEAT_SWITCH4,
    UPIO_FEAT_SWITCH5,
    UPIO_FEAT_SWITCH6,
    UPIO_FEAT_SWITCH7,
    UPIO_FEAT_SWITCH8,
    UPIO_FEAT_SWITCH9,
    UPIO_FEAT_SWITCH10,
    UPIO_FEAT_SWITCH11,
    UPIO_FEAT_SWITCH12,
    UPIO_FEAT_SWITCH13,
    UPIO_FEAT_SWITCH14,
    UPIO_FEAT_SWITCH15,
    UPIO_FEAT_SWITCH16,

    /* Jumpers */
    UPIO_FEAT_JUMPER1,
    UPIO_FEAT_JUMPER2,
    UPIO_FEAT_JUMPER3,
    UPIO_FEAT_JUMPER4,
    UPIO_FEAT_JUMPER5,
    UPIO_FEAT_JUMPER6,
    UPIO_FEAT_JUMPER7,
    UPIO_FEAT_JUMPER8,

    /* Push buttons */
    UPIO_FEAT_BUTTON1,
    UPIO_FEAT_BUTTON2,
    UPIO_FEAT_BUTTON3,
    UPIO_FEAT_BUTTON4,
    UPIO_FEAT_BUTTON5,
    UPIO_FEAT_BUTTON6,
    UPIO_FEAT_BUTTON7,
    UPIO_FEAT_BUTTON8,

    /* General purpose */
    UPIO_FEAT_GENERAL1,
    UPIO_FEAT_GENERAL2,
    UPIO_FEAT_GENERAL3,
    UPIO_FEAT_GENERAL4,
    UPIO_FEAT_GENERAL5,
    UPIO_FEAT_GENERAL6,
    UPIO_FEAT_GENERAL7,
    UPIO_FEAT_GENERAL8,
    UPIO_FEAT_GENERAL9,
    UPIO_FEAT_GENERAL10,
    UPIO_FEAT_GENERAL11,
    UPIO_FEAT_GENERAL12,
    UPIO_FEAT_GENERAL13,
    UPIO_FEAT_GENERAL14,
    UPIO_FEAT_GENERAL15,
    UPIO_FEAT_GENERAL16,
    UPIO_FEAT_GENERAL17,
    UPIO_FEAT_GENERAL18,
    UPIO_FEAT_GENERAL19,
    UPIO_FEAT_GENERAL20,
    UPIO_FEAT_GENERAL21,
    UPIO_FEAT_GENERAL22,
    UPIO_FEAT_GENERAL23,
    UPIO_FEAT_GENERAL24,
    UPIO_FEAT_GENERAL25,
    UPIO_FEAT_GENERAL26,
    UPIO_FEAT_GENERAL27,
    UPIO_FEAT_GENERAL28,
    UPIO_FEAT_GENERAL29,
    UPIO_FEAT_GENERAL30,
    UPIO_FEAT_GENERAL31,
    UPIO_FEAT_GENERAL32,

    UPIO_FEAT_IN_HIGH,          /* Support for input with interrupt on high signal level. */
    UPIO_FEAT_IN_LOW,           /* Support for input with interrupt on low signal level. */
    UPIO_FEAT_IN_RISE,          /* Support for input with interrupt on rising edge. */
    UPIO_FEAT_IN_FALL           /* Support for input with interrupt on falling. */

};
typedef UINT8 tUPIO_FEATURE;


/* Enumeration of UPIO configurations */
enum
{
    UPIO_OUT,
    UPIO_IN,
    UPIO_IN_EDGE,
    UPIO_IN_LEVEL,
    UPIO_NONE
};
typedef UINT8 tUPIO_CONFIG;


/* Enumeration of UPIO types */
enum
{
    UPIO_LED,                   /* LED */
    UPIO_SWITCH,                /* Switch */
    UPIO_JUMPER,                /* Jumper */
    UPIO_BUTTON,                /* Push-button switch */
    UPIO_GENERAL,               /* General purpose I/O */

    UPIO_NUMBER_OF_TYPES
};
typedef UINT8 tUPIO_TYPE;


/* Enumeration of UPIO states */
enum
{
    UPIO_OFF,
    UPIO_ON,
    UPIO_TOGGLE
};
typedef UINT8 tUPIO_STATE;


enum
{
    UPIO_SW_BANK2,
    UPIO_SW_BANK3
};
typedef UINT8 tUPIO_SW_BANK;

/* Jumper masks */
#define UPIO_JUMPER1    0x00000001
#define UPIO_JUMPER2    0x00000002
#define UPIO_JUMPER3    0x00000004
#define UPIO_JUMPER4    0x00000008
#define UPIO_JUMPER5    0x00000010
#define UPIO_JUMPER6    0x00000020
#define UPIO_JUMPER7    0x00000040
#define UPIO_JUMPER8    0x00000080

/* General purpose i/o masks */
#define UPIO_GENERAL1   0x00000001
#define UPIO_GENERAL2   0x00000002
#define UPIO_GENERAL3   0x00000004
#define UPIO_GENERAL4   0x00000008
#define UPIO_GENERAL5   0x00000010
#define UPIO_GENERAL6   0x00000020
#define UPIO_GENERAL7   0x00000040
#define UPIO_GENERAL8   0x00000080
#define UPIO_GENERAL9   0x00000100
#define UPIO_GENERAL10  0x00000200
#define UPIO_GENERAL11  0x00000400
#define UPIO_GENERAL12  0x00000800
#define UPIO_GENERAL13  0x00001000
#define UPIO_GENERAL14  0x00002000
#define UPIO_GENERAL15  0x00004000
#define UPIO_GENERAL16  0x00008000
#define UPIO_GENERAL17  0x00010000
#define UPIO_GENERAL18  0x00020000
#define UPIO_GENERAL19  0x00040000
#define UPIO_GENERAL20  0x00080000
#define UPIO_GENERAL21  0x00100000
#define UPIO_GENERAL22  0x00200000
#define UPIO_GENERAL23  0x00400000
#define UPIO_GENERAL24  0x00800000
#define UPIO_GENERAL25  0x01000000
#define UPIO_GENERAL26  0x02000000
#define UPIO_GENERAL27  0x04000000
#define UPIO_GENERAL28  0x08000000
#define UPIO_GENERAL29  0x10000000
#define UPIO_GENERAL30  0x20000000
#define UPIO_GENERAL31  0x40000000
#define UPIO_GENERAL32  0x80000000

typedef UINT32 tUPIO;

/* LED masks */
#define UPIO_LED1       0x00000001
#define UPIO_LED2       0x00000002
#define UPIO_LED3       0x00000004
#define UPIO_LED4       0x00000008
#define UPIO_LED5       0x00000010
#define UPIO_LED6       0x00000020
#define UPIO_LED7       0x00000040
#define UPIO_LED8       0x00000080

#define UPIO_LED_ALL    (UPIO_LED1 | UPIO_LED2 | UPIO_LED3 | UPIO_LED4 | \
                        UPIO_LED5 | UPIO_LED6 | UPIO_LED7 | UPIO_LED8)


/* Switch masks */
#define UPIO_SWITCH1    0x00000001
#define UPIO_SWITCH2    0x00000002
#define UPIO_SWITCH3    0x00000004
#define UPIO_SWITCH4    0x00000008
#define UPIO_SWITCH5    0x00000010
#define UPIO_SWITCH6    0x00000020
#define UPIO_SWITCH7    0x00000040
#define UPIO_SWITCH8    0x00000080
#define UPIO_SWITCH9    0x00000100
#define UPIO_SWITCH10   0x00000200
#define UPIO_SWITCH11   0x00000400
#define UPIO_SWITCH12   0x00000800
#define UPIO_SWITCH13   0x00001000
#define UPIO_SWITCH14   0x00002000
#define UPIO_SWITCH15   0x00004000
#define UPIO_SWITCH16   0x00008000

/* Push button masks */
#define UPIO_BUTTON1    0x00000001
#define UPIO_BUTTON2    0x00000002
#define UPIO_BUTTON3    0x00000004
#define UPIO_BUTTON4    0x00000008
#define UPIO_BUTTON5    0x00000010
#define UPIO_BUTTON6    0x00000020
#define UPIO_BUTTON7    0x00000040
#define UPIO_BUTTON8    0x00000080

typedef void (tUPIO_CBACK)(tUPIO_TYPE type, tUPIO pio, tUPIO_STATE state);

#ifdef __cplusplus
extern "C" {
#endif

/* API functions for UPIO driver */

/*****************************************************************************
**
** Function         UPIO_Init
**
** Description
**      Initialize the GPIO service.
**      This function is typically called once upon system startup.
**
** Returns          nothing
**
*****************************************************************************/
UDRV_API void UPIO_Init(void *p_cfg);


/*****************************************************************************
**
** Function         UPIO_Set
**
** Description
**      This function sets one or more GPIO devices to the given state.
**      Multiple GPIOs of the same type can be masked together to set more
**      than one GPIO. This function can only be used on types UPIO_LED and
**      UPIO_GENERAL.
**
** Input Parameters:
**      type    The type of device.
**      pio     Indicates the particular GPIOs.
**      state   The desired state.
**
** Output Parameter:
**      None.
**
** Returns:
**      None.
**
*****************************************************************************/
UDRV_API void UPIO_Set(tUPIO_TYPE type, tUPIO pio, tUPIO_STATE state);


/*****************************************************************************
**
** Function         UPIO_Read
**
** Description
**      Read the state of a GPIO. This function can be used for any type of
**      device. Parameter pio can only indicate a single GPIO; multiple GPIOs
**      cannot be masked together.
**
** Input Parameters:
**      Type:	The type of device.
**      pio:    Indicates the particular GUPIO.
**
** Output Parameter:
**      None.
**
** Returns:
**      State of GPIO (UPIO_ON or UPIO_OFF).
**
*****************************************************************************/
UDRV_API tUPIO_STATE UPIO_Read(tUPIO_TYPE type, tUPIO pio);


/*****************************************************************************
**
** Function         UPIO_Config
**
** Description      - Configure GPIOs of type UPIO_GENERAL as inputs or outputs
**                  - Configure GPIOs to be polled or interrupt driven
**
**                  Currently only support polled GPIOs.
**
** Input Parameters:
**      type    The type of device.
**      pio     Indicates the particular GPIOs.
**      config
**      cback
**
** Output Parameter:
**      None.
**
** Returns:
**      None.
**
*****************************************************************************/
UDRV_API void UPIO_Config(tUPIO_TYPE type, tUPIO pio, tUPIO_CONFIG config, tUPIO_CBACK *cback);


/*****************************************************************************
**
** Function         UPIO_Feature
**
** Description
**      Checks whether a feature of the pio API is supported
**
** Input Parameter:
**      feature     The feature to check
**
** Output Parameter:
**      None.
**
** Returns:
**      TRUE if feature is supported, FALSE if it is not.
**
*****************************************************************************/
UDRV_API BOOLEAN UPIO_Feature(tUPIO_FEATURE feature);

#ifdef __cplusplus
}
#endif

#endif  /* ifdef UPIO_H */