feat: better rtc framework which aims to remove single rtc restrictions.
[lunaix-os.git] / lunaix-os / kernel / tty / lxconsole.c
index 31afa6490766a3a5873096c5e99aca63016751d0..8d0747dda601c905c67a8ff4c863705ddd22a944 100644 (file)
@@ -1,3 +1,14 @@
+/**
+ * @file lxconsole.c
+ * @author Lunaixsky (lunaxisky@qq.com)
+ * @brief Provides simple terminal support
+ * @version 0.1
+ * @date 2023-06-18
+ *
+ * @copyright Copyright (c) 2023
+ *
+ */
+
 #include <klibc/string.h>
 #include <lunaix/device.h>
 #include <lunaix/input.h>
 #include <klibc/string.h>
 #include <lunaix/device.h>
 #include <lunaix/input.h>
 #include <lunaix/mm/valloc.h>
 #include <lunaix/mm/vmm.h>
 #include <lunaix/sched.h>
 #include <lunaix/mm/valloc.h>
 #include <lunaix/mm/vmm.h>
 #include <lunaix/sched.h>
+#include <lunaix/signal.h>
 #include <lunaix/tty/console.h>
 #include <lunaix/tty/tty.h>
 
 #include <lunaix/tty/console.h>
 #include <lunaix/tty/tty.h>
 
-#include <lunaix/lxsignal.h>
-
 static struct console lx_console;
 
 int
 static struct console lx_console;
 
 int
@@ -21,6 +31,9 @@ __tty_write(struct device* dev, void* buf, size_t offset, size_t len);
 int
 __tty_read(struct device* dev, void* buf, size_t offset, size_t len);
 
 int
 __tty_read(struct device* dev, void* buf, size_t offset, size_t len);
 
+void
+console_write(struct console* console, u8_t* data, size_t size);
+
 void
 console_flush();
 
 void
 console_flush();
 
@@ -39,8 +52,8 @@ print_control_code(const char cntrl)
 int
 __lxconsole_listener(struct input_device* dev)
 {
 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;
     kbd_kstate_t state = key >> 16;
     ttychr = key & 0xff;
     key = key & 0xffff;
@@ -86,7 +99,7 @@ done:
 }
 
 int
 }
 
 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:
 {
     switch (req) {
         case TIOCGPGRP:
@@ -119,11 +132,29 @@ lxconsole_init()
     fifo_init(&lx_console.input, valloc(4096), 4096, 0);
 
     lx_console.flush_timer = NULL;
     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");
     struct device* tty_dev = device_addseq(NULL, &lx_console, "tty");
-    tty_dev->write = __tty_write;
-    tty_dev->read = __tty_read;
-    tty_dev->exec_cmd = __tty_exec_cmd;
+    tty_dev->ops.write = __tty_write;
+    tty_dev->ops.write_page = __tty_write_pg;
+    tty_dev->ops.read = __tty_read;
+    tty_dev->ops.read_page = __tty_read_pg;
+    tty_dev->ops.exec_cmd = __tty_exec_cmd;
 
     waitq_init(&lx_reader);
     input_add_listener(__lxconsole_listener);
 
     waitq_init(&lx_reader);
     input_add_listener(__lxconsole_listener);
@@ -134,6 +165,8 @@ __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);
 {
     struct console* console = (struct console*)dev->underlay;
     console_write(console, buf, len);
+
+    return len;
 }
 
 int
 }
 
 int
@@ -176,6 +209,7 @@ __tty_read(struct device* dev, void* buf, size_t offset, size_t len)
             break;
         }
     }
             break;
         }
     }
+
     return count + fifo_read(&console->input, buf + count, len - count);
 }
 
     return count + fifo_read(&console->input, buf + count, len - count);
 }
 
@@ -257,15 +291,15 @@ console_flush()
 }
 
 void
 }
 
 void
-console_write(struct console* console, uint8_t* data, size_t size)
+console_write(struct console* console, u8_t* data, size_t size)
 {
     struct fifo_buf* fbuf = &console->output;
     mutex_lock(&console->output.lock);
     fifo_set_rdptr(fbuf, console->wnd_start);
 
 {
     struct fifo_buf* fbuf = &console->output;
     mutex_lock(&console->output.lock);
     fifo_set_rdptr(fbuf, console->wnd_start);
 
-    uint8_t* buffer = fbuf->data;
-    uintptr_t ptr = fbuf->wr_pos;
-    uintptr_t rd_ptr = fbuf->rd_pos;
+    u8_t* buffer = fbuf->data;
+    ptr_t ptr = fbuf->wr_pos;
+    ptr_t rd_ptr = fbuf->rd_pos;
 
     char c;
     for (size_t i = 0; i < size; i++) {
 
     char c;
     for (size_t i = 0; i < size; i++) {
@@ -303,13 +337,13 @@ console_write(struct console* console, uint8_t* data, size_t size)
 void
 console_write_str(char* str)
 {
 void
 console_write_str(char* str)
 {
-    console_write(&lx_console, str, strlen(str));
+    console_write(&lx_console, (u8_t*)str, strlen(str));
 }
 
 void
 console_write_char(char str)
 {
 }
 
 void
 console_write_char(char str)
 {
-    console_write(&lx_console, &str, 1);
+    console_write(&lx_console, (u8_t*)&str, 1);
 }
 
 void
 }
 
 void