mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

targets/TARGET_Analog_Devices/TARGET_ADUCM302X/TARGET_ADUCM3029/api/gpio_api.c

Committer:
AnnaBridge
Date:
2019-02-20
Revision:
189:f392fc9709a3
Parent:
180:96ed750bd169

File content as of revision 189:f392fc9709a3:

/*******************************************************************************
 * Copyright (c) 2010-2017 Analog Devices, Inc.
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *   - Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *   - 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.
 *   - Modified versions of the software must be conspicuously marked as such.
 *   - This software is licensed solely and exclusively for use with processors
 *     manufactured by or for Analog Devices, Inc.
 *   - This software may not be combined or merged with other code in any manner
 *     that would cause the software to become subject to terms and conditions
 *     which differ from those listed here.
 *   - Neither the name of Analog Devices, Inc. nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *   - The use of this software may or may not infringe the patent rights of one
 *     or more patent holders.  This license does not release you from the
 *     requirement that you obtain separate licenses from these patent holders
 *     to use this software.
 *
 * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-
 * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF
 * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; 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.
 ******************************************************************************/

#include "mbed_assert.h"
#include "gpio_api.h"
#include "pinmap.h"
#include "adi_gpio.h"


#define MUX_FUNC_0 0x0
#define NUM_GPIO_PORTS 4
/*******************************************************************************
   ADI_GPIO_DEV_DATA Instance memory containing memory pointer should
   guarantee 4 byte alignmnet.
 *******************************************************************************/
extern uint32_t gpioMemory[(ADI_GPIO_MEMORY_SIZE + 3)/4];
extern uint8_t  gpio_initialized;

static uint16_t gpio_oen[NUM_GPIO_PORTS] = {0};
static uint16_t gpio_output_val[NUM_GPIO_PORTS] = {0};


/******************************************************************************
   Function definitions
 *****************************************************************************/
uint32_t gpio_set(PinName pin)
{
    MBED_ASSERT(pin != (PinName)NC);
    uint32_t pin_num = pin & 0xFF;

    pin_function(pin, MUX_FUNC_0);

    return (1 << pin_num);
}

void gpio_init(gpio_t *obj, PinName pin)
{
    obj->pin = pin;

    if (pin == (PinName)NC) {
        return;
    }

    // Initialize the GPIO driver. This function
    // initializes the GPIO driver only once globally.
    if (!gpio_initialized) {
        adi_gpio_Init(gpioMemory, ADI_GPIO_MEMORY_SIZE);
    }

    pin_function(pin, MUX_FUNC_0);
}

void gpio_mode(gpio_t *obj, PinMode mode)
{
    uint32_t pin = obj->pin;

    pin_mode((PinName)pin, mode);
}

void gpio_dir(gpio_t *obj, PinDirection direction)
{
    MBED_ASSERT(obj->pin != (PinName)NC);
    uint32_t port = obj->pin >> GPIO_PORT_SHIFT;
    uint32_t pin_num = obj->pin & 0xFF;

    if (direction ==  PIN_OUTPUT) {
        adi_gpio_OutputEnable(port, 1 << pin_num, true);
        // save the input/output configuration
        gpio_oen[port] |= (1 << pin_num);
    } else {
        adi_gpio_InputEnable(port, 1 << pin_num, true);
        // save the input/output configuration
        gpio_oen[port] &= (~(1 << pin_num));
    }
}

void gpio_write(gpio_t *obj, int value)
{
    MBED_ASSERT(obj->pin != (PinName)NC);
    uint32_t port = obj->pin >> GPIO_PORT_SHIFT;
    uint32_t pin_num = obj->pin & 0xFF;

    if (value & 1) {
        adi_gpio_SetHigh(port, (1 << pin_num));

        // save the output port value
        gpio_output_val[port] |= ((value & 1) << pin_num);
    } else {
        adi_gpio_SetLow(port, (1 << pin_num));

        // save the output port value
        gpio_output_val[port] &= (~(1 << pin_num));
    }
}


int gpio_read(gpio_t *obj)
{
    MBED_ASSERT(obj->pin != (PinName)NC);
    uint32_t port = obj->pin >> GPIO_PORT_SHIFT;
    uint32_t pin_num = obj->pin & 0xFF;
    uint16_t Data;

    // check whether the pin is configured as input or output
    if ((gpio_oen[port] >> pin_num) & 1) {
        Data = gpio_output_val[port] & (1 << pin_num);
    } else {
        // otherwise call GetData
        adi_gpio_GetData(port, (1 << pin_num), &Data);
    }

    return ((((uint32_t)Data) >> pin_num) & 1);
}