From f842a40df4d26bd74b92a3903096fc6b1709222d Mon Sep 17 00:00:00 2001 From: Tim Radvan Date: Fri, 2 Apr 2021 19:35:18 +0100 Subject: [PATCH] rp2/rp2_pio: Add fifo_join support for PIO. The PIO state machines on the RP2040 have 4 word deep TX and RX FIFOs. If you only need one direction, you can "merge" them into either a single 8 word deep TX or RX FIFO. We simply add constants to the PIO object, and set the appropriate bits in `shiftctrl`. Resolves #6854. Signed-off-by: Tim Radvan --- examples/rp2/pio_uart_rx.py | 1 + ports/rp2/modules/rp2.py | 6 ++++-- ports/rp2/rp2_pio.c | 4 ++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/examples/rp2/pio_uart_rx.py b/examples/rp2/pio_uart_rx.py index 41dfde3dad..080b6bd639 100644 --- a/examples/rp2/pio_uart_rx.py +++ b/examples/rp2/pio_uart_rx.py @@ -22,6 +22,7 @@ PIO_RX_PIN = Pin(3, Pin.IN, Pin.PULL_UP) autopush=True, push_thresh=8, in_shiftdir=rp2.PIO.SHIFT_RIGHT, + fifo_join=PIO.JOIN_RX, ) def uart_rx_mini(): # fmt: off diff --git a/ports/rp2/modules/rp2.py b/ports/rp2/modules/rp2.py index 17e35c73b7..c7e4d1fdd9 100644 --- a/ports/rp2/modules/rp2.py +++ b/ports/rp2/modules/rp2.py @@ -31,7 +31,8 @@ class PIOASMEmit: autopush=False, autopull=False, push_thresh=32, - pull_thresh=32 + pull_thresh=32, + fifo_join=0 ): # uarray is a built-in module so importing it here won't require # scanning the filesystem. @@ -40,7 +41,8 @@ class PIOASMEmit: self.labels = {} execctrl = 0 shiftctrl = ( - (pull_thresh & 0x1F) << 25 + fifo_join << 30 + | (pull_thresh & 0x1F) << 25 | (push_thresh & 0x1F) << 20 | out_shiftdir << 19 | in_shiftdir << 18 diff --git a/ports/rp2/rp2_pio.c b/ports/rp2/rp2_pio.c index 5f93f10c26..44928c0a88 100644 --- a/ports/rp2/rp2_pio.c +++ b/ports/rp2/rp2_pio.c @@ -360,6 +360,10 @@ STATIC const mp_rom_map_elem_t rp2_pio_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_SHIFT_LEFT), MP_ROM_INT(0) }, { MP_ROM_QSTR(MP_QSTR_SHIFT_RIGHT), MP_ROM_INT(1) }, + { MP_ROM_QSTR(MP_QSTR_JOIN_NONE), MP_ROM_INT(0) }, + { MP_ROM_QSTR(MP_QSTR_JOIN_TX), MP_ROM_INT(1) }, + { MP_ROM_QSTR(MP_QSTR_JOIN_RX), MP_ROM_INT(2) }, + { MP_ROM_QSTR(MP_QSTR_IRQ_SM0), MP_ROM_INT(0x100) }, { MP_ROM_QSTR(MP_QSTR_IRQ_SM1), MP_ROM_INT(0x200) }, { MP_ROM_QSTR(MP_QSTR_IRQ_SM2), MP_ROM_INT(0x400) },