30 #if CONFIG_HAL_BOARD == HAL_BOARD_LINUX 32 #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_ERLEBOARD || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_PXF 33 #define INVENSENSE_DRDY_PIN BBB_P8_14 34 #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_MINLURE 35 #define INVENSENSE_DRDY_PIN MINNOW_GPIO_I2S_CLK 36 #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_DISCO || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BEBOP 37 #define INVENSENSE_EXT_SYNC_ENABLE 1 41 #if CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS 43 #define debug(fmt, args ...) do {hal.console->printf("MPU: " fmt "\n", ## args); } while(0) 45 #define debug(fmt, args ...) do {printf("MPU: " fmt "\n", ## args); } while(0) 52 #ifndef INVENSENSE_EXT_SYNC_ENABLE 53 #define INVENSENSE_EXT_SYNC_ENABLE 0 58 #define MPU_SAMPLE_SIZE 14 59 #define MPU_FIFO_BUFFER_LEN 16 61 #define int16_val(v, idx) ((int16_t)(((uint16_t)v[2*idx] << 8) | v[2*idx+1])) 62 #define uint16_val(v, idx)(((uint16_t)v[2*idx] << 8) | v[2*idx+1]) 84 , _dev(
std::move(dev))
105 if (!sensor || !sensor->
_init()) {
131 if (!sensor || !sensor->
_init()) {
148 #ifdef INVENSENSE_DRDY_PIN 271 hal.
console->
printf(
"MPU[%u]: enabled fast sampling rate %uHz/%uHz\n",
406 for (uint8_t i = 0; i < n_samples; i++) {
409 bool fsync_set =
false;
411 #if INVENSENSE_EXT_SYNC_ENABLE 412 fsync_set = (
int16_val(data, 2) & 1U) != 0;
456 bool clipped =
false;
459 for (uint8_t i = 0; i < n_samples; i++) {
472 if ((
_accum.count & 1) == 0) {
477 if (fabsf(a.
x) > clip_limit ||
478 fabsf(a.
y) > clip_limit ||
479 fabsf(a.
z) > clip_limit) {
531 bool need_reset =
false;
534 goto check_registers;
540 if (n_samples == 0) {
542 goto check_registers;
561 if (n_samples > 32) {
567 while (n_samples > 0) {
571 goto check_registers;
578 goto check_registers;
581 if (!
_dev->
transfer(rx, n * MPU_SAMPLE_SIZE, rx, n * MPU_SAMPLE_SIZE)) {
582 hal.
console->
printf(
"MPU60x0: error in fifo read %u bytes\n", n * MPU_SAMPLE_SIZE);
584 goto check_registers;
658 #if INVENSENSE_EXT_SYNC_ENABLE 778 for (tries = 0; tries < 5; tries++) {
848 , _mpu_reg(_mpu_addr + 1)
849 , _mpu_ctrl(_mpu_addr + 2)
864 backend._register_write(
_mpu_do, *out);
870 backend._register_write(
_mpu_addr, addr);
871 backend._register_write(
_mpu_reg, reg);
883 hal.
console->
printf(
"Error: can't passthrough when slave is already configured\n");
909 hal.
console->
printf(
"Error: can't passthrough when slave is already configured\n");
932 hal.
console->
printf(
"Error: can't read before configuring slave\n");
998 backend._dev->get_semaphore()->give();
1002 uint8_t reg, uint8_t size)
1020 return backend._dev->register_periodic_callback(period_usec, cb);
#define HAL_INS_MPU60XX_SPI
#define MPUREG_SMPLRT_DIV
void set_gyro_orientation(uint8_t instance, enum Rotation rotation)
#define BIT_ACCEL_FIFO_EN
#define BITS_DLPF_CFG_188HZ
void _set_gyro_raw_sample_rate(uint8_t instance, uint16_t rate_hz)
Vector3< float > Vector3f
#define HAL_INS_MPU9250_SPI
#define MPUREG_INT_PIN_CFG
virtual PeriodicHandle register_periodic_callback(uint32_t period_usec, PeriodicCb)=0
#define HAL_INS_MPU9250_I2C
int passthrough_read(uint8_t reg, uint8_t *buf, uint8_t size) override
static AP_InertialSensor_Backend * probe(AP_InertialSensor &imu, AP_HAL::OwnPtr< AP_HAL::I2CDevice > dev, enum Rotation rotation=ROTATION_NONE)
#define MPUREG_I2C_SLV0_DO
#define MPU_WHOAMI_ICM20689
uint16_t _backend_rate_hz
void _inc_accel_error_count(uint8_t instance)
AP_HAL::UARTDriver * console
#define BITS_GYRO_FS_2000DPS
const uint16_t multiplier_accel
AuxiliaryBus * get_auxiliary_bus() override
uint32_t get_bus_id(void) const
#define MPUREG_INT_ENABLE
#define MPU_FIFO_BUFFER_LEN
bool _has_auxiliary_bus()
uint8_t register_gyro(uint16_t raw_sample_rate_hz, uint32_t id)
#define ICM_ACC_FCHOICE_B
virtual AP_HAL::Semaphore * get_semaphore()=0
bool _block_read(uint8_t reg, uint8_t *buf, uint32_t size)
#define BIT_USER_CTRL_I2C_MST_EN
AP_HAL::Semaphore * get_semaphore() override
#define MPUREG_PRODUCT_ID
#define BIT_USER_CTRL_FIFO_EN
#define BITS_DLPF_CFG_256HZ_NOLPF2
bool _accumulate(uint8_t *samples, uint8_t n_samples)
void notify_accel_fifo_reset(uint8_t instance)
#define HAL_SEMAPHORE_BLOCK_FOREVER
#define debug(fmt, args ...)
AP_Invensense_AuxiliaryBus * _auxiliary_bus
virtual bool take(uint32_t timeout_ms) WARN_IF_UNUSED=0
bool _check_raw_temp(int16_t t2)
bool enable_fast_sampling(uint8_t instance)
#define MPUREG_I2C_SLV4_CTRL
virtual ~AP_InertialSensor_Invensense()
#define BIT_USER_CTRL_FIFO_RESET
#define ICM_ACC_DLPF_CFG_218HZ
#define BIT_I2C_SLV0_DLY_EN
uint32_t get_bus_id_devtype(uint8_t devtype)
void _set_gyro_oversampling(uint8_t instance, uint8_t n)
virtual void free_type(void *ptr, size_t size, Memory_Type mem_type)
#define BIT_USER_CTRL_I2C_IF_DIS
AP_HAL::OwnPtr< AP_HAL::Device > _dev
bool setup_checked_registers(uint8_t num_regs, uint8_t frequency=10)
static auto MAX(const A &one, const B &two) -> decltype(one > two ? one :two)
#define MPU_WHOAMI_ICM20789
#define MPUREG_CONFIG_EXT_SYNC_SHIFT
#define BIT_I2C_MST_CLK_400KHZ
virtual void mode(uint8_t output)=0
bool _accumulate_sensor_rate_sampling(uint8_t *samples, uint8_t n_samples)
#define MPUREG_ACCEL_CONFIG
#define MPUREG_FIFO_COUNTH
virtual void delay(uint16_t ms)=0
uint8_t _register_read(uint8_t reg)
int read(uint8_t *buf) override
uint8_t _fifo_downsample_rate
#define BIT_PWR_MGMT_1_CLK_ZGYRO
virtual void printf(const char *,...) FMT_PRINTF(2
uint8_t register_accel(uint16_t raw_sample_rate_hz, uint32_t id)
AP_InertialSensor_Invensense(AP_InertialSensor &imu, AP_HAL::OwnPtr< AP_HAL::Device > dev, enum Rotation rotation)
#define MPUREG_I2C_MST_CTRL
#define MPUREG_EXT_SENS_DATA_00
uint8_t _last_stat_user_ctrl
static AP_HAL::OwnPtr< AP_HAL::Device > dev
#define uint16_val(v, idx)
AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t period_usec, AP_HAL::Device::PeriodicCb cb) override
virtual bool set_speed(Speed speed)=0
int _configure_periodic_read(AuxiliaryBusSlave *slave, uint8_t reg, uint8_t size) override
#define BIT_I2C_SLV1_DLY_EN
#define MPU_WHOAMI_MPU9250
void increment_clip_count(uint8_t instance)
enum BusType bus_type(void) const
#define MPU_WHOAMI_MPU9255
virtual AP_HAL::DigitalSource * channel(uint16_t n)=0
void _set_gyro_sensor_rate_sampling_enabled(uint8_t instance, bool value)
#define MPUREG_I2C_MST_DELAY_CTRL
static AP_InertialSensor_Invensense & from(AP_InertialSensor_Backend &backend)
void _notify_new_accel_sensor_rate_sample(uint8_t instance, const Vector3f &accel)
void _notify_new_gyro_raw_sample(uint8_t instance, const Vector3f &accel, uint64_t sample_us=0)
#define int16_val(v, idx)
#define MPUREG_ICM_UNDOC1_VALUE
void _rotate_and_correct_gyro(uint8_t instance, Vector3f &gyro)
int passthrough_write(uint8_t reg, uint8_t val) override
virtual bool set_chip_select(bool set)
#define ICMREG_ACCEL_CONFIG2
AverageFilterUInt16_Size4 _temp_filter
AP_InertialSensor_Backend & get_backend()
virtual bool transfer(const uint8_t *send, uint32_t send_len, uint8_t *recv, uint32_t recv_len)=0
#define MPUREG_PWR_MGMT_1
void _notify_new_accel_raw_sample(uint8_t instance, const Vector3f &accel, uint64_t sample_us=0, bool fsync_set=false)
void notify_gyro_fifo_reset(uint8_t instance)
uint16_t get_sample_rate_hz(void) const
AP_InertialSensor_Backend & _ins_backend
#define MPUREG_INT_STATUS
void accumulate() override
virtual void * malloc_type(size_t size, Memory_Type mem_type)
void _publish_temperature(uint8_t instance, float temperature)
void _set_accel_sensor_rate_sampling_enabled(uint8_t instance, bool value)
#define HAL_INS_MPU60XX_I2C
static const uint8_t MAX_EXT_SENS_DATA
#define MPUREG_GYRO_CONFIG
void set_read_flag(uint8_t flag)
#define BIT_I2C_SLV3_DLY_EN
void set_accel_orientation(uint8_t instance, enum Rotation rotation)
#define MPUREG_ICM_UNDOC1
void update_gyro(uint8_t instance)
#define MPUREG_PWR_MGMT_2
#define MPUREG_TEMP_OUT_H
#define MPUREG_CONFIG_EXT_SYNC_AZ
virtual void delay_microseconds(uint16_t us)=0
bool check_next_register(void)
void _set_accel_oversampling(uint8_t instance, uint8_t n)
void _set_accel_raw_sample_rate(uint8_t instance, uint16_t rate_hz)
bool read_registers(uint8_t first_reg, uint8_t *recv, uint32_t recv_len)
#define BIT_I2C_SLV2_DLY_EN
#define FUNCTOR_BIND_MEMBER(func, rettype,...)
#define INVENSENSE_DRDY_PIN
friend AP_Invensense_AuxiliaryBus
void panic(const char *errormsg,...) FMT_PRINTF(1
struct AP_InertialSensor_Invensense::@122 _accum
void _set_raw_sample_accel_multiplier(uint8_t instance, uint16_t mul)
#define MPU_WHOAMI_ICM20789_R1
void _inc_gyro_error_count(uint8_t instance)
static const float GYRO_SCALE
void _set_filter_register(void)
enum Invensense_Type _mpu_type
void _register_write(uint8_t reg, uint8_t val, bool checked=false)
void _notify_new_gyro_sensor_rate_sample(uint8_t instance, const Vector3f &gyro)
bool write_register(uint8_t reg, uint8_t val, bool checked=false)
int _set_passthrough(uint8_t reg, uint8_t size, uint8_t *out=nullptr)
#define BIT_PWR_MGMT_1_DEVICE_RESET
void _rotate_and_correct_accel(uint8_t instance, Vector3f &accel)
#define MPUREG_CONFIG_FIFO_MODE_STOP
void update_accel(uint8_t instance)
#define BIT_I2C_MST_P_NSR
#define MPUREG_I2C_SLV0_ADDR
#define AP_INERTIAL_SENSOR_ACCEL_CLIP_THRESH_MSS
AP_HAL::Scheduler * scheduler
AP_Invensense_AuxiliaryBus(AP_InertialSensor_Invensense &backend, uint32_t devid)
AuxiliaryBusSlave * _instantiate_slave(uint8_t addr, uint8_t instance) override
const AP_HAL::HAL & hal
-*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
LowPassFilter2pFloat _temp_filter
AP_HAL::DigitalSource * _drdy_pin
AP_Invensense_AuxiliaryBusSlave(AuxiliaryBus &bus, uint8_t addr, uint8_t instance)