mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-19 06:03:57 +00:00
Disable interrupts before sending ws2812 data
This commit is contained in:
committed by
Ron Evans
parent
5645eb3f91
commit
7b565e8cb0
@@ -7,6 +7,7 @@ package ws2812
|
|||||||
import (
|
import (
|
||||||
"device/avr"
|
"device/avr"
|
||||||
"machine"
|
"machine"
|
||||||
|
"runtime/interrupt"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Send a single byte using the WS2812 protocol.
|
// 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.
|
// Probably this is about pointer registers, which are very limited on AVR.
|
||||||
port, maskSet := d.Pin.PortMaskSet()
|
port, maskSet := d.Pin.PortMaskSet()
|
||||||
_, maskClear := d.Pin.PortMaskClear()
|
_, maskClear := d.Pin.PortMaskClear()
|
||||||
|
mask := interrupt.Disable()
|
||||||
|
|
||||||
switch machine.CPUFrequency() {
|
switch machine.CPUFrequency() {
|
||||||
case 16e6: // 16MHz
|
case 16e6: // 16MHz
|
||||||
@@ -51,8 +53,10 @@ func (d Device) WriteByte(c byte) error {
|
|||||||
"maskClear": maskClear,
|
"maskClear": maskClear,
|
||||||
"portClear": port,
|
"portClear": port,
|
||||||
})
|
})
|
||||||
|
interrupt.Restore(mask)
|
||||||
return nil
|
return nil
|
||||||
default:
|
default:
|
||||||
|
interrupt.Restore(mask)
|
||||||
return errUnknownClockSpeed
|
return errUnknownClockSpeed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ package ws2812
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"device/arm"
|
"device/arm"
|
||||||
|
"runtime/interrupt"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Send a single byte using the WS2812 protocol.
|
// 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
|
// For the Cortex-M0 at 16MHz
|
||||||
portSet, maskSet := d.Pin.PortMaskSet()
|
portSet, maskSet := d.Pin.PortMaskSet()
|
||||||
portClear, maskClear := d.Pin.PortMaskClear()
|
portClear, maskClear := d.Pin.PortMaskClear()
|
||||||
|
mask := interrupt.Disable()
|
||||||
|
|
||||||
// See:
|
// See:
|
||||||
// https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
|
// 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,
|
"maskClear": maskClear,
|
||||||
"portClear": portClear,
|
"portClear": portClear,
|
||||||
})
|
})
|
||||||
|
interrupt.Restore(mask)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ package ws2812
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"device/arm"
|
"device/arm"
|
||||||
|
"runtime/interrupt"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Send a single byte using the WS2812 protocol.
|
// 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
|
// For the Cortex-M0 at 48MHz
|
||||||
portSet, maskSet := d.Pin.PortMaskSet()
|
portSet, maskSet := d.Pin.PortMaskSet()
|
||||||
portClear, maskClear := d.Pin.PortMaskClear()
|
portClear, maskClear := d.Pin.PortMaskClear()
|
||||||
|
mask := interrupt.Disable()
|
||||||
|
|
||||||
// See:
|
// See:
|
||||||
// https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
|
// 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,
|
"maskClear": maskClear,
|
||||||
"portClear": portClear,
|
"portClear": portClear,
|
||||||
})
|
})
|
||||||
|
interrupt.Restore(mask)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ package ws2812
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"device/arm"
|
"device/arm"
|
||||||
|
"runtime/interrupt"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Send a single byte using the WS2812 protocol.
|
// 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
|
// For the Cortex-M4 at 120MHz
|
||||||
portSet, maskSet := d.Pin.PortMaskSet()
|
portSet, maskSet := d.Pin.PortMaskSet()
|
||||||
portClear, maskClear := d.Pin.PortMaskClear()
|
portClear, maskClear := d.Pin.PortMaskClear()
|
||||||
|
mask := interrupt.Disable()
|
||||||
|
|
||||||
// See:
|
// See:
|
||||||
// https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
|
// 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,
|
"maskClear": maskClear,
|
||||||
"portClear": portClear,
|
"portClear": portClear,
|
||||||
})
|
})
|
||||||
|
interrupt.Restore(mask)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ package ws2812
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"device/arm"
|
"device/arm"
|
||||||
|
"runtime/interrupt"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Send a single byte using the WS2812 protocol.
|
// 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
|
// For the Cortex-M4 at 64MHz
|
||||||
portSet, maskSet := d.Pin.PortMaskSet()
|
portSet, maskSet := d.Pin.PortMaskSet()
|
||||||
portClear, maskClear := d.Pin.PortMaskClear()
|
portClear, maskClear := d.Pin.PortMaskClear()
|
||||||
|
mask := interrupt.Disable()
|
||||||
|
|
||||||
// See:
|
// See:
|
||||||
// https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
|
// 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,
|
"maskClear": maskClear,
|
||||||
"portClear": portClear,
|
"portClear": portClear,
|
||||||
})
|
})
|
||||||
|
interrupt.Restore(mask)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,14 @@ package ws2812
|
|||||||
import (
|
import (
|
||||||
"device"
|
"device"
|
||||||
"machine"
|
"machine"
|
||||||
|
"runtime/interrupt"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (d Device) WriteByte(c byte) error {
|
func (d Device) WriteByte(c byte) error {
|
||||||
portSet, maskSet := d.Pin.PortMaskSet()
|
portSet, maskSet := d.Pin.PortMaskSet()
|
||||||
portClear, maskClear := d.Pin.PortMaskClear()
|
portClear, maskClear := d.Pin.PortMaskClear()
|
||||||
|
mask := interrupt.Disable()
|
||||||
|
|
||||||
switch machine.CPUFrequency() {
|
switch machine.CPUFrequency() {
|
||||||
case 160e6: // 160MHz
|
case 160e6: // 160MHz
|
||||||
@@ -220,6 +222,7 @@ func (d Device) WriteByte(c byte) error {
|
|||||||
"maskClear": maskClear,
|
"maskClear": maskClear,
|
||||||
"portClear": uintptr(unsafe.Pointer(portClear)),
|
"portClear": uintptr(unsafe.Pointer(portClear)),
|
||||||
})
|
})
|
||||||
|
interrupt.Restore(mask)
|
||||||
return nil
|
return nil
|
||||||
case 80e6: // 80MHz
|
case 80e6: // 80MHz
|
||||||
// See docs for 160MHz.
|
// See docs for 160MHz.
|
||||||
@@ -336,8 +339,10 @@ func (d Device) WriteByte(c byte) error {
|
|||||||
"maskClear": maskClear,
|
"maskClear": maskClear,
|
||||||
"portClear": uintptr(unsafe.Pointer(portClear)),
|
"portClear": uintptr(unsafe.Pointer(portClear)),
|
||||||
})
|
})
|
||||||
|
interrupt.Restore(mask)
|
||||||
return nil
|
return nil
|
||||||
default:
|
default:
|
||||||
|
interrupt.Restore(mask)
|
||||||
return errUnknownClockSpeed
|
return errUnknownClockSpeed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user