Skip to content

Commit 7b565e8

Browse files
dbridgesdeadprogram
authored andcommitted
Disable interrupts before sending ws2812 data
1 parent 5645eb3 commit 7b565e8

File tree

6 files changed

+21
-0
lines changed

6 files changed

+21
-0
lines changed

ws2812/ws2812_avr.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package ws2812
77
import (
88
"device/avr"
99
"machine"
10+
"runtime/interrupt"
1011
)
1112

1213
// Send a single byte using the WS2812 protocol.
@@ -17,6 +18,7 @@ func (d Device) WriteByte(c byte) error {
1718
// Probably this is about pointer registers, which are very limited on AVR.
1819
port, maskSet := d.Pin.PortMaskSet()
1920
_, maskClear := d.Pin.PortMaskClear()
21+
mask := interrupt.Disable()
2022

2123
switch machine.CPUFrequency() {
2224
case 16e6: // 16MHz
@@ -51,8 +53,10 @@ func (d Device) WriteByte(c byte) error {
5153
"maskClear": maskClear,
5254
"portClear": port,
5355
})
56+
interrupt.Restore(mask)
5457
return nil
5558
default:
59+
interrupt.Restore(mask)
5660
return errUnknownClockSpeed
5761
}
5862
}

ws2812/ws2812_m0_16m.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ package ws2812
77

88
import (
99
"device/arm"
10+
"runtime/interrupt"
1011
)
1112

1213
// Send a single byte using the WS2812 protocol.
1314
func (d Device) WriteByte(c byte) error {
1415
// For the Cortex-M0 at 16MHz
1516
portSet, maskSet := d.Pin.PortMaskSet()
1617
portClear, maskClear := d.Pin.PortMaskClear()
18+
mask := interrupt.Disable()
1719

1820
// See:
1921
// https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
@@ -48,5 +50,6 @@ func (d Device) WriteByte(c byte) error {
4850
"maskClear": maskClear,
4951
"portClear": portClear,
5052
})
53+
interrupt.Restore(mask)
5154
return nil
5255
}

ws2812/ws2812_m0_48m.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ package ws2812
77

88
import (
99
"device/arm"
10+
"runtime/interrupt"
1011
)
1112

1213
// Send a single byte using the WS2812 protocol.
1314
func (d Device) WriteByte(c byte) error {
1415
// For the Cortex-M0 at 48MHz
1516
portSet, maskSet := d.Pin.PortMaskSet()
1617
portClear, maskClear := d.Pin.PortMaskClear()
18+
mask := interrupt.Disable()
1719

1820
// See:
1921
// https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
@@ -77,5 +79,6 @@ func (d Device) WriteByte(c byte) error {
7779
"maskClear": maskClear,
7880
"portClear": portClear,
7981
})
82+
interrupt.Restore(mask)
8083
return nil
8184
}

ws2812/ws2812_m4_120m.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ package ws2812
88

99
import (
1010
"device/arm"
11+
"runtime/interrupt"
1112
)
1213

1314
// Send a single byte using the WS2812 protocol.
1415
func (d Device) WriteByte(c byte) error {
1516
// For the Cortex-M4 at 120MHz
1617
portSet, maskSet := d.Pin.PortMaskSet()
1718
portClear, maskClear := d.Pin.PortMaskClear()
19+
mask := interrupt.Disable()
1820

1921
// See:
2022
// https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
@@ -169,5 +171,6 @@ func (d Device) WriteByte(c byte) error {
169171
"maskClear": maskClear,
170172
"portClear": portClear,
171173
})
174+
interrupt.Restore(mask)
172175
return nil
173176
}

ws2812/ws2812_m4_64m.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ package ws2812
77

88
import (
99
"device/arm"
10+
"runtime/interrupt"
1011
)
1112

1213
// Send a single byte using the WS2812 protocol.
1314
func (d Device) WriteByte(c byte) error {
1415
// For the Cortex-M4 at 64MHz
1516
portSet, maskSet := d.Pin.PortMaskSet()
1617
portClear, maskClear := d.Pin.PortMaskClear()
18+
mask := interrupt.Disable()
1719

1820
// See:
1921
// https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
@@ -106,5 +108,6 @@ func (d Device) WriteByte(c byte) error {
106108
"maskClear": maskClear,
107109
"portClear": portClear,
108110
})
111+
interrupt.Restore(mask)
109112
return nil
110113
}

ws2812/ws2812_xtensa.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ package ws2812
55
import (
66
"device"
77
"machine"
8+
"runtime/interrupt"
89
"unsafe"
910
)
1011

1112
func (d Device) WriteByte(c byte) error {
1213
portSet, maskSet := d.Pin.PortMaskSet()
1314
portClear, maskClear := d.Pin.PortMaskClear()
15+
mask := interrupt.Disable()
1416

1517
switch machine.CPUFrequency() {
1618
case 160e6: // 160MHz
@@ -220,6 +222,7 @@ func (d Device) WriteByte(c byte) error {
220222
"maskClear": maskClear,
221223
"portClear": uintptr(unsafe.Pointer(portClear)),
222224
})
225+
interrupt.Restore(mask)
223226
return nil
224227
case 80e6: // 80MHz
225228
// See docs for 160MHz.
@@ -336,8 +339,10 @@ func (d Device) WriteByte(c byte) error {
336339
"maskClear": maskClear,
337340
"portClear": uintptr(unsafe.Pointer(portClear)),
338341
})
342+
interrupt.Restore(mask)
339343
return nil
340344
default:
345+
interrupt.Restore(mask)
341346
return errUnknownClockSpeed
342347
}
343348
}

0 commit comments

Comments
 (0)