来自中国的硬件平台

Dependents:   mbed_in_china_blink_led

Fork of mbed-src by mbed official

Files at this revision

API Documentation at this revision

Comitter:
mbed_official
Date:
Mon Mar 10 11:30:07 2014 +0000
Parent:
112:a7168c414ef2
Child:
114:826c6eb78fdc
Commit message:
Synchronized with git revision 423ddcb86e83e2e0d599ca7106d436eb3c47e6dd

Full URL: https://github.com/mbedmicro/mbed/commit/423ddcb86e83e2e0d599ca7106d436eb3c47e6dd/

proposed change of gpio_api (new update pull request)

Changed in this revision

api/DigitalIn.h Show annotated file Show diff for this revision Revisions of this file
api/DigitalInOut.h Show annotated file Show diff for this revision Revisions of this file
api/DigitalOut.h Show annotated file Show diff for this revision Revisions of this file
common/InterruptIn.cpp Show annotated file Show diff for this revision Revisions of this file
common/board.c Show annotated file Show diff for this revision Revisions of this file
common/gpio.c Show annotated file Show diff for this revision Revisions of this file
hal/gpio_api.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_Freescale/TARGET_K20D5M/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_Freescale/TARGET_K20D5M/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/gpio_irq_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/gpio_irq_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/gpio_irq_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_Freescale/TARGET_KLXX/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NORDIC/TARGET_NRF51822/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NORDIC/TARGET_NRF51822/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC11UXX/TARGET_LPC11U24_301/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC11UXX/TARGET_LPC11U24_401/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC11UXX/TARGET_LPC11U35_401/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC11UXX/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11CXX/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11XX/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC13XX/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC13XX/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC15XX/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC15XX/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC176X/TARGET_MBED_LPC1768/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC176X/TARGET_UBLOX_C027/platform_init.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC176X/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC176X/serial_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC23XX/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC23XX/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC408X/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC408X/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC43XX/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC43XX/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC81X/TARGET_LPC810/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC81X/TARGET_LPC812/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NXP/TARGET_LPC81X/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_STM32F4XX/PinNames.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_STM32F4XX/gpio_api.c Show annotated file Show diff for this revision Revisions of this file
--- a/api/DigitalIn.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/api/DigitalIn.h	Mon Mar 10 11:30:07 2014 +0000
@@ -49,12 +49,19 @@
     /** Create a DigitalIn connected to the specified pin
      *
      *  @param pin DigitalIn pin to connect to
-     *  @param name (optional) A string to identify the object
      */
     DigitalIn(PinName pin) {
-        gpio_init(&gpio, pin, PIN_INPUT);
+        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
--- a/api/DigitalInOut.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/api/DigitalInOut.h	Mon Mar 10 11:30:07 2014 +0000
@@ -32,7 +32,18 @@
      *  @param pin DigitalInOut pin to connect to
      */
     DigitalInOut(PinName pin) {
-        gpio_init(&gpio, pin, PIN_INPUT);
+        gpio_init_in(&gpio, pin);
+    }
+
+    /** Create a DigitalInOut connected to the specified pin
+     *
+     *  @param pin DigitalInOut pin to connect to
+     *  @param direction the initial direction of the pin
+     *  @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, PinMode mode, int value) {
+        gpio_init_inout(&gpio, pin, direction, mode, value);
     }
 
     /** Set the output, specified as 0 or 1 (int)
--- a/api/DigitalOut.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/api/DigitalOut.h	Mon Mar 10 11:30:07 2014 +0000
@@ -46,7 +46,16 @@
      *  @param pin DigitalOut pin to connect to
      */
     DigitalOut(PinName pin) {
-        gpio_init(&gpio, pin, PIN_OUTPUT);
+        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){
+        gpio_init_out_ex(&gpio, pin, value);
     }
 
     /** Set the output, specified as 0 or 1 (int)
--- a/common/InterruptIn.cpp	Fri Mar 07 16:00:07 2014 +0000
+++ b/common/InterruptIn.cpp	Mon Mar 10 11:30:07 2014 +0000
@@ -21,7 +21,7 @@
 
 InterruptIn::InterruptIn(PinName pin) {
     gpio_irq_init(&gpio_irq, pin, (&InterruptIn::_irq_handler), (uint32_t)this);
-    gpio_init(&gpio, pin, PIN_INPUT);
+    gpio_init_in(&gpio, pin);
 }
 
 InterruptIn::~InterruptIn() {
--- a/common/board.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/common/board.c	Mon Mar 10 11:30:07 2014 +0000
@@ -20,15 +20,15 @@
 WEAK void mbed_die(void);
 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(&led_red, LED_RED, PIN_OUTPUT);
-
+    gpio_t led_red; gpio_init_out(&led_red, LED_RED);
+    
 #elif (DEVICE_ERROR_PATTERN == 1)
-    gpio_t led_1; gpio_init(&led_1, LED1, PIN_OUTPUT);
-    gpio_t led_2; gpio_init(&led_2, LED2, PIN_OUTPUT);
-    gpio_t led_3; gpio_init(&led_3, LED3, PIN_OUTPUT);
-    gpio_t led_4; gpio_init(&led_4, LED4, PIN_OUTPUT);
+    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) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/gpio.c	Mon Mar 10 11:30:07 2014 +0000
@@ -0,0 +1,56 @@
+/* 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"
+
+static inline void _gpio_init_in(gpio_t* gpio, PinName pin, PinMode mode)
+{
+    gpio_init(gpio, pin);
+    gpio_mode(gpio, mode);
+    gpio_dir(gpio, PIN_INPUT);
+}
+    
+static inline void _gpio_init_out(gpio_t* gpio, PinName pin, PinMode mode, int value)
+{
+    gpio_init(gpio, pin);
+    gpio_write(gpio, value);
+    gpio_dir(gpio, PIN_OUTPUT);
+    gpio_mode(gpio, 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 it is switched later
+    } else {
+        _gpio_init_out(gpio, pin, mode, value);
+    }
+}
--- a/hal/gpio_api.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/hal/gpio_api.h	Mon Mar 10 11:30:07 2014 +0000
@@ -29,7 +29,7 @@
 uint32_t gpio_set(PinName pin);
 
 /* GPIO object */
-void gpio_init (gpio_t *obj, PinName pin, PinDirection direction);
+void gpio_init(gpio_t *obj, PinName pin);
 
 void gpio_mode (gpio_t *obj, PinMode mode);
 void gpio_dir  (gpio_t *obj, PinDirection direction);
@@ -37,6 +37,13 @@
 void gpio_write(gpio_t *obj, int value);
 int  gpio_read (gpio_t *obj);
 
+// 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
 }
 #endif
