comparison packages/hal/sh/arch/current/include/hal_intr.h @ 126:518f42066aba ecos-sw-2000-09-19

Merge from eCos master repository on 2000-09-19-06:25:26-BST
author jlarmour
date Tue, 19 Sep 2000 05:53:51 +0000
parents 0ec04793409a
children 0c2b7be0d798
comparison
equal deleted inserted replaced
125:b4407dc7f59d 126:518f42066aba
414 : (CYG_ADDRESS)cyg_hal_default_exception_vsr ); \ 414 : (CYG_ADDRESS)cyg_hal_default_exception_vsr ); \
415 CYG_MACRO_END 415 CYG_MACRO_END
416 416
417 417
418 //-------------------------------------------------------------------------- 418 //--------------------------------------------------------------------------
419 // Interrupt controller access 419 // Interrupt controller(s) access
420 // 420 //
421 // Note: These macros work only on a unit basis ; if one source in a 421
422 // unit (such as SCI) is unmasked, all sources of that unit get 422 externC void hal_interrupt_set_level(int, int);
423 // unmasked. Finer control must be done in the driver/apps. 423 #define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ ) \
424 424 hal_interrupt_set_level(_vector_, _level_);
425 #ifdef CYGSEM_HAL_COMMON_INTERRUPTS_ALLOW_NESTING 425
426 externC cyg_uint8 cyg_hal_ILVL_table[]; 426 externC void hal_interrupt_mask(int);
427 #define HAL_UPDATE_ILVL_TABLE(_vector_, _level_) \ 427 #define HAL_INTERRUPT_MASK( _vector_ ) \
428 /* Update the ILVL table, so it is easy for the interrupt entry */ \ 428 hal_interrupt_mask(_vector_);
429 /* code to find out the level of a given interrupt source. */ \ 429
430 cyg_hal_ILVL_table[(_vector_)] = (_level_) 430 externC void hal_interrupt_unmask(int);
431 #else 431 #define HAL_INTERRUPT_UNMASK( _vector_ ) \
432 #define HAL_UPDATE_ILVL_TABLE(_vector_, _level_) 432 hal_interrupt_unmask(_vector_);
433 #endif 433
434 434 externC void hal_interrupt_acknowledge(int);
435 #define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ ) \ 435 #define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ ) \
436 CYG_MACRO_START \ 436 hal_interrupt_acknowledge(_vector_);
437 cyg_uint16 iprX; \ 437
438 \ 438 externC void hal_interrupt_configure(int, int, int);
439 CYG_ASSERT((0 <= (_level_) && 15 >= (_level_)), "Illegal level"); \ 439 #define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ ) \
440 CYG_ASSERT((CYGNUM_HAL_ISR_MIN <= (_vector_) \ 440 hal_interrupt_configure(_vector_, _level_, _up_);
441 && CYGNUM_HAL_ISR_MAX >= (_vector_)), "Illegal vector"); \
442 \
443 HAL_UPDATE_ILVL_TABLE(_vector_, _level_); \
444 \
445 switch( (_vector_) ) { \
446 case CYGNUM_HAL_INTERRUPT_NMI: \
447 /* fall through */ \
448 case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14: \
449 /* Cannot change levels */ \
450 break; \
451 \
452 /* IPRA */ \
453 case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0: \
454 HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); \
455 iprX &= ~CYGARC_REG_IPRA_TMU0_MASK; \
456 iprX |= (_level_)*CYGARC_REG_IPRA_TMU0_PRI1; \
457 HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); \
458 break; \
459 case CYGNUM_HAL_INTERRUPT_TMU1_TUNI1: \
460 HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); \
461 iprX &= ~CYGARC_REG_IPRA_TMU1_MASK; \
462 iprX |= (_level_)*CYGARC_REG_IPRA_TMU1_PRI1; \
463 HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); \
464 break; \
465 case CYGNUM_HAL_INTERRUPT_TMU2_TUNI2: \
466 case CYGNUM_HAL_INTERRUPT_TMU2_TICPI2: \
467 HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); \
468 iprX &= ~CYGARC_REG_IPRA_TMU2_MASK; \
469 iprX |= (_level_)*CYGARC_REG_IPRA_TMU2_PRI1; \
470 HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); \
471 break; \
472 case CYGNUM_HAL_INTERRUPT_RTC_ATI: \
473 case CYGNUM_HAL_INTERRUPT_RTC_PRI: \
474 case CYGNUM_HAL_INTERRUPT_RTC_CUI: \
475 HAL_READ_UINT16(CYGARC_REG_IPRA, iprX); \
476 iprX &= ~CYGARC_REG_IPRA_RTC_MASK; \
477 iprX |= (_level_)*CYGARC_REG_IPRA_RTC_PRI1; \
478 HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX); \
479 break; \
480 \
481 /* IPRB */ \
482 case CYGNUM_HAL_INTERRUPT_SCI_ERI: \
483 case CYGNUM_HAL_INTERRUPT_SCI_RXI: \
484 case CYGNUM_HAL_INTERRUPT_SCI_TXI: \
485 case CYGNUM_HAL_INTERRUPT_SCI_TEI: \
486 HAL_READ_UINT16(CYGARC_REG_IPRB, iprX); \
487 iprX &= ~CYGARC_REG_IPRB_SCI_MASK; \
488 iprX |= (_level_)*CYGARC_REG_IPRB_SCI_PRI1; \
489 HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX); \
490 break; \
491 case CYGNUM_HAL_INTERRUPT_WDT_ITI: \
492 HAL_READ_UINT16(CYGARC_REG_IPRB, iprX); \
493 iprX &= ~CYGARC_REG_IPRB_WDT_MASK; \
494 iprX |= (_level_)*CYGARC_REG_IPRB_WDT_PRI1; \
495 HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX); \
496 break; \
497 case CYGNUM_HAL_INTERRUPT_REF_RCMI: \
498 case CYGNUM_HAL_INTERRUPT_REF_ROVI: \
499 HAL_READ_UINT16(CYGARC_REG_IPRB, iprX); \
500 iprX &= ~CYGARC_REG_IPRB_REF_MASK; \
501 iprX |= (_level_)*CYGARC_REG_IPRB_REF_PRI1; \
502 HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX); \
503 break; \
504 \
505 /* IPRC */ \
506 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ0: \
507 HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); \
508 iprX &= ~CYGARC_REG_IPRC_IRQ0_MASK; \
509 iprX |= (_level_)*CYGARC_REG_IPRC_IRQ0_PRI1; \
510 HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); \
511 break; \
512 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ1: \
513 HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); \
514 iprX &= ~CYGARC_REG_IPRC_IRQ1_MASK; \
515 iprX |= (_level_)*CYGARC_REG_IPRC_IRQ1_PRI1; \
516 HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); \
517 break; \
518 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ2: \
519 HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); \
520 iprX &= ~CYGARC_REG_IPRC_IRQ2_MASK; \
521 iprX |= (_level_)*CYGARC_REG_IPRC_IRQ2_PRI1; \
522 HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); \
523 break; \
524 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ3: \
525 HAL_READ_UINT16(CYGARC_REG_IPRC, iprX); \
526 iprX &= ~CYGARC_REG_IPRC_IRQ3_MASK; \
527 iprX |= (_level_)*CYGARC_REG_IPRC_IRQ3_PRI1; \
528 HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX); \
529 break; \
530 \
531 /* IPRD */ \
532 case CYGNUM_HAL_INTERRUPT_PINT_PINT07: \
533 HAL_READ_UINT16(CYGARC_REG_IPRD, iprX); \
534 iprX &= ~CYGARC_REG_IPRD_PINT07_MASK; \
535 iprX |= (_level_)*CYGARC_REG_IPRD_PINT07_PRI1; \
536 HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX); \
537 break; \
538 case CYGNUM_HAL_INTERRUPT_PINT_PINT8F: \
539 HAL_READ_UINT16(CYGARC_REG_IPRD, iprX); \
540 iprX &= ~CYGARC_REG_IPRD_PINT8F_MASK; \
541 iprX |= (_level_)*CYGARC_REG_IPRD_PINT8F_PRI1; \
542 HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX); \
543 break; \
544 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ5: \
545 HAL_READ_UINT16(CYGARC_REG_IPRD, iprX); \
546 iprX &= ~CYGARC_REG_IPRD_IRQ5_MASK; \
547 iprX |= (_level_)*CYGARC_REG_IPRD_IRQ5_PRI1; \
548 HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX); \
549 break; \
550 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ4: \
551 HAL_READ_UINT16(CYGARC_REG_IPRD, iprX); \
552 iprX &= ~CYGARC_REG_IPRD_IRQ4_MASK; \
553 iprX |= (_level_)*CYGARC_REG_IPRD_IRQ4_PRI1; \
554 HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX); \
555 break; \
556 \
557 /* IPRE */ \
558 case CYGNUM_HAL_INTERRUPT_DMAC_DEI0: \
559 case CYGNUM_HAL_INTERRUPT_DMAC_DEI1: \
560 case CYGNUM_HAL_INTERRUPT_DMAC_DEI2: \
561 case CYGNUM_HAL_INTERRUPT_DMAC_DEI3: \
562 HAL_READ_UINT16(CYGARC_REG_IPRE, iprX); \
563 iprX &= ~CYGARC_REG_IPRE_DMAC_MASK; \
564 iprX |= (_level_)*CYGARC_REG_IPRE_DMAC_PRI1; \
565 HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX); \
566 break; \
567 case CYGNUM_HAL_INTERRUPT_IRDA_ERI1: \
568 case CYGNUM_HAL_INTERRUPT_IRDA_RXI1: \
569 case CYGNUM_HAL_INTERRUPT_IRDA_BRI1: \
570 case CYGNUM_HAL_INTERRUPT_IRDA_TXI1: \
571 HAL_READ_UINT16(CYGARC_REG_IPRE, iprX); \
572 iprX &= ~CYGARC_REG_IPRE_IRDA_MASK; \
573 iprX |= (_level_)*CYGARC_REG_IPRE_IRDA_PRI1; \
574 HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX); \
575 break; \
576 case CYGNUM_HAL_INTERRUPT_SCIF_ERI2: \
577 case CYGNUM_HAL_INTERRUPT_SCIF_RXI2: \
578 case CYGNUM_HAL_INTERRUPT_SCIF_BRI2: \
579 case CYGNUM_HAL_INTERRUPT_SCIF_TXI2: \
580 HAL_READ_UINT16(CYGARC_REG_IPRE, iprX); \
581 iprX &= ~CYGARC_REG_IPRE_SCIF_MASK; \
582 iprX |= (_level_)*CYGARC_REG_IPRE_SCIF_PRI1; \
583 HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX); \
584 break; \
585 case CYGNUM_HAL_INTERRUPT_ADC_ADI: \
586 HAL_READ_UINT16(CYGARC_REG_IPRE, iprX); \
587 iprX &= ~CYGARC_REG_IPRE_ADC_MASK; \
588 iprX |= (_level_)*CYGARC_REG_IPRE_ADC_PRI1; \
589 HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX); \
590 break; \
591 \
592 /* IPRF */ \
593 case CYGNUM_HAL_INTERRUPT_LCDC_LCDI: \
594 HAL_READ_UINT16(CYGARC_REG_IPRF, iprX); \
595 iprX &= ~CYGARC_REG_IPRF_LCDI_MASK; \
596 iprX |= (_level_)*CYGARC_REG_IPRF_LCDI_PRI1; \
597 HAL_WRITE_UINT16(CYGARC_REG_IPRF, iprX); \
598 break; \
599 case CYGNUM_HAL_INTERRUPT_PCC_PCC0: \
600 HAL_READ_UINT16(CYGARC_REG_IPRF, iprX); \
601 iprX &= ~CYGARC_REG_IPRF_PCC0_MASK; \
602 iprX |= (_level_)*CYGARC_REG_IPRF_PCC0_PRI1; \
603 HAL_WRITE_UINT16(CYGARC_REG_IPRF, iprX); \
604 break; \
605 case CYGNUM_HAL_INTERRUPT_PCC_PCC1: \
606 HAL_READ_UINT16(CYGARC_REG_IPRF, iprX); \
607 iprX &= ~CYGARC_REG_IPRF_PCC1_MASK; \
608 iprX |= (_level_)*CYGARC_REG_IPRF_PCC1_PRI1; \
609 HAL_WRITE_UINT16(CYGARC_REG_IPRF, iprX); \
610 break; \
611 \
612 case CYGNUM_HAL_INTERRUPT_RESERVED_1E0: \
613 case CYGNUM_HAL_INTERRUPT_RESERVED_3E0: \
614 /* Do nothing for these reserved vectors. */ \
615 break; \
616 } \
617 CYG_MACRO_END
618
619 #define HAL_INTERRUPT_MASK( _vector_ ) \
620 CYG_MACRO_START \
621 switch( (_vector_) ) { \
622 case CYGNUM_HAL_INTERRUPT_NMI: \
623 /* fall through */ \
624 case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14: \
625 /* Can only be masked by fiddling Imask in SR. */ \
626 break; \
627 case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0...CYGNUM_HAL_ISR_MAX: \
628 HAL_INTERRUPT_SET_LEVEL((_vector_), 0); \
629 break; \
630 case CYGNUM_HAL_INTERRUPT_RESERVED_1E0: \
631 case CYGNUM_HAL_INTERRUPT_RESERVED_3E0: \
632 /* Do nothing for these reserved vectors. */ \
633 break; \
634 default: \
635 CYG_FAIL("Unknown interrupt vector"); \
636 break; \
637 } \
638 CYG_MACRO_END
639
640 #define HAL_INTERRUPT_UNMASK( _vector_ ) \
641 CYG_MACRO_START \
642 switch( (_vector_) ) { \
643 case CYGNUM_HAL_INTERRUPT_NMI: \
644 /* fall through */ \
645 case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14: \
646 /* Can only be unmasked by fiddling Imask in SR. */ \
647 break; \
648 case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0...CYGNUM_HAL_ISR_MAX: \
649 HAL_INTERRUPT_SET_LEVEL((_vector_), 1); \
650 break; \
651 case CYGNUM_HAL_INTERRUPT_RESERVED_1E0: \
652 case CYGNUM_HAL_INTERRUPT_RESERVED_3E0: \
653 /* Do nothing for these reserved vectors. */ \
654 break; \
655 default: \
656 CYG_FAIL("Unknown interrupt vector"); \
657 break; \
658 } \
659 CYG_MACRO_END
660
661 #define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ ) \
662 CYG_MACRO_START \
663 if ( (_vector_) >= CYGNUM_HAL_INTERRUPT_IRQ_IRQ0 \
664 && (_vector_) <= CYGNUM_HAL_INTERRUPT_IRQ_IRQ5) { \
665 \
666 cyg_uint8 irr0; \
667 \
668 HAL_READ_UINT8(CYGARC_REG_IRR0, irr0); \
669 switch ( _vector_ ) { \
670 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ0: \
671 irr0 &= ~CYGARC_REG_IRR0_IRQ0; \
672 break; \
673 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ1: \
674 irr0 &= ~CYGARC_REG_IRR0_IRQ1; \
675 break; \
676 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ2: \
677 irr0 &= ~CYGARC_REG_IRR0_IRQ2; \
678 break; \
679 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ3: \
680 irr0 &= ~CYGARC_REG_IRR0_IRQ3; \
681 break; \
682 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ4: \
683 irr0 &= ~CYGARC_REG_IRR0_IRQ4; \
684 break; \
685 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ5: \
686 irr0 &= ~CYGARC_REG_IRR0_IRQ5; \
687 break; \
688 } \
689 HAL_WRITE_UINT8(CYGARC_REG_IRR0, irr0); \
690 } \
691 CYG_MACRO_END
692
693 // Note: The PINTs can be masked and configured individually, even
694 // though there are only two vectors. Maybe add some fake vectors just
695 // for masking/configuring?
696 #define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ ) \
697 CYG_MACRO_START \
698 if ( (_vector_) >= CYGNUM_HAL_INTERRUPT_IRQ_IRQ0 \
699 && (_vector_) <= CYGNUM_HAL_INTERRUPT_IRQ_IRQ5) { \
700 \
701 cyg_uint16 icr1, ss, mask; \
702 ss = 0; \
703 mask = CYGARC_REG_ICR1_SENSE_UP|CYGARC_REG_ICR1_SENSE_LEVEL; \
704 if (_up_) ss |= CYGARC_REG_ICR1_SENSE_UP; \
705 if (_level_) ss |= CYGARC_REG_ICR1_SENSE_LEVEL; \
706 CYG_ASSERT(!(_up_ && _level_), "Cannot trigger on high level!"); \
707 \
708 switch( (_vector_) ) { \
709 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ5: \
710 ss <<= CYGARC_REG_ICR1_SENSE_IRQ5_shift; \
711 mask <<= CYGARC_REG_ICR1_SENSE_IRQ5_shift; \
712 break; \
713 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ4: \
714 ss <<= CYGARC_REG_ICR1_SENSE_IRQ4_shift; \
715 mask <<= CYGARC_REG_ICR1_SENSE_IRQ4_shift; \
716 break; \
717 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ3: \
718 ss <<= CYGARC_REG_ICR1_SENSE_IRQ3_shift; \
719 mask <<= CYGARC_REG_ICR1_SENSE_IRQ3_shift; \
720 break; \
721 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ2: \
722 ss <<= CYGARC_REG_ICR1_SENSE_IRQ2_shift; \
723 mask <<= CYGARC_REG_ICR1_SENSE_IRQ2_shift; \
724 break; \
725 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ1: \
726 ss <<= CYGARC_REG_ICR1_SENSE_IRQ1_shift; \
727 mask <<= CYGARC_REG_ICR1_SENSE_IRQ1_shift; \
728 break; \
729 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ0: \
730 ss <<= CYGARC_REG_ICR1_SENSE_IRQ0_shift; \
731 mask <<= CYGARC_REG_ICR1_SENSE_IRQ0_shift; \
732 break; \
733 } \
734 \
735 HAL_READ_UINT16(CYGARC_REG_ICR1, icr1); \
736 icr1 &= ~mask; \
737 icr1 |= ss; \
738 HAL_WRITE_UINT16(CYGARC_REG_ICR1, icr1); \
739 } \
740 CYG_MACRO_END
741 441
742 //-------------------------------------------------------------------------- 442 //--------------------------------------------------------------------------
743 // Clock control 443 // Clock control
744 444
745 // Using TMU counter 0, clocked at p/4, with peripheral clock 445 // Using TMU counter 0, clocked at p/4, with peripheral clock