blob: 32d1eba4ba4f8ef5dc84c1b2633a62c553ef718b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef __BNO055_H__
#define __BNO055_H__
#include "os/mynewt.h"
#include "sensor/sensor.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Power modes */
#define BNO055_PWR_MODE_NORMAL 0X00
#define BNO055_PWR_MODE_LOWPOWER 0X01
#define BNO055_PWR_MODE_SUSPEND 0X02
/* Operation Modes */
#define BNO055_OPR_MODE_CONFIG 0X00
#define BNO055_OPR_MODE_ACCONLY 0X01
#define BNO055_OPR_MODE_MAGONLY 0X02
#define BNO055_OPR_MODE_GYRONLY 0X03
#define BNO055_OPR_MODE_ACCMAG 0X04
#define BNO055_OPR_MODE_ACCGYRO 0X05
#define BNO055_OPR_MODE_MAGGYRO 0X06
#define BNO055_OPR_MODE_AMG 0X07
#define BNO055_OPR_MODE_IMUPLUS 0X08
#define BNO055_OPR_MODE_COMPASS 0X09
#define BNO055_OPR_MODE_M4G 0X0A
#define BNO055_OPR_MODE_NDOF_FMC_OFF 0X0B
#define BNO055_OPR_MODE_NDOF 0X0C
#define BNO055_ACC_UNIT_MS2 0x0
#define BNO055_ACC_UNIT_MG 0x1
#define BNO055_ANGRATE_UNIT_DPS (0 << 1)
#define BNO055_ANGRATE_UNIT_RPS (1 << 1)
#define BNO055_EULER_UNIT_DEG (0 << 2)
#define BNO055_EULER_UNIT_RAD (1 << 2)
#define BNO055_TEMP_UNIT_DEGC (0 << 4)
#define BNO055_TEMP_UNIT_DEGF (1 << 4)
#define BNO055_DO_FORMAT_WINDOWS (0 << 7)
#define BNO055_DO_FORMAT_ANDROID (1 << 7)
/* Accelerometer config */
#define BNO055_ACC_CFG_RNG_2G 0x0
#define BNO055_ACC_CFG_RNG_4G 0x1
#define BNO055_ACC_CFG_RNG_8G 0x2
#define BNO055_ACC_CFG_RNG_16G 0x3
#define BNO055_ACC_CFG_BW_7_81HZ (0x0 << 2)
#define BNO055_ACC_CFG_BW_15_63HZ (0x1 << 2)
#define BNO055_ACC_CFG_BW_31_25HZ (0x2 << 2)
#define BNO055_ACC_CFG_BW_6_25HZ (0x3 << 2)
#define BNO055_ACC_CFG_BW_125HZ (0x4 << 2)
#define BNO055_ACC_CFG_BW_250HZ (0x5 << 2)
#define BNO055_ACC_CFG_BW_500HZ (0x6 << 2)
#define BNO055_ACC_CFG_BW_1000HZ (0x7 << 2)
#define BNO055_ACC_CFG_OPR_MODE_NORMAL (0x0 << 5)
#define BNO055_ACC_CFG_OPR_MODE_SUSPEND (0x1 << 5)
#define BNO055_ACC_CFG_OPR_MODE_LOWPWR1 (0x2 << 5)
#define BNO055_ACC_CFG_OPR_MODE_STD (0x3 << 5)
#define BNO055_ACC_CFG_OPR_MODE_LOWPWR2 (0x4 << 5)
#define BNO055_ACC_CFG_OPR_MODE_DSUSPEND (0x5 << 5)
/* Gyroscope config */
#define BNO055_GYR_CFG_RNG_2000DPS 0x0
#define BNO055_GYR_CFG_RNG_1000DPS 0x1
#define BNO055_GYR_CFG_RNG_500DPS 0x2
#define BNO055_GYR_CFG_RNG_250DPS 0x3
#define BNO055_GYR_CFG_RNG_125DPS 0x4
#define BNO055_GYR_CFG_BW_523HZ (0x0 << 3)
#define BNO055_GYR_CFG_BW_230HZ (0x1 << 3)
#define BNO055_GYR_CFG_BW_116HZ (0x2 << 3)
#define BNO055_GYR_CFG_BW_47HZ (0x3 << 3)
#define BNO055_GYR_CFG_BW_23HZ (0x4 << 3)
#define BNO055_GYR_CFG_BW_12HZ (0x5 << 3)
#define BNO055_GYR_CFG_BW_64HZ (0x6 << 3)
#define BNO055_GYR_CFG_BW_32HZ (0x7 << 3)
#define BNO055_GYR_CFG_OPR_MODE_NORMAL (0x0 << 5)
#define BNO055_GYR_CFG_OPR_MODE_FAST_PWR_UP (0x1 << 5)
#define BNO055_GYR_CFG_OPR_MODE_DSUSPEND (0x2 << 5)
#define BNO055_GYR_CFG_OPR_MODE_SUSPEND (0x3 << 5)
#define BNO055_GYR_CFG_OPR_MODE_ADV_PWR_SAVE (0x4 << 5)
/* Magnetometer config */
#define BNO055_MAG_CFG_ODR_2HZ 0x0
#define BNO055_MAG_CFG_ODR_6HZ 0x1
#define BNO055_MAG_CFG_ODR_8HZ 0x2
#define BNO055_MAG_CFG_ODR_10HZ 0x3
#define BNO055_MAG_CFG_ODR_15HZ 0x4
#define BNO055_MAG_CFG_ODR_20HZ 0x5
#define BNO055_MAG_CFG_ODR_25HZ 0x6
#define BNO055_MAG_CFG_ODR_30HZ 0x7
#define BNO055_MAG_CFG_OPR_MODE_LOWPWR (0x0 << 3)
#define BNO055_MAG_CFG_OPR_MODE_REG (0x1 << 3)
#define BNO055_MAG_CFG_OPR_MODE_EREG (0x2 << 3)
#define BNO055_MAG_CFG_OPR_MODE_HIGHACC (0x3 << 3)
#define BNO055_MAG_CFG_PWR_MODE_NORMAL (0x0 << 5)
#define BNO055_MAG_CFG_PWR_MODE_SLEEP (0x1 << 5)
#define BNO055_MAG_CFG_PWR_MODE_SUSPEND (0x2 << 5)
#define BNO055_MAG_CFG_PWR_MODE_FORCE_MODE (0x3 << 5)
/*
* Just a placeholder to specify resolution/axis x:13 bits, y:13 bits,
* z:15 bits
*/
#define BNO055_MAG_RES_13_13_15 0x00
#define BNO055_AXIS_CFG_P0 0x00
#define BNO055_AXIS_CFG_P1 0x01 /* Default */
#define BNO055_AXIS_CFG_P2 0x02
#define BNO055_AXIS_CFG_P3 0x03
#define BNO055_AXIS_CFG_P4 0x04
#define BNO055_AXIS_CFG_P5 0x05
#define BNO055_AXIS_CFG_P6 0x06
#define BNO055_AXIS_CFG_P7 0x07
struct bno055_cfg {
uint8_t bc_opr_mode;
uint8_t bc_pwr_mode;
uint8_t bc_units;
uint8_t bc_placement;
uint8_t bc_acc_range;
uint8_t bc_acc_bw;
uint8_t bc_acc_opr_mode;
uint8_t bc_acc_res;
uint8_t bc_gyro_range;
uint8_t bc_gyro_bw;
uint8_t bc_gyro_opr_mode;
uint8_t bc_gyro_res;
uint8_t bc_mag_odr;
uint8_t bc_mag_xy_rep;
uint8_t bc_mag_z_rep;
uint8_t bc_mag_res;
uint8_t bc_mag_pwr_mode;
uint8_t bc_mag_opr_mode;
uint8_t bc_use_ext_xtal;
uint32_t bc_mask;
};
struct bno055 {
struct os_dev dev;
struct sensor sensor;
struct bno055_cfg cfg;
os_time_t last_read_time;
};
struct bno055_rev_info {
uint8_t bri_accel_rev;
uint8_t bri_mag_rev;
uint8_t bri_gyro_rev;
uint8_t bri_bl_rev;
uint16_t bri_sw_rev;
};
struct bno055_calib_info {
uint8_t bci_sys;
uint8_t bci_gyro;
uint8_t bci_accel;
uint8_t bci_mag;
};
struct bno055_sensor_offsets {
uint16_t bso_acc_off_x;
uint16_t bso_acc_off_y;
uint16_t bso_acc_off_z;
uint16_t bso_gyro_off_x;
uint16_t bso_gyro_off_y;
uint16_t bso_gyro_off_z;
uint16_t bso_mag_off_x;
uint16_t bso_mag_off_y;
uint16_t bso_mag_off_z;
uint16_t bso_acc_radius;
uint16_t bso_mag_radius;
};
/**
* Initialize the bno055. This function is normally called by sysinit.
*
* @param dev Pointer to the bno055_dev device descriptor
*/
int bno055_init(struct os_dev *dev, void *arg);
int bno055_config(struct bno055 *, struct bno055_cfg *);
/**
* Get vector data from sensor
*
* @param The sensor ineterface
* @param pointer to the structure to be filled up
* @param Type of sensor
* @return 0 on success, non-zero on error
*/
int
bno055_get_vector_data(struct sensor_itf *itf, void *datastruct, int type);
/**
* Get quat data from sensor
*
* @param The sensor ineterface
* @param sensor quat data to be filled up
* @return 0 on success, non-zero on error
*/
int
bno055_get_quat_data(struct sensor_itf *itf, void *sqd);
/**
* Get temperature from bno055 sensor
*
* @param The sensor ineterface
* @return temperature in degree celcius
*/
int
bno055_get_temp(struct sensor_itf *itf, uint8_t *temp);
/**
* Gets current calibration status
*
* @param The sensor ineterface
* @param Calibration info structure to fill up calib state
* @return 0 on success, non-zero on failure
*/
int
bno055_get_calib_status(struct sensor_itf *itf, struct bno055_calib_info *bci);
/**
* Checks if bno055 is fully calibrated
*
* @param The sensor ineterface
* @return 0 on success, non-zero on failure
*/
int
bno055_is_calib(struct sensor_itf *itf);
/**
* Reads the sensor's offset registers into a byte array
*
* @param The sensor ineterface
* @param byte array to return offsets into
* @return 0 on success, non-zero on failure
*
*/
int
bno055_get_raw_sensor_offsets(struct sensor_itf *itf, uint8_t *offsets);
/**
*
* Reads the sensor's offset registers into an offset struct
*
* @param The sensor ineterface
* @param structure to fill up offsets data
* @return 0 on success, non-zero on failure
*/
int
bno055_get_sensor_offsets(struct sensor_itf *itf,
struct bno055_sensor_offsets *offsets);
/**
*
* Writes calibration data to the sensor's offset registers
*
* @param The sensor ineterface
* @param calibration data
* @return 0 on success, non-zero on success
*/
int
bno055_set_sensor_raw_offsets(struct sensor_itf *itf, uint8_t* calibdata,
uint8_t len);
/**
*
* Writes to the sensor's offset registers from an offset struct
*
* @param The sensor ineterface
* @param pointer to the offset structure
* @return 0 on success, non-zero on failure
*/
int
bno055_set_sensor_offsets(struct sensor_itf *itf,
struct bno055_sensor_offsets *offsets);
/**
* Set operation mode for the bno055 sensor
*
* @param The sensor interface
* @param Operation mode for the sensor
* @return 0 on success, non-zero on failure
*/
int
bno055_set_opr_mode(struct sensor_itf *itf, uint8_t mode);
#if MYNEWT_VAL(BNO055_CLI)
int bno055_shell_init(void);
#endif
/**
* Get Revision info for different sensors in the bno055
*
* @param The sensor interface
* @param pass the pointer to the revision structure
* @return 0 on success, non-zero on error
*/
int
bno055_get_rev_info(struct sensor_itf *itf, struct bno055_rev_info *ri);
/**
* Set power mode for the sensor
*
* @param The sensor interface
* @return mode
*/
int
bno055_set_pwr_mode(struct sensor_itf *itf, uint8_t mode);
/**
* Setting units for the bno055 sensor
*
* @param The sensor interface
* @param power mode for the sensor
* @return 0 on success, non-zero on failure
*/
int
bno055_set_units(struct sensor_itf *itf, uint8_t val);
/**
* Read current power mode of the sensor
*
* @param The sensor interface
* @param ptr to mode variableto fill up
* @return 0 on success, non-zero on failure
*/
int
bno055_get_pwr_mode(struct sensor_itf *itf, uint8_t *mode);
/**
* Read current operational mode of the sensor
*
* @param The sensor interface
* @param ptr to mode variable to fill up
* @return 0 on success, non-zero on failure
*/
int
bno055_get_opr_mode(struct sensor_itf *itf, uint8_t *mode);
/**
* Get units of the sensor
*
* @param The sensor interface
* @param ptr to the units variable
* @return 0 on success, non-zero on failure
*/
int
bno055_get_units(struct sensor_itf *itf, uint8_t *units);
/**
* Gets system status, test results and errors if any from the sensor
*
* @param The sensor interface
* @param ptr to system status
* @param ptr to self test result
* @param ptr to system error
*/
int
bno055_get_sys_status(struct sensor_itf *itf, uint8_t *system_status,
uint8_t *self_test_result, uint8_t *system_error);
/**
* Get chip ID from the sensor
*
* @param The sensor interface
* @param Pointer to the variable to fill up chip ID in
* @return 0 on success, non-zero on failure
*/
int
bno055_get_chip_id(struct sensor_itf *itf, uint8_t *id);
#ifdef __cplusplus
}
#endif
#endif /* __BNO055_H__ */