]> Zhao Yanbai Git Server - kernel.git/commitdiff
F12支持在8个tty之间切换
authoracevest <zhaoyanbai@126.com>
Thu, 1 Jun 2023 12:43:22 +0000 (20:43 +0800)
committeracevest <zhaoyanbai@126.com>
Thu, 1 Jun 2023 12:43:22 +0000 (20:43 +0800)
drivers/console.c
drivers/keyboard.c
include/tty.h
kernel/printk.c
kernel/setup.c
kernel/tty.c

index 32860c7d14d70ed0ca5b498da5852c8e760e300a..c186740513ee58706dd8cbc421c503eae6f44b2c 100644 (file)
@@ -69,10 +69,10 @@ int cnsl_kbd_write(char ch) {
     if (ch == 0) {
         return 0;
     }
-    extern tty_t default_tty;
+    extern tty_t *const default_tty;
     if (ch == '\b') {
         if (!empty(&cnsl.wr_q)) {
-            tty_color_putc(&default_tty, '\b', TTY_FG_HIGHLIGHT | TTY_WHITE, TTY_BLACK);
+            tty_color_putc(default_tty, '\b', TTY_FG_HIGHLIGHT | TTY_WHITE, TTY_BLACK);
         }
         // tty_color_putc(default_tty, '\b', TTY_WHITE, TTY_BLACK);
         erase(&cnsl.wr_q);
@@ -80,7 +80,7 @@ int cnsl_kbd_write(char ch) {
     } else {
         put(&cnsl.wr_q, ch);
         put(&cnsl.sc_q, ch);
-        tty_color_putc(&default_tty, ch, TTY_FG_HIGHLIGHT | TTY_WHITE, TTY_BLACK);
+        tty_color_putc(default_tty, ch, TTY_FG_HIGHLIGHT | TTY_WHITE, TTY_BLACK);
     }
 
     if (ch == '\n') {
index 4cb435927ff571f922d60c5401aa5560435bf09a..e1f729a794d9c9f5226917020f1c0fec95877913 100644 (file)
@@ -69,12 +69,10 @@ void kbd_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
     add_irq_bh_handler(kbd_bh_handler);
 }
 
-extern tty_t default_tty;
-extern tty_t monitor_tty;
-extern tty_t debug_tty;
-
-static tty_t *ttys[] = {&default_tty, &monitor_tty, &debug_tty};
-static int tty_no = 0;
+extern tty_t *const default_tty;
+extern tty_t *const monitor_tty;
+extern tty_t *const debug_tty;
+extern void tty_switch_to_next();
 
 void kbd_debug(uint8_t scan_code) {
     static unsigned long kbd_cnt = 0;
@@ -88,11 +86,11 @@ void kbd_debug(uint8_t scan_code) {
     // printd("[%02x]", scan_code);
 
     if (scan_code == 0x3B) {  // F1
-        tty_switch(&default_tty);
+        tty_switch(default_tty);
     } else if (scan_code == 0x3C) {  // F2
-        tty_switch(&monitor_tty);
+        tty_switch(monitor_tty);
     } else if (scan_code == 0x3D) {  // F3
-        tty_switch(&debug_tty);
+        tty_switch(debug_tty);
     }
 
     if (scan_code == 0x3F)  // F5
@@ -121,9 +119,7 @@ void kbd_debug(uint8_t scan_code) {
     }
 
     if (scan_code == 0x58) {  // F12
-        // current_tty = current_tty != &default_tty ? &default_tty : &monitor_tty;
-        current_tty = ttys[++tty_no % (sizeof(ttys) / sizeof(ttys[0]))];
-        tty_switch(current_tty);
+        tty_switch_to_next();
     }
 
     // ide_status();
index b162f3a9f2450f9443921a9656ef8d6a7a2d192a..1a6955815804e3307672a777dd45a8d73cf7efb3 100644 (file)
@@ -44,4 +44,6 @@ void tty_color_putc(tty_t *tty, char c, unsigned int fg_color, unsigned bg_color
 void tty_set_cursor(tty_t *tty);
 void tty_switch(tty_t *tty);
 
-extern tty_t *current_tty;
\ No newline at end of file
+void tty_switch_to_next();
+
+extern tty_t *current_tty;
index 08eee395eec7e675797d706a01e8aad8ef5cd166..d2c5d1a0a7a39bfb25fcaef040c0f0ecc27f100c 100644 (file)
 int vsprintf(char *buf, const char *fmt, char *args);
 
 char pkbuf[1024];
-extern tty_t default_tty;
+extern tty_t *const default_tty;
 int printk(const char *fmtstr, ...) {
     unsigned long iflags;
     irq_save(iflags);
     char *args = (char *)(((char *)&fmtstr) + 4);
     int size = vsprintf(pkbuf, fmtstr, args);
-    tty_write(&default_tty, pkbuf, (size_t)size);
+    tty_write(default_tty, pkbuf, (size_t)size);
     irq_restore(iflags);
     return 0;
 }
 
-extern tty_t debug_tty;
+extern tty_t *const debug_tty;
 char pdbuf[1024];
 int printd(const char *fmtstr, ...) {
     unsigned long iflags;
     irq_save(iflags);
     char *args = (char *)(((char *)&fmtstr) + 4);
     int size = vsprintf(pdbuf, fmtstr, args);
-    tty_write(&debug_tty, pdbuf, (size_t)size);
+    tty_write(debug_tty, pdbuf, (size_t)size);
     irq_restore(iflags);
     return 0;
 }
 
 char plobuf[1024];
-extern tty_t monitor_tty;
+extern tty_t *const monitor_tty;
 int printlo(unsigned int xpos, unsigned int ypos, const char *fmtstr, ...) {
     unsigned long iflags;
     irq_save(iflags);
     char *args = (char *)(((char *)&fmtstr) + 4);
     int size = vsprintf(plobuf, fmtstr, args);
-    tty_write_at(&monitor_tty, xpos, ypos, plobuf, (size_t)size);
+    tty_write_at(monitor_tty, xpos, ypos, plobuf, (size_t)size);
     irq_restore(iflags);
     return 0;
 }
index d27faab5d34be2f10e43f950b55307721b1dc7c0..a410fe3b39d171b33c21eaeb77dc06d0762ae1ad 100644 (file)
@@ -79,8 +79,8 @@ void setup_kernel() {
     printk(version);
     boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 
-    extern tty_t monitor_tty;
-    // tty_switch(&monitor_tty);
+    extern tty_t *const monitor_tty;
+    // tty_switch(monitor_tty);
 
     boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 
index 21976e08c09189b34e2f0d97aa14dc1f7a74a1d3..3d78ab7b6f7057bdf2905298ef1714f6ebb9a804 100644 (file)
@@ -22,15 +22,18 @@ const uint32_t PHY_VADDR = 0xB8000;
 const uint32_t VADDR = (uint32_t)pa2va(PHY_VADDR);
 #define TTY_VRAM_SIZE (0x1000)
 
+#define NR_TTYS 8
+tty_t ttys[NR_TTYS];
+
 #define MAX_X 80
 #define MAX_Y 25
 #define CHARS_PER_LINE (MAX_X)
 #define BYTES_PER_LINE (CHARS_PER_LINE * 2)
 #define TAB_SPACE 4
 
-tty_t default_tty;
-tty_t monitor_tty;
-tty_t debug_tty;
+tty_t *const default_tty = ttys + 0;
+tty_t *const monitor_tty = ttys + 1;
+tty_t *const debug_tty = ttys + 2;
 
 void tty_clear(tty_t *tty) {
     char *dst = (char *)tty->base_addr;
@@ -65,8 +68,6 @@ void __tty_set_next_pos_color(tty_t *tty, char color) {
 void init_tty(tty_t *tty, const char *name, unsigned long base) {
     assert(0 != tty);
 
-    memset(tty, 0, sizeof(tty_t));
-
     strlcpy(tty->name, name, sizeof(tty->name));
 
     tty->fg_color = TTY_FG_HIGHLIGHT | TTY_GREEN;  // 高亮
@@ -84,20 +85,35 @@ void init_tty(tty_t *tty, const char *name, unsigned long base) {
 void init_ttys() {
     assert(irq_disabled());
 
-    init_tty(&default_tty, "tty.default", VADDR + 0 * TTY_VRAM_SIZE);
-    init_tty(&monitor_tty, "tty.monitor", VADDR + 1 * TTY_VRAM_SIZE);
-    init_tty(&debug_tty, "tty.debug", VADDR + 7 * TTY_VRAM_SIZE);
+    for (int i = 0; i < NR_TTYS; i++) {
+        tty_t *tty = ttys + i;
+        char name[sizeof(tty->name)];
+        sprintf(name, "tty.%u", i);
+        init_tty(tty, name, VADDR + i * TTY_VRAM_SIZE);
 
-    monitor_tty.fg_color = TTY_FG_HIGHLIGHT | TTY_WHITE;
-    monitor_tty.bg_color = TTY_BLUE;
+        if (i != TTY_WHITE) {
+            tty->fg_color = TTY_FG_HIGHLIGHT | TTY_WHITE;
+            tty->bg_color = i;
+        } else {
+            tty->fg_color = TTY_FG_HIGHLIGHT | TTY_BLACK;
+            tty->bg_color = TTY_WHITE;
+        }
+    }
 
-    debug_tty.fg_color = TTY_FG_HIGHLIGHT | TTY_WHITE;
-    debug_tty.bg_color = TTY_CYAN;
+    default_tty->fg_color = TTY_FG_HIGHLIGHT | TTY_GREEN;
+    default_tty->bg_color = TTY_BLACK;
 
-    tty_clear(&monitor_tty);
-    tty_clear(&debug_tty);
+    monitor_tty->fg_color = TTY_FG_HIGHLIGHT | TTY_WHITE;
+    monitor_tty->bg_color = TTY_BLUE;
 
-    current_tty = &default_tty;
+    debug_tty->fg_color = TTY_FG_HIGHLIGHT | TTY_WHITE;
+    debug_tty->bg_color = TTY_BLACK;  // TTY_CYAN;
+
+    for (int i = 0; i < NR_TTYS; i++) {
+        tty_t *tty = ttys + i;
+        tty_clear(tty);
+    }
+    current_tty = default_tty;
 }
 
 void tty_do_scroll_up(tty_t *tty) {
@@ -250,4 +266,9 @@ void tty_switch(tty_t *tty) {
     tty_set_cursor(current_tty);
 }
 
+void tty_switch_to_next() {
+    tty_t *tty = ttys + ((current_tty - ttys + 1) % NR_TTYS);
+    tty_switch(tty);
+}
+
 tty_t *current_tty;