📄 var_intr.h
字号:
break; } case CYGNUM_HAL_INTERRUPT_SIU_PIT: { // Periodic Interrupt cyg_uint16 piscr; HAL_READ_UINT16 (CYGARC_REG_IMM_PISCR, piscr); piscr |= CYGARC_REG_IMM_PISCR_PIE; HAL_WRITE_UINT16 (CYGARC_REG_IMM_PISCR, piscr); break; } case CYGNUM_HAL_INTERRUPT_SIU_RTC_SEC: { // Real Time Clock Second cyg_uint16 rtcsc; HAL_READ_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); rtcsc |= CYGARC_REG_IMM_RTCSC_SIE; HAL_WRITE_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); break; } case CYGNUM_HAL_INTERRUPT_SIU_RTC_ALR: { // Real Time Clock Alarm cyg_uint16 rtcsc; HAL_READ_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); rtcsc |= CYGARC_REG_IMM_RTCSC_ALE; HAL_WRITE_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); break; } // PCMCIA_A_IRQ // PCMCIA_A_CHLVL // PCMCIA_B_IRQ // PCMCIA_B_CHLVL case CYGNUM_HAL_INTERRUPT_SIU_CPM: { // Communications Processor Module cyg_uint32 cicr; HAL_READ_UINT32 (CYGARC_REG_IMM_CICR, cicr); cicr |= CYGARC_REG_IMM_CICR_IEN; HAL_WRITE_UINT32 (CYGARC_REG_IMM_CICR, cicr); break; } case CYGNUM_HAL_INTERRUPT_CPM_FIRST ... CYGNUM_HAL_INTERRUPT_CPM_LAST: { // CPM interrupts cyg_uint32 cimr; HAL_READ_UINT32 (CYGARC_REG_IMM_CIMR, cimr); cimr |= (((cyg_uint32) 0x80000000) >> (vector - CYGNUM_HAL_INTERRUPT_CPM_FIRST)); HAL_WRITE_UINT32 (CYGARC_REG_IMM_CIMR, cimr); break; } default: CYG_FAIL("Unknown Interrupt!!!"); break; }}static __inline__ voidcyg_hal_interrupt_acknowledge ( cyg_uint32 vector ){ switch (vector) { case CYGNUM_HAL_INTERRUPT_SIU_IRQ0 ... CYGNUM_HAL_INTERRUPT_SIU_LVL7: { // SIU interrupt vectors cyg_uint32 sipend; // When IRQx is configured as an edge interrupt it needs to be // cleared. Write to INTx and IRQ/level bits are ignore so // it's safe to do always. HAL_READ_UINT32 (CYGARC_REG_IMM_SIPEND, sipend); sipend |= (((cyg_uint32) CYGARC_REG_IMM_SIPEND_IRQ0) >> (vector - CYGNUM_HAL_INTERRUPT_SIU_IRQ0)); HAL_WRITE_UINT32 (CYGARC_REG_IMM_SIPEND, sipend); break; } case CYGNUM_HAL_INTERRUPT_SIU_TB_A: { // TimeBase A interrupt cyg_uint16 tbscr; HAL_READ_UINT16 (CYGARC_REG_IMM_TBSCR, tbscr); tbscr |= CYGARC_REG_IMM_TBSCR_REFA; HAL_WRITE_UINT16 (CYGARC_REG_IMM_TBSCR, tbscr); break; } case CYGNUM_HAL_INTERRUPT_SIU_TB_B: { // TimeBase B interrupt cyg_uint16 tbscr; HAL_READ_UINT16 (CYGARC_REG_IMM_TBSCR, tbscr); tbscr |= CYGARC_REG_IMM_TBSCR_REFB; HAL_WRITE_UINT16 (CYGARC_REG_IMM_TBSCR, tbscr); break; } case CYGNUM_HAL_INTERRUPT_SIU_PIT: { // Periodic Interrupt cyg_uint16 piscr; HAL_READ_UINT16 (CYGARC_REG_IMM_PISCR, piscr); piscr |= CYGARC_REG_IMM_PISCR_PS; HAL_WRITE_UINT16 (CYGARC_REG_IMM_PISCR, piscr); break; } case CYGNUM_HAL_INTERRUPT_SIU_RTC_SEC: { // Real Time Clock Second cyg_uint16 rtcsc; HAL_READ_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); rtcsc |= CYGARC_REG_IMM_RTCSC_SEC; HAL_WRITE_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); break; } case CYGNUM_HAL_INTERRUPT_SIU_RTC_ALR: { // Real Time Clock Alarm cyg_uint16 rtcsc; HAL_READ_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); rtcsc |= CYGARC_REG_IMM_RTCSC_ALR; HAL_WRITE_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); break; } // PCMCIA_A_IRQ // PCMCIA_A_CHLVL // PCMCIA_B_IRQ // PCMCIA_B_CHLVL case CYGNUM_HAL_INTERRUPT_SIU_CPM: // Communications Processor Module // The CPM interrupts must be acknowledged individually. break; case CYGNUM_HAL_INTERRUPT_CPM_FIRST ... CYGNUM_HAL_INTERRUPT_CPM_LAST: { // CPM interrupts cyg_uint32 cisr; HAL_READ_UINT32 (CYGARC_REG_IMM_CISR, cisr); cisr |= (((cyg_uint32) 0x80000000) >> (vector - CYGNUM_HAL_INTERRUPT_CPM_FIRST)); HAL_WRITE_UINT32 (CYGARC_REG_IMM_CISR, cisr); break; } default: CYG_FAIL("Unknown Interrupt!!!"); break; }}static __inline__ voidcyg_hal_interrupt_configure ( cyg_uint32 vector, cyg_bool level, cyg_bool up ){ switch (vector) { case CYGNUM_HAL_INTERRUPT_SIU_IRQ0: case CYGNUM_HAL_INTERRUPT_SIU_IRQ1: case CYGNUM_HAL_INTERRUPT_SIU_IRQ2: case CYGNUM_HAL_INTERRUPT_SIU_IRQ3: case CYGNUM_HAL_INTERRUPT_SIU_IRQ4: case CYGNUM_HAL_INTERRUPT_SIU_IRQ5: case CYGNUM_HAL_INTERRUPT_SIU_IRQ6: case CYGNUM_HAL_INTERRUPT_SIU_IRQ7: { // External interrupts cyg_uint32 siel, bit; CYG_ASSERT( level || !up, "Only falling edge is supported"); bit = (((cyg_uint32) CYGARC_REG_IMM_SIEL_IRQ0) >> (vector - CYGNUM_HAL_INTERRUPT_SIU_IRQ0)); HAL_READ_UINT32 (CYGARC_REG_IMM_SIEL, siel); siel &= ~bit; if (!level) { // Set edge detect bit. siel |= bit; } HAL_WRITE_UINT32 (CYGARC_REG_IMM_SIEL, siel); break; } case CYGNUM_HAL_INTERRUPT_SIU_LVL0: case CYGNUM_HAL_INTERRUPT_SIU_LVL1: case CYGNUM_HAL_INTERRUPT_SIU_LVL2: case CYGNUM_HAL_INTERRUPT_SIU_LVL3: case CYGNUM_HAL_INTERRUPT_SIU_LVL4: case CYGNUM_HAL_INTERRUPT_SIU_LVL5: case CYGNUM_HAL_INTERRUPT_SIU_LVL6: case CYGNUM_HAL_INTERRUPT_SIU_LVL7: case CYGNUM_HAL_INTERRUPT_SIU_TB_A: case CYGNUM_HAL_INTERRUPT_SIU_TB_B: case CYGNUM_HAL_INTERRUPT_SIU_PIT: case CYGNUM_HAL_INTERRUPT_SIU_RTC_SEC: case CYGNUM_HAL_INTERRUPT_SIU_RTC_ALR: // PCMCIA_A_IRQ // PCMCIA_A_CHLVL // PCMCIA_B_IRQ // PCMCIA_B_CHLVL case CYGNUM_HAL_INTERRUPT_SIU_CPM: case CYGNUM_HAL_INTERRUPT_CPM_FIRST ... CYGNUM_HAL_INTERRUPT_CPM_LAST: // These cannot be configured. break; default: CYG_FAIL("Unknown Interrupt!!!"); break; }}static __inline__ voidcyg_hal_interrupt_set_level ( cyg_uint32 vector, cyg_uint32 level ){ // Note: highest priority has the lowest numerical value. CYG_ASSERT( level >= CYGARC_SIU_PRIORITY_HIGH, "Invalid priority"); CYG_ASSERT( level <= CYGARC_SIU_PRIORITY_LOW, "Invalid priority"); switch (vector) { case CYGNUM_HAL_INTERRUPT_SIU_IRQ0 ... CYGNUM_HAL_INTERRUPT_SIU_LVL7: // These cannot be configured. break; case CYGNUM_HAL_INTERRUPT_SIU_TB_A: case CYGNUM_HAL_INTERRUPT_SIU_TB_B: { // TimeBase A+B interrupt cyg_uint16 tbscr; HAL_READ_UINT16 (CYGARC_REG_IMM_TBSCR, tbscr); tbscr &= ~(CYGARC_REG_IMM_TBSCR_IRQMASK); tbscr |= CYGARC_REG_IMM_TBSCR_IRQ0 >> level; HAL_WRITE_UINT16 (CYGARC_REG_IMM_TBSCR, tbscr); break; } case CYGNUM_HAL_INTERRUPT_SIU_PIT: { // Periodic Interrupt cyg_uint16 piscr; HAL_READ_UINT16 (CYGARC_REG_IMM_PISCR, piscr); piscr &= ~(CYGARC_REG_IMM_PISCR_IRQMASK); piscr |= CYGARC_REG_IMM_PISCR_IRQ0 >> level; HAL_WRITE_UINT16 (CYGARC_REG_IMM_PISCR, piscr); break; } case CYGNUM_HAL_INTERRUPT_SIU_RTC_SEC: case CYGNUM_HAL_INTERRUPT_SIU_RTC_ALR: { // Real Time Clock Second & Real Time Clock Alarm cyg_uint16 rtcsc; HAL_READ_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); rtcsc &= ~(CYGARC_REG_IMM_RTCSC_IRQMASK); rtcsc |= CYGARC_REG_IMM_RTCSC_IRQ0 >> level; HAL_WRITE_UINT16 (CYGARC_REG_IMM_RTCSC, rtcsc); break; } // PCMCIA_A_IRQ // PCMCIA_A_CHLVL // PCMCIA_B_IRQ // PCMCIA_B_CHLVL case CYGNUM_HAL_INTERRUPT_SIU_CPM: { // Communications Processor Module cyg_uint32 cicr; HAL_READ_UINT32 (CYGARC_REG_IMM_CICR, cicr); cicr &= ~(CYGARC_REG_IMM_CICR_IRQMASK); cicr |= level << CYGARC_REG_IMM_CICR_IRQ_SHIFT; HAL_WRITE_UINT32 (CYGARC_REG_IMM_CICR, cicr); break; } case CYGNUM_HAL_INTERRUPT_CPM_FIRST ... CYGNUM_HAL_INTERRUPT_CPM_LAST: // CPM interrupt levels are for internal priority. All interrupts // fed to the CPU use the CPM level set above. // FIXME: Control of SCdP ordering. break; default: CYG_FAIL("Unknown Interrupt!!!"); break; }}// The decrementer interrupt cannnot be masked, configured or acknowledged.#define HAL_INTERRUPT_MASK( _vector_ ) \ CYG_MACRO_START \ if (CYGNUM_HAL_INTERRUPT_DECREMENTER != (_vector_)) \ cyg_hal_interrupt_mask ( (_vector_) ); \ CYG_MACRO_END#define HAL_INTERRUPT_UNMASK( _vector_ ) \ CYG_MACRO_START \ if (CYGNUM_HAL_INTERRUPT_DECREMENTER != (_vector_)) \ cyg_hal_interrupt_unmask ( (_vector_) ); \ CYG_MACRO_END#define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ ) \ CYG_MACRO_START \ if (CYGNUM_HAL_INTERRUPT_DECREMENTER != (_vector_)) \ cyg_hal_interrupt_acknowledge ( (_vector_) ); \ CYG_MACRO_END#define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ ) \ CYG_MACRO_START \ if (CYGNUM_HAL_INTERRUPT_DECREMENTER != (_vector_)) \ cyg_hal_interrupt_configure ( (_vector_), (_level_), (_up_) ); \ CYG_MACRO_END#define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ ) \ CYG_MACRO_START \ if (CYGNUM_HAL_INTERRUPT_DECREMENTER != (_vector_)) \ cyg_hal_interrupt_set_level ( (_vector_) , (_level_) ); \ CYG_MACRO_END#define CYGHWR_HAL_INTERRUPT_CONTROLLER_ACCESS_DEFINED#endif//--------------------------------------------------------------------------// Interrupt arbiters#ifdef CYGPKG_HAL_POWERPC_MPC860externC cyg_uint32 hal_arbitration_isr_tb (CYG_ADDRWORD vector, CYG_ADDRWORD data);externC cyg_uint32 hal_arbitration_isr_pit (CYG_ADDRWORD vector, CYG_ADDRWORD data);externC cyg_uint32 hal_arbitration_isr_rtc (CYG_ADDRWORD vector, CYG_ADDRWORD data);externC cyg_uint32 hal_arbitration_isr_cpm (CYG_ADDRWORD vector, CYG_ADDRWORD data);#endif // ifdef CYGPKG_HAL_POWERPC_MPC860//-----------------------------------------------------------------------------#endif // ifndef CYGONCE_VAR_INTR_H// End of var_intr.h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -