⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hal_intr.h

📁 ecos为实时嵌入式操作系统
💻 H
📖 第 1 页 / 共 3 页
字号:
    asm volatile (                      \        "mfmsr  %0;"                    \        "lis    4,0;"                   \        "ori    4,4,0x8000;"            \        "and    %0,%0,4;"               \        : "=r"(_old_)                   \        :                               \        : "r4"                          \        );//--------------------------------------------------------------------------// Vector translation.#ifndef HAL_TRANSLATE_VECTOR// Basic PowerPC configuration only has two vectors; decrementer and// external. Isr tables/chaining use same vector decoder.#define HAL_TRANSLATE_VECTOR(_vector_,_index_) \    (_index_) = (_vector_)#endif//--------------------------------------------------------------------------// Interrupt and VSR attachment macros#define HAL_INTERRUPT_IN_USE( _vector_, _state_)                          \    CYG_MACRO_START                                                       \    cyg_uint32 _index_;                                                   \    HAL_TRANSLATE_VECTOR ((_vector_), _index_);                           \                                                                          \    if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)hal_default_isr ) \        (_state_) = 0;                                                    \    else                                                                  \        (_state_) = 1;                                                    \    CYG_MACRO_END#define HAL_INTERRUPT_ATTACH( _vector_, _isr_, _data_, _object_ )         \    CYG_MACRO_START                                                       \    cyg_uint32 _index_;                                                   \    HAL_TRANSLATE_VECTOR ((_vector_), _index_);                           \                                                                          \    if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)hal_default_isr ) \    {                                                                     \        hal_interrupt_handlers[_index_] = (CYG_ADDRESS)_isr_;             \        hal_interrupt_data[_index_] = (CYG_ADDRWORD) _data_;              \        hal_interrupt_objects[_index_] = (CYG_ADDRESS)_object_;           \    }                                                                     \    CYG_MACRO_END#define HAL_INTERRUPT_DETACH( _vector_, _isr_ )                         \    CYG_MACRO_START                                                     \    cyg_uint32 _index_;                                                 \    HAL_TRANSLATE_VECTOR ((_vector_), _index_);                         \                                                                        \    if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)_isr_ )         \    {                                                                   \        hal_interrupt_handlers[_index_] = (CYG_ADDRESS)hal_default_isr; \        hal_interrupt_data[_index_] = 0;                                \        hal_interrupt_objects[_index_] = 0;                             \    }                                                                   \    CYG_MACRO_END#define HAL_VSR_GET( _vector_, _pvsr_ )                                 \    *(CYG_ADDRESS *)(_pvsr_) = hal_vsr_table[_vector_];    #define HAL_VSR_SET( _vector_, _vsr_, _poldvsr_ )               \    CYG_MACRO_START                                             \    if( _poldvsr_ != NULL )                                     \        *(CYG_ADDRESS *)_poldvsr_ = hal_vsr_table[_vector_];    \    hal_vsr_table[_vector_] = (CYG_ADDRESS)_vsr_;               \    CYG_MACRO_END//--------------------------------------------------------------------------// Interrupt controller access#ifdef CYG_HAL_POWERPC_MPC860// FIXME: Should probably be put in a separate .inl file?!?static __inline__ voidcyg_hal_interrupt_mask ( cyg_uint32 vector ){    switch (vector) {    case CYGNUM_HAL_INTERRUPT_SIU_IRQ0 ... CYGNUM_HAL_INTERRUPT_SIU_LVL7:    {        // SIU interrupt vectors        cyg_uint32 simask;        HAL_READ_UINT32 (CYGARC_REG_IMM_SIMASK, simask);        simask &= ~(((cyg_uint32) CYGARC_REG_IMM_SIMASK_IRQ0)                     >> (vector - CYGNUM_HAL_INTERRUPT_SIU_IRQ0));        HAL_WRITE_UINT32 (CYGARC_REG_IMM_SIMASK, simask);        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_REFAE);        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_REFBE);        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_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_uint16 cicr;        HAL_READ_UINT16 (CYGARC_REG_IMM_CICR, cicr);        cicr &= ~(CYGARC_REG_IMM_CICR_IEN);        HAL_WRITE_UINT16 (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_unmask ( cyg_uint32 vector ){    switch (vector) {    case CYGNUM_HAL_INTERRUPT_SIU_IRQ0 ... CYGNUM_HAL_INTERRUPT_SIU_LVL7:    {        // SIU interrupt vectors        cyg_uint32 simask;        HAL_READ_UINT32 (CYGARC_REG_IMM_SIMASK, simask);        simask |= (((cyg_uint32) CYGARC_REG_IMM_SIMASK_IRQ0)                    >> (vector - CYGNUM_HAL_INTERRUPT_SIU_IRQ0));        HAL_WRITE_UINT32 (CYGARC_REG_IMM_SIMASK, simask);        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_REFAE;        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_REFBE;        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_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_uint16 cicr;        HAL_READ_UINT16 (CYGARC_REG_IMM_CICR, cicr);        cicr |= CYGARC_REG_IMM_CICR_IEN;        HAL_WRITE_UINT16 (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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -