forked from Makuna/NeoPixelBus
Support for GPIO16 on ESP8266 (#557)
* Support for GPIO16 on ESP8266 * Seperate functions for pin16 on esp8266
This commit is contained in:
@@ -96,6 +96,61 @@ void IRAM_ATTR NeoEspBitBangBase_send_pixels(uint8_t* pixels, uint8_t* end, uint
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
|
void IRAM_ATTR NeoEspBitBangBase_send_pixels_pin16(uint8_t *pixels, uint8_t *end, uint32_t t0h, uint32_t t1h, uint32_t period)
|
||||||
|
{
|
||||||
|
uint8_t mask = 0x80;
|
||||||
|
uint8_t subpix = *pixels++;
|
||||||
|
uint32_t cyclesStart = 0; // trigger emediately
|
||||||
|
uint32_t cyclesNext = 0;
|
||||||
|
|
||||||
|
// reading and writing RTC_GPIO_OUT is too slow inside the loop
|
||||||
|
uint32_t gpio_clear = (READ_PERI_REG(RTC_GPIO_OUT) & (uint32)0xfffffffe);
|
||||||
|
uint32_t gpio_set = gpio_clear | 1;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
// do the checks here while we are waiting on time to pass
|
||||||
|
uint32_t cyclesBit = t0h;
|
||||||
|
if (subpix & mask)
|
||||||
|
{
|
||||||
|
cyclesBit = t1h;
|
||||||
|
}
|
||||||
|
|
||||||
|
// after we have done as much work as needed for this next bit
|
||||||
|
// now wait for the HIGH
|
||||||
|
while (((cyclesStart = getCycleCount()) - cyclesNext) < period);
|
||||||
|
|
||||||
|
// set pin state
|
||||||
|
WRITE_PERI_REG(RTC_GPIO_OUT, gpio_set);
|
||||||
|
|
||||||
|
// wait for the LOW
|
||||||
|
while ((getCycleCount() - cyclesStart) < cyclesBit);
|
||||||
|
|
||||||
|
// reset pin start
|
||||||
|
WRITE_PERI_REG(RTC_GPIO_OUT, gpio_clear);
|
||||||
|
|
||||||
|
cyclesNext = cyclesStart;
|
||||||
|
|
||||||
|
// next bit
|
||||||
|
mask >>= 1;
|
||||||
|
if (mask == 0)
|
||||||
|
{
|
||||||
|
// no more bits to send in this byte
|
||||||
|
// check for another byte
|
||||||
|
if (pixels >= end)
|
||||||
|
{
|
||||||
|
// no more bytes to send so stop
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// reset mask to first bit and get the next byte
|
||||||
|
mask = 0x80;
|
||||||
|
subpix = *pixels++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // defined(ARDUINO_ARCH_ESP8266)
|
||||||
|
|
||||||
void IRAM_ATTR NeoEspBitBangBase_send_pixels_inv(uint8_t* pixels, uint8_t* end, uint8_t pin, uint32_t t0h, uint32_t t1h, uint32_t period)
|
void IRAM_ATTR NeoEspBitBangBase_send_pixels_inv(uint8_t* pixels, uint8_t* end, uint8_t pin, uint32_t t0h, uint32_t t1h, uint32_t period)
|
||||||
{
|
{
|
||||||
const uint32_t pinRegister = _BV(pin);
|
const uint32_t pinRegister = _BV(pin);
|
||||||
@@ -104,6 +159,21 @@ void IRAM_ATTR NeoEspBitBangBase_send_pixels_inv(uint8_t* pixels, uint8_t* end,
|
|||||||
uint32_t cyclesStart = 0; // trigger emediately
|
uint32_t cyclesStart = 0; // trigger emediately
|
||||||
uint32_t cyclesNext = 0;
|
uint32_t cyclesNext = 0;
|
||||||
|
|
||||||
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
|
// compensation for if (pin == ...)
|
||||||
|
t0h -= 3;
|
||||||
|
t1h -= 3;
|
||||||
|
|
||||||
|
uint32_t gpio_clear = 0;
|
||||||
|
uint32_t gpio_set = 0;
|
||||||
|
if (pin == 16)
|
||||||
|
{
|
||||||
|
// reading and writing RTC_GPIO_OUT is too slow inside the loop
|
||||||
|
gpio_clear = (READ_PERI_REG(RTC_GPIO_OUT) & (uint32)0xfffffffe);
|
||||||
|
gpio_set = gpio_clear | 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
// do the checks here while we are waiting on time to pass
|
// do the checks here while we are waiting on time to pass
|
||||||
@@ -154,5 +224,59 @@ void IRAM_ATTR NeoEspBitBangBase_send_pixels_inv(uint8_t* pixels, uint8_t* end,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
|
void IRAM_ATTR NeoEspBitBangBase_send_pixels_inv_pin16(uint8_t *pixels, uint8_t *end, uint32_t t0h, uint32_t t1h, uint32_t period)
|
||||||
|
{
|
||||||
|
uint8_t mask = 0x80;
|
||||||
|
uint8_t subpix = *pixels++;
|
||||||
|
uint32_t cyclesStart = 0; // trigger emediately
|
||||||
|
uint32_t cyclesNext = 0;
|
||||||
|
|
||||||
|
// reading and writing RTC_GPIO_OUT is too slow inside the loop
|
||||||
|
uint32_t gpio_clear = (READ_PERI_REG(RTC_GPIO_OUT) & (uint32)0xfffffffe);
|
||||||
|
uint32_t gpio_set = gpio_clear | 1;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
// do the checks here while we are waiting on time to pass
|
||||||
|
uint32_t cyclesBit = t0h;
|
||||||
|
if (subpix & mask)
|
||||||
|
{
|
||||||
|
cyclesBit = t1h;
|
||||||
|
}
|
||||||
|
|
||||||
|
// after we have done as much work as needed for this next bit
|
||||||
|
// now wait for the HIGH
|
||||||
|
while (((cyclesStart = getCycleCount()) - cyclesNext) < period);
|
||||||
|
|
||||||
|
// set pin state
|
||||||
|
WRITE_PERI_REG(RTC_GPIO_OUT, gpio_clear);
|
||||||
|
|
||||||
|
// wait for the LOW
|
||||||
|
while ((getCycleCount() - cyclesStart) < cyclesBit);
|
||||||
|
|
||||||
|
// reset pin start
|
||||||
|
WRITE_PERI_REG(RTC_GPIO_OUT, gpio_set);
|
||||||
|
|
||||||
|
cyclesNext = cyclesStart;
|
||||||
|
|
||||||
|
// next bit
|
||||||
|
mask >>= 1;
|
||||||
|
if (mask == 0)
|
||||||
|
{
|
||||||
|
// no more bits to send in this byte
|
||||||
|
// check for another byte
|
||||||
|
if (pixels >= end)
|
||||||
|
{
|
||||||
|
// no more bytes to send so stop
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// reset mask to first bit and get the next byte
|
||||||
|
mask = 0x80;
|
||||||
|
subpix = *pixels++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // defined(ARDUINO_ARCH_ESP8266)
|
||||||
#endif // !defined(CONFIG_IDF_TARGET_ESP32C3)
|
#endif // !defined(CONFIG_IDF_TARGET_ESP32C3)
|
||||||
#endif // defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
|
#endif // defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
|
||||||
|
@@ -86,7 +86,11 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern void NeoEspBitBangBase_send_pixels(uint8_t* pixels, uint8_t* end, uint8_t pin, uint32_t t0h, uint32_t t1h, uint32_t period);
|
extern void NeoEspBitBangBase_send_pixels(uint8_t* pixels, uint8_t* end, uint8_t pin, uint32_t t0h, uint32_t t1h, uint32_t period);
|
||||||
extern void NeoEspBitBangBase_send_pixels_inv(uint8_t* pixels, uint8_t* end, uint8_t pin, uint32_t t0h, uint32_t t1h, uint32_t period);
|
extern void NeoEspBitBangBase_send_pixels_inv(uint8_t *pixels, uint8_t *end, uint8_t pin, uint32_t t0h, uint32_t t1h, uint32_t period);
|
||||||
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
|
extern void NeoEspBitBangBase_send_pixels_pin16(uint8_t *pixels, uint8_t *end, uint32_t t0h, uint32_t t1h, uint32_t period);
|
||||||
|
extern void NeoEspBitBangBase_send_pixels_inv_pin16(uint8_t *pixels, uint8_t *end, uint32_t t0h, uint32_t t1h, uint32_t period);
|
||||||
|
#endif
|
||||||
|
|
||||||
class NeoEspPinset
|
class NeoEspPinset
|
||||||
{
|
{
|
||||||
@@ -95,7 +99,14 @@ public:
|
|||||||
|
|
||||||
inline static void send_pixels_impl(uint8_t* pixels, uint8_t* end, uint8_t pin, uint32_t t0h, uint32_t t1h, uint32_t period)
|
inline static void send_pixels_impl(uint8_t* pixels, uint8_t* end, uint8_t pin, uint32_t t0h, uint32_t t1h, uint32_t period)
|
||||||
{
|
{
|
||||||
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
|
if (pin == 16)
|
||||||
|
NeoEspBitBangBase_send_pixels_pin16(pixels, end, t0h, t1h, period);
|
||||||
|
else
|
||||||
|
NeoEspBitBangBase_send_pixels(pixels, end, pin, t0h, t1h, period);
|
||||||
|
#else
|
||||||
NeoEspBitBangBase_send_pixels(pixels, end, pin, t0h, t1h, period);
|
NeoEspBitBangBase_send_pixels(pixels, end, pin, t0h, t1h, period);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -106,7 +117,14 @@ public:
|
|||||||
|
|
||||||
inline static void send_pixels_impl(uint8_t* pixels, uint8_t* end, uint8_t pin, uint32_t t0h, uint32_t t1h, uint32_t period)
|
inline static void send_pixels_impl(uint8_t* pixels, uint8_t* end, uint8_t pin, uint32_t t0h, uint32_t t1h, uint32_t period)
|
||||||
{
|
{
|
||||||
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
|
if (pin == 16)
|
||||||
|
NeoEspBitBangBase_send_pixels_inv_pin16(pixels, end, t0h, t1h, period);
|
||||||
|
else
|
||||||
|
NeoEspBitBangBase_send_pixels_inv(pixels, end, pin, t0h, t1h, period);
|
||||||
|
#else
|
||||||
NeoEspBitBangBase_send_pixels_inv(pixels, end, pin, t0h, t1h, period);
|
NeoEspBitBangBase_send_pixels_inv(pixels, end, pin, t0h, t1h, period);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user