*/
#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);
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) {
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]);
#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 {
#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;
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;
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;
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;
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);