commit 30e4911af3d7a3913c1043b8441dbdefcf3cd30a
parent f4fb47a6ec50ad18e6043a8cf55a65404b2718bb
Author: Sylvia Ivory <git@sivory.net>
Date: Tue, 13 Jan 2026 18:12:42 -0800
Use proper error handling
Diffstat:
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);
}