mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
Child:
147:30b64687e01f
This updates the lib to the mbed lib v125

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /**
<> 144:ef7eb2e8f9f7 2 ******************************************************************************
<> 144:ef7eb2e8f9f7 3 * @file port_api.c
<> 144:ef7eb2e8f9f7 4 * @brief Implementation of a port API
<> 144:ef7eb2e8f9f7 5 * @internal
<> 144:ef7eb2e8f9f7 6 * @author ON Semiconductor
<> 144:ef7eb2e8f9f7 7 * $Rev:
<> 144:ef7eb2e8f9f7 8 * $Date:
<> 144:ef7eb2e8f9f7 9 ******************************************************************************
<> 144:ef7eb2e8f9f7 10 * @copyright (c) 2012 ON Semiconductor. All rights reserved.
<> 144:ef7eb2e8f9f7 11 * ON Semiconductor is supplying this software for use with ON Semiconductor
<> 144:ef7eb2e8f9f7 12 * processor based microcontrollers only.
<> 144:ef7eb2e8f9f7 13 *
<> 144:ef7eb2e8f9f7 14 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
<> 144:ef7eb2e8f9f7 15 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
<> 144:ef7eb2e8f9f7 16 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
<> 144:ef7eb2e8f9f7 17 * ON SEMICONDUCTOR SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL,
<> 144:ef7eb2e8f9f7 18 * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
<> 144:ef7eb2e8f9f7 19 */
<> 144:ef7eb2e8f9f7 20 #include "gpio.h"
<> 144:ef7eb2e8f9f7 21 #include "port_api.h"
<> 144:ef7eb2e8f9f7 22
<> 144:ef7eb2e8f9f7 23 #if DEVICE_PORTIN || DEVICE_PORTOUT
<> 144:ef7eb2e8f9f7 24
<> 144:ef7eb2e8f9f7 25 /** Get the pin name from the port's pin number
<> 144:ef7eb2e8f9f7 26 *
<> 144:ef7eb2e8f9f7 27 * @param port The port name
<> 144:ef7eb2e8f9f7 28 * @param pin_n The pin number within the specified port
<> 144:ef7eb2e8f9f7 29 * @return The pin name for the port's pin number
<> 144:ef7eb2e8f9f7 30 */
<> 144:ef7eb2e8f9f7 31 PinName port_pin(PortName port, int pin_n)
<> 144:ef7eb2e8f9f7 32 {
<> 144:ef7eb2e8f9f7 33 return((PinName)(pin_n));
<> 144:ef7eb2e8f9f7 34 }
<> 144:ef7eb2e8f9f7 35
<> 144:ef7eb2e8f9f7 36 /** Initilize the port
<> 144:ef7eb2e8f9f7 37 *
<> 144:ef7eb2e8f9f7 38 * @param obj The port object to initialize
<> 144:ef7eb2e8f9f7 39 * @param port The port name
<> 144:ef7eb2e8f9f7 40 * @param mask The bitmask to identify which bits in the port should be included (0 - ignore)
<> 144:ef7eb2e8f9f7 41 * @param dir The port direction
<> 144:ef7eb2e8f9f7 42 */
<> 144:ef7eb2e8f9f7 43 void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
<> 144:ef7eb2e8f9f7 44 {
<> 144:ef7eb2e8f9f7 45 uint8_t i;
<> 144:ef7eb2e8f9f7 46 PinName pin;
<> 144:ef7eb2e8f9f7 47
<> 144:ef7eb2e8f9f7 48 /* Store the port mask in obj */
<> 144:ef7eb2e8f9f7 49 obj->mask = mask;
<> 144:ef7eb2e8f9f7 50
<> 144:ef7eb2e8f9f7 51 /* Store the port name in obj */
<> 144:ef7eb2e8f9f7 52 obj->port = port;
<> 144:ef7eb2e8f9f7 53
<> 144:ef7eb2e8f9f7 54 /* Store GPIO base address */
<> 144:ef7eb2e8f9f7 55 obj->GPIOMEMBASE = GPIOREG;
<> 144:ef7eb2e8f9f7 56
<> 144:ef7eb2e8f9f7 57 for (i=0; i<NUMBER_OF_GPIO; i++) {
<> 144:ef7eb2e8f9f7 58 /* check for valid pin */
<> 144:ef7eb2e8f9f7 59 if (obj->mask & (1<<i)) {
<> 144:ef7eb2e8f9f7 60
<> 144:ef7eb2e8f9f7 61 /* Gpio numbers start from DIO#0 to #17, so can pass in "i" */
<> 144:ef7eb2e8f9f7 62 pin = port_pin(obj->port, i);
<> 144:ef7eb2e8f9f7 63
<> 144:ef7eb2e8f9f7 64 /* Set the pin as GPIO */
<> 144:ef7eb2e8f9f7 65 gpio_set(pin);
<> 144:ef7eb2e8f9f7 66 }
<> 144:ef7eb2e8f9f7 67 }
<> 144:ef7eb2e8f9f7 68
<> 144:ef7eb2e8f9f7 69 /* Call function to set pin direction */
<> 144:ef7eb2e8f9f7 70 port_dir(obj, dir);
<> 144:ef7eb2e8f9f7 71 }
<> 144:ef7eb2e8f9f7 72
<> 144:ef7eb2e8f9f7 73 /** Set the input port mode
<> 144:ef7eb2e8f9f7 74 *
<> 144:ef7eb2e8f9f7 75 * @param obj The port object
<> 144:ef7eb2e8f9f7 76 * @param mode THe port mode to be set
<> 144:ef7eb2e8f9f7 77 */
<> 144:ef7eb2e8f9f7 78 void port_mode(port_t *obj, PinMode mode)
<> 144:ef7eb2e8f9f7 79 {
<> 144:ef7eb2e8f9f7 80 uint8_t i = 0;
<> 144:ef7eb2e8f9f7 81 PinName pin;
<> 144:ef7eb2e8f9f7 82
<> 144:ef7eb2e8f9f7 83 /* For each pin in the mask, set the mode to that defined in "mode" parameter */
<> 144:ef7eb2e8f9f7 84 for (i=0; i < NUMBER_OF_GPIO; i++) {
<> 144:ef7eb2e8f9f7 85 /* check for valid pin */
<> 144:ef7eb2e8f9f7 86 if (obj->mask & (1<<i)) {
<> 144:ef7eb2e8f9f7 87
<> 144:ef7eb2e8f9f7 88 /* get the pin name */
<> 144:ef7eb2e8f9f7 89 pin = port_pin(obj->port, i);
<> 144:ef7eb2e8f9f7 90
<> 144:ef7eb2e8f9f7 91 /* Set the mode for the pin */
<> 144:ef7eb2e8f9f7 92 pin_mode(pin, mode);
<> 144:ef7eb2e8f9f7 93 }
<> 144:ef7eb2e8f9f7 94 }
<> 144:ef7eb2e8f9f7 95 }
<> 144:ef7eb2e8f9f7 96
<> 144:ef7eb2e8f9f7 97 /** Set port direction (in/out)
<> 144:ef7eb2e8f9f7 98 *
<> 144:ef7eb2e8f9f7 99 * @param obj The port object
<> 144:ef7eb2e8f9f7 100 * @param dir The port direction to be set
<> 144:ef7eb2e8f9f7 101 */
<> 144:ef7eb2e8f9f7 102 void port_dir(port_t *obj, PinDirection dir)
<> 144:ef7eb2e8f9f7 103 {
<> 144:ef7eb2e8f9f7 104 /* Enable the GPIO clock */
<> 144:ef7eb2e8f9f7 105 CLOCK_ENABLE(CLOCK_GPIO);
<> 144:ef7eb2e8f9f7 106
<> 144:ef7eb2e8f9f7 107 if (dir == PIN_INPUT) {
<> 144:ef7eb2e8f9f7 108 obj->GPIOMEMBASE->W_IN = obj->mask;
<> 144:ef7eb2e8f9f7 109 } else if (dir == PIN_OUTPUT) {
<> 144:ef7eb2e8f9f7 110 obj->GPIOMEMBASE->W_OUT = obj->mask;
<> 144:ef7eb2e8f9f7 111 }
<> 144:ef7eb2e8f9f7 112
<> 144:ef7eb2e8f9f7 113 /* Disable the GPIO clock */
<> 144:ef7eb2e8f9f7 114 CLOCK_DISABLE(CLOCK_GPIO);
<> 144:ef7eb2e8f9f7 115 }
<> 144:ef7eb2e8f9f7 116
<> 144:ef7eb2e8f9f7 117 /** Write value to the port
<> 144:ef7eb2e8f9f7 118 *
<> 144:ef7eb2e8f9f7 119 * @param obj The port object
<> 144:ef7eb2e8f9f7 120 * @param value The value to be set
<> 144:ef7eb2e8f9f7 121 */
<> 144:ef7eb2e8f9f7 122 void port_write(port_t *obj, int value)
<> 144:ef7eb2e8f9f7 123 {
<> 144:ef7eb2e8f9f7 124 /* Enable the GPIO clock */
<> 144:ef7eb2e8f9f7 125 CLOCK_ENABLE(CLOCK_GPIO);
<> 144:ef7eb2e8f9f7 126
<> 144:ef7eb2e8f9f7 127 obj->GPIOMEMBASE->R_STATE_W_SET = value;//(obj->mask & value);
<> 144:ef7eb2e8f9f7 128 obj->GPIOMEMBASE->R_IRQ_W_CLEAR = ~value;//(obj->mask ^ value);
<> 144:ef7eb2e8f9f7 129
<> 144:ef7eb2e8f9f7 130 /* Disable the GPIO clock */
<> 144:ef7eb2e8f9f7 131 CLOCK_DISABLE(CLOCK_GPIO);
<> 144:ef7eb2e8f9f7 132 }
<> 144:ef7eb2e8f9f7 133
<> 144:ef7eb2e8f9f7 134 /** Read the current value on the port
<> 144:ef7eb2e8f9f7 135 *
<> 144:ef7eb2e8f9f7 136 * @param obj The port object
<> 144:ef7eb2e8f9f7 137 * @return An integer with each bit corresponding to an associated port pin setting
<> 144:ef7eb2e8f9f7 138 */
<> 144:ef7eb2e8f9f7 139 int port_read(port_t *obj)
<> 144:ef7eb2e8f9f7 140 {
<> 144:ef7eb2e8f9f7 141 int gpio_level = 0;
<> 144:ef7eb2e8f9f7 142
<> 144:ef7eb2e8f9f7 143 /* Enable the GPIO clock */
<> 144:ef7eb2e8f9f7 144 CLOCK_ENABLE(CLOCK_GPIO);
<> 144:ef7eb2e8f9f7 145
<> 144:ef7eb2e8f9f7 146 gpio_level = obj->GPIOMEMBASE->R_STATE_W_SET;
<> 144:ef7eb2e8f9f7 147
<> 144:ef7eb2e8f9f7 148 /* Disable the GPIO clock */
<> 144:ef7eb2e8f9f7 149 CLOCK_DISABLE(CLOCK_GPIO);
<> 144:ef7eb2e8f9f7 150
<> 144:ef7eb2e8f9f7 151 return(gpio_level);
<> 144:ef7eb2e8f9f7 152 }
<> 144:ef7eb2e8f9f7 153
<> 144:ef7eb2e8f9f7 154 #endif