Rizky Ardi Maulana / mbed-os
Committer:
elessair
Date:
Sun Oct 23 15:10:02 2016 +0000
Revision:
0:f269e3021894
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elessair 0:f269e3021894 1 /*
elessair 0:f269e3021894 2 * Copyright (c) 2015, Freescale Semiconductor, Inc.
elessair 0:f269e3021894 3 * All rights reserved.
elessair 0:f269e3021894 4 *
elessair 0:f269e3021894 5 * Redistribution and use in source and binary forms, with or without modification,
elessair 0:f269e3021894 6 * are permitted provided that the following conditions are met:
elessair 0:f269e3021894 7 *
elessair 0:f269e3021894 8 * o Redistributions of source code must retain the above copyright notice, this list
elessair 0:f269e3021894 9 * of conditions and the following disclaimer.
elessair 0:f269e3021894 10 *
elessair 0:f269e3021894 11 * o Redistributions in binary form must reproduce the above copyright notice, this
elessair 0:f269e3021894 12 * list of conditions and the following disclaimer in the documentation and/or
elessair 0:f269e3021894 13 * other materials provided with the distribution.
elessair 0:f269e3021894 14 *
elessair 0:f269e3021894 15 * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
elessair 0:f269e3021894 16 * contributors may be used to endorse or promote products derived from this
elessair 0:f269e3021894 17 * software without specific prior written permission.
elessair 0:f269e3021894 18 *
elessair 0:f269e3021894 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
elessair 0:f269e3021894 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
elessair 0:f269e3021894 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
elessair 0:f269e3021894 22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
elessair 0:f269e3021894 23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
elessair 0:f269e3021894 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
elessair 0:f269e3021894 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
elessair 0:f269e3021894 26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
elessair 0:f269e3021894 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
elessair 0:f269e3021894 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
elessair 0:f269e3021894 29 */
elessair 0:f269e3021894 30
elessair 0:f269e3021894 31 #include "fsl_gpio.h"
elessair 0:f269e3021894 32
elessair 0:f269e3021894 33 /*******************************************************************************
elessair 0:f269e3021894 34 * Variables
elessair 0:f269e3021894 35 ******************************************************************************/
elessair 0:f269e3021894 36 static PORT_Type *const s_portBases[] = PORT_BASE_PTRS;
elessair 0:f269e3021894 37 static GPIO_Type *const s_gpioBases[] = GPIO_BASE_PTRS;
elessair 0:f269e3021894 38
elessair 0:f269e3021894 39 /*******************************************************************************
elessair 0:f269e3021894 40 * Prototypes
elessair 0:f269e3021894 41 ******************************************************************************/
elessair 0:f269e3021894 42
elessair 0:f269e3021894 43 /*!
elessair 0:f269e3021894 44 * @brief Gets the GPIO instance according to the GPIO base
elessair 0:f269e3021894 45 *
elessair 0:f269e3021894 46 * @param base GPIO peripheral base pointer(PTA, PTB, PTC, etc.)
elessair 0:f269e3021894 47 * @retval GPIO instance
elessair 0:f269e3021894 48 */
elessair 0:f269e3021894 49 static uint32_t GPIO_GetInstance(GPIO_Type *base);
elessair 0:f269e3021894 50
elessair 0:f269e3021894 51 /*******************************************************************************
elessair 0:f269e3021894 52 * Code
elessair 0:f269e3021894 53 ******************************************************************************/
elessair 0:f269e3021894 54
elessair 0:f269e3021894 55 static uint32_t GPIO_GetInstance(GPIO_Type *base)
elessair 0:f269e3021894 56 {
elessair 0:f269e3021894 57 uint32_t instance;
elessair 0:f269e3021894 58
elessair 0:f269e3021894 59 /* Find the instance index from base address mappings. */
elessair 0:f269e3021894 60 for (instance = 0; instance < FSL_FEATURE_SOC_GPIO_COUNT; instance++)
elessair 0:f269e3021894 61 {
elessair 0:f269e3021894 62 if (s_gpioBases[instance] == base)
elessair 0:f269e3021894 63 {
elessair 0:f269e3021894 64 break;
elessair 0:f269e3021894 65 }
elessair 0:f269e3021894 66 }
elessair 0:f269e3021894 67
elessair 0:f269e3021894 68 assert(instance < FSL_FEATURE_SOC_GPIO_COUNT);
elessair 0:f269e3021894 69
elessair 0:f269e3021894 70 return instance;
elessair 0:f269e3021894 71 }
elessair 0:f269e3021894 72
elessair 0:f269e3021894 73 void GPIO_PinInit(GPIO_Type *base, uint32_t pin, const gpio_pin_config_t *config)
elessair 0:f269e3021894 74 {
elessair 0:f269e3021894 75 assert(config);
elessair 0:f269e3021894 76
elessair 0:f269e3021894 77 if (config->pinDirection == kGPIO_DigitalInput)
elessair 0:f269e3021894 78 {
elessair 0:f269e3021894 79 base->PDDR &= ~(1U << pin);
elessair 0:f269e3021894 80 }
elessair 0:f269e3021894 81 else
elessair 0:f269e3021894 82 {
elessair 0:f269e3021894 83 GPIO_WritePinOutput(base, pin, config->outputLogic);
elessair 0:f269e3021894 84 base->PDDR |= (1U << pin);
elessair 0:f269e3021894 85 }
elessair 0:f269e3021894 86 }
elessair 0:f269e3021894 87
elessair 0:f269e3021894 88 uint32_t GPIO_GetPinsInterruptFlags(GPIO_Type *base)
elessair 0:f269e3021894 89 {
elessair 0:f269e3021894 90 uint8_t instance;
elessair 0:f269e3021894 91 PORT_Type *portBase;
elessair 0:f269e3021894 92 instance = GPIO_GetInstance(base);
elessair 0:f269e3021894 93 portBase = s_portBases[instance];
elessair 0:f269e3021894 94 return portBase->ISFR;
elessair 0:f269e3021894 95 }
elessair 0:f269e3021894 96
elessair 0:f269e3021894 97 void GPIO_ClearPinsInterruptFlags(GPIO_Type *base, uint32_t mask)
elessair 0:f269e3021894 98 {
elessair 0:f269e3021894 99 uint8_t instance;
elessair 0:f269e3021894 100 PORT_Type *portBase;
elessair 0:f269e3021894 101 instance = GPIO_GetInstance(base);
elessair 0:f269e3021894 102 portBase = s_portBases[instance];
elessair 0:f269e3021894 103 portBase->ISFR = mask;
elessair 0:f269e3021894 104 }
elessair 0:f269e3021894 105
elessair 0:f269e3021894 106 #if defined(FSL_FEATURE_SOC_FGPIO_COUNT) && FSL_FEATURE_SOC_FGPIO_COUNT
elessair 0:f269e3021894 107
elessair 0:f269e3021894 108 /*******************************************************************************
elessair 0:f269e3021894 109 * Variables
elessair 0:f269e3021894 110 ******************************************************************************/
elessair 0:f269e3021894 111 static FGPIO_Type *const s_fgpioBases[] = FGPIO_BASE_PTRS;
elessair 0:f269e3021894 112
elessair 0:f269e3021894 113 /*******************************************************************************
elessair 0:f269e3021894 114 * Prototypes
elessair 0:f269e3021894 115 ******************************************************************************/
elessair 0:f269e3021894 116 /*!
elessair 0:f269e3021894 117 * @brief Gets the FGPIO instance according to the GPIO base
elessair 0:f269e3021894 118 *
elessair 0:f269e3021894 119 * @param base FGPIO peripheral base pointer(PTA, PTB, PTC, etc.)
elessair 0:f269e3021894 120 * @retval FGPIO instance
elessair 0:f269e3021894 121 */
elessair 0:f269e3021894 122 static uint32_t FGPIO_GetInstance(FGPIO_Type *base);
elessair 0:f269e3021894 123
elessair 0:f269e3021894 124 /*******************************************************************************
elessair 0:f269e3021894 125 * Code
elessair 0:f269e3021894 126 ******************************************************************************/
elessair 0:f269e3021894 127
elessair 0:f269e3021894 128 static uint32_t FGPIO_GetInstance(FGPIO_Type *base)
elessair 0:f269e3021894 129 {
elessair 0:f269e3021894 130 uint32_t instance;
elessair 0:f269e3021894 131
elessair 0:f269e3021894 132 /* Find the instance index from base address mappings. */
elessair 0:f269e3021894 133 for (instance = 0; instance < FSL_FEATURE_SOC_FGPIO_COUNT; instance++)
elessair 0:f269e3021894 134 {
elessair 0:f269e3021894 135 if (s_fgpioBases[instance] == base)
elessair 0:f269e3021894 136 {
elessair 0:f269e3021894 137 break;
elessair 0:f269e3021894 138 }
elessair 0:f269e3021894 139 }
elessair 0:f269e3021894 140
elessair 0:f269e3021894 141 assert(instance < FSL_FEATURE_SOC_FGPIO_COUNT);
elessair 0:f269e3021894 142
elessair 0:f269e3021894 143 return instance;
elessair 0:f269e3021894 144 }
elessair 0:f269e3021894 145
elessair 0:f269e3021894 146 void FGPIO_PinInit(FGPIO_Type *base, uint32_t pin, const gpio_pin_config_t *config)
elessair 0:f269e3021894 147 {
elessair 0:f269e3021894 148 assert(config);
elessair 0:f269e3021894 149
elessair 0:f269e3021894 150 if (config->pinDirection == kGPIO_DigitalInput)
elessair 0:f269e3021894 151 {
elessair 0:f269e3021894 152 base->PDDR &= ~(1U << pin);
elessair 0:f269e3021894 153 }
elessair 0:f269e3021894 154 else
elessair 0:f269e3021894 155 {
elessair 0:f269e3021894 156 FGPIO_WritePinOutput(base, pin, config->outputLogic);
elessair 0:f269e3021894 157 base->PDDR |= (1U << pin);
elessair 0:f269e3021894 158 }
elessair 0:f269e3021894 159 }
elessair 0:f269e3021894 160
elessair 0:f269e3021894 161 uint32_t FGPIO_GetPinsInterruptFlags(FGPIO_Type *base)
elessair 0:f269e3021894 162 {
elessair 0:f269e3021894 163 uint8_t instance;
elessair 0:f269e3021894 164 instance = FGPIO_GetInstance(base);
elessair 0:f269e3021894 165 PORT_Type *portBase;
elessair 0:f269e3021894 166 portBase = s_portBases[instance];
elessair 0:f269e3021894 167 return portBase->ISFR;
elessair 0:f269e3021894 168 }
elessair 0:f269e3021894 169
elessair 0:f269e3021894 170 void FGPIO_ClearPinsInterruptFlags(FGPIO_Type *base, uint32_t mask)
elessair 0:f269e3021894 171 {
elessair 0:f269e3021894 172 uint8_t instance;
elessair 0:f269e3021894 173 instance = FGPIO_GetInstance(base);
elessair 0:f269e3021894 174 PORT_Type *portBase;
elessair 0:f269e3021894 175 portBase = s_portBases[instance];
elessair 0:f269e3021894 176 portBase->ISFR = mask;
elessair 0:f269e3021894 177 }
elessair 0:f269e3021894 178
elessair 0:f269e3021894 179 #endif /* FSL_FEATURE_SOC_FGPIO_COUNT */