From 7b565e8cb0c0ede581ada84c8320d7c712029ec1 Mon Sep 17 00:00:00 2001 From: Daniel Bridges Date: Sun, 30 May 2021 12:48:08 -0700 Subject: [PATCH] Disable interrupts before sending ws2812 data --- ws2812/ws2812_avr.go | 4 ++++ ws2812/ws2812_m0_16m.go | 3 +++ ws2812/ws2812_m0_48m.go | 3 +++ ws2812/ws2812_m4_120m.go | 3 +++ ws2812/ws2812_m4_64m.go | 3 +++ ws2812/ws2812_xtensa.go | 5 +++++ 6 files changed, 21 insertions(+) diff --git a/ws2812/ws2812_avr.go b/ws2812/ws2812_avr.go index f4a4929..1b506c2 100644 --- a/ws2812/ws2812_avr.go +++ b/ws2812/ws2812_avr.go @@ -7,6 +7,7 @@ package ws2812 import ( "device/avr" "machine" + "runtime/interrupt" ) // Send a single byte using the WS2812 protocol. @@ -17,6 +18,7 @@ func (d Device) WriteByte(c byte) error { // Probably this is about pointer registers, which are very limited on AVR. port, maskSet := d.Pin.PortMaskSet() _, maskClear := d.Pin.PortMaskClear() + mask := interrupt.Disable() switch machine.CPUFrequency() { case 16e6: // 16MHz @@ -51,8 +53,10 @@ func (d Device) WriteByte(c byte) error { "maskClear": maskClear, "portClear": port, }) + interrupt.Restore(mask) return nil default: + interrupt.Restore(mask) return errUnknownClockSpeed } } diff --git a/ws2812/ws2812_m0_16m.go b/ws2812/ws2812_m0_16m.go index 25a876d..d44e7a5 100644 --- a/ws2812/ws2812_m0_16m.go +++ b/ws2812/ws2812_m0_16m.go @@ -7,6 +7,7 @@ package ws2812 import ( "device/arm" + "runtime/interrupt" ) // Send a single byte using the WS2812 protocol. @@ -14,6 +15,7 @@ func (d Device) WriteByte(c byte) error { // For the Cortex-M0 at 16MHz portSet, maskSet := d.Pin.PortMaskSet() portClear, maskClear := d.Pin.PortMaskClear() + mask := interrupt.Disable() // See: // 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 { "maskClear": maskClear, "portClear": portClear, }) + interrupt.Restore(mask) return nil } diff --git a/ws2812/ws2812_m0_48m.go b/ws2812/ws2812_m0_48m.go index 71d0c7d..e42ab74 100644 --- a/ws2812/ws2812_m0_48m.go +++ b/ws2812/ws2812_m0_48m.go @@ -7,6 +7,7 @@ package ws2812 import ( "device/arm" + "runtime/interrupt" ) // Send a single byte using the WS2812 protocol. @@ -14,6 +15,7 @@ func (d Device) WriteByte(c byte) error { // For the Cortex-M0 at 48MHz portSet, maskSet := d.Pin.PortMaskSet() portClear, maskClear := d.Pin.PortMaskClear() + mask := interrupt.Disable() // See: // 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 { "maskClear": maskClear, "portClear": portClear, }) + interrupt.Restore(mask) return nil } diff --git a/ws2812/ws2812_m4_120m.go b/ws2812/ws2812_m4_120m.go index 6001289..ec87297 100644 --- a/ws2812/ws2812_m4_120m.go +++ b/ws2812/ws2812_m4_120m.go @@ -8,6 +8,7 @@ package ws2812 import ( "device/arm" + "runtime/interrupt" ) // Send a single byte using the WS2812 protocol. @@ -15,6 +16,7 @@ func (d Device) WriteByte(c byte) error { // For the Cortex-M4 at 120MHz portSet, maskSet := d.Pin.PortMaskSet() portClear, maskClear := d.Pin.PortMaskClear() + mask := interrupt.Disable() // See: // 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 { "maskClear": maskClear, "portClear": portClear, }) + interrupt.Restore(mask) return nil } diff --git a/ws2812/ws2812_m4_64m.go b/ws2812/ws2812_m4_64m.go index b363a3a..1f55d36 100644 --- a/ws2812/ws2812_m4_64m.go +++ b/ws2812/ws2812_m4_64m.go @@ -7,6 +7,7 @@ package ws2812 import ( "device/arm" + "runtime/interrupt" ) // Send a single byte using the WS2812 protocol. @@ -14,6 +15,7 @@ func (d Device) WriteByte(c byte) error { // For the Cortex-M4 at 64MHz portSet, maskSet := d.Pin.PortMaskSet() portClear, maskClear := d.Pin.PortMaskClear() + mask := interrupt.Disable() // See: // 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 { "maskClear": maskClear, "portClear": portClear, }) + interrupt.Restore(mask) return nil } diff --git a/ws2812/ws2812_xtensa.go b/ws2812/ws2812_xtensa.go index 72f93a4..ac2a881 100644 --- a/ws2812/ws2812_xtensa.go +++ b/ws2812/ws2812_xtensa.go @@ -5,12 +5,14 @@ package ws2812 import ( "device" "machine" + "runtime/interrupt" "unsafe" ) func (d Device) WriteByte(c byte) error { portSet, maskSet := d.Pin.PortMaskSet() portClear, maskClear := d.Pin.PortMaskClear() + mask := interrupt.Disable() switch machine.CPUFrequency() { case 160e6: // 160MHz @@ -220,6 +222,7 @@ func (d Device) WriteByte(c byte) error { "maskClear": maskClear, "portClear": uintptr(unsafe.Pointer(portClear)), }) + interrupt.Restore(mask) return nil case 80e6: // 80MHz // See docs for 160MHz. @@ -336,8 +339,10 @@ func (d Device) WriteByte(c byte) error { "maskClear": maskClear, "portClear": uintptr(unsafe.Pointer(portClear)), }) + interrupt.Restore(mask) return nil default: + interrupt.Restore(mask) return errUnknownClockSpeed } }