+
+ struct device* tty_dev = device_addseq(NULL, &lx_console, "tty");
+ tty_dev->write = __tty_write;
+ tty_dev->read = __tty_read;
+}
+
+int
+__tty_write(struct device* dev, void* buf, size_t offset, size_t len)
+{
+ struct console* console = (struct console*)dev->underlay;
+ console_write(console, buf, len);
+}
+
+int
+__tty_read(struct device* dev, void* buf, size_t offset, size_t len)
+{
+ struct kdb_keyinfo_pkt keyevent;
+ struct console* console = (struct console*)dev->underlay;
+ while (1) {
+ // FIXME keyboard is duplicating the key that user typed
+ if (!kbd_recv_key(&keyevent)) {
+ continue;
+ }
+ if ((keyevent.keycode & 0xff00) <= KEYPAD) {
+ char c = (char)(keyevent.keycode & 0x00ff);
+ if (c == 0x08 && !fifo_backone(&console->input)) {
+ continue;
+ }
+ // console_write_char(c);
+ if (!fifo_putone(&console->input, c) || c == '\n') {
+ break;
+ }
+ }
+ }
+ return fifo_read(&console->input, buf, len);