📄 var_intr.h
字号:
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_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__ void
cyg_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.
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;
// take care not to accidently reset potential pending REFB
tbscr &= ~CYGARC_REG_IMM_TBSCR_REFB;
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;
// take care not to accidently reset potential pending REFA
tbscr &= ~CYGARC_REG_IMM_TBSCR_REFA;
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;
// take care not to accidently reset potential pending RTCSC_ALR
rtcsc &= ~CYGARC_REG_IMM_RTCSC_ALR;
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;
// take care not to accidently reset potential pending RTCSC_SEC
rtcsc &= ~CYGARC_REG_IMM_RTCSC_SEC;
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;
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__ void
cyg_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__ void
cyg_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 CYGHWR_HAL_POWERPC_MPC8XX
externC 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 CYGHWR_HAL_POWERPC_MPC8XX
//-----------------------------------------------------------------------------
// Symbols used by assembly code
#define CYGARC_VARIANT_DEFS \
DEFINE(CYGNUM_HAL_VECTOR_NMI, CYGNUM_HAL_VECTOR_NMI);
//-----------------------------------------------------------------------------
#endif // ifndef CYGONCE_VAR_INTR_H
// End of var_intr.h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -