📄 var_intr.h
字号:
#ifndef CYGONCE_VAR_INTR_H#define CYGONCE_VAR_INTR_H//=============================================================================//// var_intr.h//// Variant HAL interrupt and clock support////=============================================================================//####COPYRIGHTBEGIN####// // ------------------------------------------- // The contents of this file are subject to the Red Hat eCos Public License // Version 1.1 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.redhat.com/ // // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the // License for the specific language governing rights and limitations under // the License. // // The Original Code is eCos - Embedded Configurable Operating System, // released September 30, 1998. // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // //####COPYRIGHTEND####//=============================================================================//#####DESCRIPTIONBEGIN####//// Author(s): nickg// Contributors:nickg, jskov, jlarmour, hmt// Date: 2000-04-02// Purpose: Variant interrupt support// Description: The macros defined here provide the HAL APIs for handling// interrupts and the clock on the MPC8xx variant CPUs.// Usage: Is included via the architecture interrupt header:// #include <cyg/hal/hal_intr.h>// ...////####DESCRIPTIONEND####////=============================================================================#include <pkgconf/hal.h>#include <cyg/infra/cyg_type.h> // types#include <cyg/hal/ppc_regs.h> // register definitions#include <cyg/hal/hal_io.h> // io macros#include <cyg/infra/cyg_ass.h> // CYG_FAIL//-----------------------------------------------------------------------------// Exception vectors.// Additional exceptions on the MPC8xx CPUs#define CYGNUM_HAL_VECTOR_RESERVED_F 15#define CYGNUM_HAL_VECTOR_SW_EMUL 16#define CYGNUM_HAL_VECTOR_ITLB_MISS 17#define CYGNUM_HAL_VECTOR_DTLB_MISS 18#define CYGNUM_HAL_VECTOR_ITLB_ERROR 19#define CYGNUM_HAL_VECTOR_DTLB_ERROR 20#define CYGNUM_HAL_VECTOR_RESERVED_15 21#define CYGNUM_HAL_VECTOR_RESERVED_16 22#define CYGNUM_HAL_VECTOR_RESERVED_17 23#define CYGNUM_HAL_VECTOR_RESERVED_18 24#define CYGNUM_HAL_VECTOR_RESERVED_19 25#define CYGNUM_HAL_VECTOR_RESERVED_1A 26#define CYGNUM_HAL_VECTOR_RESERVED_1B 27#define CYGNUM_HAL_VECTOR_DATA_BP 28#define CYGNUM_HAL_VECTOR_INSTRUCTION_BP 29#define CYGNUM_HAL_VECTOR_PERIPHERAL_BP 30#define CYGNUM_HAL_VECTOR_NMI 31#define CYGNUM_HAL_VSR_MAX CYGNUM_HAL_VECTOR_NMI// These are the values used when passed out to an// external exception handler using cyg_hal_deliver_exception()#define CYGNUM_HAL_EXCEPTION_RESERVED_0 CYGNUM_HAL_VECTOR_RESERVED_0#define CYGNUM_HAL_EXCEPTION_MACHINE_CHECK CYGNUM_HAL_VECTOR_MACHINE_CHECK#ifdef CYGPKG_HAL_POWERPC_MPC860// The MPC860 does not generate DSI and ISI: instead it goes to machine// check, so that a software VM system can then call into vectors 0x300 or// 0x400 if the address is truly invalid rather than merely not in the TLB// right now. Shades of IBM wanting to port OS/MVS here!// See pp 7-9/10 in "PowerQUICC - MPC860 User's Manual"# undef CYGNUM_HAL_EXCEPTION_DATA_ACCESS# define CYGNUM_HAL_EXCEPTION_DATA_ACCESS CYGNUM_HAL_VECTOR_MACHINE_CHECK// do not define catchers for DSI and ISI - should never happen.# undef CYGNUM_HAL_EXCEPTION_MACHINE_CHECK# undef CYGNUM_HAL_EXCEPTION_CODE_ACCESS#else# define CYGNUM_HAL_EXCEPTION_DATA_ACCESS CYGNUM_HAL_VECTOR_DSI# define CYGNUM_HAL_EXCEPTION_CODE_ACCESS CYGNUM_HAL_VECTOR_ISI#endif#define CYGNUM_HAL_EXCEPTION_DATA_UNALIGNED_ACCESS \ CYGNUM_HAL_VECTOR_ALIGNMENT#define CYGNUM_HAL_EXCEPTION_FPU_NOT_AVAIL CYGNUM_HAL_VECTOR_FP_UNAVAILABLE#define CYGNUM_HAL_EXCEPTION_RESERVED_A CYGNUM_HAL_VECTOR_RESERVED_A#define CYGNUM_HAL_EXCEPTION_RESERVED_B CYGNUM_HAL_VECTOR_RESERVED_B#define CYGNUM_HAL_EXCEPTION_SYSTEM_CALL CYGNUM_HAL_VECTOR_SYSTEM_CALL#define CYGNUM_HAL_EXCEPTION_TRACE CYGNUM_HAL_VECTOR_TRACE#define CYGNUM_HAL_EXCEPTION_FP_ASSIST CYGNUM_HAL_VECTOR_FP_ASSIST#define CYGNUM_HAL_EXCEPTION_RESERVED_F CYGNUM_HAL_VECTOR_RESERVED_F#define CYGNUM_HAL_EXCEPTION_SW_EMUL CYGNUM_HAL_VECTOR_SW_EMUL#define CYGNUM_HAL_EXCEPTION_CODE_TLBMISS_ACCESS CYGNUM_HAL_VECTOR_ITLB_MISS#define CYGNUM_HAL_EXCEPTION_DATA_TLBMISS_ACCESS CYGNUM_HAL_VECTOR_DTLB_MISS#define CYGNUM_HAL_EXCEPTION_CODE_TLBERROR_ACCESS \ CYGNUM_HAL_VECTOR_ITLB_ERROR#define CYGNUM_HAL_EXCEPTION_DATA_TLBERROR_ACCESS \ CYGNUM_HAL_VECTOR_DTLB_ERROR#define CYGNUM_HAL_EXCEPTION_RESERVED_15 CYGNUM_HAL_VECTOR_RESERVED_15#define CYGNUM_HAL_EXCEPTION_RESERVED_16 CYGNUM_HAL_VECTOR_RESERVED_16#define CYGNUM_HAL_EXCEPTION_RESERVED_17 CYGNUM_HAL_VECTOR_RESERVED_17#define CYGNUM_HAL_EXCEPTION_RESERVED_18 CYGNUM_HAL_VECTOR_RESERVED_18#define CYGNUM_HAL_EXCEPTION_RESERVED_19 CYGNUM_HAL_VECTOR_RESERVED_19#define CYGNUM_HAL_EXCEPTION_RESERVED_1A CYGNUM_HAL_VECTOR_RESERVED_1A#define CYGNUM_HAL_EXCEPTION_RESERVED_1B CYGNUM_HAL_VECTOR_RESERVED_1B#define CYGNUM_HAL_EXCEPTION_DATA_BP CYGNUM_HAL_VECTOR_DATA_BP#define CYGNUM_HAL_EXCEPTION_INSTRUCTION_BP CYGNUM_HAL_VECTOR_INSTRUCTION_BP#define CYGNUM_HAL_EXCEPTION_PERIPHERAL_BP CYGNUM_HAL_VECTOR_PERIPHERAL_BP#define CYGNUM_HAL_EXCEPTION_NMI CYGNUM_HAL_VECTOR_NMI#define CYGNUM_HAL_EXCEPTION_MIN CYGNUM_HAL_EXCEPTION_RESERVED_0#define CYGNUM_HAL_EXCEPTION_MAX CYGNUM_HAL_EXCEPTION_NMI#define CYGHWR_HAL_EXCEPTION_VECTORS_DEFINED//-----------------------------------------------------------------------------// Interrupts// The first level of external interrupts#define CYGNUM_HAL_INTERRUPT_SIU_IRQ0 1#define CYGNUM_HAL_INTERRUPT_SIU_LVL0 2#define CYGNUM_HAL_INTERRUPT_SIU_IRQ1 3#define CYGNUM_HAL_INTERRUPT_SIU_LVL1 4#define CYGNUM_HAL_INTERRUPT_SIU_IRQ2 5#define CYGNUM_HAL_INTERRUPT_SIU_LVL2 6#define CYGNUM_HAL_INTERRUPT_SIU_IRQ3 7#define CYGNUM_HAL_INTERRUPT_SIU_LVL3 8#define CYGNUM_HAL_INTERRUPT_SIU_IRQ4 9#define CYGNUM_HAL_INTERRUPT_SIU_LVL4 10#define CYGNUM_HAL_INTERRUPT_SIU_IRQ5 11#define CYGNUM_HAL_INTERRUPT_SIU_LVL5 12#define CYGNUM_HAL_INTERRUPT_SIU_IRQ6 13#define CYGNUM_HAL_INTERRUPT_SIU_LVL6 14#define CYGNUM_HAL_INTERRUPT_SIU_IRQ7 15#define CYGNUM_HAL_INTERRUPT_SIU_LVL7 16// Further decoded interrups#define CYGNUM_HAL_INTERRUPT_SIU_TB_A 17#define CYGNUM_HAL_INTERRUPT_SIU_TB_B 18#define CYGNUM_HAL_INTERRUPT_SIU_PIT 19#define CYGNUM_HAL_INTERRUPT_SIU_RTC_SEC 20#define CYGNUM_HAL_INTERRUPT_SIU_RTC_ALR 21#define CYGNUM_HAL_INTERRUPT_SIU_PCMCIA_A_IRQ 22#define CYGNUM_HAL_INTERRUPT_SIU_PCMCIA_A_CHLVL 23#define CYGNUM_HAL_INTERRUPT_SIU_PCMCIA_B_IRQ 24#define CYGNUM_HAL_INTERRUPT_SIU_PCMCIA_B_CHLVL 25#define CYGNUM_HAL_INTERRUPT_SIU_CPM 26// Even further...#define CYGNUM_HAL_INTERRUPT_CPM_PC15 27#define CYGNUM_HAL_INTERRUPT_CPM_SCC1 28#define CYGNUM_HAL_INTERRUPT_CPM_SCC2 29#define CYGNUM_HAL_INTERRUPT_CPM_SCC3 30#define CYGNUM_HAL_INTERRUPT_CPM_SCC4 31#define CYGNUM_HAL_INTERRUPT_CPM_PC14 32#define CYGNUM_HAL_INTERRUPT_CPM_TIMER1 33#define CYGNUM_HAL_INTERRUPT_CPM_PC13 34#define CYGNUM_HAL_INTERRUPT_CPM_PC12 35#define CYGNUM_HAL_INTERRUPT_CPM_SDMA 36#define CYGNUM_HAL_INTERRUPT_CPM_IDMA1 37#define CYGNUM_HAL_INTERRUPT_CPM_IDMA2 38#define CYGNUM_HAL_INTERRUPT_CPM_RESERVED_13 39#define CYGNUM_HAL_INTERRUPT_CPM_TIMER2 40#define CYGNUM_HAL_INTERRUPT_CPM_RISCTT 41#define CYGNUM_HAL_INTERRUPT_CPM_I2C 42#define CYGNUM_HAL_INTERRUPT_CPM_PC11 43#define CYGNUM_HAL_INTERRUPT_CPM_PC10 44#define CYGNUM_HAL_INTERRUPT_CPM_RESERVED_0D 45#define CYGNUM_HAL_INTERRUPT_CPM_TIMER3 46#define CYGNUM_HAL_INTERRUPT_CPM_PC9 47#define CYGNUM_HAL_INTERRUPT_CPM_PC8 48#define CYGNUM_HAL_INTERRUPT_CPM_PC7 49#define CYGNUM_HAL_INTERRUPT_CPM_RESERVED_08 50#define CYGNUM_HAL_INTERRUPT_CPM_TIMER4 51#define CYGNUM_HAL_INTERRUPT_CPM_PC6 52#define CYGNUM_HAL_INTERRUPT_CPM_SPI 53#define CYGNUM_HAL_INTERRUPT_CPM_SMC1 54#define CYGNUM_HAL_INTERRUPT_CPM_SMC2_PIP 55#define CYGNUM_HAL_INTERRUPT_CPM_PC5 56#define CYGNUM_HAL_INTERRUPT_CPM_PC4 57#define CYGNUM_HAL_INTERRUPT_CPM_ERROR 58#define CYGNUM_HAL_INTERRUPT_CPM_FIRST CYGNUM_HAL_INTERRUPT_CPM_PC15#define CYGNUM_HAL_INTERRUPT_CPM_LAST CYGNUM_HAL_INTERRUPT_CPM_ERROR#define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_CPM_LAST#endif//--------------------------------------------------------------------------// Interrupt controller access#ifndef CYGHWR_HAL_INTERRUPT_CONTROLLER_ACCESS_DEFINED#ifdef CYGPKG_HAL_POWERPC_MPC860static __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_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_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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -