From ccc904c6bc74b26cdb68f6a375a8ac90b5240945 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Sat, 5 Oct 2024 13:14:55 -0400 Subject: [PATCH] break out into separate files --- src/cpu.zig | 8 +++++++ src/gpio.zig | 45 ++++++++++++++++++++++++++++++++++++++ src/main.zig | 61 +++------------------------------------------------- 3 files changed, 56 insertions(+), 58 deletions(-) create mode 100644 src/cpu.zig create mode 100644 src/gpio.zig diff --git a/src/cpu.zig b/src/cpu.zig new file mode 100644 index 0000000..58f5f40 --- /dev/null +++ b/src/cpu.zig @@ -0,0 +1,8 @@ +pub fn interrupt_disable() void { + asm volatile("cpsid i"); +} + +pub fn interrupt_enable() void { + asm volatile("cpsie i"); +} + diff --git a/src/gpio.zig b/src/gpio.zig new file mode 100644 index 0000000..1d713e6 --- /dev/null +++ b/src/gpio.zig @@ -0,0 +1,45 @@ +const registers = packed struct { + moder: u32, + otyper: u32, + ospeedr: u32, + pupdr: u32, + idr: u32, + odr: u32, + bsrr: u32, + lckr: u32, + afrl: u32, + afrh: u32, + brr: u32, + ascr: u32, +}; + +const driver = struct { + port: *registers, + + const mode = enum { + input, + output, + alternate, + analog, + }; + + pub fn set_mode(self: driver, pin: u4, m: mode) void { + self.port.moder &= ~(@as(u32, 0x3) << (2 * pin)); + + const mask: u32 = switch (m) { + .input => 0, + .output => 1, + .alternate => 2, + .analog => 3 + }; + + self.port.moder |= mask << (2 * pin); + } + + pub fn toggle(self: driver, pin: u4) void { + self.port.odr ^= @as(u32, 1) << pin; + } +}; + +pub const gpioa = driver { .port = @ptrFromInt(0x48000000) }; + diff --git a/src/main.zig b/src/main.zig index 64bc6d4..8ca6ada 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,63 +1,8 @@ -//! By convention, main.zig is where your main function lives in the case that -//! you are building an executable. If you are making a library, the convention -//! is to delete this file and start with root.zig instead. -//const std = @import("std"); +const cpu = @import("cpu.zig"); +const gpio = @import("gpio.zig"); -const gpio_registers = packed struct { - moder: u32, - otyper: u32, - ospeedr: u32, - pupdr: u32, - idr: u32, - odr: u32, - bsrr: u32, - lckr: u32, - afrl: u32, - afrh: u32, - brr: u32, - ascr: u32, -}; - -const gpio = struct { - port: *gpio_registers, - - const mode = enum { - input, - output, - alternate, - analog, - }; - - pub fn set_mode(self: gpio, pin: u4, m: mode) void { - self.port.moder &= ~(@as(u32, 0x3) << (2 * pin)); - - const mask: u32 = switch (m) { - .input => 0, - .output => 1, - .alternate => 2, - .analog => 3 - }; - - self.port.moder |= mask << (2 * pin); - } - - pub fn toggle(self: gpio, pin: u4) void { - self.port.odr ^= @as(u32, 1) << pin; - } -}; - -const cpu = struct { - pub fn interrupt_disable() void { - asm volatile("cpsid i"); - } - - pub fn interrupt_enable() void { - asm volatile("cpsie i"); - } -}; - -const gpioa = gpio { .port = @ptrFromInt(0x48000000) }; const rcc: *[39]u32 = @ptrFromInt(0x40021000); +const gpioa = gpio.gpioa; export fn _start() callconv(.C) noreturn { cpu.interrupt_disable();