From 31a85397634222b867eb3e6b30c19052e7bb4eb7 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 5 Dec 2014 00:05:01 +0300 Subject: [PATCH] Open-drain output mode --- cores/esp8266/Arduino.h | 1 + cores/esp8266/core_esp8266_wiring_digital.c | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index ea0917c5e..c7291dada 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -40,6 +40,7 @@ void yield(void); #define INPUT 0x0 #define OUTPUT 0x1 #define INPUT_PULLUP 0x2 +#define OUTPUT_OPEN_DRAIN 0x4 #define PI 3.1415926535897932384626433832795 #define HALF_PI 1.5707963267948966192313216916398 diff --git a/cores/esp8266/core_esp8266_wiring_digital.c b/cores/esp8266/core_esp8266_wiring_digital.c index 0e075e56c..9db6f2f4e 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.c +++ b/cores/esp8266/core_esp8266_wiring_digital.c @@ -88,11 +88,20 @@ void pinMode(uint8_t pin, uint8_t mode) gpio_output_set(0, 0, 0, 1 << pin); PIN_PULLUP_EN(mux); } - else + else if (mode == OUPUT) { gpio_output_set(0, 0, 1 << pin, 0); } + else if (mode == OUTPUT_OPEN_DRAIN) + { + GPIO_REG_WRITE( + GPIO_PIN_ADDR(GPIO_ID_PIN(pin)), + GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(pin))) | + GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE) + ); + GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << pin)); + } } void digitalWrite(uint8_t pin, uint8_t val)