Skip to content

Commit c137652

Browse files
soypatdeadprogram
authored andcommitted
share DMA enabling logic among drivers
1 parent 56a020e commit c137652

File tree

4 files changed

+37
-53
lines changed

4 files changed

+37
-53
lines changed

rp2-pio/piolib/dma.go

+22
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,28 @@ func (arb *dmaArbiter) Channel(channel uint8) dmaChannel {
4040
}
4141
}
4242

43+
func (dma *dmaChannel) helperIsEnabled() bool {
44+
return dma.IsValid()
45+
}
46+
47+
func (dma *dmaChannel) helperEnableDMA(enabled bool) error {
48+
dmaAlreadyEnabled := dma.helperIsEnabled()
49+
if !enabled || dmaAlreadyEnabled {
50+
if !enabled && dmaAlreadyEnabled {
51+
dma.Unclaim()
52+
*dma = dmaChannel{} // Invalidate DMA channel.
53+
}
54+
return nil
55+
}
56+
channel, ok := _DMA.ClaimChannel()
57+
if !ok {
58+
return errDMAUnavail
59+
}
60+
channel.dl = dma.dl // save deadliner from existing DMA channel, maybe set by user in future.
61+
*dma = channel
62+
return nil
63+
}
64+
4365
type dmaChannel struct {
4466
hw *dmaChannelHW
4567
arb *dmaArbiter

rp2-pio/piolib/parallel8.go

+4-16
Original file line numberDiff line numberDiff line change
@@ -80,29 +80,17 @@ func (pl *Parallel8Tx) Write(data []uint8) error {
8080
}
8181

8282
func (pl *Parallel8Tx) IsDMAEnabled() bool {
83-
return pl.dma.IsValid()
83+
return pl.dma.helperIsEnabled()
8484
}
8585

8686
func (pl *Parallel8Tx) EnableDMA(enabled bool) error {
8787
if !pl.sm.IsValid() {
8888
return errors.New("PIO Statemachine needs initializing") //Not initialized
8989
}
90-
dmaAlreadyEnabled := pl.IsDMAEnabled()
91-
if !enabled || dmaAlreadyEnabled {
92-
if !enabled && dmaAlreadyEnabled {
93-
pl.dma.Unclaim()
94-
pl.dma = dmaChannel{} // Invalidate DMA channel.
95-
}
96-
return nil
97-
}
98-
99-
channel, ok := _DMA.ClaimChannel()
100-
if !ok {
101-
return errDMAUnavail
90+
err := pl.dma.helperEnableDMA(enabled)
91+
if !enabled || err != nil {
92+
return err
10293
}
103-
104-
channel.dl = pl.dma.dl // Copy deadline.
105-
pl.dma = channel
10694
cc := pl.dma.CurrentConfig()
10795
cc.setBSwap(false)
10896
cc.setTransferDataSize(dmaTxSize8)

rp2-pio/piolib/spi3w.go

+2-16
Original file line numberDiff line numberDiff line change
@@ -266,21 +266,7 @@ func (spi *SPI3w) prepTx(readbits, writebits uint32) {
266266
// DMA code below.
267267

268268
func (spi *SPI3w) EnableDMA(enabled bool) error {
269-
dmaAlreadyEnabled := spi.IsDMAEnabled()
270-
if !enabled || dmaAlreadyEnabled {
271-
if !enabled && dmaAlreadyEnabled {
272-
spi.dma.Unclaim()
273-
spi.dma = dmaChannel{} // Invalidate DMA channel.
274-
}
275-
return nil
276-
}
277-
channel, ok := _DMA.ClaimChannel()
278-
if !ok {
279-
return errDMAUnavail
280-
}
281-
channel.dl = spi.dma.dl // Copy deadline.
282-
spi.dma = channel
283-
return nil
269+
return spi.dma.helperEnableDMA(enabled)
284270
}
285271

286272
func (spi *SPI3w) readDMA(r []uint32) error {
@@ -302,7 +288,7 @@ func (spi *SPI3w) writeDMA(w []uint32) error {
302288
}
303289

304290
func (spi *SPI3w) IsDMAEnabled() bool {
305-
return spi.dma.IsValid()
291+
return spi.dma.helperIsEnabled()
306292
}
307293

308294
func pinPadCtrl(pin machine.Pin) *volatile.Register32 {

rp2-pio/piolib/ws2812b.go

+9-21
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ type WS2812B struct {
1717
}
1818

1919
func NewWS2812B(sm pio.StateMachine, pin machine.Pin) (*WS2812B, error) {
20+
// See ws2812b.pio for more information on how the timings are calculated.
21+
// WS2812B Datasheet:
2022
// https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf
2123
const (
2224
baseline = 1250.
@@ -78,7 +80,7 @@ func (ws *WS2812B) PutColor(c color.Color) {
7880
}
7981

8082
// WriteRaw writes raw GRB values to a strip of WS2812B LEDs. Each uint32 is a WS2812B color
81-
// which can be created with 3 uint8 color values::
83+
// which can be created with 3 uint8 color values:
8284
//
8385
// color := uint32(g)<<24 | uint32(r)<<16 | uint32(b)<<8
8486
func (ws *WS2812B) WriteRaw(rawGRB []uint32) error {
@@ -101,25 +103,6 @@ func (ws *WS2812B) WriteRaw(rawGRB []uint32) error {
101103
return nil
102104
}
103105

104-
// EnableDMA enables DMA for vectorized writes.
105-
func (ws *WS2812B) EnableDMA(enabled bool) error {
106-
dmaAlreadyEnabled := ws.IsDMAEnabled()
107-
if !enabled || dmaAlreadyEnabled {
108-
if !enabled && dmaAlreadyEnabled {
109-
ws.dma.Unclaim()
110-
ws.dma = dmaChannel{} // Invalidate DMA channel.
111-
}
112-
return nil
113-
}
114-
channel, ok := _DMA.ClaimChannel()
115-
if !ok {
116-
return errDMAUnavail
117-
}
118-
channel.dl = ws.dma.dl // Copy deadline.
119-
ws.dma = channel
120-
return nil
121-
}
122-
123106
func (ws *WS2812B) writeDMA(w []uint32) error {
124107
dreq := dmaPIO_TxDREQ(ws.sm)
125108
err := ws.dma.Push32(&ws.sm.TxReg().Reg, w, dreq)
@@ -129,7 +112,12 @@ func (ws *WS2812B) writeDMA(w []uint32) error {
129112
return nil
130113
}
131114

115+
// EnableDMA enables DMA for vectorized writes.
116+
func (ws *WS2812B) EnableDMA(enabled bool) error {
117+
return ws.dma.helperEnableDMA(enabled)
118+
}
119+
132120
// IsDMAEnabled returns true if DMA is enabled.
133121
func (ws *WS2812B) IsDMAEnabled() bool {
134-
return ws.dma.IsValid()
122+
return ws.dma.helperIsEnabled()
135123
}

0 commit comments

Comments
 (0)