]> rtime.felk.cvut.cz Git - l4.git/blobdiff - kernel/fiasco/src/kern/uart_console.cpp
Inital import
[l4.git] / kernel / fiasco / src / kern / uart_console.cpp
diff --git a/kernel/fiasco/src/kern/uart_console.cpp b/kernel/fiasco/src/kern/uart_console.cpp
new file mode 100644 (file)
index 0000000..bc2f886
--- /dev/null
@@ -0,0 +1,53 @@
+IMPLEMENTATION:
+
+#include <cstdio>
+#include <cstring>
+
+#include "cmdline.h"
+#include "config.h"
+#include "filter_console.h"
+#include "kernel_console.h"
+#include "kernel_uart.h"
+#include "static_init.h"
+#include "irq.h"
+
+STATIC_INITIALIZER_P(uart_console_init_stage1 ,UART_INIT_PRIO);
+STATIC_INITIALIZER  (uart_console_init_stage2);
+
+static void uart_console_init_stage1()
+{
+  if (strstr (Cmdline::cmdline(), " -noserial")) // do not use serial uart
+    return;
+
+  static Filter_console fcon(Kernel_uart::uart());
+
+  Kconsole::console()->register_console(&fcon, 0);
+}
+
+static void uart_console_init_stage2()
+{
+  if ((Kernel_uart::uart()->failed()))
+    return;
+
+  int irq = -1;
+  if (Config::serial_esc == Config::SERIAL_ESC_IRQ
+      && (irq = Kernel_uart::uart()->irq()) == -1)
+    {
+      puts("SERIAL ESC: not supported");
+      Config::serial_esc = Config::SERIAL_ESC_NOIRQ;
+    }
+
+  switch (Config::serial_esc)
+    {
+    case Config::SERIAL_ESC_NOIRQ:
+      puts("SERIAL ESC: No IRQ for specified uart port.");
+      puts("Using serial hack in slow timer handler.");
+      break;
+
+    case Config::SERIAL_ESC_IRQ:
+      Kernel_uart::enable_rcv_irq();
+      printf("SERIAL ESC: allocated IRQ %d for serial uart\n", irq);
+      puts("Not using serial hack in slow timer handler.");
+      break;
+    }
+}