Skip to content

Commit ffee38a

Browse files
authored
self compile SPI3w program and add test (#35)
* self compile SPI3w program * add test to build * add program length check
1 parent bc073dd commit ffee38a

File tree

6 files changed

+100
-80
lines changed

6 files changed

+100
-80
lines changed

Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ FMT_PATHS = ./
77
fmt-check:
88
@unformatted=$$(gofmt -l $(FMT_PATHS)); [ -z "$$unformatted" ] && exit 0; echo "Unformatted:"; for fn in $$unformatted; do echo " $$fn"; done; exit 1
99

10+
pio-test:
11+
go test ./rp2-pio
12+
1013
smoke-test:
1114
@mkdir -p build
1215
tinygo build -target pico-w -size short -o build/test.uf2 ./rp2-pio/examples/blinky
@@ -25,4 +28,4 @@ smoke-test:
2528
tinygo build -target pico2 -size short -o build/test.uf2 ./rp2-pio/examples/ws2812b
2629
tinygo build -target pico2 -size short -o build/test.uf2 ./rp2-pio/examples/ws2812bfourpixels
2730

28-
test: clean fmt-check smoke-test
31+
test: clean fmt-check pio-test smoke-test

rp2-pio/pio_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package pio
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestAssemblerV0_spi3w(t *testing.T) {
8+
assm := AssemblerV0{
9+
SidesetBits: 1,
10+
}
11+
const (
12+
wloopOff = 0
13+
rloopOff = 5
14+
endOff = 7
15+
)
16+
17+
var program = []uint16{
18+
// .wrap_target
19+
// write out x-1 bits.
20+
wloopOff:// Write/Output loop.
21+
assm.Out(OutDestPins, 1).Side(0).Encode(), // 0: out pins, 1 side 0
22+
assm.Jmp(wloopOff, JmpXNZeroDec).Side(1).Encode(), // 1: jmp x--, 0 side 1
23+
assm.Jmp(endOff, JmpYZero).Side(0).Encode(), // 2: jmp !y, 7 side 0
24+
assm.Set(SetDestPindirs, 0).Side(0).Encode(), // 3: set pindirs, 0 side 0
25+
assm.Nop().Side(0).Encode(), // 4: nop side 0
26+
// read in y-1 bits.
27+
rloopOff:// Read/input loop
28+
assm.In(InSrcPins, 1).Side(1).Encode(), // 5: in pins, 1 side 1
29+
assm.Jmp(rloopOff, JmpYNZeroDec).Side(0).Encode(), // 6: jmp y--, 5 side 0
30+
// Wait for SPI packet on IRQ.
31+
endOff:// Wait on input pin.
32+
assm.WaitPin(true, 0).Side(0).Encode(), // 7: wait 1 pin, 0 side 0
33+
assm.IRQSet(false, 0).Side(0).Encode(), // 8: irq nowait 0 side 0
34+
}
35+
var expectedProgram = []uint16{
36+
// .wrap_target
37+
0x6001, // 0: out pins, 1 side 0
38+
0x1040, // 1: jmp x--, 0 side 1
39+
0x0067, // 2: jmp !y, 7 side 0
40+
0xe080, // 3: set pindirs, 0 side 0
41+
0xa042, // 4: nop side 0
42+
0x5001, // 5: in pins, 1 side 1
43+
0x0085, // 6: jmp y--, 5 side 0
44+
0x20a0, // 7: wait 1 pin, 0 side 0
45+
0xc000, // 8: irq nowait 0 side 0
46+
// .wrap
47+
}
48+
if len(program) != len(expectedProgram) {
49+
t.Fatal("program length mismatch, this should not be tested")
50+
}
51+
for i := range program {
52+
if program[i] != expectedProgram[i] {
53+
t.Errorf("instr %d mismatch got!=expected: %#x != %#x", i, program[i], expectedProgram[i])
54+
}
55+
}
56+
}

rp2-pio/piolib/spi3w.go

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ type SPI3w struct {
1919
dma dmaChannel
2020
offset uint8
2121

22-
statusEn bool
23-
lastStatus uint32
24-
pinMask uint32
22+
statusEn bool
23+
programWrapTarget uint8
24+
lastStatus uint32
25+
pinMask uint32
2526
}
2627

2728
func NewSPI3w(sm pio.StateMachine, dio, clk machine.Pin, baud uint32) (*SPI3w, error) {
@@ -33,15 +34,42 @@ func NewSPI3w(sm pio.StateMachine, dio, clk machine.Pin, baud uint32) (*SPI3w, e
3334

3435
// https://github.com/embassy-rs/embassy/blob/c4a8b79dbc927e46fcc71879673ad3410aa3174b/cyw43-pio/src/lib.rs#L90
3536
sm.TryClaim() // SM should be claimed beforehand, we just guarantee it's claimed.
36-
3737
Pio := sm.PIO()
38-
offset, err := Pio.AddProgram(spi3wInstructions, spi3wOrigin)
38+
assm := pio.AssemblerV0{
39+
SidesetBits: 1,
40+
}
41+
const (
42+
origin = -1
43+
wloopOff = 0
44+
rloopOff = 5
45+
endOff = 7
46+
)
47+
var program = [...]uint16{
48+
// .wrap_target
49+
// write out x-1 bits.
50+
wloopOff:// Write/Output loop.
51+
assm.Out(pio.OutDestPins, 1).Side(0).Encode(), // 0: out pins, 1 side 0
52+
assm.Jmp(wloopOff, pio.JmpXNZeroDec).Side(1).Encode(), // 1: jmp x--, 0 side 1
53+
assm.Jmp(endOff, pio.JmpYZero).Side(0).Encode(), // 2: jmp !y, 7 side 0
54+
assm.Set(pio.SetDestPindirs, 0).Side(0).Encode(), // 3: set pindirs, 0 side 0
55+
assm.Nop().Side(0).Encode(), // 4: nop side 0
56+
// read in y-1 bits.
57+
rloopOff:// Read/input loop
58+
assm.In(pio.InSrcPins, 1).Side(1).Encode(), // 5: in pins, 1 side 1
59+
assm.Jmp(rloopOff, pio.JmpYNZeroDec).Side(0).Encode(), // 6: jmp y--, 5 side 0
60+
// Wait for SPI packet on IRQ.
61+
endOff:// Wait on input pin.
62+
assm.WaitPin(true, 0).Side(0).Encode(), // 7: wait 1 pin, 0 side 0
63+
assm.IRQSet(false, 0).Side(0).Encode(), // 8: irq nowait 0 side 0
64+
}
65+
const a = len(program) - 1
66+
67+
offset, err := Pio.AddProgram(program[:], origin)
3968
if err != nil {
4069
return nil, err
4170
}
42-
71+
cfg := assm.DefaultStateMachineConfig(offset, program[:])
4372
// Configure state machine.
44-
cfg := spi3wProgramDefaultConfig(offset)
4573
cfg.SetOutPins(dio, 1)
4674
cfg.SetSetPins(dio, 1)
4775
cfg.SetInPins(dio, 1)
@@ -84,6 +112,8 @@ func NewSPI3w(sm pio.StateMachine, dio, clk machine.Pin, baud uint32) (*SPI3w, e
84112
sm: sm,
85113
offset: offset,
86114
pinMask: pinMask,
115+
116+
programWrapTarget: wloopOff,
87117
}
88118
return spiw, nil
89119
}
@@ -259,7 +289,7 @@ func (spi *SPI3w) prepTx(readbits, writebits uint32) {
259289
spi.sm.SetY(readbits)
260290
var asm pio.AssemblerV0
261291
spi.sm.Exec(asm.Set(pio.SetDestPindirs, 1).Encode()) // Set Pindir out.
262-
spi.sm.Jmp(spi.offset+spi3wWrapTarget, pio.JmpAlways)
292+
spi.sm.Jmp(spi.offset+spi.programWrapTarget, pio.JmpAlways)
263293

264294
spi.sm.SetEnabled(true)
265295
}

rp2-pio/piolib/spi3w.pio

Lines changed: 0 additions & 38 deletions
This file was deleted.

rp2-pio/piolib/spi3w_pio.go

Lines changed: 0 additions & 33 deletions
This file was deleted.

rp2-pio/statemachine.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//go:build rp2350 || rp2040
2+
13
package pio
24

35
import (

0 commit comments

Comments
 (0)