diff --git a/libraries/mbed/api/DigitalIn.h b/libraries/mbed/api/DigitalIn.h index a04bc332e6..ac6812afff 100644 --- a/libraries/mbed/api/DigitalIn.h +++ b/libraries/mbed/api/DigitalIn.h @@ -49,12 +49,19 @@ public: /** Create a DigitalIn connected to the specified pin * * @param pin DigitalIn pin to connect to - * @param mode the initial mode of the pin */ - DigitalIn(PinName pin, PinMode mode = PullDefault) { - GPIO_INIT_IN(&gpio, pin, mode); + DigitalIn(PinName pin) { + gpio_init_in(&gpio, pin); } + /** Create a DigitalIn connected to the specified pin + * + * @param pin DigitalIn pin to connect to + * @param mode the initial mode of the pin + */ + DigitalIn(PinName pin, PinMode mode) { + gpio_init_in_ex(&gpio, pin, mode); + } /** Read the input, represented as 0 or 1 (int) * * @returns diff --git a/libraries/mbed/api/DigitalInOut.h b/libraries/mbed/api/DigitalInOut.h index e62067736c..c526f7ac9d 100644 --- a/libraries/mbed/api/DigitalInOut.h +++ b/libraries/mbed/api/DigitalInOut.h @@ -27,6 +27,14 @@ namespace mbed { class DigitalInOut { public: + /** Create a DigitalInOut connected to the specified pin + * + * @param pin DigitalInOut pin to connect to + */ + DigitalInOut(PinName pin) { + gpio_init_in(&gpio, pin); + } + /** Create a DigitalInOut connected to the specified pin * * @param pin DigitalInOut pin to connect to @@ -34,14 +42,9 @@ public: * @param mode the initial mode of the pin * @param value the initial value of the pin if is an output */ - DigitalInOut(PinName pin, PinDirection direction = PIN_INPUT, PinMode mode = PullDefault, int value = 0) { - if (direction == PIN_INPUT) { - GPIO_INIT_IN(&gpio, pin, mode); - gpio_write(&gpio, value); // we prepare the value in case it is switched later - } else { - GPIO_INIT_OUT(&gpio, pin, mode, value); - } - } + DigitalInOut(PinName pin, PinDirection direction, PinMode mode, int value) { + gpio_init_inout(&gpio, pin, direction, mode, value); + } /** Set the output, specified as 0 or 1 (int) * diff --git a/libraries/mbed/api/DigitalOut.h b/libraries/mbed/api/DigitalOut.h index d3c089ad70..5e22c121e0 100644 --- a/libraries/mbed/api/DigitalOut.h +++ b/libraries/mbed/api/DigitalOut.h @@ -41,14 +41,22 @@ namespace mbed { class DigitalOut { public: + /** Create a DigitalOut connected to the specified pin + * + * @param pin DigitalOut pin to connect to + */ + DigitalOut(PinName pin) { + gpio_init_out(&gpio, pin); + } + /** Create a DigitalOut connected to the specified pin * * @param pin DigitalOut pin to connect to * @param value the initial pin value */ - DigitalOut(PinName pin, int value = 0) { - GPIO_INIT_OUT(&gpio, pin, PullNone, value); - } + DigitalOut(PinName pin, int value){ + gpio_init_out_ex(&gpio, pin, value); + } /** Set the output, specified as 0 or 1 (int) * diff --git a/libraries/mbed/common/InterruptIn.cpp b/libraries/mbed/common/InterruptIn.cpp index 0d90a1d99d..768b517635 100644 --- a/libraries/mbed/common/InterruptIn.cpp +++ b/libraries/mbed/common/InterruptIn.cpp @@ -21,7 +21,7 @@ namespace mbed { InterruptIn::InterruptIn(PinName pin) { gpio_irq_init(&gpio_irq, pin, (&InterruptIn::_irq_handler), (uint32_t)this); - GPIO_INIT_IN(&gpio, pin, PullDefault); + gpio_init_in(&gpio, pin); } InterruptIn::~InterruptIn() { diff --git a/libraries/mbed/common/board.c b/libraries/mbed/common/board.c index abc5adf7bd..eb150eb3b0 100644 --- a/libraries/mbed/common/board.c +++ b/libraries/mbed/common/board.c @@ -22,13 +22,13 @@ WEAK void mbed_die(void) { __disable_irq(); // dont allow interrupts to disturb the flash pattern #if (DEVICE_ERROR_RED == 1) - gpio_t led_red; GPIO_INIT_OUT(&led_red, LED_RED, PullNone, 0); + gpio_t led_red; gpio_init_out(&led_red, LED_RED); #elif (DEVICE_ERROR_PATTERN == 1) - gpio_t led_1; GPIO_INIT_OUT(&led_1, LED1, PullNone, 0); - gpio_t led_2; GPIO_INIT_OUT(&led_2, LED2, PullNone, 0); - gpio_t led_3; GPIO_INIT_OUT(&led_3, LED3, PullNone, 0); - gpio_t led_4; GPIO_INIT_OUT(&led_4, LED4, PullNone, 0); + gpio_t led_1; gpio_init_out(&led_1, LED1); + gpio_t led_2; gpio_init_out(&led_2, LED2); + gpio_t led_3; gpio_init_out(&led_3, LED3); + gpio_t led_4; gpio_init_out(&led_4, LED4); #endif while (1) { diff --git a/libraries/mbed/common/gpio.c b/libraries/mbed/common/gpio.c new file mode 100644 index 0000000000..54220c7273 --- /dev/null +++ b/libraries/mbed/common/gpio.c @@ -0,0 +1,52 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * 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" + +#define GPIO_INIT_IN(obj, pin, mode) \ + gpio_init(obj, pin), \ + gpio_mode(obj, mode), \ + gpio_dir(obj, PIN_INPUT) + +#define GPIO_INIT_OUT(obj, pin, mode, value) \ + gpio_init(obj, pin), \ + gpio_write(obj, value), \ + gpio_dir(obj, PIN_OUTPUT), \ + gpio_mode(obj, mode) + +void gpio_init_in(gpio_t* gpio, PinName pin) { + gpio_init_in_ex(gpio, pin, PullDefault); +} + +void gpio_init_in_ex(gpio_t* gpio, PinName pin, PinMode mode) { + GPIO_INIT_IN(gpio, pin, mode); +} + +void gpio_init_out(gpio_t* gpio, PinName pin) { + gpio_init_out_ex(gpio, pin, 0); +} + +void gpio_init_out_ex(gpio_t* gpio, PinName pin, int value) { + GPIO_INIT_OUT(gpio, pin, PullNone, value); +} + +void gpio_init_inout(gpio_t* gpio, PinName pin, PinDirection direction, PinMode mode, int value) { + if (direction == PIN_INPUT) { + GPIO_INIT_IN(gpio, pin, mode); + gpio_write(gpio, value); // we prepare the value in case direction is switched later + } else { + GPIO_INIT_OUT(gpio, pin, mode, value); + } +} diff --git a/libraries/mbed/hal/gpio_api.h b/libraries/mbed/hal/gpio_api.h index 8dfb802f0a..e4cf7fd6f5 100644 --- a/libraries/mbed/hal/gpio_api.h +++ b/libraries/mbed/hal/gpio_api.h @@ -37,16 +37,12 @@ void gpio_dir (gpio_t *obj, PinDirection direction); void gpio_write(gpio_t *obj, int value); int gpio_read (gpio_t *obj); -#define GPIO_INIT_IN(obj, pin, mode) \ - gpio_init(obj, pin), \ - gpio_mode(obj, mode), \ - gpio_dir(obj, PIN_INPUT) - -#define GPIO_INIT_OUT(obj, pin, mode, value) \ - gpio_init(obj, pin), \ - gpio_write(obj, value), \ - gpio_dir(obj, PIN_OUTPUT), \ - gpio_mode(obj, mode) +// the following set of functions are generic and are implemented in the common gpio.c file +void gpio_init_in(gpio_t* gpio, PinName pin); +void gpio_init_in_ex(gpio_t* gpio, PinName pin, PinMode mode); +void gpio_init_out(gpio_t* gpio, PinName pin); +void gpio_init_out_ex(gpio_t* gpio, PinName pin, int value); +void gpio_init_inout(gpio_t* gpio, PinName pin, PinDirection direction, PinMode mode, int value); #ifdef __cplusplus } diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/gpio_irq_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/gpio_irq_api.c index d3a1a31f4b..65ade870ec 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/gpio_irq_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/gpio_irq_api.c @@ -180,5 +180,5 @@ void gpio_irq_disable(gpio_irq_t *obj) { void NMI_Handler(void) { gpio_t gpio; - GPIO_INIT_IN(&gpio, PTA4, PIN_INPUT, PullDefault); + gpio_init_in(&gpio, PTA4); } diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/gpio_irq_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/gpio_irq_api.c index a3a8fc1d6e..e871474c05 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/gpio_irq_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/gpio_irq_api.c @@ -170,5 +170,5 @@ void gpio_irq_disable(gpio_irq_t *obj) { void NMI_Handler(void) { gpio_t gpio; - GPIO_INIT_IN(&gpio, PTA4, PullDefault); + gpio_init_in(&gpio, PTA4); } diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/gpio_irq_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/gpio_irq_api.c index de0be80832..e32f2b4177 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/gpio_irq_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/gpio_irq_api.c @@ -190,5 +190,5 @@ void gpio_irq_disable(gpio_irq_t *obj) { void NMI_Handler(void) { gpio_t gpio; - GPIO_INIT_IN(&gpio, PTA4, PIN_INPUT, PullDefault); + gpio_init_in(&gpio, PTA4); } diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/TARGET_UBLOX_C027/platform_init.c b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/TARGET_UBLOX_C027/platform_init.c index 601962f016..fd38537553 100644 --- a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/TARGET_UBLOX_C027/platform_init.c +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/TARGET_UBLOX_C027/platform_init.c @@ -9,19 +9,19 @@ void mbed_sdk_init() gpio_t gpsEn, gpsRst, led, modemRts; // start with modem disabled - GPIO_INIT_OUT(&modemEn, MDMEN, PullNone, 0); - GPIO_INIT_OUT(&modemRst, MDMRST, PullNone, 1); - GPIO_INIT_OUT(&modemPwrOn, MDMPWRON, PullNone, 1); - GPIO_INIT_OUT(&modemLvlOe, MDMLVLOE, PullNone, 1); - GPIO_INIT_OUT(&modemILvlOe, MDMILVLOE, PullNone, 0); - GPIO_INIT_OUT(&modemUsbDet, MDMUSBDET, PullNone, 0); - GPIO_INIT_OUT(&modemRts, MDMRTS, PullNone, 0); + gpio_init_out_ex(&modemEn, MDMEN, PullNone, 0); + gpio_init_out_ex(&modemRst, MDMRST, PullNone, 1); + gpio_init_out_ex(&modemPwrOn, MDMPWRON, PullNone, 1); + gpio_init_out_ex(&modemLvlOe, MDMLVLOE, PullNone, 1); + gpio_init_out_ex(&modemILvlOe, MDMILVLOE, PullNone, 0); + gpio_init_out_ex(&modemUsbDet, MDMUSBDET, PullNone, 0); + gpio_init_out_ex(&modemRts, MDMRTS, PullNone, 0); // start with gps disabled - GPIO_INIT_OUT(&gpsEn, GPSEN, PullNone, 0); - GPIO_INIT_OUT(&gpsRst, GPSRST, PullNone, 1); + gpio_init_out_ex(&gpsEn, GPSEN, PullNone, 0); + gpio_init_out_ex(&gpsRst, GPSRST, PullNone, 1); // led should be off - GPIO_INIT_OUT(&led, LED, PullNone, 0); - + gpio_init_out_ex(&led, LED, PullNone, 0); + wait_ms(50); // when USB cable is inserted the interface chip issues // multiple resets to the target CPU We wait here for a short period to // prevent those resets from propagating to the modem and other diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/serial_api.c b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/serial_api.c index 5279db1843..126b1169e7 100644 --- a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/serial_api.c @@ -412,7 +412,7 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi pinmap_pinout(txflow, PinMap_UART_CTS); } else { // Can't enable in hardware, use software emulation - GPIO_INIT_IN(&uart_data[index].sw_cts, txflow, PullDown); + gpio_init_in(&uart_data[index].sw_cts, txflow); } } if (((FlowControlRTS == type) || (FlowControlRTSCTS == type)) && (NC != rxflow)) { @@ -427,7 +427,7 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi uart1->MCR |= UART_MCR_RTSEN_MASK; pinmap_pinout(rxflow, PinMap_UART_RTS); } else { // can't enable in hardware, use software emulation - GPIO_INIT_OUT(&uart_data[index].sw_rts, rxflow, PullNone, 0); + gpio_init_out_ex(&uart_data[index].sw_rts, rxflow, 0); // Enable RX interrupt serial_flow_irq_set(obj, 1); }