|
11 | 11 |
|
12 | 12 | void IRAM_ATTR esp_neopixel_write(uint8_t pin, uint8_t *pixels, uint32_t numBytes, uint8_t timing) {
|
13 | 13 | uint8_t *p, *end, pix, mask;
|
14 |
| - uint32_t t, time0, time1, period, c, startTime, pinMask; |
| 14 | + uint32_t t, time0, time1, period, c, startTime, pinMask, gpio_reg_set, gpio_reg_clear; |
15 | 15 |
|
16 |
| - pinMask = 1 << pin; |
| 16 | + if (pin < 32) { |
| 17 | + pinMask = 1 << pin; |
| 18 | + gpio_reg_set = GPIO_OUT_W1TS_REG; |
| 19 | + gpio_reg_clear = GPIO_OUT_W1TC_REG; |
| 20 | + } else { |
| 21 | + pinMask = 1 << (pin - 32); |
| 22 | + gpio_reg_set = GPIO_OUT1_W1TS_REG; |
| 23 | + gpio_reg_clear = GPIO_OUT1_W1TC_REG; |
| 24 | + } |
17 | 25 | p = pixels;
|
18 | 26 | end = p + numBytes;
|
19 | 27 | pix = *p++;
|
@@ -42,12 +50,12 @@ void IRAM_ATTR esp_neopixel_write(uint8_t pin, uint8_t *pixels, uint32_t numByte
|
42 | 50 | while (((c = mp_hal_ticks_cpu()) - startTime) < period) {
|
43 | 51 | ; // Wait for bit start
|
44 | 52 | }
|
45 |
| - GPIO_REG_WRITE(GPIO_OUT_W1TS_REG, pinMask); // Set high |
| 53 | + GPIO_REG_WRITE(gpio_reg_set, pinMask); // Set high |
46 | 54 | startTime = c; // Save start time
|
47 | 55 | while (((c = mp_hal_ticks_cpu()) - startTime) < t) {
|
48 | 56 | ; // Wait high duration
|
49 | 57 | }
|
50 |
| - GPIO_REG_WRITE(GPIO_OUT_W1TC_REG, pinMask); // Set low |
| 58 | + GPIO_REG_WRITE(gpio_reg_clear, pinMask); // Set low |
51 | 59 | if (!(mask >>= 1)) { // Next bit/byte
|
52 | 60 | if (p >= end) {
|
53 | 61 | break;
|
|
0 commit comments