var_intr.h
来自「eCos操作系统源码」· C头文件 代码 · 共 362 行
H
362 行
#ifndef CYGONCE_VAR_INTR_H#define CYGONCE_VAR_INTR_H//=============================================================================//// var_intr.h//// Variant HAL interrupt and clock support////=============================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.// Copyright (C) 2002 Gary Thomas//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//=============================================================================//#####DESCRIPTIONBEGIN####//// Author(s): mtek, pfine// Contributors:nickg, jskov, jlarmour, hmt// Date: 2001-12-12// Purpose: Variant interrupt support// Description: The macros defined here provide the HAL APIs for handling// interrupts and the clock on the MPC8260 PowerQUICCII CPU.// Usage: Is included via the architecture interrupt header:// #include <cyg/hal/hal_intr.h>// ...////####DESCRIPTIONEND####////=============================================================================#include <pkgconf/hal.h>#include <cyg/hal/plf_intr.h>#include <cyg/hal/mpc8260.h> // Memory map#include <cyg/infra/cyg_type.h> // types#include <cyg/hal/hal_io.h> // io macros#include <cyg/infra/cyg_ass.h> // CYG_FAIL#define CYGARC_IMM_BASE 0x04700000// Interrupts// The first level of external interrupts#define CYGNUM_HAL_INTERRUPT_I2C 1#define CYGNUM_HAL_INTERRUPT_SPI 2#define CYGNUM_HAL_INTERRUPT_RISC_TIMERS 3#define CYGNUM_HAL_INTERRUPT_SMC1 4#define CYGNUM_HAL_INTERRUPT_SMC2 5#define CYGNUM_HAL_INTERRUPT_IDMA1 6#define CYGNUM_HAL_INTERRUPT_IDMA2 7#define CYGNUM_HAL_INTERRUPT_IDMA3 8#define CYGNUM_HAL_INTERRUPT_IDMA4 9#define CYGNUM_HAL_INTERRUPT_SDMA 10#define CYGNUM_HAL_INTERRUPT_TIMER1 12#define CYGNUM_HAL_INTERRUPT_TIMER2 13#define CYGNUM_HAL_INTERRUPT_TIMER3 14#define CYGNUM_HAL_INTERRUPT_TIMER4 15#define CYGNUM_HAL_INTERRUPT_TMCNT 16#define CYGNUM_HAL_INTERRUPT_PIT 17#define CYGNUM_HAL_INTERRUPT_IRQ1 19#define CYGNUM_HAL_INTERRUPT_IRQ2 20#define CYGNUM_HAL_INTERRUPT_IRQ3 21#define CYGNUM_HAL_INTERRUPT_IRQ4 22#define CYGNUM_HAL_INTERRUPT_IRQ5 23#define CYGNUM_HAL_INTERRUPT_IRQ6 24#define CYGNUM_HAL_INTERRUPT_IRQ7 25#define CYGNUM_HAL_INTERRUPT_FCC1 32#define CYGNUM_HAL_INTERRUPT_FCC2 33#define CYGNUM_HAL_INTERRUPT_FCC3 34#define CYGNUM_HAL_INTERRUPT_MCC1 36#define CYGNUM_HAL_INTERRUPT_MCC2 37#define CYGNUM_HAL_INTERRUPT_SCC1 40#define CYGNUM_HAL_INTERRUPT_SCC2 41#define CYGNUM_HAL_INTERRUPT_SCC3 42#define CYGNUM_HAL_INTERRUPT_SCC4 43#define CYGNUM_HAL_INTERRUPT_PC15 48#define CYGNUM_HAL_INTERRUPT_PC14 49#define CYGNUM_HAL_INTERRUPT_PC13 50#define CYGNUM_HAL_INTERRUPT_PC12 51#define CYGNUM_HAL_INTERRUPT_PC11 52#define CYGNUM_HAL_INTERRUPT_PC10 53#define CYGNUM_HAL_INTERRUPT_PC9 54#define CYGNUM_HAL_INTERRUPT_PC8 55#define CYGNUM_HAL_INTERRUPT_PC7 56#define CYGNUM_HAL_INTERRUPT_PC6 57#define CYGNUM_HAL_INTERRUPT_PC5 58#define CYGNUM_HAL_INTERRUPT_PC4 59#define CYGNUM_HAL_INTERRUPT_PC3 60#define CYGNUM_HAL_INTERRUPT_PC2 61#define CYGNUM_HAL_INTERRUPT_PC1 62#define CYGNUM_HAL_INTERRUPT_PC0 63#define CYGNUM_HAL_INTERRUPT_ERROR 0#define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_PC0//--------------------------------------------------------------------------// Interrupt controller access#ifndef CYGHWR_HAL_INTERRUPT_CONTROLLER_ACCESS_DEFINED#ifdef CYGPKG_HAL_POWERPC_MPC8260static __inline__ voidcyg_hal_interrupt_mask ( cyg_uint32 vector ){ volatile t_PQ2IMM *IMM = (volatile t_PQ2IMM *) CYGARC_IMM_BASE; cyg_uint32 *reg_simr_h = (cyg_uint32 *) &(IMM->ic_simr_h); cyg_uint32 *reg_simr_l = (cyg_uint32 *) &(IMM->ic_simr_l); switch (vector) { case CYGNUM_HAL_INTERRUPT_PC15 ... CYGNUM_HAL_INTERRUPT_PC0: *reg_simr_h &= ~( (0x00010000) << (vector - CYGNUM_HAL_INTERRUPT_PC15) ); break; case CYGNUM_HAL_INTERRUPT_IRQ1 ... CYGNUM_HAL_INTERRUPT_IRQ7: *reg_simr_h &= ~( (0x00004000) >> (vector - CYGNUM_HAL_INTERRUPT_IRQ1) ); break; case CYGNUM_HAL_INTERRUPT_TMCNT: *reg_simr_h &= ~(0x00000004); break; case CYGNUM_HAL_INTERRUPT_PIT: *reg_simr_h &= ~(0x00000002); break; case CYGNUM_HAL_INTERRUPT_FCC1 ... CYGNUM_HAL_INTERRUPT_FCC3: *reg_simr_l &= ~( (0x20000000) << (CYGNUM_HAL_INTERRUPT_FCC3 - vector) ); break; case CYGNUM_HAL_INTERRUPT_MCC1 ... CYGNUM_HAL_INTERRUPT_MCC2: *reg_simr_l &= ~( (0x08000000) >> (vector - CYGNUM_HAL_INTERRUPT_MCC1) ); break; case CYGNUM_HAL_INTERRUPT_SCC1 ... CYGNUM_HAL_INTERRUPT_SCC4: *reg_simr_l &= ~( (0x00800000) >> (vector - CYGNUM_HAL_INTERRUPT_SCC1) ); break; case CYGNUM_HAL_INTERRUPT_I2C ... CYGNUM_HAL_INTERRUPT_SDMA: *reg_simr_l &= ~( (0x00008000) >> (vector - CYGNUM_HAL_INTERRUPT_I2C) ); break; case CYGNUM_HAL_INTERRUPT_TIMER1 ... CYGNUM_HAL_INTERRUPT_TIMER4: *reg_simr_l &= ~( (0x00000010) >> (vector - CYGNUM_HAL_INTERRUPT_TIMER1) ); break; default: CYG_FAIL("Unknown Interrupt in mask !!!"); break; }}static __inline__ voidcyg_hal_interrupt_unmask ( cyg_uint32 vector ){ volatile t_PQ2IMM *IMM = (volatile t_PQ2IMM *) CYGARC_IMM_BASE; cyg_uint32 *reg_simr_h = (cyg_uint32 *) &(IMM->ic_simr_h); cyg_uint32 *reg_simr_l = (cyg_uint32 *) &(IMM->ic_simr_l); switch (vector) { case CYGNUM_HAL_INTERRUPT_PC15 ... CYGNUM_HAL_INTERRUPT_PC0: *reg_simr_h |= ( (0x00010000) << (vector - CYGNUM_HAL_INTERRUPT_PC15) ); break; case CYGNUM_HAL_INTERRUPT_IRQ1 ... CYGNUM_HAL_INTERRUPT_IRQ7: *reg_simr_h |= ( (0x00004000) >> (vector - CYGNUM_HAL_INTERRUPT_IRQ1) ); break; case CYGNUM_HAL_INTERRUPT_TMCNT: *reg_simr_h |= (0x00000004); break; case CYGNUM_HAL_INTERRUPT_PIT: *reg_simr_h |= (0x00000002); break; case CYGNUM_HAL_INTERRUPT_FCC1 ... CYGNUM_HAL_INTERRUPT_FCC3: *reg_simr_l |= ( (0x20000000) << (CYGNUM_HAL_INTERRUPT_FCC3 - vector) ); break; case CYGNUM_HAL_INTERRUPT_MCC1 ... CYGNUM_HAL_INTERRUPT_MCC2: *reg_simr_l |= ( (0x08000000) >> (vector - CYGNUM_HAL_INTERRUPT_MCC1) ); break; case CYGNUM_HAL_INTERRUPT_SCC1 ... CYGNUM_HAL_INTERRUPT_SCC4: *reg_simr_l |= ( (0x00800000) >> (vector - CYGNUM_HAL_INTERRUPT_SCC1) ); break; case CYGNUM_HAL_INTERRUPT_I2C ... CYGNUM_HAL_INTERRUPT_SDMA: *reg_simr_l |= ( (0x00008000) >> (vector - CYGNUM_HAL_INTERRUPT_I2C) ); break; case CYGNUM_HAL_INTERRUPT_TIMER1 ... CYGNUM_HAL_INTERRUPT_TIMER4: *reg_simr_l |= ( (0x00000010) >> (vector - CYGNUM_HAL_INTERRUPT_TIMER1) ); break; default: CYG_FAIL("Unknown Interrupt in unmask !!!"); break; }}static __inline__ voidcyg_hal_interrupt_acknowledge ( cyg_uint32 vector ){ volatile t_PQ2IMM *IMM = (volatile t_PQ2IMM *) CYGARC_IMM_BASE; cyg_uint32 *reg_sipnr_h = (cyg_uint32 *) &(IMM->ic_sipnr_h); cyg_uint32 *reg_sipnr_l = (cyg_uint32 *) &(IMM->ic_sipnr_l); switch (vector) { case CYGNUM_HAL_INTERRUPT_PC15 ... CYGNUM_HAL_INTERRUPT_PC0: *reg_sipnr_h |= ( (0x00010000) << (vector - CYGNUM_HAL_INTERRUPT_PC15) ); break; case CYGNUM_HAL_INTERRUPT_IRQ1 ... CYGNUM_HAL_INTERRUPT_IRQ7: *reg_sipnr_h |= ( (0x00004000) >> (vector - CYGNUM_HAL_INTERRUPT_IRQ1) ); break; case CYGNUM_HAL_INTERRUPT_TMCNT: *reg_sipnr_h |= (0x00000004); break; case CYGNUM_HAL_INTERRUPT_PIT: *reg_sipnr_h |= (0x00000002); break; case CYGNUM_HAL_INTERRUPT_FCC1 ... CYGNUM_HAL_INTERRUPT_FCC3: *reg_sipnr_l |= ( (0x20000000) << (CYGNUM_HAL_INTERRUPT_FCC3 - vector) ); break; case CYGNUM_HAL_INTERRUPT_MCC1 ... CYGNUM_HAL_INTERRUPT_MCC2: *reg_sipnr_l |= ( (0x08000000) >> (vector - CYGNUM_HAL_INTERRUPT_MCC1) ); break; case CYGNUM_HAL_INTERRUPT_SCC1 ... CYGNUM_HAL_INTERRUPT_SCC4: *reg_sipnr_l |= ( (0x00800000) >> (vector - CYGNUM_HAL_INTERRUPT_SCC1) ); break; case CYGNUM_HAL_INTERRUPT_I2C ... CYGNUM_HAL_INTERRUPT_SDMA: *reg_sipnr_l |= ( (0x00008000) >> (vector - CYGNUM_HAL_INTERRUPT_I2C) ); break; case CYGNUM_HAL_INTERRUPT_TIMER1 ... CYGNUM_HAL_INTERRUPT_TIMER4: *reg_sipnr_l |= ( (0x00000010) >> (vector - CYGNUM_HAL_INTERRUPT_TIMER1) ); break; default: CYG_FAIL("Unknown Interrupt in unmask !!!"); break; }}static __inline__ voidcyg_hal_interrupt_configure ( cyg_uint32 vector, cyg_bool level, cyg_bool up ){ // NOT IMPLEMENTED ...}static __inline__ voidcyg_hal_interrupt_set_level ( cyg_uint32 vector, cyg_uint32 level ){ // NOT IMPLEMENTED .... // FACT : USER should not program the same interrupt to more than // one priority position. // FACT : Every interrupt has an assigned default priority. // PROBLEM : One has to find the previous priority of the given vector // and swap(?) it with the requested priority owner (Not nice because // it changes another interrupt's priority inadvertently)}// 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#endif//-----------------------------------------------------------------------------#endif // ifndef CYGONCE_VAR_INTR_H// End of var_intr.h
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?