From 209b4babb74221ddf429ed21d5537a71937c5cc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Neuh=C3=A4user?= Date: Tue, 20 May 2025 10:14:18 +0200 Subject: [PATCH] Generic set gpio state --- src/gpio.rs | 21 ++++++++++++++++----- src/main.rs | 9 ++++++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/gpio.rs b/src/gpio.rs index f44e990..d9b545e 100644 --- a/src/gpio.rs +++ b/src/gpio.rs @@ -4,7 +4,19 @@ const GPFSEL_BASE: u32 = 0x3F20_0000; const GPSET_BASE: u32 = 0x3F20_001C; const GPCLR_BASE: u32 = 0x3F20_0028; -unsafe fn set_gpio_to_output(gpio: u8) -> Result<(), &'static str> { +#[repr(u32)] +pub enum GPIOState { + input = 0b000, + output = 0b001, + alternative0 = 0b100, + alternative1 = 0b101, + alternative2 = 0b110, + alternative3 = 0b111, + alternative4 = 0b011, + alternative5 = 0b010, +} + +pub unsafe fn set_gpio_state(gpio: u8, state: GPIOState) -> Result<(), &'static str> { if gpio > 53 { return Err("GPIO out of range"); } @@ -18,16 +30,15 @@ unsafe fn set_gpio_to_output(gpio: u8) -> Result<(), &'static str> { let mask = !(0b111 << register_offset); let cleared = current & mask; - let new_val = cleared | (0b001 << register_offset); + let new_val = cleared | ((state as u32) << register_offset); core::ptr::write_volatile(register_addr as *mut u32, new_val); Ok(()) } -pub fn pull_up_gpio(gpio: u8) -> Result<(), &'static str> { +pub fn gpio_high(gpio: u8) -> Result<(), &'static str> { unsafe { uart::print("Pull Up\n"); - set_gpio_to_output(29)?; let register_index = gpio / 32; let register_offset = gpio % 32; @@ -38,7 +49,7 @@ pub fn pull_up_gpio(gpio: u8) -> Result<(), &'static str> { Ok(()) } -pub fn pull_down_gpio(gpio: u8) -> Result<(), &'static str> { +pub fn gpio_low(gpio: u8) -> Result<(), &'static str> { unsafe { uart::print("Pull Down\n"); diff --git a/src/main.rs b/src/main.rs index c8c7d17..2ea528b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,7 @@ use core::{arch::asm, panic::PanicInfo}; -use gpio::{pull_down_gpio, pull_up_gpio}; +use gpio::{gpio_high, gpio_low, set_gpio_state}; mod gpio; mod uart; @@ -26,15 +26,18 @@ pub unsafe extern "C" fn _start() { #[no_mangle] extern "C" fn main() { uart::configure_uart(); + unsafe { + let _ = set_gpio_state(29, gpio::GPIOState::output); + } // Delay so clock speed can stabilize unsafe { delay(50000) } uart::print("Hello World!\n"); loop { - let _ = pull_up_gpio(29); + let _ = gpio_high(29); unsafe { delay(1_000_000) } - let _ = pull_down_gpio(29); + let _ = gpio_low(29); unsafe { delay(1_000_000) } } }