hardware 0.0.9

A no_std bare-metal hardware abstraction layer — all port I/O, memory and swap allocations are guarded at runtime. Do not consider this dependency stable before x.1.x
Documentation
use crate::camera::hw;
use core::sync::atomic::{AtomicU8, Ordering};

static DRIVER_STATE: AtomicU8 = AtomicU8::new(0);

pub struct CsiDriver {
    pub base: usize,
    pub lanes: u32,
    pub version: u32,
}

pub fn probe(base: usize, lanes: u32) -> CsiDriver {
    let version = hw::csi2_version(base);
    DRIVER_STATE.store(1, Ordering::Release);
    CsiDriver {
        base,
        lanes,
        version,
    }
}

pub fn init(driver: &CsiDriver) -> bool {
    hw::csi2_set_lanes(driver.base, driver.lanes);
    hw::csi2_phy_enable(driver.base);
    let state = hw::csi2_phy_state(driver.base);
    let ready = state & 0x01 != 0;
    if ready {
        DRIVER_STATE.store(2, Ordering::Release);
    }
    ready
}

pub fn shutdown(driver: &CsiDriver) {
    hw::csi2_phy_disable(driver.base);
    DRIVER_STATE.store(0, Ordering::Release);
}

pub fn state() -> u8 {
    DRIVER_STATE.load(Ordering::Acquire)
}