Skip to content

Commit aaaa99d

Browse files
Support PIO2 for SoftwareSerial/SerialPIO (#2451)
New IRQs and PIO pointers required for the 3rd PIO on the 2350. Fixes #2447
1 parent 12130eb commit aaaa99d

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

cores/rp2040/SerialPIO.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ static int _parity(int bits, int data) {
7979

8080
// We need to cache generated SerialPIOs so we can add data to them from
8181
// the shared handler
82-
static SerialPIO *_pioSP[2][4];
82+
static SerialPIO *_pioSP[3][4];
8383
static void __not_in_flash_func(_fifoIRQ)() {
84-
for (int p = 0; p < 2; p++) {
84+
for (int p = 0; p < 3; p++) {
8585
for (int sm = 0; sm < 4; sm++) {
8686
SerialPIO *s = _pioSP[p][sm];
8787
if (s) {
@@ -148,6 +148,21 @@ SerialPIO::~SerialPIO() {
148148
delete[] _queue;
149149
}
150150

151+
static int pio_irq_0(PIO p) {
152+
switch (pio_get_index(p)) {
153+
case 0:
154+
return PIO0_IRQ_0;
155+
case 1:
156+
return PIO1_IRQ_0;
157+
#if defined(PICO_RP2350)
158+
case 2:
159+
return PIO2_IRQ_0;
160+
#endif
161+
default:
162+
return -1;
163+
}
164+
}
165+
151166
void SerialPIO::begin(unsigned long baud, uint16_t config) {
152167
_overflow = false;
153168
_baud = baud;
@@ -247,7 +262,7 @@ void SerialPIO::begin(unsigned long baud, uint16_t config) {
247262
case 2: pio_set_irq0_source_enabled(_rxPIO, pis_sm2_rx_fifo_not_empty, true); break;
248263
case 3: pio_set_irq0_source_enabled(_rxPIO, pis_sm3_rx_fifo_not_empty, true); break;
249264
}
250-
auto irqno = pio_get_index(_rxPIO) == 0 ? PIO0_IRQ_0 : PIO1_IRQ_0;
265+
auto irqno = pio_irq_0(_rxPIO);
251266
irq_set_exclusive_handler(irqno, _fifoIRQ);
252267
irq_set_enabled(irqno, true);
253268

@@ -278,7 +293,7 @@ void SerialPIO::end() {
278293
used = used || !!_pioSP[pioNum][i];
279294
}
280295
if (!used) {
281-
auto irqno = pioNum == 0 ? PIO0_IRQ_0 : PIO1_IRQ_0;
296+
auto irqno = pio_irq_0(_rxPIO);
282297
irq_set_enabled(irqno, false);
283298
}
284299
gpio_set_inover(_rx, 0);

0 commit comments

Comments
 (0)