gpio driver

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

Loading…
Cancel
Save