Commit 136d16ad authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

Extend ESP8266 GPIO

parent 17a7c6d3
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -7,10 +7,22 @@ class GPIO {

	public:
		GPIO () {}

		enum Pin : unsigned char {
			d3 = 0, tx, d4, rx, d2, d1,
			d6 = 12, d7, d5, d8,
			d0 = 16
		};

		void setup();
		void led_on(unsigned char id);
		void led_off(unsigned char id);
		void led_toggle(unsigned char id);
		void input(unsigned char const pin);
		void input(unsigned char const pin, bool pullup);
		void output(unsigned char const pin);
		unsigned char read(unsigned char const pin);
		void write(unsigned char const pin, unsigned char value);
};

extern GPIO gpio;
+125 −3
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ void ICACHE_FLASH_ATTR GPIO::setup()
#endif
}

void ICACHE_FLASH_ATTR GPIO::led_on(unsigned char id)
void ICACHE_FLASH_ATTR GPIO::led_on(unsigned char const id)
{
#ifdef LED_ON_GPIO16
	if (id == 0) {
@@ -35,7 +35,7 @@ void ICACHE_FLASH_ATTR GPIO::led_on(unsigned char id)
#endif
}

void ICACHE_FLASH_ATTR GPIO::led_off(unsigned char id)
void ICACHE_FLASH_ATTR GPIO::led_off(unsigned char const id)
{
#ifdef LED_ON_GPIO16
	if (id == 0) {
@@ -48,7 +48,7 @@ void ICACHE_FLASH_ATTR GPIO::led_off(unsigned char id)
#endif
}

void ICACHE_FLASH_ATTR GPIO::led_toggle(unsigned char id)
void ICACHE_FLASH_ATTR GPIO::led_toggle(unsigned char const id)
{
#ifdef LED_ON_GPIO16
	if (id == 0) {
@@ -69,4 +69,126 @@ void ICACHE_FLASH_ATTR GPIO::led_toggle(unsigned char id)
#endif
}

void ICACHE_FLASH_ATTR GPIO::input(unsigned char const pin)
{
	if (pin == d0) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
	} else if (pin == tx) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
	} else if (pin == d4) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
	} else if (pin == rx) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_GPIO3);
	} else if (pin == d2) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
	} else if (pin == d1) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);
	} else if (pin == d6) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
	} else if (pin == d7) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
	} else if (pin == d5) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
	} else if (pin == d8) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
	} else if (pin == d0) {
		// TODO this sets it as output, not input
		WRITE_PERI_REG(PAD_XPD_DCDC_CONF, (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1);
		WRITE_PERI_REG(RTC_GPIO_CONF, (READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0);
		WRITE_PERI_REG(RTC_GPIO_ENABLE, (READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe) | (uint32)0x1);
	}
	if (pin < d0) {
		gpio_output_set(0, 0, 0, (1 << pin));
	}
}

void ICACHE_FLASH_ATTR GPIO::input(unsigned char const pin, bool pullup)
{
	if (pin == d0) {
		if (pullup) {
			PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);
		} else {
			PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO0_U);
		}
	} else if (pin == tx) {
		if (pullup) {
			PIN_PULLUP_EN(PERIPHS_IO_MUX_U0TXD_U);
		} else {
			PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);
		}
	} else if (pin == d4) {
		if (pullup) {
			PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO2_U);
		} else {
			PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO2_U);
		}
	} else if (pin == rx) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_GPIO3);
	} else if (pin == d2) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
	} else if (pin == d1) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);
	} else if (pin == d6) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
	} else if (pin == d7) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
	} else if (pin == d5) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
	} else if (pin == d8) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
	} else if (pin == d0) {
		// TODO this sets it as output, not input
		WRITE_PERI_REG(PAD_XPD_DCDC_CONF, (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1);
		WRITE_PERI_REG(RTC_GPIO_CONF, (READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0);
		WRITE_PERI_REG(RTC_GPIO_ENABLE, (READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe) | (uint32)0x1);
	}
	input(pin);
}

void ICACHE_FLASH_ATTR GPIO::output(unsigned char const pin)
{
	if (pin == d0) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
	} else if (pin == tx) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
	} else if (pin == d4) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
	} else if (pin == rx) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_GPIO3);
	} else if (pin == d2) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
	} else if (pin == d1) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);
	} else if (pin == d6) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
	} else if (pin == d7) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);
	} else if (pin == d5) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
	} else if (pin == d8) {
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);
	} else if (pin == d0) {
		WRITE_PERI_REG(PAD_XPD_DCDC_CONF, (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1);
		WRITE_PERI_REG(RTC_GPIO_CONF, (READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0);
		WRITE_PERI_REG(RTC_GPIO_ENABLE, (READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe) | (uint32)0x1);
	}
	if (pin < d0) {
		gpio_output_set(0, 0, (1 << pin), 0);
	}
}

unsigned char ICACHE_FLASH_ATTR GPIO::read(unsigned char const pin)
{
	return (gpio_input_get() & (1 << pin));
}

void ICACHE_FLASH_ATTR GPIO::write(unsigned char const pin, unsigned char value)
{
	if (value) {
		gpio_output_set(1 << pin, 0, 0, 0);
	} else {
		gpio_output_set(0, 1 << pin, 0, 0);
	}
}

GPIO gpio;