sylveos

Toy Operating System
Log | Files | Refs

commit 30e4911af3d7a3913c1043b8441dbdefcf3cd30a
parent f4fb47a6ec50ad18e6043a8cf55a65404b2718bb
Author: Sylvia Ivory <git@sivory.net>
Date:   Tue, 13 Jan 2026 18:12:42 -0800

Use proper error handling

Diffstat:
MJustfile | 2+-
Msrc/gpio.zig | 46+++++++++++++++++++++++++---------------------
Msrc/labs/2-gpio.zig | 72++++++++++++++++++++++++++++++++++++------------------------------------
3 files changed, 62 insertions(+), 58 deletions(-)

diff --git a/Justfile b/Justfile @@ -6,4 +6,4 @@ lab name: rm src/*.runner.zig list name="SylveOS": build - arm-none-eabi-objdump -m armv6 -d zig-out/bin/{{ name }} + arm-none-eabi-objdump -m armv6 -d zig-out/bin/{{ name }}.elf diff --git a/src/gpio.zig b/src/gpio.zig @@ -23,8 +23,12 @@ const FunctionSelect = enum(u3) { alt_fn_5 = 0b010, }; -fn fn_sel(pin: u8, sel: FunctionSelect) void { - if (pin > 53) @panic("pin out of range (0...53)"); +const GpioError = error{ + PinOutOfRange, +}; + +fn fn_sel(pin: u8, sel: FunctionSelect) GpioError!void { + if (pin > 53) return GpioError.PinOutOfRange; const index = @divFloor(pin, 10); const address: *volatile u32 = &GPFSEL0[index]; @@ -37,8 +41,8 @@ fn fn_sel(pin: u8, sel: FunctionSelect) void { address.* = state; } -fn addr_get(pin: u8, address: [*]volatile u32) *volatile u32 { - if (pin > 53) @panic("pin out of range (0...53)"); +fn addr_get(pin: u8, address: [*]volatile u32) GpioError!*volatile u32 { + if (pin > 53) return GpioError.PinOutOfRange; return &address[@divFloor(pin, 32)]; } @@ -53,33 +57,33 @@ fn addr_bitset(pin: u8, address: *volatile u32) void { } // Turn on -fn output_set(pin: u8) void { - addr_bitset(pin, addr_get(pin, GPSET0)); +fn output_set(pin: u8) GpioError!void { + addr_bitset(pin, try addr_get(pin, GPSET0)); } // Turn off -fn output_clear(pin: u8) void { - addr_bitset(pin, addr_get(pin, GPCLR0)); +fn output_clear(pin: u8) GpioError!void { + addr_bitset(pin, try addr_get(pin, GPCLR0)); } -pub fn set_output(pin: u8) void { - fn_sel(pin, .output); +pub fn set_output(pin: u8) GpioError!void { + try fn_sel(pin, .output); } -pub fn set_input(pin: u8) void { - fn_sel(pin, .input); +pub fn set_input(pin: u8) GpioError!void { + try fn_sel(pin, .input); } -pub fn set_on(pin: u8) void { - output_set(pin); +pub fn set_on(pin: u8) GpioError!void { + try output_set(pin); } -pub fn set_off(pin: u8) void { - output_clear(pin); +pub fn set_off(pin: u8) GpioError!void { + try output_clear(pin); } -pub fn read(pin: u8) bool { - const address = addr_get(pin, GPLEV0); +pub fn read(pin: u8) GpioError!bool { + const address = try addr_get(pin, GPLEV0); const offset: u5 = @truncate(pin % 32); const mask = (@as(u32, 1) << offset); @@ -87,10 +91,10 @@ pub fn read(pin: u8) bool { return (address.* & mask) == mask; } -pub fn write(pin: u8, state: bool) void { +pub fn write(pin: u8, state: bool) GpioError!void { if (state) { - set_on(pin); + try set_on(pin); } else { - set_off(pin); + try set_off(pin); } } diff --git a/src/labs/2-gpio.zig b/src/labs/2-gpio.zig @@ -5,74 +5,74 @@ const led0 = 20; const led1 = 21; const act = 47; -pub fn blink_1() void { - gpio.set_output(led0); +pub fn blink_1() !void { + try gpio.set_output(led0); for (0..10) |_| { - gpio.set_on(led0); + try gpio.set_on(led0); util.delay_cycles(1000000); - gpio.set_off(led0); + try gpio.set_off(led0); util.delay_cycles(1000000); } - gpio.set_on(led0); + try gpio.set_on(led0); } -pub fn blink_2() void { - gpio.set_output(led0); - gpio.set_output(led1); +pub fn blink_2() !void { + try gpio.set_output(led0); + try gpio.set_output(led1); for (0..10) |_| { - gpio.set_on(led0); - gpio.set_off(led1); + try gpio.set_on(led0); + try gpio.set_off(led1); util.delay_cycles(3000000); - gpio.set_off(led0); - gpio.set_on(led1); + try gpio.set_off(led0); + try gpio.set_on(led1); util.delay_cycles(3000000); } } -pub fn loopback() void { +pub fn loopback() !void { const input = 9; const output = 10; - gpio.set_output(led0); - gpio.set_input(input); - gpio.set_output(led1); - gpio.set_output(output); + try gpio.set_output(led0); + try gpio.set_input(input); + try gpio.set_output(led1); + try gpio.set_output(output); var v = false; for (0..20) |_| { - gpio.write(led0, v); - gpio.write(output, v); - gpio.write(led1, gpio.read(input)); + try gpio.write(led0, v); + try gpio.write(output, v); + try gpio.write(led1, try gpio.read(input)); util.delay_cycles(1500000); v = !v; } } -pub fn act_blink() void { - gpio.set_output(act); +pub fn act_blink() !void { + try gpio.set_output(act); for (0..10) |_| { - gpio.set_on(act); + try gpio.set_on(act); util.delay_cycles(1000000); - gpio.set_off(act); + try gpio.set_off(act); util.delay_cycles(1000000); } - gpio.set_on(act); + try gpio.set_on(act); } -pub fn all() void { - gpio.set_output(led0); - gpio.set_output(led1); - gpio.set_output(act); +pub fn all() !void { + try gpio.set_output(led0); + try gpio.set_output(led1); + try gpio.set_output(act); for (0..10) |_| { - gpio.set_on(led0); - gpio.set_on(led1); - gpio.set_on(act); + try gpio.set_on(led0); + try gpio.set_on(led1); + try gpio.set_on(act); util.delay_cycles(1000000); - gpio.set_off(led0); - gpio.set_off(led1); - gpio.set_off(act); + try gpio.set_off(led0); + try gpio.set_off(led1); + try gpio.set_off(act); util.delay_cycles(1000000); } - gpio.set_on(act); + try gpio.set_on(act); }