epio
A cycle-accurate RP2350 PIO emulator
Loading...
Searching...
No Matches
epio.h
Go to the documentation of this file.
1// Copyright (C) 2026 Piers Finlayson <piers@piers.rocks>
2//
3// MIT License
4
22#if !defined(EPIO_H)
23#define EPIO_H
24
25#include <stdint.h>
26#include <stddef.h>
27#define APIO_EMULATION 1
28#include <epio_wasm.h>
29#include <apio.h>
30
37typedef struct epio_t epio_t;
38
51typedef struct {
53 uint8_t first_instr;
55 uint8_t start_instr;
57 uint8_t end_instr;
59
67typedef struct {
69 uint32_t clkdiv;
71 uint32_t execctrl;
73 uint32_t shiftctrl;
75 uint32_t pinctrl;
77
90
107EPIO_EXPORT epio_t *epio_init(void);
108
114EPIO_EXPORT void epio_free(epio_t *epio);
115
127EPIO_EXPORT void epio_set_sm_debug(epio_t *epio, uint8_t block, uint8_t sm, epio_sm_debug_t *debug);
128
138EPIO_EXPORT void epio_get_sm_debug(epio_t *epio, uint8_t block, uint8_t sm, epio_sm_debug_t *debug);
139
151EPIO_EXPORT void epio_set_gpiobase(epio_t *epio, uint8_t block, uint32_t gpio_base);
152
160EPIO_EXPORT uint32_t epio_get_gpiobase(epio_t *epio, uint8_t block);
161
175EPIO_EXPORT void epio_set_sm_reg(epio_t *epio, uint8_t block, uint8_t sm, epio_sm_reg_t *reg);
176
188EPIO_EXPORT void epio_get_sm_reg(epio_t *epio, uint8_t block, uint8_t sm, epio_sm_reg_t *reg);
189
200EPIO_EXPORT void epio_enable_sm(epio_t *epio, uint8_t block, uint8_t sm);
201
210EPIO_EXPORT uint8_t epio_is_sm_enabled(epio_t *epio, uint8_t block, uint8_t sm);
211
222EPIO_EXPORT void epio_disable_sm(epio_t *epio, uint8_t block, uint8_t sm);
223
241EPIO_EXPORT void epio_set_instr(epio_t *epio, uint8_t block, uint8_t instr_num, uint16_t instr);
242
252EPIO_EXPORT uint16_t epio_get_instr(epio_t *epio, uint8_t block, uint8_t instr_num);
253
267EPIO_EXPORT void epio_force_sm_instr(epio_t *epio, uint8_t block, uint8_t sm, uint16_t instr);
268
280EPIO_EXPORT void epio_step_cycles(epio_t *epio, uint32_t cycles);
281
289EPIO_EXPORT uint64_t epio_get_cycle_count(epio_t *epio);
290
297EPIO_EXPORT void epio_reset_cycle_count(epio_t *epio);
298
320EPIO_EXPORT int32_t epio_wait_tx_fifo(epio_t *epio, uint8_t block, uint8_t sm, int32_t count);
321
330EPIO_EXPORT uint8_t epio_tx_fifo_depth(epio_t *epio, uint8_t block, uint8_t sm);
331
340EPIO_EXPORT uint8_t epio_rx_fifo_depth(epio_t *epio, uint8_t block, uint8_t sm);
341
355EPIO_EXPORT uint32_t epio_pop_rx_fifo(epio_t *epio, uint8_t block, uint8_t sm);
356
370EPIO_EXPORT uint32_t epio_pop_tx_fifo(epio_t *epio, uint8_t block, uint8_t sm);
371
385EPIO_EXPORT void epio_push_tx_fifo(epio_t *epio, uint8_t block, uint8_t sm, uint32_t value);
386
400EPIO_EXPORT void epio_push_rx_fifo(epio_t *epio, uint8_t block, uint8_t sm, uint32_t value);
401
424EPIO_EXPORT void epio_drive_gpios_ext(epio_t *epio, uint64_t gpios, uint64_t level);
425
438void epio_set_gpio_input_inverted(epio_t *epio, uint8_t pin, uint8_t inverted);
439
447uint8_t epio_get_gpio_input_inverted(epio_t *epio, uint8_t pin);
448
460void epio_set_gpio_output_control(epio_t *epio, uint8_t pin, uint8_t block);
461
471void epio_clear_gpio_output_control(epio_t *epio, uint8_t pin, uint8_t block);
472
485uint8_t epio_block_can_control_gpio_output(epio_t *epio, uint8_t block, uint8_t pin);
486
497uint64_t epio_get_gpio_output_control(epio_t *epio, uint8_t block);
498
509EPIO_EXPORT uint8_t epio_get_gpio_input(epio_t *epio, uint8_t pin);
510
521EPIO_EXPORT void epio_init_gpios(epio_t *epio);
522
533EPIO_EXPORT void epio_set_gpio_force_input_low(epio_t *epio, uint8_t pin, uint8_t force_low);
534
545EPIO_EXPORT void epio_set_gpio_force_input_high(epio_t *epio, uint8_t pin, uint8_t force_high);
546
557EPIO_EXPORT uint8_t epio_get_gpio_force_input_low(epio_t *epio, uint8_t pin);
558
569EPIO_EXPORT uint8_t epio_get_gpio_force_input_high(epio_t *epio, uint8_t pin);
570
582EPIO_EXPORT void epio_set_gpio_input(epio_t *epio, uint8_t pin);
583
594EPIO_EXPORT void epio_set_gpio_output(epio_t *epio, uint8_t pin);
595
606EPIO_EXPORT void epio_set_gpio_input_level(epio_t *epio, uint8_t pin, uint8_t level);
607
617EPIO_EXPORT void epio_set_gpio_output_level(epio_t *epio, uint8_t pin, uint8_t level);
618
632EPIO_EXPORT uint64_t epio_read_pin_states(epio_t *epio);
633
648EPIO_EXPORT uint64_t epio_read_driven_pins(epio_t *epio);
649
659EPIO_EXPORT uint64_t epio_read_pull_up_pins(epio_t *epio);
660
670EPIO_EXPORT uint64_t epio_read_pull_down_pins(epio_t *epio);
671
682EPIO_EXPORT void epio_set_gpio_pull_up(epio_t *epio, uint8_t pin, uint8_t enable);
683
695EPIO_EXPORT void epio_set_gpio_pull_down(epio_t *epio, uint8_t pin, uint8_t enable);
696
707EPIO_EXPORT void epio_set_gpio_pull_none(epio_t *epio, uint8_t pin);
708
716EPIO_EXPORT uint8_t epio_get_gpio_pull_up(epio_t *epio, uint8_t pin);
717
725EPIO_EXPORT uint8_t epio_get_gpio_pull_down(epio_t *epio, uint8_t pin);
726
737EPIO_EXPORT void epio_set_gpio_input_only(epio_t *epio, uint8_t pin, uint8_t input_only);
738
746EPIO_EXPORT uint8_t epio_get_gpio_input_only(epio_t *epio, uint8_t pin);
747
759EPIO_EXPORT void epio_set_gpio_drive(epio_t *epio, uint8_t pin, uint8_t strength);
760
768EPIO_EXPORT uint8_t epio_get_gpio_drive(epio_t *epio, uint8_t pin);
769
780EPIO_EXPORT void epio_set_gpio_slew_fast(epio_t *epio, uint8_t pin, uint8_t fast);
781
789EPIO_EXPORT uint8_t epio_get_gpio_slew_fast(epio_t *epio, uint8_t pin);
790
803EPIO_EXPORT void epio_set_float_mode(epio_t *epio, epio_float_mode_t mode);
804
814EPIO_EXPORT void epio_set_float_seed(epio_t *epio, uint32_t seed);
815
840 epio_t *epio,
841 uint8_t dma_chan,
842 uint8_t read_block,
843 uint8_t read_sm,
844 uint8_t read_cycles,
845 uint8_t write_block,
846 uint8_t write_sm,
847 uint8_t write_cycles,
848 uint8_t bit_mode
849);
850
872 epio_t *epio,
873 uint8_t dma_chan,
874 uint8_t src_block,
875 uint8_t src_sm,
876 uint8_t src_cycles,
877 uint32_t ring_base,
878 uint8_t ring_size_log2,
879 uint8_t bit_mode
880);
881
895EPIO_EXPORT uint8_t **epio_dma_capture_write_slot(epio_t *epio, uint8_t dma_chan);
896
927EPIO_EXPORT uint8_t *epio_get_sram_ptr(epio_t *epio);
928
936EPIO_EXPORT uint8_t epio_sram_read_byte(epio_t *epio, uint32_t addr);
937
949EPIO_EXPORT void epio_sram_set(epio_t *epio, uint32_t addr, uint8_t *data, size_t len);
950
958EPIO_EXPORT uint16_t epio_sram_read_halfword(epio_t *epio, uint32_t addr);
959
967EPIO_EXPORT uint32_t epio_sram_read_word(epio_t *epio, uint32_t addr);
968
976EPIO_EXPORT void epio_sram_write_byte(epio_t *epio, uint32_t addr, uint8_t value);
977
985EPIO_EXPORT void epio_sram_write_halfword(epio_t *epio, uint32_t addr, uint16_t value);
986
994EPIO_EXPORT void epio_sram_write_word(epio_t *epio, uint32_t addr, uint32_t value);
995
1024EPIO_EXPORT uint8_t epio_peek_sm_pc(epio_t *epio, uint8_t block, uint8_t sm);
1025
1037EPIO_EXPORT uint32_t epio_peek_sm_x(epio_t *epio, uint8_t block, uint8_t sm);
1038
1050EPIO_EXPORT uint32_t epio_peek_sm_y(epio_t *epio, uint8_t block, uint8_t sm);
1051
1063EPIO_EXPORT uint32_t epio_peek_sm_isr(epio_t *epio, uint8_t block, uint8_t sm);
1064
1076EPIO_EXPORT uint32_t epio_peek_sm_osr(epio_t *epio, uint8_t block, uint8_t sm);
1077
1089EPIO_EXPORT uint8_t epio_peek_sm_isr_count(epio_t *epio, uint8_t block, uint8_t sm);
1090
1104EPIO_EXPORT uint8_t epio_peek_sm_osr_count(epio_t *epio, uint8_t block, uint8_t sm);
1105
1117EPIO_EXPORT uint8_t epio_peek_sm_osr_empty(epio_t *epio, uint8_t block, uint8_t sm);
1118
1137EPIO_EXPORT uint8_t epio_peek_sm_stalled(epio_t *epio, uint8_t block, uint8_t sm);
1138
1155EPIO_EXPORT uint8_t epio_peek_sm_delay(epio_t *epio, uint8_t block, uint8_t sm);
1156
1169EPIO_EXPORT uint8_t epio_peek_sm_exec_pending(epio_t *epio, uint8_t block, uint8_t sm);
1170
1182EPIO_EXPORT uint16_t epio_peek_sm_exec_instr(epio_t *epio, uint8_t block, uint8_t sm);
1183
1196EPIO_EXPORT uint32_t epio_peek_block_irq(epio_t *epio, uint8_t block);
1197
1208EPIO_EXPORT uint8_t epio_peek_block_irq_num(epio_t *epio, uint8_t block, uint8_t irq_num);
1209
1225EPIO_EXPORT uint32_t epio_peek_rx_fifo(epio_t *epio, uint8_t block, uint8_t sm, uint8_t entry);
1226
1242EPIO_EXPORT uint32_t epio_peek_tx_fifo(epio_t *epio, uint8_t block, uint8_t sm, uint8_t entry);
1243
1262EPIO_EXPORT void epio_set_block_irq(epio_t *epio, uint8_t block, uint8_t irq_num);
1263
1274EPIO_EXPORT void epio_clear_block_irq(epio_t *epio, uint8_t block, uint8_t irq_num);
1275
1301EPIO_EXPORT epio_t *epio_from_apio(void);
1302
1338EPIO_EXPORT void epio_update_from_apio(epio_t *epio);
1339
1352EPIO_EXPORT int epio_disassemble_sm(epio_t *epio, uint8_t block, uint8_t sm, char *buffer, size_t buffer_size);
1353
1357#define NUM_GPIOS 48
1358_Static_assert(NUM_GPIOS <= 64, "NUM_GPIOS must be <= 64 to fit in uint64_t");
1359_Static_assert(NUM_GPIOS == APIO_MAX_GPIOS, "NUM_GPIOS must match APIO_MAX_GPIOS");
1360
1362#define NUM_PIO_BLOCKS 3
1363
1365#define NUM_SMS_PER_BLOCK 4
1366
1368#define MAX_FIFO_DEPTH 4
1369
1371#define NUM_DMA_CHANNELS 16
1372
1374#define NUM_IRQS_PER_BLOCK 8
1375
1377#define NUM_INSTRS_PER_BLOCK 32
1378
1379#endif // EPIO_H
struct epio_t epio_t
Opaque epio instance type.
Definition epio.h:37
EPIO_EXPORT void epio_dma_setup_capture_pio_ring(epio_t *epio, uint8_t dma_chan, uint8_t src_block, uint8_t src_sm, uint8_t src_cycles, uint32_t ring_base, uint8_t ring_size_log2, uint8_t bit_mode)
Configure a DMA channel for PIO-capture into a circular SRAM ring.
epio_float_mode_t
Controls the value returned when reading an undriven GPIO pin that has been explicitly configured wit...
Definition epio.h:85
@ EPIO_FLOAT_LOW
Definition epio.h:86
@ EPIO_FLOAT_HIGH
Definition epio.h:87
@ EPIO_FLOAT_RANDOM
Definition epio.h:88
#define NUM_GPIOS
Maximum number of supported GPIOs.
Definition epio.h:1357
EPIO_EXPORT uint8_t ** epio_dma_capture_write_slot(epio_t *epio, uint8_t dma_chan)
Get the address of a capture channel's live host write pointer.
EPIO_EXPORT void epio_dma_setup_read_pio_chain(epio_t *epio, uint8_t dma_chan, uint8_t read_block, uint8_t read_sm, uint8_t read_cycles, uint8_t write_block, uint8_t write_sm, uint8_t write_cycles, uint8_t bit_mode)
Configure a DMA channel (pair) for PIO read access to SRAM.
EPIO_EXPORT void epio_update_from_apio(epio_t *epio)
Update a live epio instance from the current accumulated apio state.
EPIO_EXPORT epio_t * epio_from_apio(void)
Create an epio instance configured from the current apio state.
EPIO_EXPORT int epio_disassemble_sm(epio_t *epio, uint8_t block, uint8_t sm, char *buffer, size_t buffer_size)
Disassemble the instructions of a state machine.
EPIO_EXPORT uint64_t epio_get_cycle_count(epio_t *epio)
Return the total number of cycles executed since last reset.
EPIO_EXPORT void epio_set_instr(epio_t *epio, uint8_t block, uint8_t instr_num, uint16_t instr)
Write a PIO instruction into the instruction memory of a block.
EPIO_EXPORT void epio_force_sm_instr(epio_t *epio, uint8_t block, uint8_t sm, uint16_t instr)
Emulate a write to a state machine's SMx_INSTR register.
EPIO_EXPORT void epio_reset_cycle_count(epio_t *epio)
Reset the cycle counter to zero.
EPIO_EXPORT uint16_t epio_get_instr(epio_t *epio, uint8_t block, uint8_t instr_num)
Read a PIO instruction from the instruction memory of a block.
EPIO_EXPORT void epio_step_cycles(epio_t *epio, uint32_t cycles)
Advance all enabled state machines by a number of clock cycles.
EPIO_EXPORT void epio_push_tx_fifo(epio_t *epio, uint8_t block, uint8_t sm, uint32_t value)
Push a value into the TX FIFO.
EPIO_EXPORT uint32_t epio_pop_rx_fifo(epio_t *epio, uint8_t block, uint8_t sm)
Pop a value from the RX FIFO.
EPIO_EXPORT uint8_t epio_tx_fifo_depth(epio_t *epio, uint8_t block, uint8_t sm)
Return the current number of entries in the TX FIFO.
EPIO_EXPORT uint8_t epio_rx_fifo_depth(epio_t *epio, uint8_t block, uint8_t sm)
Return the current number of entries in the RX FIFO.
EPIO_EXPORT void epio_push_rx_fifo(epio_t *epio, uint8_t block, uint8_t sm, uint32_t value)
Push a value directly into the RX FIFO from the host.
EPIO_EXPORT int32_t epio_wait_tx_fifo(epio_t *epio, uint8_t block, uint8_t sm, int32_t count)
Wait for a maximum of count cycles until the TX FIFO of a state machine has an entry pushed to it.
EPIO_EXPORT uint32_t epio_pop_tx_fifo(epio_t *epio, uint8_t block, uint8_t sm)
Pop a value from the TX FIFO.
EPIO_EXPORT uint8_t epio_is_sm_enabled(epio_t *epio, uint8_t block, uint8_t sm)
Check if a state machine is enabled.
EPIO_EXPORT epio_t * epio_init(void)
Create and initialise a new epio instance.
EPIO_EXPORT void epio_disable_sm(epio_t *epio, uint8_t block, uint8_t sm)
Disable a state machine.
EPIO_EXPORT void epio_free(epio_t *epio)
Free an epio instance and all associated resources.
EPIO_EXPORT uint32_t epio_get_gpiobase(epio_t *epio, uint8_t block)
Get the GPIO base for a PIO block.
EPIO_EXPORT void epio_enable_sm(epio_t *epio, uint8_t block, uint8_t sm)
Enable a state machine for execution.
EPIO_EXPORT void epio_get_sm_debug(epio_t *epio, uint8_t block, uint8_t sm, epio_sm_debug_t *debug)
Gets the debug information for a specific state machine.
EPIO_EXPORT void epio_set_gpiobase(epio_t *epio, uint8_t block, uint32_t gpio_base)
Set the GPIO base for a PIO block.
EPIO_EXPORT void epio_set_sm_debug(epio_t *epio, uint8_t block, uint8_t sm, epio_sm_debug_t *debug)
Sets debug information for a specific state machine.
EPIO_EXPORT void epio_get_sm_reg(epio_t *epio, uint8_t block, uint8_t sm, epio_sm_reg_t *reg)
Read the current SM configuration registers for a state machine.
EPIO_EXPORT void epio_set_sm_reg(epio_t *epio, uint8_t block, uint8_t sm, epio_sm_reg_t *reg)
Set the SM configuration registers for a state machine.
EPIO_EXPORT uint64_t epio_read_driven_pins(epio_t *epio)
Read the set of GPIO pins currently being driven by PIO.
EPIO_EXPORT void epio_set_gpio_force_input_low(epio_t *epio, uint8_t pin, uint8_t force_low)
Force a GPIO pin configured as an input to present a low level.
EPIO_EXPORT void epio_set_gpio_output(epio_t *epio, uint8_t pin)
Configure a GPIO pin as an output.
uint64_t epio_get_gpio_output_control(epio_t *epio, uint8_t block)
Get the GPIO output control for a block.
EPIO_EXPORT uint8_t epio_get_gpio_pull_down(epio_t *epio, uint8_t pin)
Get the pull-down state of a GPIO pin.
EPIO_EXPORT void epio_set_gpio_input_level(epio_t *epio, uint8_t pin, uint8_t level)
Set the level of a GPIO configured as an input.
EPIO_EXPORT void epio_set_gpio_pull_none(epio_t *epio, uint8_t pin)
Disable both pull-up and pull-down resistors on a GPIO pin.
EPIO_EXPORT uint8_t epio_get_gpio_force_input_high(epio_t *epio, uint8_t pin)
Get whether a GPIO pin configured as an input has a forced input level high.
EPIO_EXPORT uint8_t epio_get_gpio_pull_up(epio_t *epio, uint8_t pin)
Get the pull-up state of a GPIO pin.
void epio_set_gpio_input_inverted(epio_t *epio, uint8_t pin, uint8_t inverted)
Set a GPIO pin as inverted or non-inverted.
EPIO_EXPORT uint8_t epio_get_gpio_force_input_low(epio_t *epio, uint8_t pin)
Get whether a GPIO pin configured as an input has a forced input level low.
EPIO_EXPORT void epio_set_gpio_slew_fast(epio_t *epio, uint8_t pin, uint8_t fast)
Set the slew rate for a GPIO output pin.
EPIO_EXPORT uint64_t epio_read_pull_up_pins(epio_t *epio)
Return a bitmask of all GPIO pins that have a pull-up configured.
uint8_t epio_get_gpio_input_inverted(epio_t *epio, uint8_t pin)
Get the inversion state of a GPIO pin.
EPIO_EXPORT void epio_set_gpio_output_level(epio_t *epio, uint8_t pin, uint8_t level)
Set the level of a GPIO configured as an output.
EPIO_EXPORT uint8_t epio_get_gpio_drive(epio_t *epio, uint8_t pin)
Get the configured drive strength for a GPIO output pin.
void epio_set_gpio_output_control(epio_t *epio, uint8_t pin, uint8_t block)
Set GPIO output control for a pin to a specific block.
EPIO_EXPORT uint8_t epio_get_gpio_input_only(epio_t *epio, uint8_t pin)
Get the input-only state of a GPIO pin.
EPIO_EXPORT void epio_set_gpio_force_input_high(epio_t *epio, uint8_t pin, uint8_t force_high)
Force a GPIO pin configured as an input to present a high level.
EPIO_EXPORT uint64_t epio_read_pull_down_pins(epio_t *epio)
Return a bitmask of all GPIO pins that have a pull-down configured.
EPIO_EXPORT void epio_set_float_mode(epio_t *epio, epio_float_mode_t mode)
Set the float mode for undriven PULL_NONE pins.
EPIO_EXPORT void epio_set_float_seed(epio_t *epio, uint32_t seed)
Seed the PRNG used by EPIO_FLOAT_RANDOM float mode.
uint8_t epio_block_can_control_gpio_output(epio_t *epio, uint8_t block, uint8_t pin)
Check if a block can control the output of a GPIO pin.
EPIO_EXPORT uint8_t epio_get_gpio_input(epio_t *epio, uint8_t pin)
Read the current input level of a single GPIO pin.
EPIO_EXPORT uint8_t epio_get_gpio_slew_fast(epio_t *epio, uint8_t pin)
Get the configured slew rate for a GPIO output pin.
EPIO_EXPORT void epio_set_gpio_pull_up(epio_t *epio, uint8_t pin, uint8_t enable)
Enable or disable a pull-up resistor on a GPIO pin.
EPIO_EXPORT void epio_set_gpio_drive(epio_t *epio, uint8_t pin, uint8_t strength)
Set the drive strength for a GPIO output pin.
EPIO_EXPORT uint64_t epio_read_pin_states(epio_t *epio)
Read the current state of all GPIO pins.
EPIO_EXPORT void epio_drive_gpios_ext(epio_t *epio, uint64_t gpios, uint64_t level)
Drive a set of GPIOs to specified levels from an external source.
EPIO_EXPORT void epio_set_gpio_input_only(epio_t *epio, uint8_t pin, uint8_t input_only)
Mark a GPIO pin as input-only (output driver disabled).
EPIO_EXPORT void epio_init_gpios(epio_t *epio)
Reset all GPIOs to their hardware reset defaults.
EPIO_EXPORT void epio_set_gpio_input(epio_t *epio, uint8_t pin)
Configure a GPIO pin as an input.
EPIO_EXPORT void epio_set_gpio_pull_down(epio_t *epio, uint8_t pin, uint8_t enable)
Enable or disable a pull-down resistor on a GPIO pin.
void epio_clear_gpio_output_control(epio_t *epio, uint8_t pin, uint8_t block)
Clear GPIO output control for a pin.
EPIO_EXPORT void epio_clear_block_irq(epio_t *epio, uint8_t block, uint8_t irq_num)
Clear an IRQ flag for a PIO block.
EPIO_EXPORT void epio_set_block_irq(epio_t *epio, uint8_t block, uint8_t irq_num)
Set an IRQ flag for a PIO block.
EPIO_EXPORT uint32_t epio_peek_sm_isr(epio_t *epio, uint8_t block, uint8_t sm)
Get the current Input Shift Register (ISR) value for a state machine.
EPIO_EXPORT uint32_t epio_peek_sm_x(epio_t *epio, uint8_t block, uint8_t sm)
Get the current X register value for a state machine.
EPIO_EXPORT uint8_t epio_peek_sm_exec_pending(epio_t *epio, uint8_t block, uint8_t sm)
Check if a state machine has a pending EXEC instruction.
EPIO_EXPORT uint32_t epio_peek_tx_fifo(epio_t *epio, uint8_t block, uint8_t sm, uint8_t entry)
Peek at an entry in the TX FIFO of a state machine without popping it.
EPIO_EXPORT uint32_t epio_peek_rx_fifo(epio_t *epio, uint8_t block, uint8_t sm, uint8_t entry)
Peek at an entry in the RX FIFO of a state machine without popping it.
EPIO_EXPORT uint8_t epio_peek_block_irq_num(epio_t *epio, uint8_t block, uint8_t irq_num)
Check if a specific IRQ flag is set for a PIO block.
EPIO_EXPORT uint16_t epio_peek_sm_exec_instr(epio_t *epio, uint8_t block, uint8_t sm)
Get the pending EXEC instruction for a state machine.
EPIO_EXPORT uint32_t epio_peek_sm_osr(epio_t *epio, uint8_t block, uint8_t sm)
Get the current Output Shift Register (OSR) value for a state machine.
EPIO_EXPORT uint8_t epio_peek_sm_pc(epio_t *epio, uint8_t block, uint8_t sm)
Get the current program counter (PC) for a state machine.
EPIO_EXPORT uint8_t epio_peek_sm_delay(epio_t *epio, uint8_t block, uint8_t sm)
Get the current delay counter for a state machine.
EPIO_EXPORT uint8_t epio_peek_sm_isr_count(epio_t *epio, uint8_t block, uint8_t sm)
Get the current ISR bit counter for a state machine.
EPIO_EXPORT uint8_t epio_peek_sm_stalled(epio_t *epio, uint8_t block, uint8_t sm)
Check if a state machine is currently stalled.
EPIO_EXPORT uint32_t epio_peek_sm_y(epio_t *epio, uint8_t block, uint8_t sm)
Get the current Y register value for a state machine.
EPIO_EXPORT uint32_t epio_peek_block_irq(epio_t *epio, uint8_t block)
Get the current IRQ state bitmask for a PIO block.
EPIO_EXPORT uint8_t epio_peek_sm_osr_count(epio_t *epio, uint8_t block, uint8_t sm)
Get the current OSR bit counter for a state machine.
EPIO_EXPORT uint8_t epio_peek_sm_osr_empty(epio_t *epio, uint8_t block, uint8_t sm)
Check whether the OSR is considered empty for a state machine.
EPIO_EXPORT void epio_sram_write_halfword(epio_t *epio, uint32_t addr, uint16_t value)
Write a halfword (16-bit) to the emulated SRAM.
EPIO_EXPORT uint8_t epio_sram_read_byte(epio_t *epio, uint32_t addr)
Read a byte from the emulated SRAM.
EPIO_EXPORT uint32_t epio_sram_read_word(epio_t *epio, uint32_t addr)
Read a word (32-bit) from the emulated SRAM.
EPIO_EXPORT void epio_sram_write_byte(epio_t *epio, uint32_t addr, uint8_t value)
Write a byte to the emulated SRAM.
EPIO_EXPORT uint8_t * epio_get_sram_ptr(epio_t *epio)
Get a direct pointer to the emulated SRAM buffer.
EPIO_EXPORT void epio_sram_set(epio_t *epio, uint32_t addr, uint8_t *data, size_t len)
Write a block of data into the emulated SRAM.
EPIO_EXPORT uint16_t epio_sram_read_halfword(epio_t *epio, uint32_t addr)
Read a halfword (16-bit) from the emulated SRAM.
EPIO_EXPORT void epio_sram_write_word(epio_t *epio, uint32_t addr, uint32_t value)
Write a word (32-bit) to the emulated SRAM.
Debug information for a single PIO state machine.
Definition epio.h:51
uint8_t start_instr
Definition epio.h:55
uint8_t first_instr
Definition epio.h:53
uint8_t end_instr
Definition epio.h:57
Configurable registers for a single PIO state machine.
Definition epio.h:67
uint32_t shiftctrl
Definition epio.h:73
uint32_t pinctrl
Definition epio.h:75
uint32_t execctrl
Definition epio.h:71
uint32_t clkdiv
Definition epio.h:69