--- a/targets/hal/TARGET_Freescale/TARGET_K20D5M/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_Freescale/TARGET_K20D5M/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -240,6 +240,7 @@
     PullNone = 0,
     PullDown = 2,
     PullUp   = 3,
+    PullDefault = PullUp
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_Freescale/TARGET_K20D5M/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_Freescale/TARGET_K20D5M/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -21,7 +21,7 @@
     return 1 << ((pin & 0x7F) >> 2);
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if(pin == NC)
         return;
 
@@ -35,16 +35,6 @@
     obj->reg_clr = &reg->PCOR;
     obj->reg_in  = &reg->PDIR;
     obj->reg_dir = &reg->PDDR;
-
-    gpio_dir(obj, direction);
-    switch (direction) {
-        case PIN_OUTPUT:
-            pin_mode(pin, PullNone);
-            break;
-        case PIN_INPUT :
-            pin_mode(pin, PullUp);
-            break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -126,6 +126,7 @@
 typedef enum {
     PullNone = 0,
     PullUp   = 2,
+    PullDefault = PullUp
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/gpio_irq_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL05Z/gpio_irq_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -17,6 +17,7 @@
 #include "cmsis.h"
 
 #include "gpio_irq_api.h"
+#include "gpio_api.h"
 #include "error.h"
 
 #define CHANNEL_NUM    64   // 31 pins on 2 ports
@@ -176,9 +177,8 @@
 // Change the NMI pin to an input. This allows NMI pin to 
 //  be used as a low power mode wakeup.  The application will
 //  need to change the pin back to NMI_b or wakeup only occurs once!
-extern void gpio_init(gpio_t *obj, PinName pin, PinDirection direction);
 void NMI_Handler(void)
 {
     gpio_t gpio;
-    gpio_init(&gpio, PTB5, PIN_INPUT);
+    gpio_init_in(&gpio, PTA4);
 }
--- a/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -244,6 +244,7 @@
 typedef enum {
     PullNone = 0,
     PullUp = 2,
+    PullDefault = PullUp
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/gpio_irq_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/gpio_irq_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -17,6 +17,7 @@
 #include "cmsis.h"
 
 #include "gpio_irq_api.h"
+#include "gpio_api.h"
 #include "error.h"
 
 #define CHANNEL_NUM    64
@@ -166,9 +167,8 @@
 // Change the NMI pin to an input. This allows NMI pin to 
 //  be used as a low power mode wakeup.  The application will
 //  need to change the pin back to NMI_b or wakeup only occurs once!
-extern void gpio_init(gpio_t *obj, PinName pin, PinDirection direction);
 void NMI_Handler(void)
 {
     gpio_t gpio;
-    gpio_init(&gpio, PTA4, PIN_INPUT);
+    gpio_init_in(&gpio, PTA4);
 }
--- a/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -247,7 +247,8 @@
 typedef enum {
     PullNone = 0,
     PullDown = 2,
-    PullUp = 3
+    PullUp = 3,
+    PullDefault = PullUp
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/gpio_irq_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/gpio_irq_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -17,6 +17,7 @@
 #include "cmsis.h"
 
 #include "gpio_irq_api.h"
+#include "gpio_api.h"
 #include "error.h"
 
 #define CHANNEL_NUM    96
@@ -186,9 +187,8 @@
 // Change the NMI pin to an input. This allows NMI pin to 
 //  be used as a low power mode wakeup.  The application will
 //  need to change the pin back to NMI_b or wakeup only occurs once!
-extern void gpio_init(gpio_t *obj, PinName pin, PinDirection direction);
 void NMI_Handler(void)
 {
     gpio_t gpio;
-    gpio_init(&gpio, PTA4, PIN_INPUT);
+    gpio_init_in(&gpio, PTA4);
 }
--- a/targets/hal/TARGET_Freescale/TARGET_KLXX/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_Freescale/TARGET_KLXX/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -21,7 +21,7 @@
     return 1 << ((pin & 0x7F) >> 2);
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if(pin == (PinName)NC) return;
 
     obj->pin = pin;
@@ -34,12 +34,6 @@
     obj->reg_clr = &reg->PCOR;
     obj->reg_in  = &reg->PDIR;
     obj->reg_dir = &reg->PDDR;
-
-    gpio_dir(obj, direction);
-    switch (direction) {
-        case PIN_OUTPUT: pin_mode(pin, PullNone); break;
-        case PIN_INPUT : pin_mode(pin, PullUp); break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_NORDIC/TARGET_NRF51822/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NORDIC/TARGET_NRF51822/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -142,7 +142,8 @@
 typedef enum {
     PullNone = 0,
     PullDown = 1,
-    PullUp = 3
+    PullUp = 3,
+    PullDefault = PullUp
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_NORDIC/TARGET_NRF51822/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NORDIC/TARGET_NRF51822/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -16,7 +16,7 @@
 #include "gpio_api.h"
 #include "pinmap.h"
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if(pin == NC) return;
 
     obj->pin = pin;
@@ -26,12 +26,6 @@
     obj->reg_clr = &NRF_GPIO->OUTCLR;
     obj->reg_in  = &NRF_GPIO->IN;
     obj->reg_dir = &NRF_GPIO->DIR;
-
-    gpio_dir(obj, direction);
-    switch (direction) {
-        case PIN_OUTPUT: pin_mode(pin, PullNone); break;
-        case PIN_INPUT : pin_mode(pin, PullUp); break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_NXP/TARGET_LPC11UXX/TARGET_LPC11U24_301/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC11UXX/TARGET_LPC11U24_301/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -155,7 +155,8 @@
     PullDown = 1,
     PullNone = 0,
     Repeater = 3,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_NXP/TARGET_LPC11UXX/TARGET_LPC11U24_401/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC11UXX/TARGET_LPC11U24_401/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -178,7 +178,8 @@
     PullDown = 1,
     PullNone = 0,
     Repeater = 3,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_NXP/TARGET_LPC11UXX/TARGET_LPC11U35_401/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC11UXX/TARGET_LPC11U35_401/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -150,7 +150,8 @@
     PullDown = 1,
     PullNone = 0,
     Repeater = 3,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_NXP/TARGET_LPC11UXX/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC11UXX/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -27,7 +27,7 @@
     return (1 << ((int)pin & 0x1F));
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if(pin == NC) return;
 
     obj->pin = pin;
@@ -39,12 +39,6 @@
     obj->reg_clr = &LPC_GPIO->CLR[port];
     obj->reg_in  = &LPC_GPIO->PIN[port];
     obj->reg_dir = &LPC_GPIO->DIR[port];
-    
-    gpio_dir(obj, direction);
-    switch (direction) {
-        case PIN_OUTPUT: pin_mode(pin, PullNone); break;
-        case PIN_INPUT : pin_mode(pin, PullDown); break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11CXX/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11CXX/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -208,7 +208,8 @@
     PullDown = 1,
     PullNone = 0,
     Repeater = 3,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11XX/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11XX/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -223,7 +223,8 @@
     PullDown = 1,
     PullNone = 0,
     Repeater = 3,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -34,7 +34,7 @@
     return ((pin & 0x0F00) >> 8);
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if(pin == NC) return;
 
     obj->pin = pin;
@@ -43,13 +43,6 @@
     obj->reg_mask_read = &port_reg->MASKED_ACCESS[1 << gpio_set(pin)];
     obj->reg_dir       = &port_reg->DIR;
     obj->reg_write     = &port_reg->DATA;
-    
-    gpio_dir(obj, direction);
-    
-    switch (direction) {
-        case PIN_OUTPUT: pin_mode(pin, PullNone); break;
-        case PIN_INPUT : pin_mode(pin, PullDown); break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_NXP/TARGET_LPC13XX/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC13XX/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -140,7 +140,8 @@
     PullDown = 1,
     PullNone = 0,
     Repeater = 3,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_NXP/TARGET_LPC13XX/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC13XX/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -27,7 +27,7 @@
     return (1 << ((int)pin & 0x1F));
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if(pin == NC) return;
 
     obj->pin = pin;
@@ -39,12 +39,6 @@
     obj->reg_clr = &LPC_GPIO->CLR[port];
     obj->reg_in  = &LPC_GPIO->PIN[port];
     obj->reg_dir = &LPC_GPIO->DIR[port];
-    
-    gpio_dir(obj, direction);
-    switch (direction) {
-        case PIN_OUTPUT: pin_mode(pin, PullNone); break;
-        case PIN_INPUT : pin_mode(pin, PullDown); break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_NXP/TARGET_LPC15XX/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC15XX/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -81,7 +81,8 @@
     PullDown = 1,
     PullNone = 0,
     Repeater = 3,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 #define STDIO_UART_TX     USBTX
--- a/targets/hal/TARGET_NXP/TARGET_LPC15XX/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC15XX/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -33,7 +33,7 @@
     return (1UL << ((int)pin & 0x1f));
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if(pin == NC) return;
     
     obj->pin = pin;
@@ -45,12 +45,6 @@
     obj->reg_clr = &LPC_GPIO_PORT->CLR[port];
     obj->reg_in  = &LPC_GPIO_PORT->PIN[port];
     obj->reg_dir = &LPC_GPIO_PORT->DIR[port];
-    
-    gpio_dir(obj, direction);
-    switch (direction) {
-        case PIN_OUTPUT: pin_mode(pin, PullNone); break;
-        case PIN_INPUT : pin_mode(pin, PullDown); break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_NXP/TARGET_LPC176X/TARGET_MBED_LPC1768/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC176X/TARGET_MBED_LPC1768/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -112,7 +112,8 @@
     PullUp = 0,
     PullDown = 3,
     PullNone = 2,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 // version of PINCON_TypeDef using register arrays
--- a/targets/hal/TARGET_NXP/TARGET_LPC176X/TARGET_UBLOX_C027/platform_init.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC176X/TARGET_UBLOX_C027/platform_init.c	Mon Mar 10 11:30:07 2014 +0000
@@ -8,29 +8,19 @@
     gpio_t modemEn, modemRst, modemPwrOn, modemLvlOe, modemILvlOe, modemUsbDet;
     gpio_t gpsEn, gpsRst, led, modemRts;
     
-    gpio_init(&modemEn, MDMEN, PIN_OUTPUT);
-    gpio_init(&modemRst, MDMRST, PIN_OUTPUT);
-    gpio_init(&modemPwrOn, MDMPWRON, PIN_OUTPUT);
-    gpio_init(&modemLvlOe, MDMLVLOE, PIN_OUTPUT);
-    gpio_init(&modemILvlOe, MDMILVLOE, PIN_OUTPUT);
-    gpio_init(&modemUsbDet, MDMUSBDET, PIN_OUTPUT);
-    gpio_init(&gpsEn, GPSEN, PIN_OUTPUT);
-    gpio_init(&gpsRst, GPSRST, PIN_OUTPUT);
-    gpio_init(&led, LED, PIN_OUTPUT);
-    gpio_init(&modemRts, MDMRTS, PIN_OUTPUT);
-    
-    gpio_write(&led, 0);  			// LED1:   0=off
-    gpio_write(&modemRts, 0);		// RTS:    0=ready to send 
-    // we start with the gps disabled
-    gpio_write(&gpsEn, 0);  		// LDOEN:  1=on,0=off
-    gpio_write(&gpsRst, 0); 		// RESET:  0=reset,1=operating
-    // we start with the modem disabled
-    gpio_write(&modemLvlOe, 1);		// LVLEN:  1=disabled (uart/gpio)
-    gpio_write(&modemILvlOe, 0);  	// ILVLEN: 0=disabled (i2c)
-    gpio_write(&modemUsbDet, 0); 	// USBDET: 0=disabled
-    gpio_write(&modemPwrOn, 1);		// PWRON:  1=idle, 0=action
-    gpio_write(&modemEn, 0);  		// LDOEN:  1=on, 0=off
-    gpio_write(&modemRst, 0);  		// RESET:  0=reset, 1=operating
+    // start with modem disabled 
+    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_ex(&gpsEn,       GPSEN,     PullNone, 0);
+    gpio_init_out_ex(&gpsRst,      GPSRST,    PullNone, 1);
+    // led should be off
+    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 
--- a/targets/hal/TARGET_NXP/TARGET_LPC176X/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC176X/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -21,7 +21,7 @@
     return (1 << ((int)pin & 0x1F));
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if(pin == NC) return;
     
     obj->pin = pin;
@@ -32,12 +32,6 @@
     obj->reg_clr = &port_reg->FIOCLR;
     obj->reg_in  = &port_reg->FIOPIN;
     obj->reg_dir = &port_reg->FIODIR;
-    
-    gpio_dir(obj, direction);
-    switch (direction) {
-        case PIN_OUTPUT: pin_mode(pin, PullNone); break;
-        case PIN_INPUT : pin_mode(pin, PullDown); break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_NXP/TARGET_LPC176X/serial_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC176X/serial_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -76,7 +76,7 @@
 struct serial_global_data_s {
     uint32_t serial_irq_id;
     gpio_t sw_rts, sw_cts;
-    uint8_t count, rx_irq_set_flow, rx_irq_set_api;
+    uint8_t rx_irq_set_flow, rx_irq_set_api;
 };
 
 static struct serial_global_data_s uart_data[UART_NUM];
@@ -357,7 +357,6 @@
 void serial_putc(serial_t *obj, int c) {
     while (!serial_writable(obj));
     obj->uart->THR = c;
-    uart_data[obj->index].count++;    
 }
 
 int serial_readable(serial_t *obj) {
@@ -365,16 +364,10 @@
 }
 
 int serial_writable(serial_t *obj) {
-    int isWritable = 1;
     if (NC != uart_data[obj->index].sw_cts.pin)
-        isWritable = (gpio_read(&uart_data[obj->index].sw_cts) == 0) && (obj->uart->LSR & 0x40);
-    else {
-        if (obj->uart->LSR & 0x20)
-            uart_data[obj->index].count = 0;
-        else if (uart_data[obj->index].count >= 16)
-            isWritable = 0;
-    }
-    return isWritable;
+        return (gpio_read(&uart_data[obj->index].sw_cts) == 0) && (obj->uart->LSR & 0x40);  //If flow control: writable if CTS low + UART done
+    else
+        return obj->uart->LSR & 0x20;                                                       //No flow control: writable if space in holding register
 }
 
 void serial_clear(serial_t *obj) {
@@ -419,7 +412,7 @@
             pinmap_pinout(txflow, PinMap_UART_CTS);
         } else {
             // Can't enable in hardware, use software emulation
-            gpio_init(&uart_data[index].sw_cts, txflow, PIN_INPUT);
+            gpio_init_in(&uart_data[index].sw_cts, txflow);
         }
     }
     if (((FlowControlRTS == type) || (FlowControlRTSCTS == type)) && (NC != rxflow)) {
@@ -434,8 +427,7 @@
             uart1->MCR |= UART_MCR_RTSEN_MASK;
             pinmap_pinout(rxflow, PinMap_UART_RTS);
         } else { // can't enable in hardware, use software emulation
-            gpio_init(&uart_data[index].sw_rts, rxflow, PIN_OUTPUT);
-            gpio_write(&uart_data[index].sw_rts, 0);
+            gpio_init_out_ex(&uart_data[index].sw_rts, rxflow, 0);
             // Enable RX interrupt
             serial_flow_irq_set(obj, 1);
         }
--- a/targets/hal/TARGET_NXP/TARGET_LPC23XX/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC23XX/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -84,7 +84,8 @@
     PullUp = 0,
     PullDown = 3,
     PullNone = 2,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 // version of PINCON_TypeDef using register arrays
--- a/targets/hal/TARGET_NXP/TARGET_LPC23XX/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC23XX/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -24,7 +24,7 @@
     return (1 << ((int)pin & 0x1F));
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if (pin == NC) return;
     
     obj->pin = pin;
@@ -36,12 +36,6 @@
     obj->reg_clr = &port_reg->FIOCLR;
     obj->reg_in  = &port_reg->FIOPIN;
     obj->reg_dir = &port_reg->FIODIR;
-    
-    gpio_dir(obj, direction);
-    switch (direction) {
-        case PIN_OUTPUT: pin_mode(pin, PullNone); break;
-        case PIN_INPUT : pin_mode(pin, PullDown); break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_NXP/TARGET_LPC408X/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC408X/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -91,7 +91,8 @@
     PullUp = 2,
     PullDown = 1,
     PullNone = 0,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 
--- a/targets/hal/TARGET_NXP/TARGET_LPC408X/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC408X/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -21,7 +21,7 @@
     return (1 << ((int)pin & 0x1F));
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if (pin == NC) return;
     
     obj->pin = pin;
@@ -33,12 +33,6 @@
     obj->reg_clr = &port_reg->CLR;
     obj->reg_in  = &port_reg->PIN;
     obj->reg_dir = &port_reg->DIR;
-    
-    gpio_dir(obj, direction);
-    switch (direction) {
-        case PIN_OUTPUT: pin_mode(pin, PullNone); break;
-        case PIN_INPUT : pin_mode(pin, PullDown); break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_NXP/TARGET_LPC43XX/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC43XX/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -556,7 +556,8 @@
     PullDown = 3,
     PullNone = 2,
     Repeater = 1,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_NXP/TARGET_LPC43XX/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC43XX/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -28,7 +28,7 @@
     return (1 << ((int)pin & 0x1F));
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if (pin == NC) return;
     
     obj->pin = pin;
@@ -41,12 +41,6 @@
     obj->reg_clr = &port_reg->CLR[port];
     obj->reg_in  = &port_reg->PIN[port];
     obj->reg_dir = &port_reg->DIR[port];
-
-    gpio_dir(obj, direction);
-    switch (direction) {
-        case PIN_OUTPUT: pin_mode(pin, PullNone); break;
-        case PIN_INPUT : pin_mode(pin, PullDown); break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_NXP/TARGET_LPC81X/TARGET_LPC810/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC81X/TARGET_LPC810/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -62,7 +62,8 @@
     PullDown = 1,
     PullNone = 0,
     Repeater = 3,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 #define STDIO_UART_TX     USBTX
--- a/targets/hal/TARGET_NXP/TARGET_LPC81X/TARGET_LPC812/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC81X/TARGET_LPC812/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -88,7 +88,8 @@
     PullDown = 1,
     PullNone = 0,
     Repeater = 3,
-    OpenDrain = 4
+    OpenDrain = 4,
+    PullDefault = PullDown
 } PinMode;
 
 #define STDIO_UART_TX     USBTX
--- a/targets/hal/TARGET_NXP/TARGET_LPC81X/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_NXP/TARGET_LPC81X/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -39,7 +39,7 @@
     return (1 << ((int)pin & 0x1F));
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if(pin == NC) return;
     
     obj->pin = pin;
@@ -49,12 +49,6 @@
     obj->reg_clr = &LPC_GPIO_PORT->CLR0;
     obj->reg_in  = &LPC_GPIO_PORT->PIN0;
     obj->reg_dir = &LPC_GPIO_PORT->DIR0;
-    
-    gpio_dir(obj, direction);
-    switch (direction) {
-        case PIN_OUTPUT: pin_mode(pin, PullNone); break;
-        case PIN_INPUT : pin_mode(pin, PullDown); break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -166,7 +166,8 @@
     PullNone  = 0,
     PullUp    = 1,
     PullDown  = 2,
-    OpenDrain = 3
+    OpenDrain = 3,
+    PullDefault = PullNone
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -41,7 +41,7 @@
     return (uint32_t)(1 << ((uint32_t)pin & 0xF)); // Return the pin mask
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if (pin == NC) return;
 
     uint32_t port_index = STM_PORT(pin);
@@ -56,14 +56,6 @@
     obj->reg_in  = &gpio->IDR;
     obj->reg_set = &gpio->BSRR;
     obj->reg_clr = &gpio->BRR;
-  
-    // Configure GPIO
-    if (direction == PIN_OUTPUT) {
-        pin_function(pin, STM_PIN_DATA(GPIO_Mode_OUT, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF));
-    }
-    else { // PIN_INPUT
-        pin_function(pin, STM_PIN_DATA(GPIO_Mode_IN, 0, GPIO_PuPd_NOPULL, 0xFF));
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -156,7 +156,8 @@
     PullNone  = 0,
     PullUp    = 1,
     PullDown  = 2,
-    OpenDrain = 3
+    OpenDrain = 3,
+    PullDefault = PullNone
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -41,7 +41,7 @@
     return (uint32_t)(1 << ((uint32_t)pin & 0xF)); // Return the pin mask
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if (pin == NC) return;
 
     uint32_t port_index = STM_PORT(pin);
@@ -56,14 +56,6 @@
     obj->reg_in  = &gpio->IDR;
     obj->reg_set = &gpio->BSRR;
     obj->reg_clr = &gpio->BRR;
-  
-    // Configure GPIO
-    if (direction == PIN_OUTPUT) {
-        pin_function(pin, STM_PIN_DATA(GPIO_Mode_Out_PP, 0));
-    }
-    else { // PIN_INPUT
-        pin_function(pin, STM_PIN_DATA(GPIO_Mode_IN_FLOATING, 0));
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -168,7 +168,8 @@
     PullNone  = 0,
     PullUp    = 1,
     PullDown  = 2,
-    OpenDrain = 3
+    OpenDrain = 3,
+    PullDefault = PullNone
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -42,7 +42,7 @@
     return (uint32_t)(1 << ((uint32_t)pin & 0xF)); // Return the pin mask
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if (pin == NC) return;
 
     uint32_t port_index = STM_PORT(pin);
@@ -57,14 +57,6 @@
     obj->reg_in  = &gpio->IDR;
     obj->reg_set = &gpio->BSRRL;
     obj->reg_clr = &gpio->BSRRH;
-  
-    // Configure GPIO
-    if (direction == PIN_OUTPUT) {
-        pin_function(pin, STM_PIN_DATA(STM_MODE_OUTPUT_PP, GPIO_NOPULL, 0));
-    }
-    else { // PIN_INPUT
-        pin_function(pin, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -161,7 +161,8 @@
     PullNone  = 0,
     PullUp    = 1,
     PullDown  = 2,
-    OpenDrain = 3
+    OpenDrain = 3,
+    PullDefault = PullNone
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -41,7 +41,7 @@
     return (uint32_t)(1 << ((uint32_t)pin & 0xF)); // Return the pin mask
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if (pin == NC) return;
 
     uint32_t port_index = STM_PORT(pin);
@@ -56,14 +56,6 @@
     obj->reg_in  = &gpio->IDR;
     obj->reg_set = &gpio->BSRRL;
     obj->reg_clr = &gpio->BSRRH;
-  
-    // Configure GPIO
-    if (direction == PIN_OUTPUT) {
-        pin_function(pin, STM_PIN_DATA(GPIO_Mode_OUT, GPIO_OType_PP, GPIO_PuPd_NOPULL, 0xFF));
-    }
-    else { // PIN_INPUT
-        pin_function(pin, STM_PIN_DATA(GPIO_Mode_IN, 0, GPIO_PuPd_NOPULL, 0xFF));
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {
--- a/targets/hal/TARGET_STM/TARGET_STM32F4XX/PinNames.h	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_STM/TARGET_STM32F4XX/PinNames.h	Mon Mar 10 11:30:07 2014 +0000
@@ -51,7 +51,8 @@
     PullNone = 0,
     PullUp = 1,
     PullDown = 2,
-    OpenDrain = 3
+    OpenDrain = 3,
+    PullDefault = PullDown
 } PinMode;
 
 #ifdef __cplusplus
--- a/targets/hal/TARGET_STM/TARGET_STM32F4XX/gpio_api.c	Fri Mar 07 16:00:07 2014 +0000
+++ b/targets/hal/TARGET_STM/TARGET_STM32F4XX/gpio_api.c	Mon Mar 10 11:30:07 2014 +0000
@@ -26,7 +26,7 @@
     return 1 << ((uint32_t) pin & 0xF);
 }
 
-void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) {
+void gpio_init(gpio_t *obj, PinName pin) {
     if(pin == NC) return;
 
     obj->pin = pin;
@@ -39,14 +39,6 @@
     obj->reg_set = &port_reg->BSRRL;
     obj->reg_clr = &port_reg->BSRRH;
     obj->reg_in  = &port_reg->IDR;
-
-
-    gpio_dir(obj, direction);
-
-    switch (direction) {
-        case PIN_OUTPUT: pin_mode(pin, PullNone); break;
-        case PIN_INPUT : pin_mode(pin, PullDown); break;
-    }
 }
 
 void gpio_mode(gpio_t *obj, PinMode mode) {