]> Zhao Yanbai Git Server - kernel.git/commitdiff
添加console接口
authoracevest <zhaoyanbai@126.com>
Sun, 9 Aug 2026 10:37:46 +0000 (18:37 +0800)
committeracevest <zhaoyanbai@126.com>
Sun, 9 Aug 2026 10:37:46 +0000 (18:37 +0800)
drivers/serial.c
include/console.h
kernel/console.c
kernel/printk.c

index 09c1786906dac7c68cd400e83c3833341c52a6c2..1878976a79a3d8792c22c7518cda11609342569f 100644 (file)
@@ -8,6 +8,7 @@
  */
 
 #include "io.h"
+#include "console.h"
 
 #define COMM1_PORT 0x3F8
 #define COMM2_PORT 0x2F8
 
 const uint32_t baud_rate = 115200;
 
-void init_serial() {
+
+int serial_write(const char *buf, size_t size) {
+    return 0;
+}
+
+int serial_setup(console_t *console) {
+    assert(console != NULL);
+
     uint32_t port = SERIAL_PORT;
     outb(0x00, port + 1);  // 禁用中断
     outb(0x80, port + 3);
@@ -31,6 +39,18 @@ void init_serial() {
     outb(0x03, port + 3);
     outb(0xC7, port + 2);
     outb(0x0B, port + 4);
+
+    return 0;
+}
+
+static console_t serial_console = {
+    .name = "SERIAL",
+    .write = serial_write,
+    .setup = serial_setup,
+};
+
+void init_serial() {
+    register_console(&serial_console);
 }
 
 void serial_putc(char c) {
@@ -39,7 +59,7 @@ void serial_putc(char c) {
     outb(c, SERIAL_PORT);
 }
 
-void serial_write(const char* buf, size_t size) {
+void serial_old_write(const char* buf, size_t size) {
     // return 0;
     for (size_t i = 0; i < size; i++) {
         serial_putc(buf[i]);
index 7e97e87c9f776dc7a6a3e57434e74b0145d164cf..8dc26f0c7ea41ac5159366772f0a40ff918b2a32 100644 (file)
 
 #include <wait.h>
 
+typedef struct console console_t;
+
+struct console {
+    const char *name;
+    int (*setup)(console_t *console);
+    int (*write)(const char *buf, size_t size);
+};
+
+void register_console(console_t *console);
+
+
+
+
 #define CNSL_QUEUE_SIZE 1024
 
 typedef struct cnsl_queue {
index 3f6645e3a70f68a62870fb8cefeabf56a7f8752c..15e42837a4fdbabf3832d38ce1e52d14d9a02d5c 100644 (file)
 #include <tty.h>
 #include <wait.h>
 
+
+#define MAX_CONSOLE_CNT 16
+
+static console_t *console_list[MAX_CONSOLE_CNT] = {NULL};
+
+void register_console(console_t *console) {
+    assert(console != NULL);
+    assert(console->name != NULL);
+    assert(console->write != NULL);
+    //assert(console->setup != NULL);
+
+
+    for (int i=0; i<MAX_CONSOLE_CNT; i++) {
+        if (console_list[i] == console) {
+            return;
+        }
+    }
+
+
+    for (int i=0; i<MAX_CONSOLE_CNT; i++) {
+        if (console_list[i] == NULL) {
+            console_list[i] = console;
+            if(console->setup != NULL) {
+                console->setup(console);
+            }
+            printk("console %s registered\n", console->name);
+            return;
+        }
+    }
+    panic("console list full\n");
+    return;
+}
+
 void vga_putc(unsigned int nr, unsigned char c, const unsigned char color);
 
 cnsl_t cnsl;
index c227225a61a46023ee22f6ac3ceac448d596ea59..8972fc31e7daf78dc9b07ecca5beff19efc81f54 100644 (file)
@@ -21,7 +21,7 @@
 
 int vsprintf(char* buf, const char* fmt, va_list args);
 
-void serial_write(const char* buf, size_t size);
+void serial_old_write(const char* buf, size_t size);
 
 extern tty_t* const default_tty;
 
@@ -31,7 +31,7 @@ int _printk(const char* fmtstr, va_list args) {
     int size = vsprintf(pkbuf, fmtstr, args);
 
     tty_write(default_tty, pkbuf, (size_t)size);
-    serial_write(pkbuf, (size_t)size);
+    serial_old_write(pkbuf, (size_t)size);
 
     kfree(pkbuf);
     return 0;
@@ -45,7 +45,7 @@ int _early_printk(const char* fmtstr, va_list args) {
     int size = vsprintf(_early_pkbuf, fmtstr, args);
 
     tty_write(default_tty, _early_pkbuf, (size_t)size);
-    serial_write(_early_pkbuf, (size_t)size);
+    serial_old_write(_early_pkbuf, (size_t)size);
 
     irq_restore(eflags);
     return 0;
@@ -78,7 +78,7 @@ int printd(const char* fmtstr, ...) {
     va_end(args);
 
     tty_write(debug_tty, pdbuf, (size_t)size);
-    serial_write(pdbuf, (size_t)size);
+    serial_old_write(pdbuf, (size_t)size);
 
     kfree(pdbuf);