gpio driver

main
Clyne 2 weeks ago
parent e7b0460825
commit 3a004869e4
Signed by: clyne
GPG Key ID: 3267C8EBF3F9AFC7

@ -3,7 +3,7 @@
//! is to delete this file and start with root.zig instead.
//const std = @import("std");
const gpio = packed struct {
const gpio_registers = packed struct {
moder: u32,
otyper: u32,
ospeedr: u32,
@ -18,6 +18,34 @@ const gpio = packed struct {
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");
@ -28,18 +56,17 @@ const cpu = struct {
}
};
const gpioa: *gpio = @ptrFromInt(0x48000000);
const gpioa = gpio { .port = @ptrFromInt(0x48000000) };
const rcc: *[39]u32 = @ptrFromInt(0x40021000);
export fn _start() callconv(.C) noreturn {
cpu.interrupt_disable();
rcc[19] |= 1; // gpioaen
gpioa.moder &= ~@as(u32, 0x3 << (5 * 2));
gpioa.moder |= (1 << (5 * 2));
gpioa.set_mode(5, .output);
while (true) {
gpioa.odr ^= (1 << 5);
gpioa.toggle(5);
}
}

Loading…
Cancel
Save