📄 mb93093_misc.c
字号:
// Initialize real-time clock (for delays, etc, even if kernel doesn't use it)
hal_clock_initialize(CYGNUM_HAL_RTC_PERIOD);
}
//
// Interrupt control
//
void hal_interrupt_mask(int vector)
{
cyg_uint16 _mask;
switch (vector) {
#if 0
case CYGNUM_HAL_INTERRUPT_LAN:
HAL_READ_UINT16(_FRVGEN_FPGA_IRQ_MASK, _mask);
_mask |= _FRVGEN_FPGA_IRQ_LAN;
HAL_WRITE_UINT16(_FRVGEN_FPGA_IRQ_MASK, _mask);
break;
#endif
}
HAL_READ_UINT16(_FRVGEN_IRC_MASK, _mask);
_mask |= (1<<(vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1));
HAL_WRITE_UINT16(_FRVGEN_IRC_MASK, _mask);
}
void hal_interrupt_unmask(int vector)
{
cyg_uint16 _mask;
switch (vector) {
case CYGNUM_HAL_INTERRUPT_LAN:
#if 0
HAL_READ_UINT16(_FRVGEN_FPGA_IRQ_MASK, _mask);
_mask &= ~_FRVGEN_FPGA_IRQ_LAN;
HAL_WRITE_UINT16(_FRVGEN_FPGA_IRQ_MASK, _mask);
break;
#endif
}
HAL_READ_UINT16(_FRVGEN_IRC_MASK, _mask);
_mask &= ~(1<<(vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1));
HAL_WRITE_UINT16(_FRVGEN_IRC_MASK, _mask);
}
void hal_interrupt_acknowledge(int vector)
{
cyg_uint16 _mask;
switch (vector) {
case CYGNUM_HAL_INTERRUPT_LAN:
#if 0
HAL_WRITE_UINT16(_FRVGEN_FPGA_IRQ_REQUEST, // Clear LAN interrupt
0x7FFE & ~_FRVGEN_FPGA_IRQ_LAN);
#endif
break;
}
_mask = (1<<(vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1));
HAL_WRITE_UINT16(_FRVGEN_IRC_RC, _mask);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRL, 0x10); // Clears IRL latch
}
//
// Configure an interrupt
// level - boolean (0=> edge, 1=>level)
// up - edge: (0=>falling edge, 1=>rising edge)
// level: (0=>low, 1=>high)
//
void hal_interrupt_configure(int vector, int level, int up)
{
cyg_uint16 _irr, _tmr, _trig;
if (level) {
if (up) {
_trig = 0; // level, high
} else {
_trig = 1; // level, low
}
} else {
if (up) {
_trig = 2; // edge, rising
} else {
_trig = 3; // edge, falling
}
}
switch (vector) {
case CYGNUM_HAL_INTERRUPT_TIMER0:
HAL_READ_UINT16(_FRVGEN_IRC_IRR5, _irr);
_irr = (_irr & 0xFFF0) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<0);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR5, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_ITM0, _tmr);
_tmr = (_tmr & 0xFFFC) | (_trig<<0);
HAL_WRITE_UINT16(_FRVGEN_IRC_ITM0, _tmr);
break;
case CYGNUM_HAL_INTERRUPT_TIMER1:
HAL_READ_UINT16(_FRVGEN_IRC_IRR5, _irr);
_irr = (_irr & 0xFF0F) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<4);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR5, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_ITM0, _tmr);
_tmr = (_tmr & 0xFFF3) | (_trig<<2);
HAL_WRITE_UINT16(_FRVGEN_IRC_ITM0, _tmr);
break;
case CYGNUM_HAL_INTERRUPT_TIMER2:
HAL_READ_UINT16(_FRVGEN_IRC_IRR5, _irr);
_irr = (_irr & 0xF0FF) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<8);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR5, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_ITM0, _tmr);
_tmr = (_tmr & 0xFFCF) | (_trig<<4);
HAL_WRITE_UINT16(_FRVGEN_IRC_ITM0, _tmr);
break;
case CYGNUM_HAL_INTERRUPT_DMA0:
HAL_READ_UINT16(_FRVGEN_IRC_IRR4, _irr);
_irr = (_irr & 0xFFF0) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<0);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR4, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_ITM0, _tmr);
_tmr = (_tmr & 0xFCFF) | (_trig<<8);
HAL_WRITE_UINT16(_FRVGEN_IRC_ITM0, _tmr);
break;
case CYGNUM_HAL_INTERRUPT_DMA1:
HAL_READ_UINT16(_FRVGEN_IRC_IRR4, _irr);
_irr = (_irr & 0xFF0F) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<4);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR4, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_ITM0, _tmr);
_tmr = (_tmr & 0xF3FF) | (_trig<<10);
HAL_WRITE_UINT16(_FRVGEN_IRC_ITM0, _tmr);
break;
case CYGNUM_HAL_INTERRUPT_DMA2:
HAL_READ_UINT16(_FRVGEN_IRC_IRR4, _irr);
_irr = (_irr & 0xF0FF) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<8);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR4, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_ITM0, _tmr);
_tmr = (_tmr & 0xCFFF) | (_trig<<12);
HAL_WRITE_UINT16(_FRVGEN_IRC_ITM0, _tmr);
break;
case CYGNUM_HAL_INTERRUPT_DMA3:
HAL_READ_UINT16(_FRVGEN_IRC_IRR4, _irr);
_irr = (_irr & 0x0FFF) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<12);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR4, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_ITM0, _tmr);
_tmr = (_tmr & 0x3FFF) | (_trig<<14);
HAL_WRITE_UINT16(_FRVGEN_IRC_ITM0, _tmr);
break;
case CYGNUM_HAL_INTERRUPT_UART0:
HAL_READ_UINT16(_FRVGEN_IRC_IRR6, _irr);
_irr = (_irr & 0xFFF0) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<0);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR6, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_ITM1, _tmr);
_tmr = (_tmr & 0xFCFF) | (_trig<<8);
HAL_WRITE_UINT16(_FRVGEN_IRC_ITM1, _tmr);
break;
case CYGNUM_HAL_INTERRUPT_UART1:
HAL_READ_UINT16(_FRVGEN_IRC_IRR6, _irr);
_irr = (_irr & 0xFF0F) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<4);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR6, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_ITM1, _tmr);
_tmr = (_tmr & 0xF3FF) | (_trig<<10);
HAL_WRITE_UINT16(_FRVGEN_IRC_ITM1, _tmr);
break;
case CYGNUM_HAL_INTERRUPT_EXT0:
HAL_READ_UINT16(_FRVGEN_IRC_IRR3, _irr);
_irr = (_irr & 0xFFF0) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<0);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR3, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_TM1, _tmr);
_tmr = (_tmr & 0xFFFC) | (_trig<<0);
HAL_WRITE_UINT16(_FRVGEN_IRC_TM1, _tmr);
break;
case CYGNUM_HAL_INTERRUPT_EXT1:
HAL_READ_UINT16(_FRVGEN_IRC_IRR3, _irr);
_irr = (_irr & 0xFF0F) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<4);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR3, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_TM1, _tmr);
_tmr = (_tmr & 0xFFF3) | (_trig<<2);
HAL_WRITE_UINT16(_FRVGEN_IRC_TM1, _tmr);
break;
case CYGNUM_HAL_INTERRUPT_EXT2:
HAL_READ_UINT16(_FRVGEN_IRC_IRR3, _irr);
_irr = (_irr & 0xF0FF) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<8);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR3, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_TM1, _tmr);
_tmr = (_tmr & 0xFFCF) | (_trig<<4);
HAL_WRITE_UINT16(_FRVGEN_IRC_TM1, _tmr);
break;
case CYGNUM_HAL_INTERRUPT_EXT7:
HAL_READ_UINT16(_FRVGEN_IRC_IRR2, _irr);
_irr = (_irr & 0x0FFF) | ((vector-CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1+1)<<12);
HAL_WRITE_UINT16(_FRVGEN_IRC_IRR2, _irr);
HAL_READ_UINT16(_FRVGEN_IRC_TM1, _tmr);
_tmr = (_tmr & 0x3FFF) | (_trig<<14);
HAL_WRITE_UINT16(_FRVGEN_IRC_TM1, _tmr);
break;
default:
; // Nothing to do
};
}
void hal_interrupt_set_level(int vector, int level)
{
// UNIMPLEMENTED(__FUNCTION__);
}
/*------------------------------------------------------------------------*/
// EOF mb93093_misc.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -