diff options
| author | wires <wires@noreply.wires.systems> | 2025-10-13 10:11:14 -0400 |
|---|---|---|
| committer | wires <wires@noreply.wires.systems> | 2025-10-13 10:11:14 -0400 |
| commit | 72857c6f87e62dc2d2fa0173efa2c68b2c710f9d (patch) | |
| tree | 8979489fdf9967e3a46a938e712cfd0853e3d60f | |
| parent | start working on devicetree (diff) | |
| download | zosimos-72857c6f87e62dc2d2fa0173efa2c68b2c710f9d.tar.gz | |
first console driver abstraction
| -rw-r--r-- | src/console.zig | 34 | ||||
| -rw-r--r-- | src/main.zig | 9 | ||||
| -rw-r--r-- | src/mini_uart.zig | 35 |
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 {}; -} |