aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2024-10-05 13:14:55 -0400
committerClyne Sullivan <clyne@bitgloo.com>2024-10-05 13:14:55 -0400
commitccc904c6bc74b26cdb68f6a375a8ac90b5240945 (patch)
treeb54bd67f0f93498d52527265e411b17398d9f26b
parent0a60bf4e362d870ba20c6086e2ce0647c9c9f7ab (diff)
break out into separate files
-rw-r--r--src/cpu.zig8
-rw-r--r--src/gpio.zig45
-rw-r--r--src/main.zig61
3 files changed, 56 insertions, 58 deletions
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();