/** * This function read a character from serial without interrupt enable mode * * @return the read char */ char rt_serial_getc(void) { return rt_keyboard_getc(); #if 0 while(!(inb(COM1+COMSTATUS) & COMDATA)); return inb(COM1+COMREAD); #endif }
static void rt_console_isr(int vector, void* param) { char c; rt_bool_t ret; rt_base_t level; if(INTUART0_RX == vector) { c = rt_serial_getc(); ret = RT_TRUE; } else { rt_keyboard_isr(); ret = rt_keyboard_getc(&c); } if(ret == RT_FALSE) { /* do nothing */ } else { /* disable interrupt */ level = rt_hw_interrupt_disable(); /* save character */ rx_buffer[save_index] = c; save_index ++; if (save_index >= CONSOLE_RX_BUFFER_SIZE) save_index = 0; /* if the next position is read index, discard this 'read char' */ if (save_index == read_index) { read_index ++; if (read_index >= CONSOLE_RX_BUFFER_SIZE) read_index = 0; } /* enable interrupt */ rt_hw_interrupt_enable(level); } /* invoke callback */ if (console_device.rx_indicate != RT_NULL) { rt_size_t rx_length; /* get rx length */ rx_length = read_index > save_index ? CONSOLE_RX_BUFFER_SIZE - read_index + save_index : save_index - read_index; if(rx_length > 0) { console_device.rx_indicate(&console_device, rx_length); } } else { } }