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 core::ptr;

pub const SENSOR_ID_REG: usize = 0x00;
pub const SENSOR_STATUS: usize = 0x04;
pub const SENSOR_CTRL: usize = 0x08;
pub const SENSOR_DATA_OUT: usize = 0x0C;
pub const SENSOR_DATA_OUT_H: usize = 0x10;
pub const SENSOR_CONFIG: usize = 0x14;
pub const SENSOR_RATE: usize = 0x18;
pub const SENSOR_FIFO_CTRL: usize = 0x1C;
pub const SENSOR_FIFO_STATUS: usize = 0x20;
pub const SENSOR_INT_CTRL: usize = 0x24;
pub const SENSOR_INT_STATUS: usize = 0x28;
pub const SENSOR_OFFSET_X: usize = 0x2C;
pub const SENSOR_OFFSET_Y: usize = 0x30;
pub const SENSOR_OFFSET_Z: usize = 0x34;
pub const SENSOR_SCALE: usize = 0x38;

pub const CTRL_POWER_ON: u32 = 1 << 0;
pub const CTRL_STANDBY: u32 = 1 << 1;
pub const CTRL_CONTINUOUS: u32 = 1 << 2;
pub const CTRL_SINGLE_SHOT: u32 = 1 << 3;
pub const CTRL_FIFO_EN: u32 = 1 << 4;
pub const CTRL_INT_EN: u32 = 1 << 5;
pub const CTRL_RESET: u32 = 1 << 7;

pub fn read_reg(base: usize, offset: usize) -> u32 {
    unsafe { ptr::read_volatile((base + offset) as *const u32) }
}

pub fn write_reg(base: usize, offset: usize, val: u32) {
    unsafe { ptr::write_volatile((base + offset) as *mut u32, val) }
}

pub fn sensor_id(base: usize) -> u32 {
    read_reg(base, SENSOR_ID_REG)
}

pub fn enable(base: usize) {
    let ctrl = read_reg(base, SENSOR_CTRL);
    write_reg(base, SENSOR_CTRL, ctrl | CTRL_POWER_ON);
}

pub fn disable(base: usize) {
    let ctrl = read_reg(base, SENSOR_CTRL);
    write_reg(base, SENSOR_CTRL, ctrl & !CTRL_POWER_ON);
}

pub fn reset(base: usize) {
    write_reg(base, SENSOR_CTRL, CTRL_RESET);
    loop {
        let ctrl = read_reg(base, SENSOR_CTRL);
        if ctrl & CTRL_RESET == 0 {
            break;
        }
    }
}

pub fn set_continuous(base: usize) {
    let ctrl = read_reg(base, SENSOR_CTRL);
    write_reg(
        base,
        SENSOR_CTRL,
        (ctrl & !CTRL_SINGLE_SHOT) | CTRL_CONTINUOUS,
    );
}

pub fn set_single_shot(base: usize) {
    let ctrl = read_reg(base, SENSOR_CTRL);
    write_reg(
        base,
        SENSOR_CTRL,
        (ctrl & !CTRL_CONTINUOUS) | CTRL_SINGLE_SHOT,
    );
}

pub fn enable_fifo(base: usize) {
    let ctrl = read_reg(base, SENSOR_CTRL);
    write_reg(base, SENSOR_CTRL, ctrl | CTRL_FIFO_EN);
}

pub fn fifo_level(base: usize) -> u32 {
    read_reg(base, SENSOR_FIFO_STATUS) & 0x3F
}

pub fn read_data(base: usize) -> u32 {
    read_reg(base, SENSOR_DATA_OUT)
}

pub fn read_data_high(base: usize) -> u32 {
    read_reg(base, SENSOR_DATA_OUT_H)
}

pub fn set_sample_rate(base: usize, rate_code: u32) {
    write_reg(base, SENSOR_RATE, rate_code);
}

pub fn set_offsets(base: usize, x: u32, y: u32, z: u32) {
    write_reg(base, SENSOR_OFFSET_X, x);
    write_reg(base, SENSOR_OFFSET_Y, y);
    write_reg(base, SENSOR_OFFSET_Z, z);
}

pub fn set_scale(base: usize, scale: u32) {
    write_reg(base, SENSOR_SCALE, scale);
}