@@ -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 ];
8383static 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+
151166void 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