X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/ea77b9c3fc7fb9bf9d7f9604fc187c8049212a2a..0cf90cca0c924622f3fee8d2a3fafa8238363dc6:/lunaix-os/kernel/tty/lxconsole.c diff --git a/lunaix-os/kernel/tty/lxconsole.c b/lunaix-os/kernel/tty/lxconsole.c index ad3fc42..adf577a 100644 --- a/lunaix-os/kernel/tty/lxconsole.c +++ b/lunaix-os/kernel/tty/lxconsole.c @@ -8,11 +8,10 @@ #include #include #include +#include #include #include -#include - static struct console lx_console; int @@ -27,9 +26,9 @@ console_flush(); static waitq_t lx_reader; static volatile char ttychr; -static pid_t fg_pgid = 0; +static volatile pid_t fg_pgid = 0; -inline void +static inline void print_control_code(const char cntrl) { console_write_char('^'); @@ -39,8 +38,8 @@ print_control_code(const char cntrl) int __lxconsole_listener(struct input_device* dev) { - uint32_t key = dev->current_pkt.sys_code; - uint32_t type = dev->current_pkt.pkt_type; + u32_t key = dev->current_pkt.sys_code; + u32_t type = dev->current_pkt.pkt_type; kbd_kstate_t state = key >> 16; ttychr = key & 0xff; key = key & 0xffff; @@ -86,7 +85,7 @@ done: } int -__tty_exec_cmd(struct device* dev, uint32_t req, va_list args) +__tty_exec_cmd(struct device* dev, u32_t req, va_list args) { switch (req) { case TIOCGPGRP: @@ -119,10 +118,28 @@ lxconsole_init() fifo_init(&lx_console.input, valloc(4096), 4096, 0); lx_console.flush_timer = NULL; +} + +int +__tty_write_pg(struct device* dev, void* buf, size_t offset) +{ + return __tty_write(dev, buf, offset, PG_SIZE); +} + +int +__tty_read_pg(struct device* dev, void* buf, size_t offset) +{ + return __tty_read(dev, buf, offset, PG_SIZE); +} +void +lxconsole_spawn_ttydev() +{ struct device* tty_dev = device_addseq(NULL, &lx_console, "tty"); tty_dev->write = __tty_write; + tty_dev->write_page = __tty_write_pg; tty_dev->read = __tty_read; + tty_dev->read_page = __tty_read_pg; tty_dev->exec_cmd = __tty_exec_cmd; waitq_init(&lx_reader); @@ -294,6 +311,10 @@ console_write(struct console* console, uint8_t* data, size_t size) console->wnd_start = rd_ptr; fbuf->flags |= FIFO_DIRTY; mutex_unlock(&fbuf->lock); + + if (!lx_console.flush_timer) { + console_flush(); + } } void