rtems_isr_entry set_vector( /* returns old vector */ rtems_isr_entry handler, /* isr routine */ rtems_vector_number vector, /* vector number */ int type /* RTEMS or RAW intr */ ) { rtems_isr_entry previous_isr; uint32_t real_trap; uint32_t source; if ( type == SET_VECTOR_INT ) rtems_interrupt_catch( handler, vector, &previous_isr ); else _CPU_ISR_install_raw_handler( vector, handler, (void *)&previous_isr ); real_trap = SPARC_REAL_TRAP_NUMBER( vector ); if ( ERC32_Is_MEC_Trap( real_trap ) ) { source = ERC32_TRAP_SOURCE( real_trap ); ERC32_Clear_interrupt( source ); ERC32_Unmask_interrupt( source ); } return previous_isr; }
static void erc32_console_isr_b( rtems_vector_number vector ) { console_data *cd = &Console_Port_Data[1]; /* check for error */ if (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_ERRB) { ERC32_MEC.UART_Status = ERC32_MEC_UART_STATUS_CLRB; ERC32_MEC.Control = ERC32_MEC.Control; } do { int chars_to_dequeue = (int)cd->pDeviceContext; int rv = 0; int i = 0; char buf[CONSOLE_BUF_SIZE]; /* enqueue received chars */ while (i < CONSOLE_BUF_SIZE) { if (!(ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_DRB)) break; buf[i] = ERC32_MEC.UART_Channel_B; ++i; } if ( i ) rtems_termios_enqueue_raw_characters(cd->termios_data, buf, i); /* dequeue transmitted chars */ if (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEB) { rv = rtems_termios_dequeue_characters( cd->termios_data, chars_to_dequeue); if ( !rv ) { cd->pDeviceContext = 0; cd->bActive = false; } ERC32_Clear_interrupt (ERC32_INTERRUPT_UART_B_RX_TX); } } while (ERC32_Is_interrupt_pending (ERC32_INTERRUPT_UART_B_RX_TX)); }