uint32_t bsp_clock_nanoseconds_since_last_tick(void) { uint32_t clicks; uint32_t usecs; clicks = ERC32_MEC.Real_Time_Clock_Counter; if ( ERC32_Is_interrupt_pending( ERC32_INTERRUPT_REAL_TIME_CLOCK ) ) { clicks = ERC32_MEC.Real_Time_Clock_Counter; usecs = (2*rtems_configuration_get_microseconds_per_tick() - clicks); } else { usecs = (rtems_configuration_get_microseconds_per_tick() - clicks); } return usecs * 1000; }
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)); }
static bool erc32_tc_is_pending( rtems_timecounter_simple *tc ) { return ERC32_Is_interrupt_pending( ERC32_INTERRUPT_REAL_TIME_CLOCK ); }