diff --git a/cores/esp8266/core_esp8266_wiring_digital.c b/cores/esp8266/core_esp8266_wiring_digital.c index 33fbe8c49..b61901bbb 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.c +++ b/cores/esp8266/core_esp8266_wiring_digital.c @@ -59,13 +59,17 @@ extern void __pinMode(uint8_t pin, uint8_t mode) { GPF(pin) = GPFFS(GPFFS_GPIO(pin));//Set mode to GPIO GPC(pin) = (GPC(pin) & (0xF << GPCI)); //SOURCE(GPIO) | DRIVER(NORMAL) | INT_TYPE(UNCHANGED) | WAKEUP_ENABLE(DISABLED) GPES = (1 << pin); //Enable - } else if(mode == INPUT || mode == INPUT_PULLUP){ + } else if(mode == INPUT || mode == INPUT_PULLUP || mode == INPUT_PULLDOWN){ GPF(pin) = GPFFS(GPFFS_GPIO(pin));//Set mode to GPIO GPC(pin) = (GPC(pin) & (0xF << GPCI)) | (1 << GPCD); //SOURCE(GPIO) | DRIVER(OPEN_DRAIN) | INT_TYPE(UNCHANGED) | WAKEUP_ENABLE(DISABLED) GPEC = (1 << pin); //Disable - if(mode == INPUT_PULLUP){ - GPF(pin) |= (1 << GPFPU);//Enable Pullup - } + if(mode == INPUT_PULLUP) { + GPF(pin) &= ~(1 << GPFPD); // Disable Pulldown + GPF(pin) |= (1 << GPFPU); // Enable Pullup + } else if(mode == INPUT_PULLDOWN) { + GPF(pin) &= ~(1 << GPFPU); // Disable Pullup + GPF(pin) |= (1 << GPFPD); // Enable Pulldown + } } } else if(pin == 16){ GPF16 = GP16FFS(GPFFS_GPIO(pin));//Set mode to GPIO diff --git a/cores/esp8266/esp8266_peri.h b/cores/esp8266/esp8266_peri.h index f905d34b3..8b92a07f5 100644 --- a/cores/esp8266/esp8266_peri.h +++ b/cores/esp8266/esp8266_peri.h @@ -93,9 +93,11 @@ static uint8_t esp8266_gpioToFn[16] = {0x34, 0x18, 0x38, 0x14, 0x3C, 0x40, 0x1C, //GPIO (0-15) PIN Function Bits #define GPFSOE 0 //Sleep OE #define GPFSS 1 //Sleep Sel +#define GPFSPD 2 //Sleep Pulldown #define GPFSPU 3 //Sleep Pullup #define GPFFS0 4 //Function Select bit 0 #define GPFFS1 5 //Function Select bit 1 +#define GPFPD 6 //Pulldown #define GPFPU 7 //Pullup #define GPFFS2 8 //Function Select bit 2 #define GPFFS(f) (((((f) & 4) != 0) << GPFFS2) | ((((f) & 2) != 0) << GPFFS1) | ((((f) & 1) != 0) << GPFFS0))