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) };