|
24 | 24 | #define NO_CTS_PIN 255 |
25 | 25 | #define RTS_RX_THRESHOLD 10 |
26 | 26 |
|
| 27 | +// Derive SERCOM ISR symbols from PERIPH_SERIAL* tokens (e.g. sercom4 -> |
| 28 | +// SERCOM4_Handler) so variants only need to describe the UART routing. |
| 29 | +#define UART_SERCOM_INDEX_sercom0 0 |
| 30 | +#define UART_SERCOM_INDEX_sercom1 1 |
| 31 | +#define UART_SERCOM_INDEX_sercom2 2 |
| 32 | +#define UART_SERCOM_INDEX_sercom3 3 |
| 33 | +#define UART_SERCOM_INDEX_sercom4 4 |
| 34 | +#define UART_SERCOM_INDEX_sercom5 5 |
| 35 | +#if defined(SERCOM6) |
| 36 | +#define UART_SERCOM_INDEX_sercom6 6 |
| 37 | +#endif |
| 38 | +#if defined(SERCOM7) |
| 39 | +#define UART_SERCOM_INDEX_sercom7 7 |
| 40 | +#endif |
| 41 | + |
| 42 | +#define UART_SERCOM_INDEX(token) UART_SERCOM_INDEX_##token |
| 43 | +#define UART_SERCOM_HANDLER_FROM_INDEX(idx) \ |
| 44 | + UART_SERCOM_HANDLER_FROM_INDEX_2(idx) |
| 45 | +#define UART_SERCOM_HANDLER_FROM_INDEX_2(idx) SERCOM##idx##_Handler |
| 46 | +#define UART_SERCOM_HANDLER_FROM_TOKEN(token) \ |
| 47 | + UART_SERCOM_HANDLER_FROM_INDEX(UART_SERCOM_INDEX(token)) |
| 48 | + |
| 49 | +#define UART_SERCOM_HANDLER0_FROM_INDEX(idx) \ |
| 50 | + UART_SERCOM_HANDLER0_FROM_INDEX_2(idx) |
| 51 | +#define UART_SERCOM_HANDLER0_FROM_INDEX_2(idx) SERCOM##idx##_0_Handler |
| 52 | +#define UART_SERCOM_HANDLER1_FROM_INDEX(idx) \ |
| 53 | + UART_SERCOM_HANDLER1_FROM_INDEX_2(idx) |
| 54 | +#define UART_SERCOM_HANDLER1_FROM_INDEX_2(idx) SERCOM##idx##_1_Handler |
| 55 | +#define UART_SERCOM_HANDLER2_FROM_INDEX(idx) \ |
| 56 | + UART_SERCOM_HANDLER2_FROM_INDEX_2(idx) |
| 57 | +#define UART_SERCOM_HANDLER2_FROM_INDEX_2(idx) SERCOM##idx##_2_Handler |
| 58 | +#define UART_SERCOM_HANDLER3_FROM_INDEX(idx) \ |
| 59 | + UART_SERCOM_HANDLER3_FROM_INDEX_2(idx) |
| 60 | +#define UART_SERCOM_HANDLER3_FROM_INDEX_2(idx) SERCOM##idx##_3_Handler |
| 61 | + |
| 62 | +#define UART_SERCOM_HANDLER0_FROM_TOKEN(token) \ |
| 63 | + UART_SERCOM_HANDLER0_FROM_INDEX(UART_SERCOM_INDEX(token)) |
| 64 | +#define UART_SERCOM_HANDLER1_FROM_TOKEN(token) \ |
| 65 | + UART_SERCOM_HANDLER1_FROM_INDEX(UART_SERCOM_INDEX(token)) |
| 66 | +#define UART_SERCOM_HANDLER2_FROM_TOKEN(token) \ |
| 67 | + UART_SERCOM_HANDLER2_FROM_INDEX(UART_SERCOM_INDEX(token)) |
| 68 | +#define UART_SERCOM_HANDLER3_FROM_TOKEN(token) \ |
| 69 | + UART_SERCOM_HANDLER3_FROM_INDEX(UART_SERCOM_INDEX(token)) |
| 70 | + |
27 | 71 | Uart::Uart(SERCOM *_s, uint8_t _pinRX, uint8_t _pinTX, SercomRXPad _padRX, SercomUartTXPad _padTX) : |
28 | 72 | Uart(_s, _pinRX, _pinTX, _padRX, _padTX, NO_RTS_PIN, NO_CTS_PIN) |
29 | 73 | { |
@@ -371,3 +415,195 @@ SercomParityMode Uart::extractParity(uint16_t config) |
371 | 415 | return SERCOM_ODD_PARITY; |
372 | 416 | } |
373 | 417 | } |
| 418 | + |
| 419 | +#if defined(PERIPH_SERIAL) && !defined(UART_VARIANT_OWNS_SERIAL) |
| 420 | +Uart Serial(&PERIPH_SERIAL, PIN_SERIAL_RX, PIN_SERIAL_TX, PAD_SERIAL_RX, |
| 421 | + PAD_SERIAL_TX); |
| 422 | + |
| 423 | +#ifndef SERIAL_IT_HANDLER |
| 424 | +#define SERIAL_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL) |
| 425 | +#endif |
| 426 | +void SERIAL_IT_HANDLER() |
| 427 | +{ |
| 428 | + Serial.IrqHandler(); |
| 429 | +} |
| 430 | + |
| 431 | +#ifdef FAMILY_SAMD5X |
| 432 | +#ifndef SERIAL_IT_HANDLER_0 |
| 433 | +#define SERIAL_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL) |
| 434 | +#define SERIAL_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL) |
| 435 | +#define SERIAL_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL) |
| 436 | +#define SERIAL_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL) |
| 437 | +#endif |
| 438 | +void SERIAL_IT_HANDLER_0() { Serial.IrqHandler(); } |
| 439 | +void SERIAL_IT_HANDLER_1() { Serial.IrqHandler(); } |
| 440 | +void SERIAL_IT_HANDLER_2() { Serial.IrqHandler(); } |
| 441 | +void SERIAL_IT_HANDLER_3() { Serial.IrqHandler(); } |
| 442 | +#endif |
| 443 | +#endif |
| 444 | + |
| 445 | +#if defined(PERIPH_SERIAL_UART) && !defined(UART_VARIANT_OWNS_SERIAL_UART) |
| 446 | +Uart SerialUART(&PERIPH_SERIAL_UART, PIN_SERIAL_UART_RX, PIN_SERIAL_UART_TX, |
| 447 | + PAD_SERIAL_UART_RX, PAD_SERIAL_UART_TX); |
| 448 | + |
| 449 | +#ifndef SERIAL_UART_IT_HANDLER |
| 450 | +#define SERIAL_UART_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL_UART) |
| 451 | +#endif |
| 452 | +#ifndef FAMILY_SAMD5X |
| 453 | +void SERIAL_UART_IT_HANDLER() |
| 454 | +{ |
| 455 | + SerialUART.IrqHandler(); |
| 456 | +} |
| 457 | +#else |
| 458 | +#ifndef SERIAL_UART_IT_HANDLER_0 |
| 459 | +#define SERIAL_UART_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL_UART) |
| 460 | +#define SERIAL_UART_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL_UART) |
| 461 | +#define SERIAL_UART_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL_UART) |
| 462 | +#define SERIAL_UART_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL_UART) |
| 463 | +#endif |
| 464 | +void SERIAL_UART_IT_HANDLER_0() { SerialUART.IrqHandler(); } |
| 465 | +void SERIAL_UART_IT_HANDLER_1() { SerialUART.IrqHandler(); } |
| 466 | +void SERIAL_UART_IT_HANDLER_2() { SerialUART.IrqHandler(); } |
| 467 | +void SERIAL_UART_IT_HANDLER_3() { SerialUART.IrqHandler(); } |
| 468 | +#endif |
| 469 | +#endif |
| 470 | + |
| 471 | +#if defined(PERIPH_SERIAL1) && !defined(UART_VARIANT_OWNS_SERIAL1) |
| 472 | +#ifdef PIN_SERIAL1_RTS |
| 473 | +Uart Serial1(&PERIPH_SERIAL1, PIN_SERIAL1_RX, PIN_SERIAL1_TX, PAD_SERIAL1_RX, |
| 474 | + PAD_SERIAL1_TX, PIN_SERIAL1_RTS, PIN_SERIAL1_CTS); |
| 475 | +#else |
| 476 | +Uart Serial1(&PERIPH_SERIAL1, PIN_SERIAL1_RX, PIN_SERIAL1_TX, PAD_SERIAL1_RX, |
| 477 | + PAD_SERIAL1_TX); |
| 478 | +#endif |
| 479 | + |
| 480 | +#ifndef SERIAL1_IT_HANDLER |
| 481 | +#define SERIAL1_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL1) |
| 482 | +#endif |
| 483 | +#ifndef FAMILY_SAMD5X |
| 484 | +void SERIAL1_IT_HANDLER() |
| 485 | +{ |
| 486 | + Serial1.IrqHandler(); |
| 487 | +} |
| 488 | +#else |
| 489 | +#ifndef SERIAL1_IT_HANDLER_0 |
| 490 | +#define SERIAL1_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL1) |
| 491 | +#define SERIAL1_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL1) |
| 492 | +#define SERIAL1_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL1) |
| 493 | +#define SERIAL1_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL1) |
| 494 | +#endif |
| 495 | +void SERIAL1_IT_HANDLER_0() { Serial1.IrqHandler(); } |
| 496 | +void SERIAL1_IT_HANDLER_1() { Serial1.IrqHandler(); } |
| 497 | +void SERIAL1_IT_HANDLER_2() { Serial1.IrqHandler(); } |
| 498 | +void SERIAL1_IT_HANDLER_3() { Serial1.IrqHandler(); } |
| 499 | +#endif |
| 500 | +#endif |
| 501 | + |
| 502 | +#if defined(PERIPH_SERIAL2) && !defined(UART_VARIANT_OWNS_SERIAL2) |
| 503 | +#ifdef PIN_SERIAL2_RTS |
| 504 | +Uart Serial2(&PERIPH_SERIAL2, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, |
| 505 | + PAD_SERIAL2_TX, PIN_SERIAL2_RTS, PIN_SERIAL2_CTS); |
| 506 | +#else |
| 507 | +Uart Serial2(&PERIPH_SERIAL2, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, |
| 508 | + PAD_SERIAL2_TX); |
| 509 | +#endif |
| 510 | + |
| 511 | +#ifndef SERIAL2_IT_HANDLER |
| 512 | +#define SERIAL2_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL2) |
| 513 | +#endif |
| 514 | +#ifndef FAMILY_SAMD5X |
| 515 | +void SERIAL2_IT_HANDLER() |
| 516 | +{ |
| 517 | + Serial2.IrqHandler(); |
| 518 | +} |
| 519 | +#else |
| 520 | +#ifndef SERIAL2_IT_HANDLER_0 |
| 521 | +#define SERIAL2_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL2) |
| 522 | +#define SERIAL2_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL2) |
| 523 | +#define SERIAL2_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL2) |
| 524 | +#define SERIAL2_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL2) |
| 525 | +#endif |
| 526 | +void SERIAL2_IT_HANDLER_0() { Serial2.IrqHandler(); } |
| 527 | +void SERIAL2_IT_HANDLER_1() { Serial2.IrqHandler(); } |
| 528 | +void SERIAL2_IT_HANDLER_2() { Serial2.IrqHandler(); } |
| 529 | +void SERIAL2_IT_HANDLER_3() { Serial2.IrqHandler(); } |
| 530 | +#endif |
| 531 | +#endif |
| 532 | + |
| 533 | +#if defined(PERIPH_SERIAL3) && !defined(UART_VARIANT_OWNS_SERIAL3) |
| 534 | +Uart Serial3(&PERIPH_SERIAL3, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, |
| 535 | + PAD_SERIAL3_TX); |
| 536 | + |
| 537 | +#ifndef SERIAL3_IT_HANDLER |
| 538 | +#define SERIAL3_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL3) |
| 539 | +#endif |
| 540 | +#ifndef FAMILY_SAMD5X |
| 541 | +void SERIAL3_IT_HANDLER() |
| 542 | +{ |
| 543 | + Serial3.IrqHandler(); |
| 544 | +} |
| 545 | +#else |
| 546 | +#ifndef SERIAL3_IT_HANDLER_0 |
| 547 | +#define SERIAL3_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL3) |
| 548 | +#define SERIAL3_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL3) |
| 549 | +#define SERIAL3_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL3) |
| 550 | +#define SERIAL3_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL3) |
| 551 | +#endif |
| 552 | +void SERIAL3_IT_HANDLER_0() { Serial3.IrqHandler(); } |
| 553 | +void SERIAL3_IT_HANDLER_1() { Serial3.IrqHandler(); } |
| 554 | +void SERIAL3_IT_HANDLER_2() { Serial3.IrqHandler(); } |
| 555 | +void SERIAL3_IT_HANDLER_3() { Serial3.IrqHandler(); } |
| 556 | +#endif |
| 557 | +#endif |
| 558 | + |
| 559 | +#if defined(PERIPH_SERIAL4) && !defined(UART_VARIANT_OWNS_SERIAL4) |
| 560 | +Uart Serial4(&PERIPH_SERIAL4, PIN_SERIAL4_RX, PIN_SERIAL4_TX, PAD_SERIAL4_RX, |
| 561 | + PAD_SERIAL4_TX); |
| 562 | + |
| 563 | +#ifndef SERIAL4_IT_HANDLER |
| 564 | +#define SERIAL4_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL4) |
| 565 | +#endif |
| 566 | +#ifndef FAMILY_SAMD5X |
| 567 | +void SERIAL4_IT_HANDLER() |
| 568 | +{ |
| 569 | + Serial4.IrqHandler(); |
| 570 | +} |
| 571 | +#else |
| 572 | +#ifndef SERIAL4_IT_HANDLER_0 |
| 573 | +#define SERIAL4_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL4) |
| 574 | +#define SERIAL4_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL4) |
| 575 | +#define SERIAL4_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL4) |
| 576 | +#define SERIAL4_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL4) |
| 577 | +#endif |
| 578 | +void SERIAL4_IT_HANDLER_0() { Serial4.IrqHandler(); } |
| 579 | +void SERIAL4_IT_HANDLER_1() { Serial4.IrqHandler(); } |
| 580 | +void SERIAL4_IT_HANDLER_2() { Serial4.IrqHandler(); } |
| 581 | +void SERIAL4_IT_HANDLER_3() { Serial4.IrqHandler(); } |
| 582 | +#endif |
| 583 | +#endif |
| 584 | + |
| 585 | +#if defined(PERIPH_SERIAL5) && !defined(UART_VARIANT_OWNS_SERIAL5) |
| 586 | +Uart Serial5(&PERIPH_SERIAL5, PIN_SERIAL_RX, PIN_SERIAL_TX, PAD_SERIAL_RX, |
| 587 | + PAD_SERIAL_TX); |
| 588 | + |
| 589 | +#ifndef SERIAL5_IT_HANDLER |
| 590 | +#define SERIAL5_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL5) |
| 591 | +#endif |
| 592 | +void SERIAL5_IT_HANDLER() |
| 593 | +{ |
| 594 | + Serial5.IrqHandler(); |
| 595 | +} |
| 596 | + |
| 597 | +#ifdef FAMILY_SAMD5X |
| 598 | +#ifndef SERIAL5_IT_HANDLER_0 |
| 599 | +#define SERIAL5_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL5) |
| 600 | +#define SERIAL5_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL5) |
| 601 | +#define SERIAL5_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL5) |
| 602 | +#define SERIAL5_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL5) |
| 603 | +#endif |
| 604 | +void SERIAL5_IT_HANDLER_0() { Serial5.IrqHandler(); } |
| 605 | +void SERIAL5_IT_HANDLER_1() { Serial5.IrqHandler(); } |
| 606 | +void SERIAL5_IT_HANDLER_2() { Serial5.IrqHandler(); } |
| 607 | +void SERIAL5_IT_HANDLER_3() { Serial5.IrqHandler(); } |
| 608 | +#endif |
| 609 | +#endif |
0 commit comments