← index #17747PR #18133
Related · high · value 5.651
QUERY · ISSUE

rp2: Support for new RP2350 PIO instructions in the `@rp2.asm_pio` assembler

openby rtyleyopened 2025-07-22updated 2025-12-30
enhancementport-rp2

Description

The RP2350 adds several new PIO instructions/options compared to the RP2040 - currently they're not supported by MicroPython's @rp2.asm_pio assembler, so it's difficult to use them under MicroPython.

https://datasheets.raspberrypi.com/rp2350/rp2350-datasheet.pdf

The PIO changes are listed in Section 11.1.1. ('Changes from RP2040') - note that the first change is:

DBG_CFGINFO.VERSION indicates the PIO version, to allow PIO feature detection at runtime.
This 4-bit field was reserved-0 on RP2040 (indicating version 0), and reads as 1 on RP2350.

Specifically I'm interested in the new variants of mov that allow random-access to the FIFO queue with indexed arguments:

  • mov rxfifo[y], isr
  • mov rxfifo[<index>], isr
  • mov osr, rxfifo[y]
  • mov osr, rxfifo[<index>]

where:

  • y : The literal token "y", indicating the RX FIFO entry is indexed by the Y register.
  • <index> : A value (see Section 11.3.2) specifying the RX FIFO entry to write (valid range 0-3).

It's not currently possible to express these with the Micropython mov() assembler function, so far as I'm aware.

Support for the rp2040 was originally added to MicroPython with:

  • https://github.com/micropython/micropython/pull/6791

See also:

  • https://github.com/raspberrypi/pico-feedback/issues/437

Code Size

Random-access to the FIFO queue is a pretty substantial upgrade for PIO! I really do not know how large/difficult the implementation would be though.

Implementation

I hope the MicroPython maintainers or community will implement this feature

Code of Conduct

Yes, I agree

CANDIDATE · PULL REQUEST

rp2: Add execctrl option for the PIO decorator.

openby arachsysopened 2025-09-24updated 2026-02-24
docsport-rp2

Summary

The rp2 PIO assembler includes support for instructions like

mov(y, status)

which can be used to detect when the TX and RX FIFOs pass a configurable threshold, for example to trigger an interrupt handler to fill/empty them.

However, to actually use these instructions, the relevant threshold needs to be configured in the execctrl register, and at present, only the side_pindir bit can be set.

Expose an execctrl= keyword argument in the PIO decorator to do this, together with constants in rp2.PIO which can be used like

@rp2.asm_pio(execctrl = rp2.PIO.STATUS_TXLEVEL + n)
def program():
    [...]
    mov(y, status)
    jmp(not_y, "skip")
    irq(rel(0))
    label("skip")
    [...]

to generate an interrupt if the TX FIFO has fewer than n words left.

This also fixes a bug with the existing side_pindir option, which is meant to be boolean. Previously, if it was passed an integer other than 0 or 1, unintended high bits in the execctrl value would be set, not just the intended bit 29.

Testing

I've tested (and used) this functionality on a real rp2350 board.

Unfortunately there are no in-tree tests at all for the rp2 PIO assembler yet, so there isn't a natural place to add a simple test for this new option. I propose to write a full set of tests to cover as much as I can of that decorator, but will submit in a separate PR.

Trade-offs and Alternatives

It is possible to work around the lack of assembler execctrl support by patching the word of the program array that corresponds to the execctrl register, for example

program[4] = program[4] & ~127 | 1 # set status if txlevel < 1

but this assumes undocumented internal details of the rp2 pio module.

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied