pio.h File Reference
#include "pico.h"
#include "hardware/address_mapped.h"
#include "hardware/structs/pio.h"
#include "hardware/gpio.h"
#include "hardware/regs/dreq.h"
#include "hardware/pio_instructions.h"
Include dependency graph for pio.h:

Go to the source code of this file.

Data Structures

struct  pio_sm_config
 PIO Configuration structure. More...
 
struct  pio_program
 

Macros

#define PARAM_ASSERTIONS_ENABLED_PIO   0
 
#define pio0   pio0_hw
 
#define pio1   pio1_hw
 

Typedefs

typedef pio_hw_tPIO
 
typedef struct pio_program pio_program_t
 

Enumerations

enum  pio_fifo_join { PIO_FIFO_JOIN_NONE = 0, PIO_FIFO_JOIN_TX = 1, PIO_FIFO_JOIN_RX = 2 }
 FIFO join states.
 
enum  pio_mov_status_type { STATUS_TX_LESSTHAN = 0, STATUS_RX_LESSTHAN = 1 }
 MOV status types.
 
enum  pio_interrupt_source {
  pis_interrupt0 = PIO_INTR_SM0_LSB, pis_interrupt1 = PIO_INTR_SM1_LSB, pis_interrupt2 = PIO_INTR_SM2_LSB, pis_interrupt3 = PIO_INTR_SM3_LSB,
  pis_sm0_tx_fifo_not_full = PIO_INTR_SM0_TXNFULL_LSB, pis_sm1_tx_fifo_not_full = PIO_INTR_SM1_TXNFULL_LSB, pis_sm2_tx_fifo_not_full = PIO_INTR_SM2_TXNFULL_LSB, pis_sm3_tx_fifo_not_full = PIO_INTR_SM3_TXNFULL_LSB,
  pis_sm0_rx_fifo_not_empty = PIO_INTR_SM0_RXNEMPTY_LSB, pis_sm1_rx_fifo_not_empty = PIO_INTR_SM1_RXNEMPTY_LSB, pis_sm2_rx_fifo_not_empty = PIO_INTR_SM2_RXNEMPTY_LSB, pis_sm3_rx_fifo_not_empty = PIO_INTR_SM3_RXNEMPTY_LSB
}
 PIO interrupt source numbers for pio related IRQs.
 

Functions

static void check_sm_param (__unused uint sm)
 
static void check_sm_mask (__unused uint mask)
 
static void check_pio_param (__unused PIO pio)
 
static void sm_config_set_out_pins (pio_sm_config *c, uint out_base, uint out_count)
 Set the 'out' pins in a state machine configuration. More...
 
static void sm_config_set_set_pins (pio_sm_config *c, uint set_base, uint set_count)
 Set the 'set' pins in a state machine configuration. More...
 
static void sm_config_set_in_pins (pio_sm_config *c, uint in_base)
 Set the 'in' pins in a state machine configuration. More...
 
static void sm_config_set_sideset_pins (pio_sm_config *c, uint sideset_base)
 Set the 'sideset' pins in a state machine configuration. More...
 
static void sm_config_set_sideset (pio_sm_config *c, uint bit_count, bool optional, bool pindirs)
 Set the 'sideset' options in a state machine configuration. More...
 
static void sm_config_set_clkdiv_int_frac (pio_sm_config *c, uint16_t div_int, uint8_t div_frac)
 Set the state machine clock divider (from integer and fractional parts - 16:8) in a state machine configuration. More...
 
static void pio_calculate_clkdiv_from_float (float div, uint16_t *div_int, uint8_t *div_frac)
 
static void sm_config_set_clkdiv (pio_sm_config *c, float div)
 Set the state machine clock divider (from a floating point value) in a state machine configuration. More...
 
static void sm_config_set_wrap (pio_sm_config *c, uint wrap_target, uint wrap)
 Set the wrap addresses in a state machine configuration. More...
 
static void sm_config_set_jmp_pin (pio_sm_config *c, uint pin)
 Set the 'jmp' pin in a state machine configuration. More...
 
static void sm_config_set_in_shift (pio_sm_config *c, bool shift_right, bool autopush, uint push_threshold)
 Setup 'in' shifting parameters in a state machine configuration. More...
 
static void sm_config_set_out_shift (pio_sm_config *c, bool shift_right, bool autopull, uint pull_threshold)
 Setup 'out' shifting parameters in a state machine configuration. More...
 
static void sm_config_set_fifo_join (pio_sm_config *c, enum pio_fifo_join join)
 Setup the FIFO joining in a state machine configuration. More...
 
