HeavyX/firmware/testing/src/gpio.rs

28 lines
927 B
Rust

use core::ptr::{read_volatile, write_volatile};
const GPIO_SWITCH: *mut u32 = (0x02000010) as *mut u32;
pub fn gpio_led_on(index: u32) {
unsafe {
let bitmask = 1 << index as u32;
let bitmasked = read_volatile(GPIO_SWITCH) & (0xFFFF - bitmask) as u32;
write_volatile(GPIO_SWITCH, ((1 << index) | bitmasked) as u32);
}
}
pub fn gpio_led_off(index: u32) {
unsafe {
let bitmask = 1 << index as u32;
let bitmasked = read_volatile(GPIO_SWITCH) & (0xFFFF - bitmask) as u32;
write_volatile(GPIO_SWITCH, ((0 << index) | bitmasked) as u32);
}
}
pub fn gpio_led_toggle(index: u32) {
unsafe {
let raw = read_volatile(GPIO_SWITCH) as u32;
let bitmask = 1 << index as u32;
let bitmasked = raw & (!bitmask) as u32;
let current = raw & bitmask as u32;
write_volatile(GPIO_SWITCH, (!current & bitmask | bitmasked) as u32);
}
}