var_intr.c
来自「eCos操作系统源码」· C语言 代码 · 共 496 行 · 第 1/2 页
C
496 行
externC void hal_ppc40x_interrupt_acknowledge(int vector){ switch (vector) { case CYGNUM_HAL_INTERRUPT_EXT0: case CYGNUM_HAL_INTERRUPT_EXT1: case CYGNUM_HAL_INTERRUPT_EXT2: case CYGNUM_HAL_INTERRUPT_EXT3: case CYGNUM_HAL_INTERRUPT_EXT4: CYGARC_MTDCR(DCR_EXISR, exier_mask[vector]); break; case CYGNUM_HAL_INTERRUPT_VAR_TIMER: CYGARC_MTSPR(SPR_TSR, TSR_PIS); // clear & acknowledge interrupt break; case CYGNUM_HAL_INTERRUPT_FIXED_TIMER: CYGARC_MTSPR(SPR_TSR, TSR_FIS); // clear & acknowledge interrupt break; case CYGNUM_HAL_INTERRUPT_WATCHDOG_TIMER: CYGARC_MTSPR(SPR_TSR, TSR_WIS); // clear & acknowledge interrupt break; case CYGNUM_HAL_INTERRUPT_CRITICAL: case CYGNUM_HAL_INTERRUPT_SERIAL_RCV: case CYGNUM_HAL_INTERRUPT_SERIAL_XMT: case CYGNUM_HAL_INTERRUPT_JTAG_RCV: case CYGNUM_HAL_INTERRUPT_JTAG_XMT: case CYGNUM_HAL_INTERRUPT_DMA0: case CYGNUM_HAL_INTERRUPT_DMA1: case CYGNUM_HAL_INTERRUPT_DMA2: case CYGNUM_HAL_INTERRUPT_DMA3: default: break; }}// Note: These functions are only [well] defined for "external" interrupts// which can be controlled via the EXIER register.externC void hal_ppc40x_interrupt_configure(int vector, int level, int dir){ cyg_uint32 mask, new_state, iocr; if ((vector >= CYGNUM_HAL_INTERRUPT_EXT0) && (vector <= CYGNUM_HAL_INTERRUPT_EXT4)) { mask = 0x03 << (30 - ((vector - CYGNUM_HAL_INTERRUPT_EXT0)*2)); new_state = (dir & 0x01); // Up/Down if (level == 0) { // Edge triggered new_state = 0x02; } new_state <<= (30 - ((vector - CYGNUM_HAL_INTERRUPT_EXT0)*2)); CYGARC_MFDCR(DCR_IOCR, iocr); iocr = (iocr & ~mask) | new_state; CYGARC_MTDCR(DCR_IOCR, iocr); }}externC void hal_ppc40x_interrupt_set_level(int vector, int level){}#endif // CYGHWR_HAL_POWERPC_PPC4XX_403#if defined(CYGHWR_HAL_POWERPC_PPC4XX_405) || defined(CYGHWR_HAL_POWERPC_PPC4XX_405GP)cyg_uint32 _hold_tcr = 0; // Shadow of hardware registerexternC voidhal_variant_IRQ_init(void){#ifndef HAL_PLF_INTERRUPT_INIT // Ensure all interrupts masked (disabled) & cleared CYGARC_MTDCR(DCR_UIC0_ER, 0); CYGARC_MTDCR(DCR_UIC0_CR, 0); CYGARC_MTDCR(DCR_UIC0_PR, 0xFFFFE000); CYGARC_MTDCR(DCR_UIC0_TR, 0); CYGARC_MTDCR(DCR_UIC0_VCR, 0); // Makes vector identification easy CYGARC_MTDCR(DCR_UIC0_SR, 0xFFFFFFFF);#else HAL_PLF_INTERRUPT_INIT();#endif // Disable timers CYGARC_MTSPR(SPR_TCR, 0); // Let the platform do any overrides hal_platform_IRQ_init();}externC void hal_ppc40x_interrupt_mask(int vector){ cyg_uint32 exier, tcr; switch (vector) { case CYGNUM_HAL_INTERRUPT_first...CYGNUM_HAL_INTERRUPT_last:#ifndef HAL_PLF_INTERRUPT_MASK CYGARC_MFDCR(DCR_UIC0_ER, exier); exier &= ~(1<<(31-(vector-CYGNUM_HAL_INTERRUPT_405_BASE))); CYGARC_MTDCR(DCR_UIC0_ER, exier);#else HAL_PLF_INTERRUPT_MASK(vector);#endif break; case CYGNUM_HAL_INTERRUPT_VAR_TIMER: CYGARC_MFSPR(SPR_TCR, tcr); tcr = _hold_tcr; tcr &= ~TCR_PIE; CYGARC_MTSPR(SPR_TCR, tcr); _hold_tcr = tcr; break; case CYGNUM_HAL_INTERRUPT_FIXED_TIMER: CYGARC_MFSPR(SPR_TCR, tcr); tcr = _hold_tcr; tcr &= ~TCR_FIE; CYGARC_MTSPR(SPR_TCR, tcr); _hold_tcr = tcr; break; case CYGNUM_HAL_INTERRUPT_WATCHDOG_TIMER: CYGARC_MFSPR(SPR_TCR, tcr); tcr = _hold_tcr; tcr &= ~TCR_WIE; CYGARC_MTSPR(SPR_TCR, tcr); _hold_tcr = tcr; break; default: break; }}externC void hal_ppc40x_interrupt_unmask(int vector){ cyg_uint32 exier, tcr; switch (vector) { case CYGNUM_HAL_INTERRUPT_first...CYGNUM_HAL_INTERRUPT_last:#ifndef HAL_PLF_INTERRUPT_UNMASK CYGARC_MFDCR(DCR_UIC0_ER, exier); exier |= (1<<(31-(vector-CYGNUM_HAL_INTERRUPT_405_BASE))); CYGARC_MTDCR(DCR_UIC0_ER, exier);#else HAL_PLF_INTERRUPT_UNMASK(vector);#endif break; case CYGNUM_HAL_INTERRUPT_VAR_TIMER: CYGARC_MFSPR(SPR_TCR, tcr); tcr = _hold_tcr; tcr |= TCR_PIE; CYGARC_MTSPR(SPR_TCR, tcr); _hold_tcr = tcr; break; case CYGNUM_HAL_INTERRUPT_FIXED_TIMER: CYGARC_MFSPR(SPR_TCR, tcr); tcr = _hold_tcr; tcr |= TCR_FIE; CYGARC_MTSPR(SPR_TCR, tcr); _hold_tcr = tcr; break; case CYGNUM_HAL_INTERRUPT_WATCHDOG_TIMER: CYGARC_MFSPR(SPR_TCR, tcr); tcr = _hold_tcr; tcr |= TCR_WIE; CYGARC_MTSPR(SPR_TCR, tcr); _hold_tcr = tcr; break; default: break; }}externC void hal_ppc40x_interrupt_acknowledge(int vector){ switch (vector) { case CYGNUM_HAL_INTERRUPT_first...CYGNUM_HAL_INTERRUPT_last:#ifndef HAL_PLF_INTERRUPT_ACKNOWLEDGE CYGARC_MTDCR(DCR_UIC0_SR, (1<<(31-(vector-CYGNUM_HAL_INTERRUPT_405_BASE))));#else HAL_PLF_INTERRUPT_ACKNOWLEDGE(vector);#endif break; case CYGNUM_HAL_INTERRUPT_VAR_TIMER: CYGARC_MTSPR(SPR_TSR, TSR_PIS); // clear & acknowledge interrupt break; case CYGNUM_HAL_INTERRUPT_FIXED_TIMER: CYGARC_MTSPR(SPR_TSR, TSR_FIS); // clear & acknowledge interrupt break; case CYGNUM_HAL_INTERRUPT_WATCHDOG_TIMER: CYGARC_MTSPR(SPR_TSR, TSR_WIS); // clear & acknowledge interrupt break; default: break; }}// Note: These functions are only [well] defined for "external" interruptsexternC void hal_ppc40x_interrupt_configure(int vector, int level, int dir){#ifndef HAL_PLF_INTERRUPT_CONFIGURE cyg_uint32 mask, new_state, iocr; if ((vector >= CYGNUM_HAL_INTERRUPT_IRQ0) && (vector <= CYGNUM_HAL_INTERRUPT_IRQ6)) { mask = (1<<(31-(vector-CYGNUM_HAL_INTERRUPT_405_BASE))); // Set polarity if (dir) { // High true new_state = mask; } else { // Low true new_state = 0; } CYGARC_MFDCR(DCR_UIC0_PR, iocr); iocr = (iocr & ~mask) | new_state; CYGARC_MTDCR(DCR_UIC0_PR, iocr); // Set edge/level if (level == 0) { // Edge triggered new_state = mask; } else { // Level triggered new_state = 0; } CYGARC_MFDCR(DCR_UIC0_TR, iocr); iocr = (iocr & ~mask) | new_state; CYGARC_MTDCR(DCR_UIC0_TR, iocr); }#else HAL_PLF_INTERRUPT_CONFIGURE(vector, level, dir);#endif}externC void hal_ppc40x_interrupt_set_level(int vector, int level){#ifndef HAL_PLF_INTERRUPT_SET_LEVEL // Nothing to do for UIC#else HAL_PLF_INTERRUPT_SET_LEVEL(vector, level);#endif}#endif // CYGHWR_HAL_POWERPC_PPC4XX_405// -------------------------------------------------------------------------// EOF var_intr.c
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?