#include "gpio_funcs.h" void gpioStatusEsp8266() { volatile u32_t *gpio_out = (volatile u32_t*)0x60000300; volatile u32_t *gpio_ena = (volatile u32_t*)0x6000030C; volatile u32_t *gpio_in = (volatile u32_t*)0x60000318; for (int i = 0; i < NUM_DIGITAL_PINS; i++) { int bit = 1 << i; Serial.printf(" D%d dir=%s in=%s strap=%s out=%s\n", i, (*gpio_ena & bit) ? "OUTPUT" : "INPUT", (*gpio_in & bit) ? "HIGH" : "LOW", (*gpio_in & (bit << 16)) ? "HIGH" : "LOW", (*gpio_out & bit) ? "HIGH" : "LOW" ); } } void gpioScanArduino() { for (int i = 0; i < NUM_DIGITAL_PINS; i++) { int mode = getPinMode(i); Serial.printf(" D%d dir=%s read=%s\n", i, (mode==OUTPUT) ? "OUTPUT" : (mode==INPUT_PULLUP ? "INPUT_PULLUP" : "INPUT"), digitalRead(i) ? "HIGH" : "LOW"); } } void gpioScan() { #ifdef ESP8266 gpioStatusEsp8266(); #else gpioScanArduino(); #endif } int getPinMode(int pin) { uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile auto *reg = portModeRegister(port); volatile auto *out = portOutputRegister(port); volatile auto *in = portInputRegister(port); // Serial.printf("d=%d mask=%02x mode=%04x|%d out=%04x|%d in=%04x|%d\n", pin, bit, *reg, (*reg&bit), *out, (*out&bit), *in, (*in&bit)); if (*reg & bit) return (OUTPUT); return ((*out & bit) ? INPUT_PULLUP : INPUT); }