static void sm_config_set_out_special (pio_sm_config *c, bool sticky, bool has_enable_pin, uint enable_pin_index)
 Set special 'out' operations in a state machine configuration. More...
 
static void sm_config_set_mov_status (pio_sm_config *c, enum pio_mov_status_type status_sel, uint status_n)
 Set source for 'mov status' in a state machine configuration. More...
 
static pio_sm_config pio_get_default_sm_config (void)
 Get the default state machine configuration. More...
 
static void pio_sm_set_config (PIO pio, uint sm, const pio_sm_config *config)
 Apply a state machine configuration to a state machine. More...
 
static uint pio_get_index (PIO pio)
 Return the instance number of a PIO instance. More...
 
static void pio_gpio_init (PIO pio, uint pin)
 Setup the function select for a GPIO to use output from the given PIO instance. More...
 
static uint pio_get_dreq (PIO pio, uint sm, bool is_tx)
 Return the DREQ to use for pacing transfers to/from a particular state machine FIFO. More...
 
bool pio_can_add_program (PIO pio, const pio_program_t *program)
 Determine whether the given program can (at the time of the call) be loaded onto the PIO instance. More...
 
bool pio_can_add_program_at_offset (PIO pio, const pio_program_t *program, uint offset)
 Determine whether the given program can (at the time of the call) be loaded onto the PIO instance starting at a particular location. More...
 
uint pio_add_program (PIO pio, const pio_program_t *program)
 Attempt to load the program, panicking if not possible. More...
 
void pio_add_program_at_offset (PIO pio, const pio_program_t *program, uint offset)
 Attempt to load the program at the specified instruction memory offset, panicking if not possible. More...
 
void pio_remove_program (PIO pio, const pio_program_t *program, uint loaded_offset)
 Remove a program from a PIO instance's instruction memory. More...
 
void pio_clear_instruction_memory (PIO pio)
 Clears all of a PIO instance's instruction memory. More...
 
void pio_sm_init (PIO pio, uint sm, uint initial_pc, const pio_sm_config *config)
 Resets the state machine to a consistent state, and configures it. More...
 
static void pio_sm_set_enabled (PIO pio, uint sm, bool enabled)
 Enable or disable a PIO state machine. More...
 
static void pio_set_sm_mask_enabled (PIO pio, uint32_t mask, bool enabled)
 Enable or disable multiple PIO state machines. More...
 
static void pio_sm_restart (PIO pio, uint sm)
 Restart a state machine with a known state. More...
 
static void pio_restart_sm_mask (PIO pio, uint32_t mask)
 Restart multiple state machine with a known state. More...
 
static void pio_sm_clkdiv_restart (PIO pio, uint sm)
 Restart a state machine's clock divider from a phase of 0. More...
 
static void pio_clkdiv_restart_sm_mask (PIO pio, uint32_t mask)
 Restart multiple state machines' clock dividers from a phase of 0. More...
 
static void pio_enable_sm_mask_in_sync (PIO pio, uint32_t mask)
 Enable multiple PIO state machines synchronizing their clock dividers. More...
 
static void pio_set_irq0_source_enabled (PIO pio, enum pio_interrupt_source source, bool enabled)
 Enable/Disable a single source on a PIO's IRQ 0. More...
 
static void pio_set_irq1_source_enabled (PIO pio, enum pio_interrupt_source source, bool enabled)
 Enable/Disable a single source on a PIO's IRQ 1. More...
 
static void pio_set_irq0_source_mask_enabled (PIO pio, uint32_t source_mask, bool enabled)
 Enable/Disable multiple sources on a PIO's IRQ 0. More...
 
static void pio_set_irq1_source_mask_enabled (PIO pio, uint32_t source_mask, bool enabled)
 Enable/Disable multiple sources on a PIO's IRQ 1. More...
 
static void pio_set_irqn_source_enabled (PIO pio, uint irq_index, enum pio_interrupt_source source, bool enabled)
 Enable/Disable a single source on a PIO's specified (0/1) IRQ index. More...
 
static void pio_set_irqn_source_mask_enabled (PIO pio, uint irq_index, uint32_t source_mask, bool enabled)
 Enable/Disable multiple sources on a PIO's specified (0/1) IRQ index. More...
 
static bool pio_interrupt_get (PIO pio, uint pio_interrupt_num)
 Determine if a particular PIO interrupt is set. More...
 
static void pio_interrupt_clear (PIO pio, uint pio_interrupt_num)
 Clear a particular PIO interrupt. More...
 
static uint8_t pio_sm_get_pc (PIO pio, uint sm)
 Return the current program counter for a state machine. More...
 
