27 #define CHIP_ID_REG 0x40 28 #define CHIP_ID_VAL 0x32 30 #define POWER_AND_OPERATIONS_REG 0x4B 31 #define POWER_CONTROL_VAL (1 << 0) 32 #define SOFT_RESET (1 << 7 | 1 << 1) 34 #define OP_MODE_SELF_TEST_ODR_REG 0x4C 35 #define NORMAL_MODE (0 << 1) 36 #define ODR_30HZ (1 << 3 | 1 << 4 | 1 << 5) 37 #define ODR_20HZ (1 << 3 | 0 << 4 | 1 << 5) 39 #define DATA_X_LSB_REG 0x42 41 #define REPETITIONS_XY_REG 0x51 42 #define REPETITIONS_Z_REG 0X52 45 #define DIG_X1_REG 0x5D 46 #define DIG_Y1_REG 0x5E 47 #define DIG_Z4_LSB_REG 0x62 48 #define DIG_Z4_MSB_REG 0x63 49 #define DIG_X2_REG 0x64 50 #define DIG_Y2_REG 0x65 51 #define DIG_Z2_LSB_REG 0x68 52 #define DIG_Z2_MSB_REG 0x69 53 #define DIG_Z1_LSB_REG 0x6A 54 #define DIG_Z1_MSB_REG 0x6B 55 #define DIG_XYZ1_LSB_REG 0x6C 56 #define DIG_XYZ1_MSB_REG 0x6D 57 #define DIG_Z3_LSB_REG 0x6E 58 #define DIG_Z3_MSB_REG 0x6F 59 #define DIG_XY2_REG 0x70 60 #define DIG_XY1_REG 0x71 62 #define MEASURE_TIME_USEC 16667 73 if (!sensor || !sensor->
init()) {
104 }
PACKED trim_registers, trim_registers2;
112 sizeof(trim_registers))) {
116 sizeof(trim_registers))) {
119 if (memcmp(&trim_registers, &trim_registers2,
sizeof(trim_registers)) == 0) {
124 hal.
console->
printf(
"BMM150: Failed to load trim registers\n");
128 _dig.x1 = trim_registers.dig_x1;
129 _dig.x2 = trim_registers.dig_x2;
130 _dig.xy1 = trim_registers.dig_xy1;
131 _dig.xy2 = trim_registers.dig_xy2;
133 _dig.y1 = trim_registers.dig_y1;
134 _dig.y2 = trim_registers.dig_y2;
149 hal.
console->
printf(
"BMM150: Unable to get bus semaphore\n");
159 int8_t boot_tries = 4;
160 while (boot_tries--) {
183 if (boot_tries == 0) {
187 if (-1 == boot_tries) {
249 int32_t inter = ((int32_t)
_dig.xyz1) << 14;
253 int32_t val =
_dig.xy2 * ((inter * inter) >> 7);
254 val += (inter * (((uint32_t)
_dig.xy1) << 7));
257 val *= (txy2 + 0xA0);
268 int32_t dividend = int32_t(z -
_dig.z4) << 15;
269 int32_t dividend2 = dividend - ((
_dig.z3 * (int32_t(rhall) - int32_t(
_dig.xyz1))) >> 2);
271 int32_t divisor = int32_t(
_dig.z1) * (rhall << 1);
279 if (counter++ == 0) {
280 printf(
"ret=%d z=%d rhall=%u z1=%d z2=%d z3=%d z4=%d xyz1=%d dividend=%d dividend2=%d divisor=%d\n",
281 ret, z, rhall,
_dig.z1,
_dig.z2,
_dig.z3,
_dig.z4,
_dig.xyz1, dividend, dividend2, divisor);
293 if (!ret || !(data[3] & 0
x1)) {
306 const uint16_t rhall =
le16toh(data[3]) >> 2;
int printf(const char *fmt,...)
uint8_t _compass_instance
virtual perf_counter_t perf_alloc(perf_counter_type t, const char *name)
virtual PeriodicHandle register_periodic_callback(uint32_t period_usec, PeriodicCb)=0
AP_HAL::UARTDriver * console
uint32_t get_bus_id(void) const
virtual AP_HAL::Semaphore * get_semaphore()=0
void rotate_field(Vector3f &mag, uint8_t instance)
virtual void set_retries(uint8_t retries)
void publish_filtered_field(const Vector3f &mag, uint8_t instance)
AP_Compass_BMM150(Compass &compass, AP_HAL::OwnPtr< AP_HAL::Device > dev)
#define POWER_AND_OPERATIONS_REG
void correct_field(Vector3f &mag, uint8_t i)
static AP_Compass_Backend * probe(Compass &compass, AP_HAL::OwnPtr< AP_HAL::I2CDevice > dev)
#define HAL_SEMAPHORE_BLOCK_FOREVER
virtual bool take(uint32_t timeout_ms) WARN_IF_UNUSED=0
int16_t _compensate_xy(int16_t xy, uint32_t rhall, int32_t txy1, int32_t txy2)
int16_t _compensate_z(int16_t z, uint32_t rhall)
#define POWER_CONTROL_VAL
void set_dev_id(uint8_t instance, uint32_t dev_id)
struct AP_Compass_BMM150::@18 _dig
bool setup_checked_registers(uint8_t num_regs, uint8_t frequency=10)
virtual void delay(uint16_t ms)=0
void set_device_type(uint8_t devtype)
virtual void printf(const char *,...) FMT_PRINTF(2
AP_HAL::OwnPtr< AP_HAL::Device > _dev
virtual bool take_nonblocking() WARN_IF_UNUSED=0
static AP_HAL::OwnPtr< AP_HAL::Device > dev
uint8_t register_compass(void) const
#define MEASURE_TIME_USEC
int32_t constrain_int32(const int32_t amt, const int32_t low, const int32_t high)
AP_HAL::Util::perf_counter_t _perf_err
uint16_t __ap_bitwise le16_t
#define REPETITIONS_Z_REG
#define OP_MODE_SELF_TEST_ODR_REG
bool check_next_register(void)
bool read_registers(uint8_t first_reg, uint8_t *recv, uint32_t recv_len)
#define FUNCTOR_BIND_MEMBER(func, rettype,...)
void publish_raw_field(const Vector3f &mag, uint8_t instance)
#define REPETITIONS_XY_REG
static uint16_t le16toh(le16_t value)
bool write_register(uint8_t reg, uint8_t val, bool checked=false)
AP_HAL::Scheduler * scheduler
virtual void perf_count(perf_counter_t h)