Toggle navigation
Documentation
The friendly Operating System for the Internet of Things
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
19
extern
"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
Generated on Thu Feb 26 2026 19:45:48 by
1.13.2