From 96af920a12fa55c6f28bd05ec470bdbf210030fc Mon Sep 17 00:00:00 2001 From: chrysn Date: Thu, 25 Jan 2024 13:56:17 +0100 Subject: [PATCH] drivers/lsm303agr: Use version 0.3 of driver Note that for the very CPU this driver is used with (nRF52 on the microbit-v2 board), this currently needs extra workarounds to copy written data from flash to RAM so that the driver can see it. (Otherwise it silently writes 00, and then correctly reads 00 from the bus all the time). --- drivers/lsm303agr/Cargo.toml | 2 +- drivers/lsm303agr/Makefile.dep | 1 + drivers/lsm303agr/src/lib.rs | 14 ++++++++------ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/lsm303agr/Cargo.toml b/drivers/lsm303agr/Cargo.toml index a895f37fd5..184c4b779e 100644 --- a/drivers/lsm303agr/Cargo.toml +++ b/drivers/lsm303agr/Cargo.toml @@ -11,7 +11,7 @@ license = "LGPL-2.1-only" publish = false [dependencies] -lsm303agr = "^0.2" +lsm303agr = "0.3.0" riot-wrappers = "^0.8" # Whatever lsm uses nb = "*" diff --git a/drivers/lsm303agr/Makefile.dep b/drivers/lsm303agr/Makefile.dep index fb1f1f980b..273175f9ff 100644 --- a/drivers/lsm303agr/Makefile.dep +++ b/drivers/lsm303agr/Makefile.dep @@ -1,3 +1,4 @@ USEMODULE += rust_riotmodules +USEMODULE += ztimer_usec FEATURES_REQUIRED += periph_i2c diff --git a/drivers/lsm303agr/src/lib.rs b/drivers/lsm303agr/src/lib.rs index 9f21be3b9e..4a6f657505 100644 --- a/drivers/lsm303agr/src/lib.rs +++ b/drivers/lsm303agr/src/lib.rs @@ -1,6 +1,6 @@ #![no_std] -use lsm303agr::{interface, mode, Lsm303agr, AccelOutputDataRate::Hz50}; +use lsm303agr::{interface, mode, Lsm303agr, AccelOutputDataRate::Hz50, AccelMode}; use riot_wrappers::{saul, println, i2c, cstr::cstr, mutex::Mutex}; use saul::{Phydat, registration}; @@ -59,9 +59,11 @@ fn init() -> Result<(), &'static str> { for (&i2cdev, (lsm, (reg, reg_mag))) in I2C_DEVICES.iter().zip(lsm.iter_mut().zip(reg.iter_mut().zip(reg_mag.iter_mut()))) { let mut device = Lsm303agr::new_with_i2c(i2c::I2CDevice::new(i2cdev)); + let mut init_clock = riot_wrappers::ztimer::Clock::usec(); + device.init() .map_err(|_| "Device initialization failed")?; - device.set_accel_odr(Hz50) + device.set_accel_mode_and_odr(&mut init_clock, AccelMode::Normal, Hz50) .map_err(|_| "Device configuration failed")?; let lsm = lsm.insert(SaulLSM { device: Mutex::new(device) }); @@ -90,10 +92,10 @@ impl registration::Drivable for &SaulLSM { let mut device = self.device.try_lock() .ok_or(registration::Error)?; - let data = device.accel_data() + let data = device.acceleration() .map_err(|_| registration::Error)?; // Data is in the +-2g range by default, which doesn't overflow even the i16 SAUL uses - Ok(Phydat::new(&[data.x as _, data.y as _, data.z as _], Some(saul::Unit::GForce), -3)) + Ok(Phydat::new(&[data.x_mg() as _, data.y_mg() as _, data.z_mg() as _], Some(saul::Unit::GForce), -3)) } } @@ -115,9 +117,9 @@ impl registration::Drivable for MagAspect { let mut device = self.0.device.try_lock() .ok_or(registration::Error)?; - let data = nb::block!(device.mag_data()) + let data = nb::block!(device.magnetic_field()) .map_err(|_| registration::Error)?; // Original data is in nanotesla - return Ok(Phydat::fit(&[data.x, data.y, data.z], Some(saul::Unit::T), -9)) + return Ok(Phydat::fit(&[data.x_nt(), data.y_nt(), data.z_nt()], Some(saul::Unit::T), -9)) } }