blob: 325fdde4dfbf1d34889c7f4fe7820f265f91e14b [file] [log] [blame]
/*! \file
* Altera - GPIO Module
*/
/******************************************************************************
*
* Copyright 2013 Altera Corporation. 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. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "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 AUTHOR 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.
*
******************************************************************************/
#ifndef __ALT_GPIO_H__
#define __ALT_GPIO_H__
#include <stdint.h>
#include "hwlib.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define ALT_GPIO_BITMASK 0x1FFFFFFF
/* If the GPIO special test mode flag was not defined in the makefile, */
/* set the ALT_GPIO_DATAREAD_TEST_MODE flag to false to specify that */
/* the production code version of alt_gpio_port_data_read() is included. */
/* If the flag is defined as true in the makefile, then the test version */
/* located in the test code file is substituted instead of the version */
/* in this file. */
#ifndef ALT_GPIO_DATAREAD_TEST_MODE
#define ALT_GPIO_DATAREAD_TEST_MODE false
#endif
/******************************************************************************/
/*! \addtogroup ALT_GPIO_API The General Purpose Input/Output Manager API
*
* This module defines the General Purpose Input/Output Manager API for
* accessing, configuring, and controlling the General Purpose Input/Output
* Manager resources. These include both the general-purpose GPIO signals and
* the input-only GPI signals that are shared with the DDR interface.\n \n
* The GPIO API presents two views or perspectives of the GPIO signals. The first
* is to view the GPIO signals in a traditional way, as separate GPIO ports
* each comprised of a number of GPIO bits. The second perspective is of a
* unified flat view that presents the GPIO and GPI signals as a set of indexed
* bits, a view that allows the programmer to mostly ignore the port and pin
* hardware configuration and read/write/configure the GPIO and GPI signals
* independently of the underlying hardware implementation.
*
* @{
*/
/******************************************************************************/
/*! \addtogroup ALT_GPIO_API_CONFIG General-Purpose IO Configuration Functions
*
* This functional group contains functions to control, configure and manage
* the general-purpose IO signals as individual signals or as groups of signals.
* This group of functions can operate on multiple bits within the same GPIO
* port and accepts a bit mask to specify which bits an operation will operate on.
* Other bits within the same GPIO port are not changed.
*
* This example shows how multiple drivers or applications can use this feature
* to easily prevent conflict while accessing the same GPIO port:
* \verbatim
#define DRIVER_0_GPIO_MSK 0x0010FF03;
#define DRIVER_1_GPIO_MSK 0x002000F8;
#define DRIVER_2_GPIO_MSK 0x03C00004;
#define DRIVER_3_GPIO_MSK 0x000F0000;
alt_gpio_port_data_write(ALT_GPIO_PORTA, DRIVER_0_GPIO_MSK, init_val0);
alt_gpio_port_data_write(ALT_GPIO_PORTA, DRIVER_1_GPIO_MSK, init_val1);
alt_gpio_port_data_write(ALT_GPIO_PORTA, DRIVER_2_GPIO_MSK, init_val2);
alt_gpio_port_data_write(ALT_GPIO_PORTA, DRIVER_3_GPIO_MSK, init_val3);
alt_gpio_port_int_type_set(ALT_GPIO_PORTA, DRIVER_1_GPIO_MSK, config_val1);
\endverbatim
*
* @{
*/
/******************************************************************************/
/*!
* This type definition enumerates the data direction (input or output) of
* the GPIO signals.
*/
typedef enum ALT_GPIO_PIN_DIR_e
{
/*! # */
ALT_GPIO_PIN_INPUT,
/*! # */
ALT_GPIO_PIN_OUTPUT
} ALT_GPIO_PIN_DIR_t;
/******************************************************************************/
/*!
* This type definition enumerates the type of interrupt source
* (level-triggered or edge-triggered) of the GPIO signals.
*/
typedef enum ALT_GPIO_PIN_TYPE_e
{
/*! # */
ALT_GPIO_PIN_LEVEL_TRIG_INT,
/*! # */
ALT_GPIO_PIN_EDGE_TRIG_INT
} ALT_GPIO_PIN_TYPE_t;
/******************************************************************************/
/*!
* This type definition enumerates the polarity of the interrupt sources
* (falling-edge or rising-edge for edge-triggered interrupts, active-low or
* active-high for level-triggered interrupts) of the GPIO signals.
*/
typedef enum ALT_GPIO_PIN_POL_e
{
/*! Indicates active-low for level-triggered interrupts and
* falling-edge for edge-triggered interrupts */
ALT_GPIO_PIN_ACTIVE_LOW,
/*! Indicates active-high for level-triggered interrupts and
* rising-edge for edge-triggered interrupt */
ALT_GPIO_PIN_ACTIVE_HIGH
} ALT_GPIO_PIN_POL_t;
/******************************************************************************/
/*!
* This type definition enumerates whether or not the debounce metastability
* flip-flops are inserted or not. These are used to debounce signals presented
* to the GPIO inputs. A signal must be steady for two periods of the
* gpio_db_clk clock before it is considered valid. The frequency of the
* gpio_db_clk clock may be set using the Clock Manager API.
*/
typedef enum ALT_GPIO_PIN_DEBOUNCE_e
{
/*! # */
ALT_GPIO_PIN_NODEBOUNCE,
/*! # */
ALT_GPIO_PIN_DEBOUNCE
} ALT_GPIO_PIN_DEBOUNCE_t;
/******************************************************************************/
/*!
* This type definition enumerates whether or not level-sensitive interrupts
* are synchronized to the internal pclk_intr clock. It has no effect for GPIO
* signals that are selected as outputs, or if the interrupt is not enabled,
* or if the interrupt is set to be edge-triggered. This is a port-wide option.
*/
typedef enum ALT_GPIO_PIN_SYNC_e
{
/*! # */
ALT_GPIO_PIN_NOSYNC,
/*! # */
ALT_GPIO_PIN_SYNC
} ALT_GPIO_PIN_SYNC_t;
/******************************************************************************/
/*!
* This type definition enumerates the possible data states of the GPIO bits.
*/
typedef enum ALT_GPIO_PIN_DATA_e
{
/*! # */
ALT_GPIO_PIN_DATAZERO,
/*! # */
ALT_GPIO_PIN_DATAONE
} ALT_GPIO_PIN_DATA_t;
/******************************************************************************/
/*!
* This type definition enumerates the GPIO ports that the GPIO manager
* handles.
*/
typedef enum ALT_GPIO_PORT_e
{
/*!
* \b Port \b A - 29-bit GPIO port A.
*/
ALT_GPIO_PORTA,
/*!
* \b Port \b B - 29-bit GPIO port B.
*/
ALT_GPIO_PORTB,
/*!
* \b Port \b C - 29-bit GPIO port C. \n 13 bits are used for GPIO signals,
* 14 bits are used for GPI-only signals that are shared
* with the DDR interface, 2 bits are not used. Some signals
* may not be connected on some versions. See the relevant
* pin mux data.
*/
ALT_GPIO_PORTC,
/*!
* \b Unknown \b Port - Used to indicate an error.
*/
ALT_GPIO_PORT_UNKNOWN
} ALT_GPIO_PORT_t;
/******************************************************************************/
/*!
* This type definition enumerates the individual bits within the GPIO ports
* used by the GPIO manager. The bit-ordering must match the hardware
* bit-ordering. Since the ordering and packing of bitfields is not
* standardized in C/C++, the following are defined as masks. \n
* For example, to set bits 3 and 4 of GPIO port B outputs (assuming the bits
* had previously been set to outputs), the user could use the syntax: \par
* \b alt_gpio_port_data_write(\b ALT_GPIO_PORTB, \b ALT_GPIO_BIT3 \b | \b
* ALT_GPIO_BIT4);
*/
typedef enum ALT_GPIO_PORTBIT_e
{
/*! # */
ALT_GPIO_BIT0 = ALT_TWO_TO_POW0,
/*! # */
ALT_GPIO_BIT1 = ALT_TWO_TO_POW1,
/*! # */
ALT_GPIO_BIT2 = ALT_TWO_TO_POW2,
/*! # */
ALT_GPIO_BIT3 = ALT_TWO_TO_POW3,
/*! # */
ALT_GPIO_BIT4 = ALT_TWO_TO_POW4,
/*! # */
ALT_GPIO_BIT5 = ALT_TWO_TO_POW5,
/*! # */
ALT_GPIO_BIT6 = ALT_TWO_TO_POW6,
/*! # */
ALT_GPIO_BIT7 = ALT_TWO_TO_POW7,
/*! # */
ALT_GPIO_BIT8 = ALT_TWO_TO_POW8,
/*! # */
ALT_GPIO_BIT9 = ALT_TWO_TO_POW9,
/*! # */
ALT_GPIO_BIT10 = ALT_TWO_TO_POW10,
/*! # */
ALT_GPIO_BIT11 = ALT_TWO_TO_POW11,
/*! # */
ALT_GPIO_BIT12 = ALT_TWO_TO_POW12,
/*! # */
ALT_GPIO_BIT13 = ALT_TWO_TO_POW13,
/*! # */
ALT_GPIO_BIT14 = ALT_TWO_TO_POW14,
/*! # */
ALT_GPIO_BIT15 = ALT_TWO_TO_POW15,
/*! # */
ALT_GPIO_BIT16 = ALT_TWO_TO_POW16,
/*! # */
ALT_GPIO_BIT17 = ALT_TWO_TO_POW17,
/*! # */
ALT_GPIO_BIT18 = ALT_TWO_TO_POW18,
/*! # */
ALT_GPIO_BIT19 = ALT_TWO_TO_POW19,
/*! # */
ALT_GPIO_BIT20 = ALT_TWO_TO_POW20,
/*! # */
ALT_GPIO_BIT21 = ALT_TWO_TO_POW21,
/*! # */
ALT_GPIO_BIT22 = ALT_TWO_TO_POW22,
/*! # */
ALT_GPIO_BIT23 = ALT_TWO_TO_POW23,
/*! # */
ALT_GPIO_BIT24 = ALT_TWO_TO_POW24,
/*! # */
ALT_GPIO_BIT25 = ALT_TWO_TO_POW25,
/*! # */
ALT_GPIO_BIT26 = ALT_TWO_TO_POW26,
/*! # */
ALT_GPIO_BIT27 = ALT_TWO_TO_POW27,
/*! # */
ALT_GPIO_BIT28 = ALT_TWO_TO_POW28,
ALT_GPIO_BIT29 = ALT_TWO_TO_POW29, /* Not currently used */
ALT_GPIO_BIT30 = ALT_TWO_TO_POW30, /* Not currently used */
ALT_GPIO_BIT31 = (int32_t) (1UL<<31), /* Not currently used */
ALT_GPIO_BITNUM_MAX = (28),
ALT_GPIO_BIT_MAX = (1 << ALT_GPIO_BITNUM_MAX),
ALT_END_OF_GPIO_PORT_SIGNALS = (32)
} ALT_GPIO_PORTBIT_t;
/******************************************************************************/
/*!
* Initialize the GPIO modules before use
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
*/
ALT_STATUS_CODE alt_gpio_init(void);
/******************************************************************************/
/*!
* Uninitialize the GPIO modules & return to reset state
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
*/
ALT_STATUS_CODE alt_gpio_uninit(void);
/******************************************************************************/
/*!
* Sets the specified GPIO data bits to use the data direction(s)
* specified.
*
*
* \param gpio_pid
* The GPIO port identifier.
* \param mask
* The group of bits (where mask bits equal one) to apply this
* operation to. Other bits (where mask bits equal zero) are
* not changed. Specify mask = ALT_GPIO_BITMASK (0x1FFFFFFF) to
* configure all data direction bits of the port.
* \param config
* The data-directions of the bits to be set in this operation.
* Individual bits are: \n \b 0 - Use as an input (default). \n
* \b 1 - Use as an output.
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Bad input argument.
*/
ALT_STATUS_CODE alt_gpio_port_datadir_set(ALT_GPIO_PORT_t gpio_pid,
uint32_t mask, uint32_t config);
/******************************************************************************/
/*!
* Returns the data direction configuration of selected bits of the
* specified GPIO module.
*
* \param gpio_pid
* The GPIO port identifier.
* \param mask
* The group of bits (where mask bits equal one) to read and
* return. Other bits (where mask bits equal zero) are returned
* as zero. Specify mask = ALT_GPIO_BITMASK (0x1FFFFFFF) to
* return all data direction bits of the port.
*
* \retval uint32_t \n Individual bits are: \n \b 0 - The signal is
* configured as an input.
* \n \b 1 - The signal is configured as an output.
*
*/
uint32_t alt_gpio_port_datadir_get(ALT_GPIO_PORT_t gpio_pid,
uint32_t mask);
/******************************************************************************/
/*!
* Sets the GPIO data outputs of the specified GPIO module to a logic one or
* zero. Outputs are only set if the data direction for those bits is also
* set to configure them as outputs.
*
* \param gpio_pid
* The GPIO port identifier.
* \param mask
* The group of bits (mask bits equal one) to apply this
* operation to. Other bits (mask bits equal zero) are
* not changed.
* \param val
* The 32-bit word to write to the GPIO outputs. Only the 29 LSBs
* are used. Setting the three MSBs causes an error.
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Bad input argument.
*/
ALT_STATUS_CODE alt_gpio_port_data_write(ALT_GPIO_PORT_t gpio_pid,
uint32_t mask, uint32_t val);
/******************************************************************************/
/*!
* Returns the value of the data inputs of the specified GPIO module. This is
* the current logic value of the pin, whether set to be an input or an output.
* \n If a given signal is set to be an output, this input value can be read to
* determine if the pin is grounded, pulled high, or is floating.
*
* \param gpio_pid
* The GPIO port identifier.
* \param mask
* The group of bits (where mask bits equal one) to return. Other
* bits (where mask bits equal zero) are returned as zero. Specify
* mask = ALT_GPIO_BITMASK (0x1FFFFFFF) to return all data bits of
* the port.
*
* \retval uint32_t The current value of the GPIO module input signals.
*/
uint32_t alt_gpio_port_data_read(ALT_GPIO_PORT_t gpio_pid, uint32_t mask);
/*! @} */
/******************************************************************************/
/*! \addtogroup ALT_GPIO_INT General-Purpose IO Interrupt Functions
*
* This functional group contains functions to control and manage the
* interrupts of the General-Purpose IO modules.
*
* @{
*/
/******************************************************************************/
/*!
* Sets edge-triggered or level-triggered interrupt configuration for the
* specified signals of the specified GPIO module.
*
*
* \param gpio_pid
* The GPIO port identifier.
* \param mask
* The group of bits (where mask bits equal one) to apply this
* operation to. Other bits (where mask bits equal zero) are
* not changed. Specify mask = ALT_GPIO_BITMASK (0x1FFFFFFF) to
* configure all interrupt type bits of the port.
* \param config
* The interrupt configuration to write. Individual bits
* are: \n \b 0 - Set the
* interrupt for this bit to be level-sensitive (default). \n \b
* 1 - Set the interrupt for this bit to be edge-sensitive.
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Invalid input data.
*/
ALT_STATUS_CODE alt_gpio_port_int_type_set(ALT_GPIO_PORT_t gpio_pid,
uint32_t mask, uint32_t config);
/******************************************************************************/
/*!
* Returns the interrupt configuration (edge-triggered or level-triggered) for
* the specified bits of the specified GPIO module.
*
* \param gpio_pid
* The GPIO port identifier.
* \param mask
* The group of bits (where mask bits equal one) to return. Other
* bits (where mask bits equal zero) are returned as zero. Specify
* mask = ALT_GPIO_BITMASK (0x1FFFFFFF) to return all configuration
* bits of the port.
* \retval uint32_t
* The current interrupt source configuration. Individual bits
* are: \n \b 0 - The interrupt for this bit is set to be
* level-sensitive. \n \b 1 -
* The interrupt for this bit is set to be edge-sensitive.
*
*/
uint32_t alt_gpio_port_int_type_get(ALT_GPIO_PORT_t gpio_pid,
uint32_t mask);
/******************************************************************************/
/*!
* Sets the interrupt polarity of the signals of the specified GPIO register
* (when used as inputs) to active-high or active-low (for level-sensitive
* interrupts) or to rising-edge or falling-edge (for edge-sensitive interrupts).
*
* \param gpio_pid
* The GPIO port identifier.
* \param mask
* The group of bits (where mask bits equal one) to apply this
* operation to. Other bits (where mask bits equal zero) are
* not changed.
* \param config
* The interrupt polarity configuration to set. Individual bits
* are: \n \b 0 - Set the interrupt polarity for this bit to
* active-low or falling-edge mode (default). \n \b 1 - Set the
* interrupt polarity for this bit to active-high or rising-edge mode.
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Invalid input data.
*/
ALT_STATUS_CODE alt_gpio_port_int_pol_set(ALT_GPIO_PORT_t gpio_pid,
uint32_t mask, uint32_t config);
/******************************************************************************/
/*!
* Returns the active-high or active-low polarity configuration for the
* possible interrupt sources of the specified GPIO module.
*
*
* \param gpio_pid
* The GPIO port identifier.
* \param mask
* The group of bits (where mask bits equal one) to return. Other
* bits (where mask bits equal zero) are returned as zero. Specify
* mask = ALT_GPIO_BITMASK (0x1FFFFFFF) to return all the
* configuration bits of the port.
*
* \retval uint32_t
* The current polarity configuration. Individual bits are: \n
* \b 0 = The interrupt polarity for this bit is set to
* active-low or falling-edge mode. \n \b 1 = The interrupt
* polarity for this bit is set to active-high or rising-edge mode.
*
*/
uint32_t alt_gpio_port_int_pol_get(ALT_GPIO_PORT_t gpio_pid,
uint32_t mask);
/*! @} */
/******************************************************************************/
/*! \addtogroup ALT_GPIO_API_CONFIG General-Purpose IO Configuration Functions
*
* @{
*/
/******************************************************************************/
/*!
* Sets the debounce configuration for input signals of the specified GPIO
* module. If debounce is selected, metastability flip-flops are inserted to
* debounce signals presented to the GPIO inputs. A signal must be steady for
* two periods of the gpio_db_clk clock before it is considered valid. The
* frequency of the gpio_db_clk clock may be set using the Clock Manager API.
*
* \param gpio_pid
* The GPIO port identifier.
* \param mask
* The group of bits (where mask bits equal one) to apply this
* operation to. Other bits (where mask bits equal zero) are
* not changed. Specify mask = ALT_GPIO_BITMASK (0x1FFFFFFF) to
* configure the debounce setting for all bits of the port.
* \param config
* The debounce configuration to set. Individual bits are: \n
* \b 0 - Debounce is not selected for this signal (default). \n
* \b 1 - Debounce is selected for this signal.
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Invalid input data.
*/
ALT_STATUS_CODE alt_gpio_port_debounce_set(ALT_GPIO_PORT_t gpio_pid,
uint32_t mask, uint32_t config);
/******************************************************************************/
/*!
* Returns the debounce configuration for the input signals of the specified
* GPIO register. If debounce is selected, metastability flip-flops are
* inserted to debounce signals presented to the GPIO inputs.
*
* \param gpio_pid
* The GPIO port identifier.
* \param mask
* The group of bits (where mask bits equal one) to return. Other
* bits (where mask bits equal zero) are returned as zero. Specify
* mask = ALT_GPIO_BITMASK (0x1FFFFFFF) to return all debounce
* configuration bits of the port.
*
* \retval uint32_t
* The current debounce configuration.Individual bits are: \n
* \b 0 - Debounce is not selected for this signal. \n \b 1 -
* Debounce is selected for this signal.
*
*/
uint32_t alt_gpio_port_debounce_get(ALT_GPIO_PORT_t gpio_pid,
uint32_t mask);
/******************************************************************************/
/*!
* Sets the synchronization configuration for the signals of the specified
* GPIO register. This allows for synchronizing level-sensitive interrupts to
* an internal clock signal. This is a port-wide option that controls all
* level-sensitive interrupt signals of that GPIO port.
*
* \param gpio_pid
* The GPIO port identifier.
* \param config
* \n \b Any \b non-zero \b value - Synchronize to internal clock signal.
* \n \b Zero - Do not synchronize to internal clock signal.
*
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Invalid input data.
*/
ALT_STATUS_CODE alt_gpio_port_sync_set(ALT_GPIO_PORT_t gpio_pid,
uint32_t config);
/******************************************************************************/
/*!
*
* Returns the synchronization configuration for the signals of the
* specified GPIO register. This allows for synchronizing level-sensitive
* interrupts to the internal clock signal. This is a port-wide option that
* controls all level-sensitive interrupt signals of that GPIO port.
*
* \param gpio_pid
* The GPIO port identifier.
* \retval ALT_E_TRUE Synchronization to clock is enabled for
* level-sensitive interrupts.
* \retval ALT_E_FALSE Synchronization to clock is disabled for
* level-sensitive interrupts.
* \retval ALT_E_BAD_ARG Invalid input argument.
*/
ALT_STATUS_CODE alt_gpio_port_sync_get(ALT_GPIO_PORT_t gpio_pid);
/******************************************************************************/
/*!
* Configures a group of GPIO signals with identical setup parameters. Allows
* for configuring all parameters of a given port at one time.
*
* \param gpio_pid
* The GPIO port identifier.
* \param mask
* The group of bits to apply this operation to. Other bits (mask
* set to zero) are not changed.
* \param dir
* Data direction.
* \param type
* Edge-triggered or level-triggered interrupts.
* \param pol
* Active-high or active-low polarity.
* \param debounc
* Debounce signals or not.
* \param data
* Set the data output to this value.
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Invalid input argument.
*/
ALT_STATUS_CODE alt_gpio_port_config(ALT_GPIO_PORT_t gpio_pid,
uint32_t mask, ALT_GPIO_PIN_DIR_t dir, ALT_GPIO_PIN_TYPE_t type,
ALT_GPIO_PIN_POL_t pol, ALT_GPIO_PIN_DEBOUNCE_t debounc,
uint32_t data);
/*! @} */
/******************************************************************************/
/*! \addtogroup ALT_GPIO_INT General-Purpose IO Interrupt Functions
*
* @{
*/
/******************************************************************************/
/*!
* Enables the specified GPIO data input interrupts.
*
*
* \param gpio_pid
* The GPIO port identifier.
* \param config
* Individual bit interrupt enables \n
* \b 0 - Interrupt disabled. \n
* \b 1 - Interrupt enabled.
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Bad input argument.
*/
ALT_STATUS_CODE alt_gpio_port_int_enable(ALT_GPIO_PORT_t gpio_pid, uint32_t config);
/******************************************************************************/
/*!
* Disables the specified GPIO data module interrupt.
*
*
* \param gpio_pid
* The GPIO port identifier.
* \param config
* Individual bit interrupt enables \n
* \b 0 - Interrupt disabled. \n
* \b 1 - Interrupt enabled.
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Bad input argument.
*/
ALT_STATUS_CODE alt_gpio_port_int_disable(ALT_GPIO_PORT_t gpio_pid, uint32_t config);
/******************************************************************************/
/*!
* Returns the current state of the specified GPIO port interrupts enables.
*
* \param gpio_pid
* The GPIO port identifier.
*
* \retval uint32_t
* The interrupt enable configuration that was read. Individual bits
* are: \n \b 0 = The interrupt for this bit is not enabled. \n \b
* 1 = The interrupt for this bit is enabled.
*/
uint32_t alt_gpio_port_int_enable_get(ALT_GPIO_PORT_t gpio_pid);
/******************************************************************************/
/*!
* Masks or unmasks selected interrupt source bits of the data register of
* the specified GPIO module. Uses a second bit mask to determine which
* signals may be changed by this call.
*
*
* \param gpio_pid
* The GPIO port identifier.
* \param mask
* Which bits to change among the port \n \b 0 =
* Do not change this bit. \n \b 1 = Allow this bit to change.
* \param val
* The interrupt mask to write. Individual bits are: \n \b 0 =
* Do not mask the interrupt for this bit (default). \n \b 1 =
* Mask the interrupt for this bit.
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Invalid input data.
*/
ALT_STATUS_CODE alt_gpio_port_int_mask_set(ALT_GPIO_PORT_t gpio_pid,
uint32_t mask, uint32_t val);
/******************************************************************************/
/*!
* Returns the interrupt mask of the specified GPIO module.
*
*
* \param gpio_pid
* The GPIO port identifier.
*
* \retval uint32_t
* The interrupt mask that was read. Individual bits are: \n
* \b 0 = The interrupt for this bit is not masked. \n \b 1 = The
* interrupt for this bit is masked.
*
*/
uint32_t alt_gpio_port_int_mask_get(ALT_GPIO_PORT_t gpio_pid);
/******************************************************************************/
/*!
* Returns the interrupt pending status of all signals of the specified GPIO
* register.
*
*
* \param gpio_pid
* The GPIO port identifier.
* \retval uint32_t
* The current interrupt pending status. Individual bits are: \n
* \b 0 - The interrupt for this bit is not pending. \n \b 1 -
* The interrupt for this bit is pending.
*
*/
uint32_t alt_gpio_port_int_status_get(ALT_GPIO_PORT_t gpio_pid);
/******************************************************************************/
/*!
* Clear the interrupt pending status of selected signals of the
* specified GPIO register.
*
*
* \param gpio_pid
* The GPIO port identifier.
* \param clrmask
* The interrupt bits to clear. Individual bits are: \n \b 0 -
* The interrupt for this bit will not be changed. \n \b 1 -
* The interrupt for this bit will be cleared.
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Invalid input data.
*/
ALT_STATUS_CODE alt_gpio_port_int_status_clear(ALT_GPIO_PORT_t gpio_pid,
uint32_t clrmask);
/*! @} */
/******************************************************************************/
/*! \addtogroup ALT_GPIO_BITVIEW General-Purpose IO via Bit Index
*
* This functional group presents a perspective of the General-Purpose IO
* signals as individual GPIO and GPI bits spread across a number of signals
* across several GPIO ports. This allows the programmer the freedom to generally
* ignore the underlying port and signal structure of the GPIO hardware if
* desired.
*
* @{
*/
/******************************************************************************/
/*!
* This type definition enumerates the individual bits as one flat array spread
* across the multiple GPIO ports handled by the GPIO manager. The bit-ordering
* must match the hardware bit-ordering.
*
*/
typedef enum ALT_GPIO_1BIT_e
{
/*! # */
ALT_GPIO_1BIT_0,
/*! # */
ALT_GPIO_1BIT_1,
/*! # */
ALT_GPIO_1BIT_2,
/*! # */
ALT_GPIO_1BIT_3,
/*! # */
ALT_GPIO_1BIT_4,
/*! # */
ALT_GPIO_1BIT_5,
/*! # */
ALT_GPIO_1BIT_6,
/*! # */
ALT_GPIO_1BIT_7,
/*! # */
ALT_GPIO_1BIT_8,
/*! # */
ALT_GPIO_1BIT_9,
/*! # */
ALT_GPIO_1BIT_10,
/*! # */
ALT_GPIO_1BIT_11,
/*! # */
ALT_GPIO_1BIT_12,
/*! # */
ALT_GPIO_1BIT_13,
/*! # */
ALT_GPIO_1BIT_14,
/*! # */
ALT_GPIO_1BIT_15,
/*! # */
ALT_GPIO_1BIT_16,
/*! # */
ALT_GPIO_1BIT_17,
/*! # */
ALT_GPIO_1BIT_18,
/*! # */
ALT_GPIO_1BIT_19,
/*! # */
ALT_GPIO_1BIT_20,
/*! # */
ALT_GPIO_1BIT_21,
/*! # */
ALT_GPIO_1BIT_22,
/*! # */
ALT_GPIO_1BIT_23,
/*! # */
ALT_GPIO_1BIT_24,
/*! # */
ALT_GPIO_1BIT_25,
/*! # */
ALT_GPIO_1BIT_26,
/*! # */
ALT_GPIO_1BIT_27,
/*! # */
ALT_GPIO_1BIT_28,
/*! # */
ALT_GPIO_1BIT_29,
/*! # */
ALT_GPIO_1BIT_30,
/*! # */
ALT_GPIO_1BIT_31,
/*! # */
ALT_GPIO_1BIT_32,
/*! # */
ALT_GPIO_1BIT_33,
/*! # */
ALT_GPIO_1BIT_34,
/*! # */
ALT_GPIO_1BIT_35,
/*! # */
ALT_GPIO_1BIT_36,
/*! # */
ALT_GPIO_1BIT_37,
/*! # */
ALT_GPIO_1BIT_38,
/*! # */
ALT_GPIO_1BIT_39,
/*! # */
ALT_GPIO_1BIT_40,
/*! # */
ALT_GPIO_1BIT_41,
/*! # */
ALT_GPIO_1BIT_42,
/*! # */
ALT_GPIO_1BIT_43,
/*! # */
ALT_GPIO_1BIT_44,
/*! # */
ALT_GPIO_1BIT_45,
/*! # */
ALT_GPIO_1BIT_46,
/*! # */
ALT_GPIO_1BIT_47,
/*! # */
ALT_GPIO_1BIT_48,
/*! # */
ALT_GPIO_1BIT_49,
/*! # */
ALT_GPIO_1BIT_50,
/*! # */
ALT_GPIO_1BIT_51,
/*! # */
ALT_GPIO_1BIT_52,
/*! # */
ALT_GPIO_1BIT_53,
/*! # */
ALT_GPIO_1BIT_54,
/*! # */
ALT_GPIO_1BIT_55,
/*! # */
ALT_GPIO_1BIT_56,
/*! # */
ALT_GPIO_1BIT_57,
/*! # */
ALT_GPIO_1BIT_58,
/*! # */
ALT_GPIO_1BIT_59,
/*! # */
ALT_GPIO_1BIT_60,
/*! # */
ALT_GPIO_1BIT_61,
/*! # */
ALT_GPIO_1BIT_62,
/*! # */
ALT_GPIO_1BIT_63,
/*! # */
ALT_GPIO_1BIT_64,
/*! # */
ALT_GPIO_1BIT_65,
/*! # */
ALT_GPIO_1BIT_66,
/*! # */
ALT_GPIO_1BIT_67, /* Not bonded out on some versions */
/*! # */
ALT_GPIO_1BIT_68, /* Not bonded out on some versions */
/*! # */
ALT_GPIO_1BIT_69, /* Not bonded out on some versions */
/*! The last of the input/output bits */
ALT_GPIO_1BIT_70, /* Not bonded out on some versions */
/*! This and the following signals are not present on all SoCs. \n
* If present, the selection between their use as 14 General-purpose inputs or
* use as 14 DDR interface signals is made in the IOCSR (IO Configuration Shift
* Register) and software to make this selection is in the IO Manager API. If
* they are present, they are restricted to using the same power supply voltage
* as the SDRAM module.*/
ALT_HLGPI_0, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_1, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_2, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_3, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_4, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_5, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_6, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_7, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_8, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_9, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_10, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_11, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_12, /* Not bonded out on some versions */
/*! # */
ALT_HLGPI_13, /* Not bonded out on some versions */
ALT_HLGPI_14, /* Not bonded out */
ALT_HLGPI_15, /* Not bonded out */
ALT_GPIO_INVALID,
ALT_END_OF_GPIO_SIGNALS = -1,
ALT_LAST_VALID_GPIO_BIT = ALT_HLGPI_15
} ALT_GPIO_1BIT_t;
/******************************************************************************/
/*!
* This configuration record definition is used for configuring bits and
* groups of bits of the GPIO interface.
*/
typedef struct ALT_GPIO_CONFIG_RECORD_s
{
/*!
* The index number of the signal to configure. */
ALT_GPIO_1BIT_t signal_number;
/*!
* The data direction of the signal. */
ALT_GPIO_PIN_DIR_t direction;
/*!
* Edge-triggered or level triggered interrupts. */
ALT_GPIO_PIN_TYPE_t type;
/*!
* Active-high or active-low trigger for the interrupt. */
ALT_GPIO_PIN_POL_t polarity;
/*!
* Enable or disable GPIO debounce capability. */
ALT_GPIO_PIN_DEBOUNCE_t debounce;
/*!
* If the signal is an output, the data value to be output. */
ALT_GPIO_PIN_DATA_t data;
} ALT_GPIO_CONFIG_RECORD_t;
/******************************************************************************/
/*!
* This pin record type definition is comprised of the signal index and
* associated input or output data.
*/
typedef struct ALT_GPIO_PIN_RECORD_s
{
/*!
* The index number of the signal. */
ALT_GPIO_1BIT_t signal_number;
/*!
* Data - zero or one. */
ALT_GPIO_PIN_DATA_t val;
} ALT_GPIO_PIN_RECORD_t;
/*! @} */
/******************************************************************************/
/*! \addtogroup ALT_GPIO_BITVIEW General-Purpose IO via Bit Index
*
* @{
*/
/******************************************************************************/
/*!
* Configures all parameters for one bit (signal) of the GPIO ports.
*
* \param signal_num
* The GPIO port signal index.
* \param dir
* The data direction for this signal.
* \param type
* Edge-triggered or Level-triggered interrupt for this signal.
* \param pol
* Active-high or active-low interrupt polarity for this signal.
* \param debounce
* Enable the debounce flip-flops for this signal or not.
* \param data
* If the GPIO signal is set to be an output, set it to
* this value
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Invalid input argument.
*/
ALT_STATUS_CODE alt_gpio_bit_config(ALT_GPIO_1BIT_t signal_num,
ALT_GPIO_PIN_DIR_t dir, ALT_GPIO_PIN_TYPE_t type,
ALT_GPIO_PIN_POL_t pol, ALT_GPIO_PIN_DEBOUNCE_t debounce,
ALT_GPIO_PIN_DATA_t data);
/******************************************************************************/
/*!
* Returns the configuration parameters of a given GPIO bit.
*
* \param signal_num
* The GPIO port signal index.
* \param config
* Pointer to a single GPIO_CONFIG_RECORD_s configuration record.
* The fields of this configuration record are filled in
* by the function.
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Invalid input argument.
*/
ALT_STATUS_CODE alt_gpio_bitconfig_get(ALT_GPIO_1BIT_t signal_num,
ALT_GPIO_CONFIG_RECORD_t *config);
/******************************************************************************/
/*!
* Configures a list of GPIO bits. The GPIO bits do not have to be
* configured the same, as was the case for the mask version of this function,
* alt_gpio_port_config(). Each bit may be configured differently and bits may
* be listed in any order.
*
* \param config_array
* Pointer to an array of GPIO_CONFIG_RECORD_s configuration
* records. These definitions contain all the parameters
* needed to set up the listed pins. All or
* any subset of the GPIO signals can be configured. Signals do
* not have to be listed in numerical order or be unique. If a
* signal number is listed multiple times, the last configuration
* listed is used. \n Configuration terminates either when \b len
* signals have been configured or if the next signal number index
* in the array is equal to \b ALT_END_OF_GPIO_SIGNALS (-1).
*
* \param len
* Length of array to configure.
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Invalid input argument.
*/
ALT_STATUS_CODE alt_gpio_group_config(ALT_GPIO_CONFIG_RECORD_t* config_array,
uint32_t len);
/******************************************************************************/
/*!
* Returns a list of the pin signal indices and the associated configuration
* settings (data direction, interrupt type, polarity, and debounce) of that
* list of signals.
*
* \param config_array
* Pointer to an array of ALT_GPIO_CONFIG_RECORD_t configuration
* records. Only the signal indices in the first field of each
* configuration record need be filled in. This function will
* fill in all the other fields of the configuration record,
* returning all configuration parameters in the array.
* Signals do not have to be listed in numerical order or be
* unique. If a signal number is listed multiple times, the
* configuration record will contain multiple entries for
* that signal. \n Configuration reading terminates either when
* \b len signal configurations have been read or if the next
* signal number index in the array is equal to
* \b ALT_END_OF_GPIO_SIGNALS (-1).
* \param len
* Length of configuration array to read and return.
*
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Invalid input argument.
*/
ALT_STATUS_CODE alt_gpio_group_config_get(ALT_GPIO_CONFIG_RECORD_t *config_array,
uint32_t len);
/******************************************************************************/
/*!
* Returns a list of the pin signal indices and the associated configuration
* settings (data direction, interrupt type, polarity, and debounce) of that
* list of signals. The difference between this version and
* alt_gpio_group_config_get() is this version follows a separate list of
* signal indices instead of having the signal list provided in the first
* field of the configuration records in the array.
*
* \param pinid_array
* Pointer to a list of signal index numbers. These indices
* are copied to the first field of each configuration record
* in the returned array.
* \param config_array
* Pointer to an array of ALT_GPIO_CONFIG_RECORD_t configuration
* records. This function will fill in the fields of the
* configuration record, returning all configuration parameters
* in the array. Signals do not have to be listed in numerical
* order or be unique. If a signal number is listed multiple
* times, the configuration record array will contain multiple
* identical entries for that signal. \n Configuration reading
* terminates either when \b len signal configurations have been
* read or if the next signal number index in the array is equal
* to \b ALT_END_OF_GPIO_SIGNALS (-1).
* \param len
* Length of configuration array to read.
*
*
* \retval ALT_E_SUCCESS The operation was successful.
* \retval ALT_E_ERROR The operation failed.
* \retval ALT_E_BAD_ARG Invalid input argument.
*
*/
ALT_STATUS_CODE alt_gpio_group_config_get2(ALT_GPIO_1BIT_t* pinid_array,
ALT_GPIO_CONFIG_RECORD_t *config_array, uint32_t len);
/*! @} */
/******************************************************************************/
/*! \addtogroup ALT_GPIO_UTILITY General-Purpose IO Utility Functions
*
* These are useful utility functions for the general-purpose input & output
* module.
*
* @{ */
/******************************************************************************/
/*!
* Returns the ID code of the specified GPIO module.
*
* \param gpio_pid
* The GPIO port identifier.
*
*
* \retval uint32_t The component code of the module, GPIO_MODULE_IDCODE.
*/
uint32_t alt_gpio_port_idcode_get(ALT_GPIO_PORT_t gpio_pid);
/******************************************************************************/
/*!
* Returns the version code of the specified GPIO module.
*
* \param gpio_pid
* The GPIO port identifier.
*
*
* \retval uint32_t The encoded revision number of the module.
*/
uint32_t alt_gpio_port_ver_get(ALT_GPIO_PORT_t gpio_pid);
/******************************************************************************/
/*!
* Extracts the GPIO port ID from the supplied GPIO Signal Index Number.
*/
ALT_GPIO_PORT_t alt_gpio_bit_to_pid(ALT_GPIO_1BIT_t pin_num);
/******************************************************************************/
/*!
* Extracts the GPIO signal (pin) offset from the supplied GPIO Signal Index
* Number.
* */
ALT_GPIO_PORTBIT_t alt_gpio_bit_to_port_pin(ALT_GPIO_1BIT_t pin_num);
/******************************************************************************/
/*!
* Extracts the GPIO Signal Index Number from the supplied GPIO port ID and
* signal mask. If passed a bitmask composed of more than one signal, the
* signal number of the lowest bit in the bitmask presented is returned.
*
*/
ALT_GPIO_1BIT_t alt_gpio_port_pin_to_bit(ALT_GPIO_PORT_t pid,
uint32_t bitmask);
/*! @} */
/*! @} */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __ALT_GPIO_H__ */