Forked.
Fork of mbed-dev by
Diff: targets/TARGET_TOSHIBA/TARGET_TMPM066/gpio_api.c
- Revision:
- 172:7d866c31b3c5
diff -r 89b338f31ef1 -r 7d866c31b3c5 targets/TARGET_TOSHIBA/TARGET_TMPM066/gpio_api.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/targets/TARGET_TOSHIBA/TARGET_TMPM066/gpio_api.c Thu Aug 31 17:27:04 2017 +0100 @@ -0,0 +1,96 @@ +/* mbed Microcontroller Library + * (C)Copyright TOSHIBA ELECTRONIC DEVICES & STORAGE CORPORATION 2017 All rights reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "gpio_api.h" +#include "PeripheralNames.h" +#include "pinmap.h" +#include "mbed_error.h" + +#define GPIO_DATA PIN_DATA(0, 3) +extern const PinMap PinMap_GPIO_IRQ[]; + +uint32_t gpio_set(PinName pin) +{ + // Check that pin is valid + MBED_ASSERT(pin != (PinName)NC); + + // Checking pin name is not interrupt pins + if (pinmap_find_peripheral(pin, PinMap_GPIO_IRQ) == (uint32_t) NC) { + // Set pin function as GPIO pin + pin_function(pin, GPIO_DATA); + } + + // Return pin mask + return (1 << (pin & 0x07)); +} + +void gpio_init(gpio_t *obj, PinName pin) +{ + // Store above pin mask, pin name into GPIO object + obj->pin = pin; + obj->mask = gpio_set(pin); + obj->port = (GPIO_Port) (pin >> 3); + if ((PortName)obj->port == PortH) { + CG_SetFcPeriphA(CG_FC_PERIPH_PORTH, ENABLE); + } + if ((PortName)obj->port == PortJ) { + CG_SetFcPeriphA(CG_FC_PERIPH_PORTJ, ENABLE); + } +} + +void gpio_mode(gpio_t *obj, PinMode mode) +{ + // Set pin mode + pin_mode(obj->pin, mode); +} + +void gpio_dir(gpio_t *obj, PinDirection direction) +{ + // Set direction + switch (direction) { + case PIN_INPUT: + // Set pin input + GPIO_SetInput(obj->port, obj->mask); + break; + case PIN_OUTPUT: + // Set pin output + GPIO_SetOutput(obj->port, obj->mask); + break; + case PIN_INOUT: + // Set pin both input and output + GPIO_SetOutputEnableReg(obj->port, obj->mask, ENABLE); + GPIO_SetInputEnableReg(obj->port, obj->mask, ENABLE); + break; + default: + error("Invalid direction\n"); + break; + } +} + +void gpio_write(gpio_t *obj, int value) +{ + // Write gpio object pin data + if ((value == 0) || (value == 1)) { + GPIO_WriteDataBit(obj->port, obj->mask, value); + } else { + error("Invalid value\n"); + } +} + +int gpio_read(gpio_t *obj) +{ + // Read gpio object pin data + return GPIO_ReadDataBit(obj->port, obj->mask); +}