From 3aff91c85c1c5bc9d2f783aa62826edb85ac908e Mon Sep 17 00:00:00 2001
From: Angus Gratton <gus@projectgus.com>
Date: Sat, 12 Sep 2015 16:20:05 +1000
Subject: [PATCH] Rename GPIO_CONF_PUSH_PULL to GPIO_CONF_OPEN_DRAIN

Seems I got the functionality of this bit inverted when
initially testing.

In testing it also seems open drain mode is ignored on some pins, which
still source current. Needs more investigation though (may be pullups
internal to the ESP modules or set by default in software.)

Relates to #45
---
 core/include/esp/gpio.h      | 10 ++++------
 core/include/esp/gpio_regs.h | 15 ++++++++++-----
 2 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/core/include/esp/gpio.h b/core/include/esp/gpio.h
index 679fff2..4f431f2 100644
--- a/core/include/esp/gpio.h
+++ b/core/include/esp/gpio.h
@@ -27,28 +27,26 @@ typedef enum {
 INLINED void gpio_enable(const uint8_t gpio_num, const gpio_direction_t direction)
 {
     uint32_t iomux_flags;
-    uint32_t ctrl_val;
 
     switch(direction) {
     case GPIO_INPUT:
         iomux_flags = 0;
-        ctrl_val = 0;
         break;
     case GPIO_OUTPUT:
         iomux_flags = IOMUX_PIN_OUTPUT_ENABLE;
-        ctrl_val = GPIO_CONF_PUSH_PULL;
         break;
     case GPIO_OUT_OPEN_DRAIN:
         iomux_flags = IOMUX_PIN_OUTPUT_ENABLE;
-        ctrl_val = 0;
         break;
     case GPIO_INPUT_PULLUP:
         iomux_flags = IOMUX_PIN_PULLUP;
-        ctrl_val = 0;
         break;
     }
     iomux_set_gpio_function(gpio_num, iomux_flags);
-    GPIO.CONF[gpio_num] = (GPIO.CONF[gpio_num] & FIELD_MASK(GPIO_CONF_INTTYPE)) | ctrl_val;
+    if(direction == GPIO_OUT_OPEN_DRAIN)
+        GPIO.CONF[gpio_num] |= GPIO_CONF_OPEN_DRAIN;
+    else
+        GPIO.CONF[gpio_num] &= ~GPIO_CONF_OPEN_DRAIN;
     if (iomux_flags & IOMUX_PIN_OUTPUT_ENABLE)
         GPIO.ENABLE_OUT_SET = BIT(gpio_num);
     else
diff --git a/core/include/esp/gpio_regs.h b/core/include/esp/gpio_regs.h
index 3d91efb..815e7c1 100644
--- a/core/include/esp/gpio_regs.h
+++ b/core/include/esp/gpio_regs.h
@@ -76,10 +76,15 @@ _Static_assert(sizeof(struct GPIO_REGS) == 0x74, "GPIO_REGS is the wrong size");
  *     Under what conditions this GPIO input should generate an interrupt.
  *     (see gpio_inttype_t enum below for values)
  *
- * GPIO_CONF_PUSH_PULL (boolean)
- *     When set, a high output state will pull the pin up to +Vcc (3.3V).  When
- *     cleared, output functions in "open drain" mode (low state will pull down
- *     to ground, but high state allows output to "float").
+ * GPIO_CONF_OPEN_DRAIN (boolean)
+ *     If this bit is set, the pin is in "open drain" mode - a high output state
+ *     will leave the pin floating but not source any current. If bit is cleared,
+ *     the pin is in push/pull mode so a high output state will drive the pin up
+ *     to +Vcc (3.3V).  In either case, a low output state will pull the pin down
+ *     to ground.
+ *
+ *     GPIO_CONF_OPEN_DRAIN does not appear to work on all pins.
+ *
  *
  * GPIO_CONF_SOURCE_PWM (boolean)
  *     When set, GPIO pin output will be connected to the sigma-delta PWM
@@ -93,7 +98,7 @@ _Static_assert(sizeof(struct GPIO_REGS) == 0x74, "GPIO_REGS is the wrong size");
 #define GPIO_CONF_WAKEUP_ENABLE  BIT(10)
 #define GPIO_CONF_INTTYPE_M      0x00000007
 #define GPIO_CONF_INTTYPE_S      7
-#define GPIO_CONF_PUSH_PULL      BIT(2)
+#define GPIO_CONF_OPEN_DRAIN     BIT(2)
 #define GPIO_CONF_SOURCE_PWM     BIT(0)
 
 /* Valid values for the GPIO_CONF_INTTYPE field */