You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by vi...@apache.org on 2017/02/13 19:36:34 UTC
incubator-mynewt-core git commit: SensorAPI - BNO055 Add external
crystal support
Repository: incubator-mynewt-core
Updated Branches:
refs/heads/sensors_branch 5a76b68cc -> 33253b22f
SensorAPI - BNO055 Add external crystal support
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/33253b22
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/33253b22
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/33253b22
Branch: refs/heads/sensors_branch
Commit: 33253b22f303eb924e9656a86327f4f3e5b140f6
Parents: 5a76b68
Author: Vipul Rahane <vi...@apache.org>
Authored: Mon Feb 13 11:34:26 2017 -0800
Committer: Vipul Rahane <vi...@apache.org>
Committed: Mon Feb 13 11:34:26 2017 -0800
----------------------------------------------------------------------
apps/slinky/src/main.c | 2 +-
hw/drivers/sensors/bno055/src/bno055.c | 82 ++++++++++++++++++++++--
hw/drivers/sensors/bno055/src/bno055_priv.h | 5 ++
3 files changed, 84 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/33253b22/apps/slinky/src/main.c
----------------------------------------------------------------------
diff --git a/apps/slinky/src/main.c b/apps/slinky/src/main.c
index aa58fcb..2bdcc76 100755
--- a/apps/slinky/src/main.c
+++ b/apps/slinky/src/main.c
@@ -292,7 +292,7 @@ config_sensor(void)
#if MYNEWT_VAL(BNO055_PRESENT)
struct bno055_cfg bcfg;
- dev = (struct os_dev *) os_dev_open("accel0", OS_TIMEOUT_NEVER, NULL);
+ dev = (struct os_dev *) os_dev_open("accel1", OS_TIMEOUT_NEVER, NULL);
assert(dev != NULL);
rc = bno055_init(dev, NULL);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/33253b22/hw/drivers/sensors/bno055/src/bno055.c
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bno055/src/bno055.c b/hw/drivers/sensors/bno055/src/bno055.c
index 665db28..b74fcb2 100644
--- a/hw/drivers/sensors/bno055/src/bno055.c
+++ b/hw/drivers/sensors/bno055/src/bno055.c
@@ -160,7 +160,7 @@ bno055_read8(uint8_t reg, uint8_t *value)
/* Register write */
payload = reg;
rc = hal_i2c_master_write(MYNEWT_VAL(BNO055_I2CBUS), &data_struct,
- OS_TICKS_PER_SEC / 10, 1);
+ OS_TICKS_PER_SEC / 10, 0);
if (rc) {
BNO055_ERR("I2C register write failed at address 0x%02X:0x%02X\n",
data_struct.address, reg);
@@ -366,6 +366,62 @@ err:
return rc;
}
+/**
+ * Use external crystal 32.768KHz
+ *
+ * @return 0 on success, non-zero on failure
+ */
+static int
+bno055_set_ext_xtal_use(uint8_t use_xtal)
+{
+ int rc;
+ uint8_t prev_mode;
+
+ prev_mode = g_bno055_mode;
+
+ /* Switch to config mode */
+ rc = bno055_set_mode(BNO055_OPERATION_MODE_CONFIG);
+ if (rc) {
+ goto err;
+ }
+
+ os_time_delay(OS_TICKS_PER_SEC/1000 * 25);
+
+ rc = bno055_write8(BNO055_PAGE_ID_ADDR, 0);
+ if (rc) {
+ goto err;
+ }
+
+ if (use_xtal) {
+ /* Use External Clock */
+ rc = bno055_write8(BNO055_SYS_TRIGGER_ADDR, BNO055_SYS_TRIGGER_CLK_SEL);
+ if (rc) {
+ goto err;
+ }
+ } else {
+ /* Use Internal clock */
+ rc = bno055_write8(BNO055_SYS_TRIGGER_ADDR, 0x00);
+ if (rc) {
+ goto err;
+ }
+ }
+
+ os_time_delay(OS_TICKS_PER_SEC/1000 * 10);
+
+ /* Reset to previous operating mode */
+ rc = bno055_set_mode(prev_mode);
+ if (rc) {
+ goto err;
+ }
+
+ os_time_delay(OS_TICKS_PER_SEC/1000 * 20);
+
+ return 0;
+err:
+ return rc;
+}
+
+
int
bno055_config(struct bno055 *bno055, struct bno055_cfg *cfg)
{
@@ -375,6 +431,16 @@ bno055_config(struct bno055 *bno055, struct bno055_cfg *cfg)
prev_mode = g_bno055_mode;
+ /**
+ * As per Section 5.5 in the BNO055 Datasheet,
+ * external crystal should be used for accurate
+ * results
+ */
+ rc = bno055_set_ext_xtal_use(1);
+ if (rc) {
+ goto err;
+ }
+
/* Check if we can read the chip address */
rc = bno055_read8(BNO055_CHIP_ID_ADDR, &id);
if (rc) {
@@ -390,6 +456,7 @@ bno055_config(struct bno055 *bno055, struct bno055_cfg *cfg)
}
if(id != BNO055_ID) {
+ rc = SYS_EINVAL;
goto err;
}
}
@@ -430,8 +497,6 @@ bno055_config(struct bno055 *bno055, struct bno055_cfg *cfg)
goto err;
}
- os_time_delay(OS_TICKS_PER_SEC/1000 * 20);
-
return 0;
err:
return rc;
@@ -514,6 +579,13 @@ bno055_find_reg(sensor_type_t type, uint8_t *reg)
return rc;
}
+/**
+ * Get vector data from sensor
+ *
+ * @param pointer to teh structure to be filled up
+ * @param Type of sensor
+ * @return 0 on success, non-zero on error
+ */
int
bno055_get_vector_data(void *datastruct, int type)
{
@@ -592,7 +664,8 @@ err:
/**
* Get temperature from bno055 sensor
*
- * @return temperature in degree celcius
+ * @param pointer to the temperature variable to be filled up
+ * @return 0 on success, non-zero on error
*/
int
bno055_get_temp(int8_t *temp)
@@ -826,3 +899,4 @@ bno055_sensor_get_config(struct sensor *sensor, sensor_type_t type,
err:
return (rc);
}
+
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/33253b22/hw/drivers/sensors/bno055/src/bno055_priv.h
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bno055/src/bno055_priv.h b/hw/drivers/sensors/bno055/src/bno055_priv.h
index 3a2da68..295e83b 100644
--- a/hw/drivers/sensors/bno055/src/bno055_priv.h
+++ b/hw/drivers/sensors/bno055/src/bno055_priv.h
@@ -107,6 +107,11 @@
#define BNO055_PWR_MODE_ADDR 0X3E
#define BNO055_SYS_TRIGGER_ADDR 0X3F
+#define BNO055_SYS_TRIGGER_CLK_SEL (0x01 << 7)
+#define BNO055_SYS_TRIGGER_RST_INT (0x01 << 6)
+#define BNO055_SYS_TRIGGER_RST_SYS (0x01 << 5)
+#define BNO055_SYS_TRIGGER_SELF_TEST (0x01)
+
#define BNO055_TEMP_SOURCE_ADDR 0X40
/* Axis remap registers */