sylveos

Toy Operating System
Log | Files | Refs

commit f3053e02c829278dfc592752177f995eebcb976a
parent c1cc531558a4fbf331c6156b8457bc8bb09a7b33
Author: Sylvia Ivory <git@sivory.net>
Date:   Tue, 13 Jan 2026 19:24:33 -0800

Add HC-SR04 stub

Diffstat:
Asrc/devices/hc-sr04.zig | 20++++++++++++++++++++
Msrc/gpio.zig | 27++++++++++++++-------------
2 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/src/devices/hc-sr04.zig b/src/devices/hc-sr04.zig @@ -0,0 +1,20 @@ +const gpio = @import("../gpio.zig"); + +pub const Error = error{Timeout} | gpio.Error; + +pub const Device = struct { + echo_pin: u8, + trigger_pin: u8, + + pub fn setup(echo_pin: u8, trigger_pin: u8) Error!Device { + if (echo_pin >= gpio.MAX_GPIO) return Error.PinOutOfRange; + if (trigger_pin >= gpio.MAX_GPIO) return Error.PinOutOfRange; + + return .{ echo_pin, trigger_pin }; + } + + pub fn get_distance(d: *Device, timeout: bool) Error!Device { + _ = d; + _ = timeout; + } +}; diff --git a/src/gpio.zig b/src/gpio.zig @@ -8,6 +8,7 @@ const GPFSEL0: [*]volatile u32 = @ptrFromInt(BASE_ADDR + 0x0000); const GPSET0: [*]volatile u32 = @ptrFromInt(BASE_ADDR + 0x001C); const GPCLR0: [*]volatile u32 = @ptrFromInt(BASE_ADDR + 0x0028); const GPLEV0: [*]volatile u32 = @ptrFromInt(BASE_ADDR + 0x0034); +pub const MAX_GPIO: u8 = 53; // Page 92, Table 6-2: GPIO Alternate function select register 0 // All function select registers reflect this bit layout @@ -23,12 +24,12 @@ const FunctionSelect = enum(u3) { alt_fn_5 = 0b010, }; -const GpioError = error{ +pub const Error = error{ PinOutOfRange, }; -fn fn_sel(pin: u8, sel: FunctionSelect) GpioError!void { - if (pin > 53) return GpioError.PinOutOfRange; +fn fn_sel(pin: u8, sel: FunctionSelect) Error!void { + if (pin > MAX_GPIO) return Error.PinOutOfRange; const index = @divFloor(pin, 10); const address: *volatile u32 = &GPFSEL0[index]; @@ -41,8 +42,8 @@ fn fn_sel(pin: u8, sel: FunctionSelect) GpioError!void { address.* = state; } -fn addr_get(pin: u8, address: [*]volatile u32) GpioError!*volatile u32 { - if (pin > 53) return GpioError.PinOutOfRange; +fn addr_get(pin: u8, address: [*]volatile u32) Error!*volatile u32 { + if (pin > MAX_GPIO) return Error.PinOutOfRange; return &address[@divFloor(pin, 32)]; } @@ -57,32 +58,32 @@ fn addr_bitset(pin: u8, address: *volatile u32) void { } // Turn on -fn output_set(pin: u8) GpioError!void { +fn output_set(pin: u8) Error!void { addr_bitset(pin, try addr_get(pin, GPSET0)); } // Turn off -fn output_clear(pin: u8) GpioError!void { +fn output_clear(pin: u8) Error!void { addr_bitset(pin, try addr_get(pin, GPCLR0)); } -pub fn set_output(pin: u8) GpioError!void { +pub fn set_output(pin: u8) Error!void { try fn_sel(pin, .output); } -pub fn set_input(pin: u8) GpioError!void { +pub fn set_input(pin: u8) Error!void { try fn_sel(pin, .input); } -pub fn set_on(pin: u8) GpioError!void { +pub fn set_on(pin: u8) Error!void { try output_set(pin); } -pub fn set_off(pin: u8) GpioError!void { +pub fn set_off(pin: u8) Error!void { try output_clear(pin); } -pub fn read(pin: u8) GpioError!bool { +pub fn read(pin: u8) Error!bool { const address = try addr_get(pin, GPLEV0); const offset: u5 = @truncate(pin % 32); @@ -91,7 +92,7 @@ pub fn read(pin: u8) GpioError!bool { return (address.* & mask) == mask; } -pub fn write(pin: u8, state: bool) GpioError!void { +pub fn write(pin: u8, state: bool) Error!void { if (state) { try set_on(pin); } else {