Loading...
Searching...
No Matches
pio.h
1/*
2 * SPDX-FileCopyrightText: 2025 Tom Hert <git@annsann.eu>
3 * SPDX-FileCopyrightText: 2025 HAW Hamburg
4 * SPDX-License-Identifier: LGPL-2.1-only
5 */
6
7#pragma once
8
9#include <stdint.h>
10
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
22/* ========================================================================== */
23/* JMP Instruction - Section 11.4.2 */
24/* ========================================================================== */
25
30#define PIO_JMP_COND_ALWAYS (0)
31#define PIO_JMP_COND_X_ZERO (1)
32#define PIO_JMP_COND_X_DEC (2)
33#define PIO_JMP_COND_Y_ZERO (3)
34#define PIO_JMP_COND_Y_DEC (4)
35#define PIO_JMP_COND_X_NE_Y (5)
36#define PIO_JMP_COND_PIN (6)
37#define PIO_JMP_COND_OSRE_NOT_EMPTY (7)
39
48#define PIO_JMP(cond, addr) \
49 (0b0000000000000000 | (((cond) & 0b111) << 5) | ((addr) & 0b11111))
50
56#define PIO_JMP_ALWAYS(addr) PIO_JMP(PIO_JMP_COND_ALWAYS, (addr))
57
63#define PIO_JMP_X_ZERO(addr) PIO_JMP(PIO_JMP_COND_X_ZERO, (addr))
64
70#define PIO_JMP_X_DEC(addr) PIO_JMP(PIO_JMP_COND_X_DEC, (addr))
71
77#define PIO_JMP_Y_ZERO(addr) PIO_JMP(PIO_JMP_COND_Y_ZERO, (addr))
78
84#define PIO_JMP_Y_DEC(addr) PIO_JMP(PIO_JMP_COND_Y_DEC, (addr))
85
91#define PIO_JMP_X_NE_Y(addr) PIO_JMP(PIO_JMP_COND_X_NE_Y, (addr))
92
98#define PIO_JMP_PIN(addr) PIO_JMP(PIO_JMP_COND_PIN, (addr))
99
105#define PIO_JMP_OSRE_NOT_EMPTY(addr) PIO_JMP(PIO_JMP_COND_OSRE_NOT_EMPTY, (addr))
106
107/* ========================================================================== */
108/* WAIT Instruction - Section 11.4.3 */
109/* ========================================================================== */
110
115#define PIO_WAIT_SRC_GPIO (0)
116#define PIO_WAIT_SRC_PIN (1)
117#define PIO_WAIT_SRC_IRQ (2)
118#define PIO_WAIT_SRC_JMPPIN (3)
120
125#define PIO_WAIT_IRQ_IDXMODE_DIRECT (0)
126#define PIO_WAIT_IRQ_IDXMODE_PREV (1)
127#define PIO_WAIT_IRQ_IDXMODE_REL (2)
128#define PIO_WAIT_IRQ_IDXMODE_NEXT (3)
130
140#define PIO_WAIT(pol, src, index) \
141 (0b0010000000000000 | ((pol) ? 0b0000000010000000 : 0) | \
142 (((src) & 0b11) << 5) | ((index) & 0b11111))
143
150#define PIO_WAIT_GPIO(pol, gpio) PIO_WAIT((pol), PIO_WAIT_SRC_GPIO, (gpio))
151
158#define PIO_WAIT_PIN(pol, pin) PIO_WAIT((pol), PIO_WAIT_SRC_PIN, (pin))
159
167#define PIO_WAIT_IRQ(pol, idxmode, irq) \
168 PIO_WAIT((pol), PIO_WAIT_SRC_IRQ, (((idxmode) & 0b11) << 3) | ((irq) & 0b111))
169
176#define PIO_WAIT_IRQ_REL(pol, irq) \
177 PIO_WAIT_IRQ((pol), PIO_WAIT_IRQ_IDXMODE_REL, (irq))
178
185#define PIO_WAIT_IRQ_PREV(pol, irq) \
186 PIO_WAIT_IRQ((pol), PIO_WAIT_IRQ_IDXMODE_PREV, (irq))
187
194#define PIO_WAIT_IRQ_NEXT(pol, irq) \
195 PIO_WAIT_IRQ((pol), PIO_WAIT_IRQ_IDXMODE_NEXT, (irq))
196
203#define PIO_WAIT_JMPPIN(pol, offset) \
204 PIO_WAIT((pol), PIO_WAIT_SRC_JMPPIN, (offset))
205
206/* ========================================================================== */
207/* IN Instruction - Section 11.4.4 */
208/* ========================================================================== */
209
214#define PIO_IN_SRC_PINS (0)
215#define PIO_IN_SRC_X (1)
216#define PIO_IN_SRC_Y (2)
217#define PIO_IN_SRC_NULL (3)
218#define PIO_IN_SRC_ISR (6)
219#define PIO_IN_SRC_OSR (7)
221
230#define PIO_IN(src, bitcount) \
231 (0b0100000000000000 | (((src) & 0b111) << 5) | ((bitcount) & 0b11111))
232
238#define PIO_IN_PINS(bits) PIO_IN(PIO_IN_SRC_PINS, (bits) & 0b11111)
239
245#define PIO_IN_X(bits) PIO_IN(PIO_IN_SRC_X, (bits) & 0b11111)
246
252#define PIO_IN_Y(bits) PIO_IN(PIO_IN_SRC_Y, (bits) & 0b11111)
253
259#define PIO_IN_NULL(bits) PIO_IN(PIO_IN_SRC_NULL, (bits) & 0b11111)
260
266#define PIO_IN_ISR(bits) PIO_IN(PIO_IN_SRC_ISR, (bits) & 0b11111)
267
273#define PIO_IN_OSR(bits) PIO_IN(PIO_IN_SRC_OSR, (bits) & 0b11111)
274
275/* ========================================================================== */
276/* OUT Instruction - Section 11.4.5 */
277/* ========================================================================== */
278
283#define PIO_OUT_DEST_PINS (0)
284#define PIO_OUT_DEST_X (1)
285#define PIO_OUT_DEST_Y (2)
286#define PIO_OUT_DEST_NULL (3)
287#define PIO_OUT_DEST_PINDIRS (4)
288#define PIO_OUT_DEST_PC (5)
289#define PIO_OUT_DEST_ISR (6)
290#define PIO_OUT_DEST_EXEC (7)
292
301#define PIO_OUT(dest, bitcount) \
302 (0b0110000000000000 | (((dest) & 0b111) << 5) | ((bitcount) & 0b11111))
303
309#define PIO_OUT_PINS(bits) PIO_OUT(PIO_OUT_DEST_PINS, (bits) & 0b11111)
310
316#define PIO_OUT_X(bits) PIO_OUT(PIO_OUT_DEST_X, (bits) & 0b11111)
317
323#define PIO_OUT_Y(bits) PIO_OUT(PIO_OUT_DEST_Y, (bits) & 0b11111)
324
330#define PIO_OUT_NULL(bits) PIO_OUT(PIO_OUT_DEST_NULL, (bits) & 0b11111)
331
337#define PIO_OUT_PINDIRS(bits) PIO_OUT(PIO_OUT_DEST_PINDIRS, (bits) & 0b11111)
338
344#define PIO_OUT_PC(bits) PIO_OUT(PIO_OUT_DEST_PC, (bits) & 0b11111)
345
351#define PIO_OUT_ISR(bits) PIO_OUT(PIO_OUT_DEST_ISR, (bits) & 0b11111)
352
358#define PIO_OUT_EXEC(bits) PIO_OUT(PIO_OUT_DEST_EXEC, (bits) & 0b11111)
359
360/* ========================================================================== */
361/* PUSH Instruction - Section 11.4.6 */
362/* ========================================================================== */
363
373#define PIO_PUSH(iffull, block) \
374 (0b1000000000000000 | ((iffull) ? 0b0000000001000000 : 0) | ((block) ? 0b0000000000100000 : 0))
375
379#define PIO_PUSH_BLOCK() PIO_PUSH(0, 1)
380
384#define PIO_PUSH_NOBLOCK() PIO_PUSH(0, 0)
385
389#define PIO_PUSH_IFFULL() PIO_PUSH(1, 1)
390
394#define PIO_PUSH_IFFULL_NOBLOCK() PIO_PUSH(1, 0)
395
396/* ========================================================================== */
397/* PULL Instruction - Section 11.4.7 */
398/* ========================================================================== */
399
408#define PIO_PULL(ifempty, block) \
409 (0b1000000010000000 | ((ifempty) ? 0b0000000001000000 : 0) | ((block) ? 0b0000000000100000 : 0))
410
414#define PIO_PULL_BLOCK() PIO_PULL(0, 1)
415
419#define PIO_PULL_NOBLOCK() PIO_PULL(0, 0)
420
424#define PIO_PULL_IFEMPTY() PIO_PULL(1, 1)
425
429#define PIO_PULL_IFEMPTY_NOBLOCK() PIO_PULL(1, 0)
430
431/* ========================================================================== */
432/* MOV to RX FIFO - Section 11.4.8 */
433/* ========================================================================== */
434
444#define PIO_MOV_RXFIFO_ISR(idxi, index) \
445 (0b1000000000010000 | ((idxi) ? 0b0000000000010000 : 0) | ((index) & 0b0000000000001111))
446
450#define PIO_MOV_RXFIFO_Y_ISR() PIO_MOV_RXFIFO_ISR(0, 0)
451
457#define PIO_MOV_RXFIFO_IDX_ISR(idx) PIO_MOV_RXFIFO_ISR(1, (idx))
458
459/* ========================================================================== */
460/* MOV from RX FIFO - Section 11.4.9 */
461/* ========================================================================== */
462
472#define PIO_MOV_OSR_RXFIFO(idxi, index) \
473 (0b1000000010010000 | ((idxi) ? 0b0000000000010000 : 0) | ((index) & 0b0000000000001111))
474
478#define PIO_MOV_OSR_RXFIFO_Y() PIO_MOV_OSR_RXFIFO(0, 0)
479
485#define PIO_MOV_OSR_RXFIFO_IDX(idx) PIO_MOV_OSR_RXFIFO(1, (idx))
486
487/* ========================================================================== */
488/* MOV Instruction - Section 11.4.10 */
489/* ========================================================================== */
490
495#define PIO_MOV_DEST_PINS (0)
496#define PIO_MOV_DEST_X (1)
497#define PIO_MOV_DEST_Y (2)
498#define PIO_MOV_DEST_PINDIRS (3)
499#define PIO_MOV_DEST_EXEC (4)
500#define PIO_MOV_DEST_PC (5)
501#define PIO_MOV_DEST_ISR (6)
502#define PIO_MOV_DEST_OSR (7)
504
509#define PIO_MOV_OP_NONE (0)
510#define PIO_MOV_OP_INVERT (1)
511#define PIO_MOV_OP_BITREV (2)
513
518#define PIO_MOV_SRC_PINS (0)
519#define PIO_MOV_SRC_X (1)
520#define PIO_MOV_SRC_Y (2)
521#define PIO_MOV_SRC_NULL (3)
522#define PIO_MOV_SRC_STATUS (5)
523#define PIO_MOV_SRC_ISR (6)
524#define PIO_MOV_SRC_OSR (7)
526
536#define PIO_MOV(dest, op, src) \
537 (0b1010000000000000 | (((dest) & 0b111) << 5) | (((op) & 0b11) << 3) | ((src) & 0b111))
538
539/* ========================================================================== */
540/* IRQ Instruction - Section 11.4.11 */
541/* ========================================================================== */
542
547#define PIO_IRQ_IDXMODE_DIRECT (0)
548#define PIO_IRQ_IDXMODE_PREV (1)
549#define PIO_IRQ_IDXMODE_REL (2)
550#define PIO_IRQ_IDXMODE_NEXT (3)
552
563#define PIO_IRQ(clr, wait, idxmode, index) \
564 (0b1100000000000000 | ((clr) ? 0b0000000001000000 : 0) | ((wait) ? 0b0000000000100000 : 0) | \
565 (((idxmode) & 0b11) << 3) | ((index) & 0b111))
566
572#define PIO_IRQ_SET(num) PIO_IRQ(0, 0, PIO_IRQ_IDXMODE_DIRECT, (num))
573
579#define PIO_IRQ_NOWAIT(num) PIO_IRQ(0, 0, PIO_IRQ_IDXMODE_DIRECT, (num))
580
586#define PIO_IRQ_WAIT(num) PIO_IRQ(0, 1, PIO_IRQ_IDXMODE_DIRECT, (num))
587
593#define PIO_IRQ_CLEAR(num) PIO_IRQ(1, 0, PIO_IRQ_IDXMODE_DIRECT, (num))
594
600#define PIO_IRQ_SET_REL(num) PIO_IRQ(0, 0, PIO_IRQ_IDXMODE_REL, (num))
601
607#define PIO_IRQ_WAIT_REL(num) PIO_IRQ(0, 1, PIO_IRQ_IDXMODE_REL, (num))
608
614#define PIO_IRQ_SET_PREV(num) PIO_IRQ(0, 0, PIO_IRQ_IDXMODE_PREV, (num))
615
621#define PIO_IRQ_SET_NEXT(num) PIO_IRQ(0, 0, PIO_IRQ_IDXMODE_NEXT, (num))
622
623/* ========================================================================== */
624/* SET Instruction - Section 11.4.12 */
625/* ========================================================================== */
626
631#define PIO_SET_DEST_PINS (0)
632#define PIO_SET_DEST_X (1)
633#define PIO_SET_DEST_Y (2)
634#define PIO_SET_DEST_PINDIRS (4)
636
645#define PIO_SET(dest, data) \
646 (0b1110000000000000 | (((dest) & 0b111) << 5) | ((data) & 0b11111))
647
653#define PIO_SET_PINS(val) PIO_SET(PIO_SET_DEST_PINS, (val))
654
660#define PIO_SET_X(val) PIO_SET(PIO_SET_DEST_X, (val))
661
667#define PIO_SET_Y(val) PIO_SET(PIO_SET_DEST_Y, (val))
668
674#define PIO_SET_PINDIRS(val) PIO_SET(PIO_SET_DEST_PINDIRS, (val))
675
676#ifdef __cplusplus
677}
678#endif
679