mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	[esp8266] fix isr pin (#8981)
Co-authored-by: Samuel Sieb <samuel@sieb.net>
This commit is contained in:
		| @@ -40,6 +40,7 @@ struct ISRPinArg { | |||||||
|   volatile uint32_t *mode_set_reg; |   volatile uint32_t *mode_set_reg; | ||||||
|   volatile uint32_t *mode_clr_reg; |   volatile uint32_t *mode_clr_reg; | ||||||
|   volatile uint32_t *func_reg; |   volatile uint32_t *func_reg; | ||||||
|  |   volatile uint32_t *control_reg; | ||||||
|   uint32_t mask; |   uint32_t mask; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -54,6 +55,7 @@ ISRInternalGPIOPin ESP8266GPIOPin::to_isr() const { | |||||||
|     arg->mode_set_reg = &GPES; |     arg->mode_set_reg = &GPES; | ||||||
|     arg->mode_clr_reg = &GPEC; |     arg->mode_clr_reg = &GPEC; | ||||||
|     arg->func_reg = &GPF(this->pin_); |     arg->func_reg = &GPF(this->pin_); | ||||||
|  |     arg->control_reg = &GPC(this->pin_); | ||||||
|     arg->mask = 1 << this->pin_; |     arg->mask = 1 << this->pin_; | ||||||
|   } else { |   } else { | ||||||
|     arg->in_reg = &GP16I; |     arg->in_reg = &GP16I; | ||||||
| @@ -62,6 +64,7 @@ ISRInternalGPIOPin ESP8266GPIOPin::to_isr() const { | |||||||
|     arg->mode_set_reg = &GP16E; |     arg->mode_set_reg = &GP16E; | ||||||
|     arg->mode_clr_reg = nullptr; |     arg->mode_clr_reg = nullptr; | ||||||
|     arg->func_reg = &GPF16; |     arg->func_reg = &GPF16; | ||||||
|  |     arg->control_reg = nullptr; | ||||||
|     arg->mask = 1; |     arg->mask = 1; | ||||||
|   } |   } | ||||||
|   return ISRInternalGPIOPin((void *) arg); |   return ISRInternalGPIOPin((void *) arg); | ||||||
| @@ -143,11 +146,17 @@ void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) { | |||||||
|   if (arg->pin < 16) { |   if (arg->pin < 16) { | ||||||
|     if (flags & gpio::FLAG_OUTPUT) { |     if (flags & gpio::FLAG_OUTPUT) { | ||||||
|       *arg->mode_set_reg = arg->mask; |       *arg->mode_set_reg = arg->mask; | ||||||
|  |       if (flags & gpio::FLAG_OPEN_DRAIN) { | ||||||
|  |         *arg->control_reg |= 1 << GPCD; | ||||||
|       } else { |       } else { | ||||||
|  |         *arg->control_reg &= ~(1 << GPCD); | ||||||
|  |       } | ||||||
|  |     } else if (flags & gpio::FLAG_INPUT) { | ||||||
|       *arg->mode_clr_reg = arg->mask; |       *arg->mode_clr_reg = arg->mask; | ||||||
|     } |     } | ||||||
|     if (flags & gpio::FLAG_PULLUP) { |     if (flags & gpio::FLAG_PULLUP) { | ||||||
|       *arg->func_reg |= 1 << GPFPU; |       *arg->func_reg |= 1 << GPFPU; | ||||||
|  |       *arg->control_reg |= 1 << GPCD; | ||||||
|     } else { |     } else { | ||||||
|       *arg->func_reg &= ~(1 << GPFPU); |       *arg->func_reg &= ~(1 << GPFPU); | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user