wires

summary refs log tree commit diff
diff options
context:
space:
mode:
authorwires <wires@noreply.wires.systems>2025-10-13 10:11:14 -0400
committerwires <wires@noreply.wires.systems>2025-10-13 10:11:14 -0400
commit72857c6f87e62dc2d2fa0173efa2c68b2c710f9d (patch)
tree8979489fdf9967e3a46a938e712cfd0853e3d60f
parentstart working on devicetree (diff)
downloadzosimos-72857c6f87e62dc2d2fa0173efa2c68b2c710f9d.tar.gz
first console driver abstraction
-rw-r--r--src/console.zig34
-rw-r--r--src/main.zig9
-rw-r--r--src/mini_uart.zig35
3 files changed, 45 insertions, 33 deletions
diff --git a/src/console.zig b/src/console.zig
new file mode 100644
index 0000000..1a7539e
--- /dev/null
+++ b/src/console.zig
@@ -0,0 +1,34 @@
+const std = @import("std");
+const Writer = std.Io.Writer;
+
+pub const Console = struct {
+    setup: *const fn (*const @This()) void,
+    write: *const fn (*const @This(), []const u8) void,
+};
+
+var cur: ?*const Console = null;
+
+fn drain(
+    _: *Writer,
+    data: []const []const u8,
+    _: usize,
+) Writer.Error!usize {
+    if (cur) |c| {
+        c.write(c, data[0]);
+    }
+    return data[0].len;
+}
+
+var writer: Writer = .{
+    .vtable = &.{ .drain = drain },
+    .buffer = &.{},
+};
+
+pub fn print(comptime fmt: []const u8, args: anytype) void {
+    writer.print(fmt, args) catch {};
+}
+
+pub fn set_console(console: *const Console) void {
+    console.setup(console);
+    cur = console;
+}
diff --git a/src/main.zig b/src/main.zig
index 3b013e8..8c54533 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -1,20 +1,21 @@
-const mini_uart = @import("mini_uart.zig");
+const console = @import("console.zig");
 const DtParser = @import("DtParser.zig");
+const mini_uart = @import("mini_uart.zig");
 
 export fn main(dt_base: [*]u8) void {
-    mini_uart.enable();
+    console.set_console(&mini_uart.console);
 
     const dt = DtParser.new(dt_base);
 
     var mem_rsvmap = dt.memRsvmap();
 
     while (mem_rsvmap.next()) |rsv_entry| {
-        mini_uart.print("addr: 0x{x} size: 0x{x}\n", .{
+        console.print("addr: 0x{x} size: 0x{x}\n", .{
             rsv_entry.address,
             rsv_entry.size,
         });
     }
-    mini_uart.print("0x{x}\n", .{dt.magic()});
+    console.print("0x{x}\n", .{dt.magic()});
 
     while (true) {}
 }
diff --git a/src/mini_uart.zig b/src/mini_uart.zig
index be364b2..e6145a5 100644
--- a/src/mini_uart.zig
+++ b/src/mini_uart.zig
@@ -6,6 +6,7 @@ const AUX_ENABLE = board.AUX_ENABLE;
 
 const gpio = @import("gpio.zig");
 const mmio = @import("mmio.zig");
+const Console = @import("console.zig").Console;
 
 const IO = AUX_BASE + 0x40;
 const IER = AUX_BASE + 0x44;
@@ -19,7 +20,7 @@ const CNTL = AUX_BASE + 0x60;
 const STAT = AUX_BASE + 0x64;
 const BAUD = AUX_BASE + 0x68;
 
-pub fn enable() void {
+pub fn setup(_: *const Console) void {
     board.enableAux(.mini_uart);
 
     gpio.setPull(14, .none);
@@ -45,7 +46,7 @@ fn writeByte(b: u8) void {
     mmio.write(IO, b);
 }
 
-fn writeString(str: []const u8) void {
+fn writeString(_: *const Console, str: []const u8) void {
     for (str) |b| {
         if (b == '\n') {
             writeByte('\r');
@@ -54,31 +55,7 @@ fn writeString(str: []const u8) void {
     }
 }
 
-const Writer = std.Io.Writer;
-
-fn drain(
-    w: *Writer,
-    data: []const []const u8,
-    _: usize,
-) Writer.Error!usize {
-    var written: usize = 0;
-    writeString(w.buffer[0..w.end]);
-    written += w.end;
-    w.end = 0;
-    for (data) |slice| {
-        writeString(slice);
-        written += slice.len;
-    }
-    return written;
-}
-
-var buf: [1024]u8 = undefined;
-var writer: Writer = .{
-    .vtable = &.{ .drain = drain },
-    .buffer = &buf,
+pub const console = Console{
+    .write = writeString,
+    .setup = setup,
 };
-
-pub fn print(comptime fmt: []const u8, args: anytype) void {
-    writer.print(fmt, args) catch {};
-    writer.flush() catch {};
-}