mirror of https://github.com/ARMmbed/mbed-os.git
163 lines
4.4 KiB
C
163 lines
4.4 KiB
C
/**
|
|
******************************************************************************
|
|
* @file port_api.c
|
|
* @brief Implementation of a port API
|
|
* @internal
|
|
* @author ON Semiconductor
|
|
* $Rev:
|
|
* $Date:
|
|
******************************************************************************
|
|
* Copyright 2016 Semiconductor Components Industries LLC (d/b/a “ON Semiconductor”).
|
|
* All rights reserved. This software and/or documentation is licensed by ON Semiconductor
|
|
* under limited terms and conditions. The terms and conditions pertaining to the software
|
|
* and/or documentation are available at http://www.onsemi.com/site/pdf/ONSEMI_T&C.pdf
|
|
* (“ON Semiconductor Standard Terms and Conditions of Sale, Section 8 Software”) and
|
|
* if applicable the software license agreement. Do not use this software and/or
|
|
* documentation unless you have carefully read and you agree to the limited terms and
|
|
* conditions. By using this software and/or documentation, you agree to the limited
|
|
* terms and conditions.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
|
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
|
* ON SEMICONDUCTOR SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL,
|
|
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
|
*/
|
|
#include "gpio.h"
|
|
#include "gpio_api.h"
|
|
#include "port_api.h"
|
|
#include "pinmap.h"
|
|
|
|
#if DEVICE_PORTIN || DEVICE_PORTOUT
|
|
|
|
/** Get the pin name from the port's pin number
|
|
*
|
|
* @param port The port name
|
|
* @param pin_n The pin number within the specified port
|
|
* @return The pin name for the port's pin number
|
|
*/
|
|
PinName port_pin(PortName port, int pin_n)
|
|
{
|
|
return((PinName)(pin_n));
|
|
}
|
|
|
|
/** Initilize the port
|
|
*
|
|
* @param obj The port object to initialize
|
|
* @param port The port name
|
|
* @param mask The bitmask to identify which bits in the port should be included (0 - ignore)
|
|
* @param dir The port direction
|
|
*/
|
|
void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
|
|
{
|
|
uint8_t i;
|
|
PinName pin;
|
|
|
|
/* Store the port mask in obj */
|
|
obj->mask = mask;
|
|
|
|
/* Store the port name in obj */
|
|
obj->port = port;
|
|
|
|
/* Store GPIO base address */
|
|
obj->GPIOMEMBASE = GPIOREG;
|
|
|
|
for (i=0; i<NUMBER_OF_GPIO; i++) {
|
|
/* check for valid pin */
|
|
if (obj->mask & (1<<i)) {
|
|
|
|
/* Gpio numbers start from DIO#0 to #17, so can pass in "i" */
|
|
pin = port_pin(obj->port, i);
|
|
|
|
/* Set the pin as GPIO */
|
|
gpio_set(pin);
|
|
}
|
|
}
|
|
|
|
/* Call function to set pin direction */
|
|
port_dir(obj, dir);
|
|
}
|
|
|
|
/** Set the input port mode
|
|
*
|
|
* @param obj The port object
|
|
* @param mode THe port mode to be set
|
|
*/
|
|
void port_mode(port_t *obj, PinMode mode)
|
|
{
|
|
uint8_t i = 0;
|
|
PinName pin;
|
|
|
|
/* For each pin in the mask, set the mode to that defined in "mode" parameter */
|
|
for (i=0; i < NUMBER_OF_GPIO; i++) {
|
|
/* check for valid pin */
|
|
if (obj->mask & (1<<i)) {
|
|
|
|
/* get the pin name */
|
|
pin = port_pin(obj->port, i);
|
|
|
|
/* Set the mode for the pin */
|
|
pin_mode(pin, mode);
|
|
}
|
|
}
|
|
}
|
|
|
|
/** Set port direction (in/out)
|
|
*
|
|
* @param obj The port object
|
|
* @param dir The port direction to be set
|
|
*/
|
|
void port_dir(port_t *obj, PinDirection dir)
|
|
{
|
|
/* Enable the GPIO clock */
|
|
CLOCK_ENABLE(CLOCK_GPIO);
|
|
|
|
if (dir == PIN_INPUT) {
|
|
obj->GPIOMEMBASE->W_IN = obj->mask;
|
|
} else if (dir == PIN_OUTPUT) {
|
|
obj->GPIOMEMBASE->W_OUT = obj->mask;
|
|
}
|
|
|
|
/* Disable the GPIO clock */
|
|
CLOCK_DISABLE(CLOCK_GPIO);
|
|
}
|
|
|
|
/** Write value to the port
|
|
*
|
|
* @param obj The port object
|
|
* @param value The value to be set
|
|
*/
|
|
void port_write(port_t *obj, int value)
|
|
{
|
|
/* Enable the GPIO clock */
|
|
CLOCK_ENABLE(CLOCK_GPIO);
|
|
|
|
obj->GPIOMEMBASE->R_STATE_W_SET = value;//(obj->mask & value);
|
|
obj->GPIOMEMBASE->R_IRQ_W_CLEAR = ~value;//(obj->mask ^ value);
|
|
|
|
/* Disable the GPIO clock */
|
|
CLOCK_DISABLE(CLOCK_GPIO);
|
|
}
|
|
|
|
/** Read the current value on the port
|
|
*
|
|
* @param obj The port object
|
|
* @return An integer with each bit corresponding to an associated port pin setting
|
|
*/
|
|
int port_read(port_t *obj)
|
|
{
|
|
int gpio_level = 0;
|
|
|
|
/* Enable the GPIO clock */
|
|
CLOCK_ENABLE(CLOCK_GPIO);
|
|
|
|
gpio_level = obj->GPIOMEMBASE->R_STATE_W_SET;
|
|
|
|
/* Disable the GPIO clock */
|
|
CLOCK_DISABLE(CLOCK_GPIO);
|
|
|
|
return(gpio_level);
|
|
}
|
|
|
|
#endif
|