Skip to content

Instantly share code, notes, and snippets.

@timokroeger
Created February 25, 2022 15:21
Show Gist options
  • Save timokroeger/f07129b9ab762ce2dc7f06edd6b71dc6 to your computer and use it in GitHub Desktop.
Save timokroeger/f07129b9ab762ce2dc7f06edd6b71dc6 to your computer and use it in GitHub Desktop.
SWD PIO experiments (never tested)
// packet request 1: parity with counter and intermediate reg
// 20 instructions, max swd freq clk/4
.side_set 1
set pins, 1 side 0 // start
set x, 3 side 0
reload_even:
out y, 1 side 1
jmp !y, even side 1
odd:
mov pins, y side 0
jmp x--, reload_odd side 0
jmp parity side 1 [1] // x == 0, inverse of parity bit
reload_odd:
out y, 1 side 1
jmp !y, odd side 1
even:
mov pins, y side 0
jmp x--, reload_even side 0
set x, 1 side 1 [1] // x is the inverse parity bit, set it to output 0
parity:
mov pins, !x side 0 [1]
nop side 1 [1]
set pins, 0 side 0 [1] // stop
nop side 1 [1]
set pindirs, 0 side 0 [1] // park not driven
nop side 1 [1]
nop side 0 [1] // turnover
nop side 1 [1]
// packet request 2: parity with jumps
// 26 instructions, max swd freq clk/2
.side_set 1
set pins, 1 side 0 // start
nop side 1
out pins, 1 side 0
jmp pin, odd1 side 1
even1:
out pins, 1 side 0
jmp pin, odd2 side 1
even2:
out pins, 1 side 0
jmp pin, odd3 side 1
even3:
out pins, 1 side 0
jmp pin, parity1 side 1
parity0:
set pins, 0 side 0
jmp stop side 1
odd1:
out pins, 1 side 0
jmp pin, even2 side 1
odd2:
out pins, 1 side 0
jmp pin, even3 side 1
odd3:
out pins, 1 side 0
jmp pin, parity0 side 1
parity1:
set pins, 1 side 0
nop side 1
stop:
set pins, 0 side 0 // stop
nop side 1
set pindirs, 0 side 0 // park not driven
nop side 1
nop side 0 // turnover
nop side 1
// packet request 3: parity from fifo
// 14 instructions, max swd freq clk/2
pub fn calc_parity(inp: u8) -> u8 {
let masked = inp & 0b1111;
(masked.count_ones() % 2) as u8
}
.side_set 1 opt
.wrap_target
start:
pull
set pins, 1 side 0 // Start
set x, 2 side 1
next_bit:
out pins, 1 side 0 // APnDP, RnW, A2
jmp x--, next_bit side 1
out pins, 1 side 0 // A3
pull side 1 // Get the parity bit, which was computed on the CPU in meantime
out pins, 1 side 0 // Parity
nop side 1
set pins, 0 side 0 // Stop
nop side 1
set pins, 1 side 0 // Park
nop side 1
set pindirs, 0 side 0 // Turnaround
set x, 1 side 1
ack_bit:
in pins, 1 side 0 // ACK0, ACK1
jmp x--, ack_bit side 1
in pins, 1 side 0 // ACK2
irq ? side 1
// read_write sm controls clocking
mov x, isr
push
jmp x!=y, nack
jmp start
nack:
set pindirs, 1
.wrap
//////////////////////
.program read
.side_set 1
// autopull 8bit
mov x, osr
wait ?
read_bit:
in pins, 1 side 0
jmp x--, read_bit side 1
parity:
in pins, 1 side 0 // parity
push side 1
set pindirs, 1 side 1
//////////////////////////
.program write
.side_set 1
// autopull
write_bit:
out pins, 1 side 0
jmp x--, write_bit side 1
out pins, 1 side 0 // parity
nop side 1
/// LOW SPEED
/////////////
.program swd_packet_request
.sideset 1
.wrap_target
pull
set pins, 1 side 0 [1] // Start
set x, 3 side 1
next_bit:
nop side 1
out pins, 1 side 0 [1] // APnDP, RnW, A2, A3
jmp x--, next_bit side 1
pull side 1 // Get the parity bit, which was computed on the CPU in meantime
out pins, 1 side 0 // Parity
set x, 1 side 0
out pins, 1
nop side 1
set pins, 0 side 0 // Stop
nop side 1
set pins, 1 side 0 // Park
nop side 1
set pindirs, 0 side 0 // Turnaround
set x, 1 side 1
ack_bit:
in pins, 1 side 0 // ACK0, ACK1
jmp x--, ack_bit side 1
in pins, 1 side 0 // ACK3
irq 4 side 1
// write, autopull8
.program swd_read_bits
.sideset 1 opt
.wrap_target
pull ; number of bits - 1
mov x, osr
pull ; first byte needs a manual pull, next bytes are autopulled
wait irq, 1
next_bit:
out pins, 1 side 0 ; clock data out on falling edge
jmp x--, next_bit side 1 ; data is present for posedge
irq 2 side 0
.wrap
// read, autopush8
.program swd_write_bits
.sideset 1 opt
.wrap_target
pull ; number of bits - 1
mov x, osr
wait irq, 2
set pindirs, 0 side 1 ; turnaround
next_bit:
in pins, 1 side 0
jmp x--, next_bit side 1
push side 0 ; last bytes needs a manual push
set pindirs, 1 side 1 ; turnaround
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment