epio WASM — API Reference

This page documents the JavaScript bindings for libepio, a cycle-accurate RP2350 PIO emulator compiled to WebAssembly via Emscripten.

The C signatures link to the full API documentation. The JS column shows the equivalent binding exposed by epio_bindings.js, using Emscripten’s cwrap type system: 'number' for all integer and pointer types, 'bigint' for uint64_t, and null for void.

C signatureJS binding
epio_t * epio_init(void)epio.epio_init() → 'number'
void epio_free(epio_t* epio)epio.epio_free(epio: 'number') → null
void epio_set_sm_debug(epio_t* epio, uint8_t block, uint8_t sm, epio_sm_debug_t* debug)epio.epio_set_sm_debug(epio: 'number', block: 'number', sm: 'number', debug: 'number') → null
void epio_get_sm_debug(epio_t* epio, uint8_t block, uint8_t sm, epio_sm_debug_t* debug)epio.epio_get_sm_debug(epio: 'number', block: 'number', sm: 'number', debug: 'number') → null
void epio_set_gpiobase(epio_t* epio, uint8_t block, uint32_t gpio_base)epio.epio_set_gpiobase(epio: 'number', block: 'number', gpio_base: 'number') → null
uint32_t epio_get_gpiobase(epio_t* epio, uint8_t block)epio.epio_get_gpiobase(epio: 'number', block: 'number') → 'number'
void epio_set_sm_reg(epio_t* epio, uint8_t block, uint8_t sm, epio_sm_reg_t* reg)epio.epio_set_sm_reg(epio: 'number', block: 'number', sm: 'number', reg: 'number') → null
void epio_get_sm_reg(epio_t* epio, uint8_t block, uint8_t sm, epio_sm_reg_t* reg)epio.epio_get_sm_reg(epio: 'number', block: 'number', sm: 'number', reg: 'number') → null
void epio_enable_sm(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_enable_sm(epio: 'number', block: 'number', sm: 'number') → null
uint8_t epio_is_sm_enabled(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_is_sm_enabled(epio: 'number', block: 'number', sm: 'number') → 'number'
void epio_disable_sm(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_disable_sm(epio: 'number', block: 'number', sm: 'number') → null
void epio_set_instr(epio_t* epio, uint8_t block, uint8_t instr_num, uint16_t instr)epio.epio_set_instr(epio: 'number', block: 'number', instr_num: 'number', instr: 'number') → null
uint16_t epio_get_instr(epio_t* epio, uint8_t block, uint8_t instr_num)epio.epio_get_instr(epio: 'number', block: 'number', instr_num: 'number') → 'number'
void epio_step_cycles(epio_t* epio, uint32_t cycles)epio.epio_step_cycles(epio: 'number', cycles: 'number') → null
uint64_t epio_get_cycle_count(epio_t* epio)epio.epio_get_cycle_count(epio: 'number') → 'bigint'
void epio_reset_cycle_count(epio_t* epio)epio.epio_reset_cycle_count(epio: 'number') → null
int32_t epio_wait_tx_fifo(epio_t* epio, uint8_t block, uint8_t sm, int32_t count)epio.epio_wait_tx_fifo(epio: 'number', block: 'number', sm: 'number', count: 'number') → 'number'
uint8_t epio_tx_fifo_depth(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_tx_fifo_depth(epio: 'number', block: 'number', sm: 'number') → 'number'
uint8_t epio_rx_fifo_depth(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_rx_fifo_depth(epio: 'number', block: 'number', sm: 'number') → 'number'
uint32_t epio_pop_rx_fifo(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_pop_rx_fifo(epio: 'number', block: 'number', sm: 'number') → 'number'
uint32_t epio_pop_tx_fifo(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_pop_tx_fifo(epio: 'number', block: 'number', sm: 'number') → 'number'
void epio_push_tx_fifo(epio_t* epio, uint8_t block, uint8_t sm, uint32_t value)epio.epio_push_tx_fifo(epio: 'number', block: 'number', sm: 'number', value: 'number') → null
void epio_push_rx_fifo(epio_t* epio, uint8_t block, uint8_t sm, uint32_t value)epio.epio_push_rx_fifo(epio: 'number', block: 'number', sm: 'number', value: 'number') → null
void epio_drive_gpios_ext(epio_t* epio, uint64_t gpios, uint64_t level)epio.epio_drive_gpios_ext(epio: 'number', gpios: 'bigint', level: 'bigint') → null
uint8_t epio_get_gpio_input(epio_t* epio, uint8_t pin)epio.epio_get_gpio_input(epio: 'number', pin: 'number') → 'number'
void epio_init_gpios(epio_t* epio)epio.epio_init_gpios(epio: 'number') → null
void epio_set_gpio_force_input_low(epio_t* epio, uint8_t pin, uint8_t force_low)epio.epio_set_gpio_force_input_low(epio: 'number', pin: 'number', force_low: 'number') → null
void epio_set_gpio_force_input_high(epio_t* epio, uint8_t pin, uint8_t force_high)epio.epio_set_gpio_force_input_high(epio: 'number', pin: 'number', force_high: 'number') → null
uint8_t epio_get_gpio_force_input_low(epio_t* epio, uint8_t pin)epio.epio_get_gpio_force_input_low(epio: 'number', pin: 'number') → 'number'
uint8_t epio_get_gpio_force_input_high(epio_t* epio, uint8_t pin)epio.epio_get_gpio_force_input_high(epio: 'number', pin: 'number') → 'number'
void epio_set_gpio_input(epio_t* epio, uint8_t pin)epio.epio_set_gpio_input(epio: 'number', pin: 'number') → null
void epio_set_gpio_output(epio_t* epio, uint8_t pin)epio.epio_set_gpio_output(epio: 'number', pin: 'number') → null
void epio_set_gpio_input_level(epio_t* epio, uint8_t pin, uint8_t level)epio.epio_set_gpio_input_level(epio: 'number', pin: 'number', level: 'number') → null
void epio_set_gpio_output_level(epio_t* epio, uint8_t pin, uint8_t level)epio.epio_set_gpio_output_level(epio: 'number', pin: 'number', level: 'number') → null
uint64_t epio_read_pin_states(epio_t* epio)epio.epio_read_pin_states(epio: 'number') → 'bigint'
uint64_t epio_read_driven_pins(epio_t* epio)epio.epio_read_driven_pins(epio: 'number') → 'bigint'
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)epio.epio_dma_setup_read_pio_chain(epio: 'number', dma_chan: 'number', read_block: 'number', read_sm: 'number', read_cycles: 'number', write_block: 'number', write_sm: 'number', write_cycles: 'number', bit_mode: 'number') → null
uint8_t epio_sram_read_byte(epio_t* epio, uint32_t addr)epio.epio_sram_read_byte(epio: 'number', addr: 'number') → 'number'
void epio_sram_set(epio_t* epio, uint32_t addr, uint8_t* data, size_t len)epio.epio_sram_set(epio: 'number', addr: 'number', data: 'number', len: 'number') → null
uint16_t epio_sram_read_halfword(epio_t* epio, uint32_t addr)epio.epio_sram_read_halfword(epio: 'number', addr: 'number') → 'number'
uint32_t epio_sram_read_word(epio_t* epio, uint32_t addr)epio.epio_sram_read_word(epio: 'number', addr: 'number') → 'number'
void epio_sram_write_byte(epio_t* epio, uint32_t addr, uint8_t value)epio.epio_sram_write_byte(epio: 'number', addr: 'number', value: 'number') → null
void epio_sram_write_halfword(epio_t* epio, uint32_t addr, uint16_t value)epio.epio_sram_write_halfword(epio: 'number', addr: 'number', value: 'number') → null
void epio_sram_write_word(epio_t* epio, uint32_t addr, uint32_t value)epio.epio_sram_write_word(epio: 'number', addr: 'number', value: 'number') → null
uint8_t epio_peek_sm_pc(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_peek_sm_pc(epio: 'number', block: 'number', sm: 'number') → 'number'
uint32_t epio_peek_sm_x(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_peek_sm_x(epio: 'number', block: 'number', sm: 'number') → 'number'
uint32_t epio_peek_sm_y(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_peek_sm_y(epio: 'number', block: 'number', sm: 'number') → 'number'
uint32_t epio_peek_sm_isr(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_peek_sm_isr(epio: 'number', block: 'number', sm: 'number') → 'number'
uint32_t epio_peek_sm_osr(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_peek_sm_osr(epio: 'number', block: 'number', sm: 'number') → 'number'
uint8_t epio_peek_sm_isr_count(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_peek_sm_isr_count(epio: 'number', block: 'number', sm: 'number') → 'number'
uint8_t epio_peek_sm_osr_count(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_peek_sm_osr_count(epio: 'number', block: 'number', sm: 'number') → 'number'
uint8_t epio_peek_sm_osr_empty(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_peek_sm_osr_empty(epio: 'number', block: 'number', sm: 'number') → 'number'
uint8_t epio_peek_sm_stalled(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_peek_sm_stalled(epio: 'number', block: 'number', sm: 'number') → 'number'
uint8_t epio_peek_sm_delay(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_peek_sm_delay(epio: 'number', block: 'number', sm: 'number') → 'number'
uint8_t epio_peek_sm_exec_pending(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_peek_sm_exec_pending(epio: 'number', block: 'number', sm: 'number') → 'number'
uint16_t epio_peek_sm_exec_instr(epio_t* epio, uint8_t block, uint8_t sm)epio.epio_peek_sm_exec_instr(epio: 'number', block: 'number', sm: 'number') → 'number'
uint32_t epio_peek_block_irq(epio_t* epio, uint8_t block)epio.epio_peek_block_irq(epio: 'number', block: 'number') → 'number'
uint8_t epio_peek_block_irq_num(epio_t* epio, uint8_t block, uint8_t irq_num)epio.epio_peek_block_irq_num(epio: 'number', block: 'number', irq_num: 'number') → 'number'
uint32_t epio_peek_rx_fifo(epio_t* epio, uint8_t block, uint8_t sm, uint8_t entry)epio.epio_peek_rx_fifo(epio: 'number', block: 'number', sm: 'number', entry: 'number') → 'number'
uint32_t epio_peek_tx_fifo(epio_t* epio, uint8_t block, uint8_t sm, uint8_t entry)epio.epio_peek_tx_fifo(epio: 'number', block: 'number', sm: 'number', entry: 'number') → 'number'
void epio_set_block_irq(epio_t* epio, uint8_t block, uint8_t irq_num)epio.epio_set_block_irq(epio: 'number', block: 'number', irq_num: 'number') → null
void epio_clear_block_irq(epio_t* epio, uint8_t block, uint8_t irq_num)epio.epio_clear_block_irq(epio: 'number', block: 'number', irq_num: 'number') → null
epio_t * epio_from_apio(void)epio.epio_from_apio() → 'number'
int epio_disassemble_sm(epio_t* epio, uint8_t block, uint8_t sm, char* buffer, size_t buffer_size)epio.epio_disassemble_sm(epio: 'number', block: 'number', sm: 'number', buffer: 'number', buffer_size: 'number') → 'number'