48 lines
1.5 KiB
C++
48 lines
1.5 KiB
C++
#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);
|
|
}
|