📄 hal_intr.h
字号:
#else#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_uint32 _index_; \ HAL_TRANSLATE_VECTOR( _vector_, _index_ ); \ \ if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)hal_default_isr ) \ { \ hal_interrupt_handlers[_index_] = (CYG_ADDRESS)_isr_; \ hal_interrupt_data[_index_] = (CYG_ADDRWORD)_data_; \ hal_interrupt_objects[_index_] = (CYG_ADDRESS)_object_; \ } \}#define HAL_INTERRUPT_DETACH( _vector_, _isr_ ) \{ \ cyg_uint32 _index_; \ HAL_TRANSLATE_VECTOR( _vector_, _index_ ); \ \ if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)_isr_ ) \ { \ hal_interrupt_handlers[_index_] = (CYG_ADDRESS)hal_default_isr; \ hal_interrupt_data[_index_] = 0; \ hal_interrupt_objects[_index_] = 0; \ } \}#define HAL_VSR_GET( _vector_, _pvsr_ ) \ *(_pvsr_) = (void (*)())hal_vsr_table[_vector_]; #define HAL_VSR_SET( _vector_, _vsr_, _poldvsr_ ) CYG_MACRO_START \ if( _poldvsr_ != NULL) \ *(CYG_ADDRESS *)_poldvsr_ = (CYG_ADDRESS)hal_vsr_table[_vector_]; \ hal_vsr_table[_vector_] = (CYG_ADDRESS)_vsr_; \CYG_MACRO_END// This is an ugly name, but what it means is: grab the VSR back to eCos// internal handling, or if you like, the default handler. But if// cooperating with GDB and CygMon, the default behaviour is to pass most// exceptions to CygMon. This macro undoes that so that eCos handles the// exception. So use it with care.externC void __default_exception_vsr(void);externC void __default_interrupt_vsr(void);#define HAL_VSR_SET_TO_ECOS_HANDLER( _vector_, _poldvsr_ ) CYG_MACRO_START \ HAL_VSR_SET( _vector_, _vector_ == CYGNUM_HAL_VECTOR_INTERRUPT \ ? (CYG_ADDRESS)__default_interrupt_vsr \ : (CYG_ADDRESS)__default_exception_vsr, \ _poldvsr_ ); \CYG_MACRO_END//--------------------------------------------------------------------------// Interrupt controller access#if defined(CYG_HAL_MIPS_TX3904) || defined(CYG_HAL_MIPS_SIM)#define CYG_HAL_MIPS_TX3904_ILR0 0xFFFFC010#define CYG_HAL_MIPS_TX3904_CConR 0xFFFFE000// Array which stores the configured priority levels for the configured// interrupts.externC volatile CYG_BYTE hal_interrupt_level[CYGNUM_HAL_ISR_COUNT];#define HAL_INTERRUPT_MASK( _vector_ ) \{ \ HAL_IO_REGISTER _reg_ = CYG_HAL_MIPS_TX3904_ILR0; \ CYG_WORD32 _ilr_; \ _reg_ += (_vector_)&0xC; \ HAL_READ_UINT32( _reg_, _ilr_ ); \ _ilr_ &= ~(7 << (((_vector_)&0x3)<<3)); \ HAL_WRITE_UINT32( _reg_, _ilr_ ); \}#define HAL_INTERRUPT_UNMASK( _vector_ ) \{ \ HAL_IO_REGISTER _reg_ = CYG_HAL_MIPS_TX3904_ILR0; \ CYG_WORD32 _ilr_; \ _reg_ += (_vector_)&0xC; \ HAL_READ_UINT32( _reg_, _ilr_ ); \ _ilr_ |= hal_interrupt_level[_vector_] << (((_vector_)&0x3)<<3); \ HAL_WRITE_UINT32( _reg_, _ilr_ ); \}#define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ ) \{ \ if( _vector_ <= CYGNUM_HAL_INTERRUPT_7 || \ _vector_ == CYGNUM_HAL_INTERRUPT_0 ) \ { \ cyg_uint32 _val_ = _vector_ + 1; \ if( _val_ == CYGNUM_HAL_INTERRUPT_0 + 1 ) _val_ = 0; \ HAL_WRITE_UINT8( CYG_HAL_MIPS_TX3904_CConR+1, _val_); \ } \}#define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ ) \{ \ if( _vector_ <= CYGNUM_HAL_INTERRUPT_7 || \ _vector_ == CYGNUM_HAL_INTERRUPT_0 ) \ { \ cyg_uint32 _val_ = 0; \ if( _up_ ) _val_ |= 1; \ if( !(_level_) ) _val_ |= 2; \ HAL_WRITE_UINT16( CYG_HAL_MIPS_TX3904_CConR+2, _val_ ); \ } \}#define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ ) \{ \ HAL_IO_REGISTER _reg_ = CYG_HAL_MIPS_TX3904_ILR0; \ CYG_WORD32 _ilr_; \ _reg_ += (_vector_)&0xC; \ HAL_READ_UINT32( _reg_, _ilr_ ); \ _ilr_ |= (_level_) << (((_vector_)&0x3)<<3); \ HAL_WRITE_UINT32( _reg_, _ilr_ ); \ hal_interrupt_level[_vector_] = _level_; \}#else#error Unspecified platform for MIPS#endif//--------------------------------------------------------------------------// Clock control#if defined(CYG_HAL_MIPS_TX3904) || defined(CYG_HAL_MIPS_SIM)#define CYG_HAL_MIPS_TX3904_TIMER_BASE 0xFFFFF000#define CYG_HAL_MIPS_TX3904_TIMER_CR (CYG_HAL_MIPS_TX3904_TIMER_BASE + 0x00)#define CYG_HAL_MIPS_TX3904_TIMER_SR (CYG_HAL_MIPS_TX3904_TIMER_BASE + 0x04)#define CYG_HAL_MIPS_TX3904_TIMER_CPR (CYG_HAL_MIPS_TX3904_TIMER_BASE + 0x08)#define CYG_HAL_MIPS_TX3904_TIMER_IMR (CYG_HAL_MIPS_TX3904_TIMER_BASE + 0x10)#define CYG_HAL_MIPS_TX3904_TIMER_DR (CYG_HAL_MIPS_TX3904_TIMER_BASE + 0x20)#define CYG_HAL_MIPS_TX3904_TIMER_RR (CYG_HAL_MIPS_TX3904_TIMER_BASE + 0xF0)#define HAL_CLOCK_INITIALIZE( _period_ ) \{ \ HAL_WRITE_UINT32( CYG_HAL_MIPS_TX3904_TIMER_DR, 0x00000003 ); \ HAL_WRITE_UINT32( CYG_HAL_MIPS_TX3904_TIMER_CPR, _period_ ); \ HAL_WRITE_UINT32( CYG_HAL_MIPS_TX3904_TIMER_SR, 0x00000000 ); \ HAL_WRITE_UINT32( CYG_HAL_MIPS_TX3904_TIMER_IMR, 0x00008001 ); \ HAL_WRITE_UINT32( CYG_HAL_MIPS_TX3904_TIMER_CR, 0x000000C0 ); \}#define HAL_CLOCK_RESET( _vector_, _period_ ) \{ \ HAL_WRITE_UINT32( CYG_HAL_MIPS_TX3904_TIMER_SR, 0x00000000 ); \}#if defined(CYGHWR_HAL_MIPS_TX3904_TRR_REQUIRES_SYNC) && \ !defined(CYG_HAL_MIPS_SIM)// We need to sync and check the coprocessor 0 condition - this indicates// whether data is present in the write buffer. We need to wait until// that data to be written is flushed out. This works around a tx39 bug.// gcc will insert a NOP after the asm insns.# define HAL_CLOCK_READ( _pvalue_ ) \CYG_MACRO_START \ asm volatile ( \ "sync; nop; 1: ; bc0f 1b" \ : \ : \ : "$0" \ ); \ HAL_READ_UINT32( CYG_HAL_MIPS_TX3904_TIMER_RR, *(_pvalue_) ); \CYG_MACRO_END#else# define HAL_CLOCK_READ( _pvalue_ ) \CYG_MACRO_START \ HAL_READ_UINT32( CYG_HAL_MIPS_TX3904_TIMER_RR, *(_pvalue_) ); \CYG_MACRO_END#endif#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY#define HAL_CLOCK_LATENCY( _pvalue_ ) HAL_CLOCK_READ(_pvalue_)#endif#else#error Unspecified platform for MIPS#endif//--------------------------------------------------------------------------// Timeout exception support. This is only enabled on the real TX39 hardware.#if defined(CYG_HAL_MIPS_TX3904)#define HAL_TX39_DEBUG_TOE_ENABLE() \{ \ HAL_IO_REGISTER _reg_ = CYG_HAL_MIPS_TX3904_CConR; \ CYG_WORD32 _cconr_; \ HAL_READ_UINT32( _reg_, _cconr_); \ _cconr_ |= 0x04000000; \ HAL_WRITE_UINT32( _reg_, _cconr_); \}#define HAL_TX39_DEBUG_TOE_DISABLE() \{ \ HAL_IO_REGISTER _reg_ = CYG_HAL_MIPS_TX3904_CConR; \ CYG_WORD32 _cconr_; \ HAL_READ_UINT32( _reg_, _cconr_); \ _cconr_ &= 0xFBFFFFFF; \ HAL_WRITE_UINT32( _reg_, _cconr_); \}#else#define HAL_TX39_DEBUG_TOE_ENABLE()#define HAL_TX39_DEBUG_TOE_DISABLE()#endif//--------------------------------------------------------------------------#endif // ifndef CYGONCE_HAL_HAL_INTR_H// End of hal_intr.h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -