📄 hal_intr.h
字号:
#ifndef CYGONCE_HAL_INTR_H#define CYGONCE_HAL_INTR_H//==========================================================================//// hal_intr.h//// HAL Interrupt and clock support////==========================================================================//####COPYRIGHTBEGIN####//// -------------------------------------------// The contents of this file are subject to the Cygnus eCos Public License// Version 1.0 (the "License"); you may not use this file except in// compliance with the License. You may obtain a copy of the License at// http://sourceware.cygnus.com/ecos// // 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 Cygnus Operating System, released// September 30, 1998.// // The Initial Developer of the Original Code is Cygnus. Portions created// by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.// -------------------------------------------////####COPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): nickg, gthomas// Contributors: nickg, gthomas,// jlarmour// Date: 1999-02-20// Purpose: Define Interrupt support// Description: The macros defined here provide the HAL APIs for handling// interrupts and the clock.// // Usage: #include <cyg/hal/hal_intr.h>// ...// ////####DESCRIPTIONEND####////==========================================================================#include <pkgconf/hal.h>#include <cyg/infra/cyg_type.h>#include <cyg/hal/hal_platform_ints.h>//--------------------------------------------------------------------------// ARM exception vectors.// These vectors correspond to VSRs. These values are the ones to use for// HAL_VSR_GET/SET#define CYGNUM_HAL_VECTOR_RESERVED_0 0#define CYGNUM_HAL_VECTOR_RESET 1#define CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION 2#define CYGNUM_HAL_VECTOR_SOFTWARE_INTERRUPT 3#define CYGNUM_HAL_VECTOR_ABORT_PREFETCH 4#define CYGNUM_HAL_VECTOR_ABORT_DATA 5#define CYGNUM_HAL_VECTOR_reserved 6#define CYGNUM_HAL_VECTOR_IRQ 7#define CYGNUM_HAL_VECTOR_FIQ 8#define CYGNUM_HAL_VSR_MIN 0#define CYGNUM_HAL_VSR_MAX 8#define CYGNUM_HAL_VSR_COUNT 9// Exception vectors. These are the values used when passed out to an// external exception handler using cyg_hal_deliver_exception()#define CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION \ CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION#define CYGNUM_HAL_EXCEPTION_INTERRUPT \ CYGNUM_HAL_VECTOR_SOFTWARE_INTERRUPT#define CYGNUM_HAL_EXCEPTION_CODE_ACCESS CYGNUM_HAL_VECTOR_ABORT_PREFETCH#define CYGNUM_HAL_EXCEPTION_DATA_ACCESS CYGNUM_HAL_VECTOR_ABORT_DATA#define CYGNUM_HAL_EXCEPTION_FIQ CYGNUM_HAL_VECTOR_FIQ#define CYGNUM_HAL_EXCEPTION_MIN CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION#define CYGNUM_HAL_EXCEPTION_MAX CYGNUM_HAL_EXCEPTION_FIQ#define CYGNUM_HAL_EXCEPTION_COUNT (CYGNUM_HAL_EXCEPTION_MAX - \ CYGNUM_HAL_EXCEPTION_MIN + 1)//--------------------------------------------------------------------------// Static data used by HAL// ISR tablesexternC volatile CYG_ADDRESS hal_interrupt_handlers[CYGNUM_HAL_ISR_COUNT];externC volatile CYG_ADDRWORD hal_interrupt_data[CYGNUM_HAL_ISR_COUNT];externC volatile CYG_ADDRESS hal_interrupt_objects[CYGNUM_HAL_ISR_COUNT];// VSR tableexternC volatile CYG_ADDRESS hal_vsr_table[CYGNUM_HAL_VSR_COUNT];//--------------------------------------------------------------------------// Default ISRexternC cyg_uint32 hal_default_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data);//--------------------------------------------------------------------------// Interrupt state storagetypedef cyg_uint32 CYG_INTERRUPT_STATE;//--------------------------------------------------------------------------// Interrupt control macros// Note: This disables both FIQ and IRQ interrupts!#define HAL_DISABLE_INTERRUPTS(_old_) \ asm volatile ( \ "mrs %0,cpsr;" \ "mrs r4,cpsr;" \ "orr r4,r4,#0xC0;" \ "msr cpsr,r4" \ : "=r"(_old_) \ : \ : "r4" \ );#define HAL_ENABLE_INTERRUPTS() \ asm volatile ( \ "mrs r3,cpsr;" \ "bic r3,r3,#0xC0;" \ "msr cpsr,r3" \ : \ : \ : "r3" \ );#define HAL_RESTORE_INTERRUPTS(_old_) \ asm volatile ( \ "mrs r3,cpsr;" \ "and r4,%0,#0xC0;" \ "bic r3,r3,#0xC0;" \ "orr r3,r3,r4;" \ "msr cpsr,r3" \ : \ : "r"(_old_) \ : "r3", "r4" \ );#define HAL_QUERY_INTERRUPTS(_old_) \ asm volatile ( \ "mrs r4,cpsr;" \ "and r4,r4,#0xC0;" \ "eor %0,r4,#0xC0;" \ : "=r"(_old_) \ : \ : "r4" \ );//--------------------------------------------------------------------------// Vector translation.#ifndef HAL_TRANSLATE_VECTOR#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 \ if( hal_interrupt_handlers[_vector_] == (CYG_ADDRESS)hal_default_isr ) \ { \ hal_interrupt_handlers[_vector_] = (CYG_ADDRESS)_isr_; \ hal_interrupt_data[_vector_] = (CYG_ADDRWORD) _data_; \ hal_interrupt_objects[_vector_] = (CYG_ADDRESS)_object_; \ } \ CYG_MACRO_END#define HAL_INTERRUPT_DETACH( _vector_, _isr_ ) \ CYG_MACRO_START \ if( hal_interrupt_handlers[_vector_] == (CYG_ADDRESS)_isr_ ) \ { \ hal_interrupt_handlers[_vector_] = (CYG_ADDRESS)hal_default_isr; \ hal_interrupt_data[_vector_] = 0; \ hal_interrupt_objects[_vector_] = 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 accessexternC void hal_interrupt_mask(int);externC void hal_interrupt_unmask(int);externC void hal_interrupt_acknowledge(int);externC void hal_interrupt_configure(int, int, int);externC void hal_interrupt_set_level(int, int);#define HAL_INTERRUPT_MASK( _vector_ ) \ hal_interrupt_mask( _vector_ ) #define HAL_INTERRUPT_UNMASK( _vector_ ) \ hal_interrupt_unmask( _vector_ )#define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ ) \ hal_interrupt_acknowledge( _vector_ )#define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ ) \ hal_interrupt_configure( _vector_, _level_, _up_ )#define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ ) \ hal_interrupt_set_level( _vector_, _level_ )//--------------------------------------------------------------------------// Clock controlexternC void hal_clock_initialize(cyg_uint32);externC void hal_clock_read(cyg_uint32 *);externC void hal_clock_reset(cyg_uint32, cyg_uint32);#define HAL_CLOCK_INITIALIZE( _period_ ) hal_clock_initialize( _period_ )#define HAL_CLOCK_RESET( _vec_, _period_ ) hal_clock_reset( _vec_, _period_ )#define HAL_CLOCK_READ( _pvalue_ ) hal_clock_read( _pvalue_ )#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY#define HAL_CLOCK_LATENCY( _pvalue_ ) HAL_CLOCK_READ( (cyg_uint32 *)_pvalue_ )#endif//--------------------------------------------------------------------------#endif // ifndef CYGONCE_HAL_INTR_H// End of hal_intr.h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -