You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by st...@apache.org on 2016/12/26 21:54:23 UTC
incubator-mynewt-core git commit: Moved shifts outside read48 to
allow for differences with mag values
Repository: incubator-mynewt-core
Updated Branches:
refs/heads/sensors_branch 68986fbd7 -> 9be6bc81c
Moved shifts outside read48 to allow for differences with mag values
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/9be6bc81
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/9be6bc81
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/9be6bc81
Branch: refs/heads/sensors_branch
Commit: 9be6bc81c04e83036bba123cf80a04307799764a
Parents: 68986fb
Author: microbuilder <co...@microbuilder.eu>
Authored: Fri Dec 23 23:55:56 2016 +0100
Committer: microbuilder <co...@microbuilder.eu>
Committed: Fri Dec 23 23:55:56 2016 +0100
----------------------------------------------------------------------
hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc.c | 31 ++++++++++++++------
.../sensors/lsm303dlhc/src/lsm303dlhc_priv.h | 1 +
2 files changed, 23 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/9be6bc81/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc.c
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc.c b/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc.c
index 40978c6..f9c2dee 100644
--- a/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc.c
+++ b/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc.c
@@ -169,7 +169,7 @@ error:
}
int
-lsm303dlhc_read48(uint8_t addr, uint8_t reg, int16_t *x, int16_t*y, int16_t *z)
+lsm303dlhc_read48(uint8_t addr, uint8_t reg, uint8_t *buffer)
{
int rc;
uint8_t payload[7] = { reg | 0x80, 0, 0, 0, 0, 0, 0 };
@@ -180,6 +180,9 @@ lsm303dlhc_read48(uint8_t addr, uint8_t reg, int16_t *x, int16_t*y, int16_t *z)
.buffer = payload
};
+ /* Clear the supplied buffer */
+ memset(buffer, 0, 6);
+
/* Register write */
rc = hal_i2c_master_write(MYNEWT_VAL(LSM303DLHC_I2CBUS), &data_struct,
OS_TICKS_PER_SEC / 10, 1);
@@ -197,11 +200,6 @@ lsm303dlhc_read48(uint8_t addr, uint8_t reg, int16_t *x, int16_t*y, int16_t *z)
rc = hal_i2c_master_read(MYNEWT_VAL(LSM303DLHC_I2CBUS), &data_struct,
OS_TICKS_PER_SEC / 10, 1);
- /* Shift 12-bit left-aligned accel values into 16-bit int */
- *x = ((int16_t)(payload[0] | (payload[1] << 8))) >> 4;
- *y = ((int16_t)(payload[2] | (payload[3] << 8))) >> 4;
- *z = ((int16_t)(payload[4] | (payload[5] << 8))) >> 4;
-
if (rc) {
LSM303DLHC_ERR("Failed to read from 0x%02X:0x%02X\n", addr, reg);
#if MYNEWT_VAL(LSM303DLHC_STATS)
@@ -210,6 +208,9 @@ lsm303dlhc_read48(uint8_t addr, uint8_t reg, int16_t *x, int16_t*y, int16_t *z)
goto error;
}
+ /* Copy the I2C results into the supplied buffer */
+ memcpy(buffer, payload, 6);
+
/* ToDo: Log raw reads */
// console_printf("0x%04X\n", (uint16_t)payload[0] | ((uint16_t)payload[1] << 8));
@@ -316,6 +317,7 @@ lsm303dlhc_sensor_read(struct sensor *sensor, sensor_type_t type,
int rc;
int16_t x, y, z;
float mg_lsb;
+ uint8_t payload[6];
/* If the read isn't looking for accel data, then don't do anything. */
if (!(type & SENSOR_TYPE_ACCELEROMETER)) {
@@ -326,9 +328,20 @@ lsm303dlhc_sensor_read(struct sensor *sensor, sensor_type_t type,
lsm = (struct lsm303dlhc *) SENSOR_GET_DEVICE(sensor);
x = y = z = 0;
- lsm303dlhc_read48(LSM303DLHC_ADDR_ACCEL,
- LSM303DLHC_REGISTER_ACCEL_OUT_X_L_A,
- &x, &y, &z);
+ rc = lsm303dlhc_read48(LSM303DLHC_ADDR_ACCEL,
+ LSM303DLHC_REGISTER_ACCEL_OUT_X_L_A,
+ payload);
+ if (rc != 0) {
+ goto err;
+ }
+
+ /* Shift raw values based on sensor type */
+ if (type & SENSOR_TYPE_ACCELEROMETER) {
+ /* Shift 12-bit left-aligned accel values into 16-bit int */
+ x = ((int16_t)(payload[0] | (payload[1] << 8))) >> 4;
+ y = ((int16_t)(payload[2] | (payload[3] << 8))) >> 4;
+ z = ((int16_t)(payload[4] | (payload[5] << 8))) >> 4;
+ }
/* Determine mg per lsb based on range */
switch(lsm->cfg.accel_range) {
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/9be6bc81/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc_priv.h
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc_priv.h b/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc_priv.h
index 5983096..98b9f21 100644
--- a/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc_priv.h
+++ b/hw/drivers/sensors/lsm303dlhc/src/lsm303dlhc_priv.h
@@ -80,6 +80,7 @@ enum lsm303dlhc_registers_mag {
int lsm303dlhc_write8(uint8_t addr, uint8_t reg, uint32_t value);
int lsm303dlhc_read8(uint8_t addr, uint8_t reg, uint8_t *value);
+int lsm303dlhc_read48(uint8_t addr, uint8_t reg, uint8_t *buffer);
#ifdef __cplusplus
}