Created
February 25, 2022 15:21
-
-
Save timokroeger/f07129b9ab762ce2dc7f06edd6b71dc6 to your computer and use it in GitHub Desktop.
SWD PIO experiments (never tested)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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