static void pio_sm_exec (PIO pio, uint sm, uint instr)
 Immediately execute an instruction on a state machine. More...
 
static bool pio_sm_is_exec_stalled (PIO pio, uint sm)
 Determine if an instruction set by pio_sm_exec() is stalled executing. More...
 
static void pio_sm_exec_wait_blocking (PIO pio, uint sm, uint instr)
 Immediately execute an instruction on a state machine and wait for it to complete. More...
 
static void pio_sm_set_wrap (PIO pio, uint sm, uint wrap_target, uint wrap)
 Set the current wrap configuration for a state machine. More...
 
static void pio_sm_set_out_pins (PIO pio, uint sm, uint out_base, uint out_count)
 Set the current 'out' pins for a state machine. More...
 
static void pio_sm_set_set_pins (PIO pio, uint sm, uint set_base, uint set_count)
 Set the current 'set' pins for a state machine. More...
 
static void pio_sm_set_in_pins (PIO pio, uint sm, uint in_base)
 Set the current 'in' pins for a state machine. More...
 
static void pio_sm_set_sideset_pins (PIO pio, uint sm, uint sideset_base)
 Set the current 'sideset' pins for a state machine. More...
 
static void pio_sm_put (PIO pio, uint sm, uint32_t data)
 Write a word of data to a state machine's TX FIFO. More...
 
static uint32_t pio_sm_get (PIO pio, uint sm)
 Read a word of data from a state machine's RX FIFO. More...
 
static bool pio_sm_is_rx_fifo_full (PIO pio, uint sm)
 Determine if a state machine's RX FIFO is full. More...
 
static bool pio_sm_is_rx_fifo_empty (PIO pio, uint sm)
 Determine if a state machine's RX FIFO is empty. More...
 
static uint pio_sm_get_rx_fifo_level (PIO pio, uint sm)
 Return the number of elements currently in a state machine's RX FIFO. More...
 
static bool pio_sm_is_tx_fifo_full (PIO pio, uint sm)
 Determine if a state machine's TX FIFO is full. More...
 
static bool pio_sm_is_tx_fifo_empty (PIO pio, uint sm)
 Determine if a state machine's TX FIFO is empty. More...
 
static uint pio_sm_get_tx_fifo_level (PIO pio, uint sm)
 Return the number of elements currently in a state machine's TX FIFO. More...
 
static void pio_sm_put_blocking (PIO pio, uint sm, uint32_t data)
 Write a word of data to a state machine's TX FIFO, blocking if the FIFO is full. More...
 
static uint32_t pio_sm_get_blocking (PIO pio, uint sm)
 Read a word of data from a state machine's RX FIFO, blocking if the FIFO is empty. More...
 
void pio_sm_drain_tx_fifo (PIO pio, uint sm)
 Empty out a state machine's TX FIFO. More...
 
static void pio_sm_set_clkdiv_int_frac (PIO pio, uint sm, uint16_t div_int, uint8_t div_frac)
 set the current clock divider for a state machine using a 16:8 fraction More...
 
static void pio_sm_set_clkdiv (PIO pio, uint sm, float div)
 set the current clock divider for a state machine More...
 
static void pio_sm_clear_fifos (PIO pio, uint sm)
 Clear a state machine's TX and RX FIFOs. More...
 
void pio_sm_set_pins (PIO pio, uint sm, uint32_t pin_values)
 Use a state machine to set a value on all pins for the PIO instance. More...
 
void pio_sm_set_pins_with_mask (PIO pio, uint sm, uint32_t pin_values, uint32_t pin_mask)
 Use a state machine to set a value on multiple pins for the PIO instance. More...
 
void pio_sm_set_pindirs_with_mask (PIO pio, uint sm, uint32_t pin_dirs, uint32_t pin_mask)
 Use a state machine to set the pin directions for multiple pins for the PIO instance. More...
 
void pio_sm_set_consecutive_pindirs (PIO pio, uint sm, uint pin_base, uint pin_count, bool is_out)
 Use a state machine to set the same pin direction for multiple consecutive pins for the PIO instance. More...
 
void pio_sm_claim (PIO pio, uint sm)
 Mark a state machine as used. More...
 
void pio_claim_sm_mask (PIO pio, uint sm_mask)
 Mark multiple state machines as used. More...
 
void pio_sm_unclaim (PIO pio, uint sm)
 Mark a state machine as no longer used. More...
 
int pio_claim_unused_sm (PIO pio, bool required)
 Claim a free state machine on a PIO instance. More...
 
bool pio_sm_is_claimed (PIO pio, uint sm)
 Determine if a PIO state machine is claimed. More...