39 #include <nuttx/wqueue.h> 41 #include <board_config.h> 48 #include <drivers/drv_mag.h> 49 #include <mathlib/math/filter/LowPassFilter2p.hpp> 54 #include <uORB/topics/debug_key_value.h> 61 #if defined(PX4_I2C_OBDEV_MPU9250) || defined(PX4_I2C_BUS_EXPANSION) 67 #define MPUREG_WHOAMI 0x75 68 #define MPUREG_SMPLRT_DIV 0x19 69 #define MPUREG_CONFIG 0x1A 70 #define MPUREG_GYRO_CONFIG 0x1B 71 #define MPUREG_ACCEL_CONFIG 0x1C 72 #define MPUREG_ACCEL_CONFIG2 0x1D 73 #define MPUREG_LPACCEL_ODR 0x1E 74 #define MPUREG_WOM_THRESH 0x1F 75 #define MPUREG_FIFO_EN 0x23 76 #define MPUREG_I2C_MST_CTRL 0x24 77 #define MPUREG_I2C_SLV0_ADDR 0x25 78 #define MPUREG_I2C_SLV0_REG 0x26 79 #define MPUREG_I2C_SLV0_CTRL 0x27 80 #define MPUREG_I2C_SLV1_ADDR 0x28 81 #define MPUREG_I2C_SLV1_REG 0x29 82 #define MPUREG_I2C_SLV1_CTRL 0x2A 83 #define MPUREG_I2C_SLV2_ADDR 0x2B 84 #define MPUREG_I2C_SLV2_REG 0x2C 85 #define MPUREG_I2C_SLV2_CTRL 0x2D 86 #define MPUREG_I2C_SLV3_ADDR 0x2E 87 #define MPUREG_I2C_SLV3_REG 0x2F 88 #define MPUREG_I2C_SLV3_CTRL 0x30 89 #define MPUREG_I2C_SLV4_ADDR 0x31 90 #define MPUREG_I2C_SLV4_REG 0x32 91 #define MPUREG_I2C_SLV4_DO 0x33 92 #define MPUREG_I2C_SLV4_CTRL 0x34 93 #define MPUREG_I2C_SLV4_DI 0x35 94 #define MPUREG_I2C_MST_STATUS 0x36 95 #define MPUREG_INT_PIN_CFG 0x37 96 #define MPUREG_INT_ENABLE 0x38 97 #define MPUREG_INT_STATUS 0x3A 98 #define MPUREG_ACCEL_XOUT_H 0x3B 99 #define MPUREG_ACCEL_XOUT_L 0x3C 100 #define MPUREG_ACCEL_YOUT_H 0x3D 101 #define MPUREG_ACCEL_YOUT_L 0x3E 102 #define MPUREG_ACCEL_ZOUT_H 0x3F 103 #define MPUREG_ACCEL_ZOUT_L 0x40 104 #define MPUREG_TEMP_OUT_H 0x41 105 #define MPUREG_TEMP_OUT_L 0x42 106 #define MPUREG_GYRO_XOUT_H 0x43 107 #define MPUREG_GYRO_XOUT_L 0x44 108 #define MPUREG_GYRO_YOUT_H 0x45 109 #define MPUREG_GYRO_YOUT_L 0x46 110 #define MPUREG_GYRO_ZOUT_H 0x47 111 #define MPUREG_GYRO_ZOUT_L 0x48 112 #define MPUREG_EXT_SENS_DATA_00 0x49 113 #define MPUREG_I2C_SLV0_D0 0x63 114 #define MPUREG_I2C_SLV1_D0 0x64 115 #define MPUREG_I2C_SLV2_D0 0x65 116 #define MPUREG_I2C_SLV3_D0 0x66 117 #define MPUREG_I2C_MST_DELAY_CTRL 0x67 118 #define MPUREG_SIGNAL_PATH_RESET 0x68 119 #define MPUREG_MOT_DETECT_CTRL 0x69 120 #define MPUREG_USER_CTRL 0x6A 121 #define MPUREG_PWR_MGMT_1 0x6B 122 #define MPUREG_PWR_MGMT_2 0x6C 123 #define MPUREG_FIFO_COUNTH 0x72 124 #define MPUREG_FIFO_COUNTL 0x73 125 #define MPUREG_FIFO_R_W 0x74 128 #define BIT_SLEEP 0x40 129 #define BIT_H_RESET 0x80 130 #define MPU_CLK_SEL_AUTO 0x01 132 #define BITS_GYRO_ST_X 0x80 133 #define BITS_GYRO_ST_Y 0x40 134 #define BITS_GYRO_ST_Z 0x20 135 #define BITS_FS_250DPS 0x00 136 #define BITS_FS_500DPS 0x08 137 #define BITS_FS_1000DPS 0x10 138 #define BITS_FS_2000DPS 0x18 139 #define BITS_FS_MASK 0x18 141 #define BITS_DLPF_CFG_250HZ 0x00 142 #define BITS_DLPF_CFG_184HZ 0x01 143 #define BITS_DLPF_CFG_92HZ 0x02 144 #define BITS_DLPF_CFG_41HZ 0x03 145 #define BITS_DLPF_CFG_20HZ 0x04 146 #define BITS_DLPF_CFG_10HZ 0x05 147 #define BITS_DLPF_CFG_5HZ 0x06 148 #define BITS_DLPF_CFG_3600HZ 0x07 149 #define BITS_DLPF_CFG_MASK 0x07 151 #define BITS_ACCEL_CONFIG2_41HZ 0x03 153 #define BIT_RAW_RDY_EN 0x01 154 #define BIT_INT_ANYRD_2CLEAR 0x10 155 #define BIT_INT_BYPASS_EN 0x02 157 #define BIT_I2C_READ_FLAG 0x80 159 #define BIT_I2C_SLV0_NACK 0x01 160 #define BIT_I2C_FIFO_EN 0x40 161 #define BIT_I2C_MST_EN 0x20 162 #define BIT_I2C_IF_DIS 0x10 163 #define BIT_FIFO_RST 0x04 164 #define BIT_I2C_MST_RST 0x02 165 #define BIT_SIG_COND_RST 0x01 167 #define BIT_I2C_SLV0_EN 0x80 168 #define BIT_I2C_SLV0_BYTE_SW 0x40 169 #define BIT_I2C_SLV0_REG_DIS 0x20 170 #define BIT_I2C_SLV0_REG_GRP 0x10 172 #define BIT_I2C_MST_MULT_MST_EN 0x80 173 #define BIT_I2C_MST_WAIT_FOR_ES 0x40 174 #define BIT_I2C_MST_SLV_3_FIFO_EN 0x20 175 #define BIT_I2C_MST_P_NSR 0x10 176 #define BITS_I2C_MST_CLOCK_258HZ 0x08 177 #define BITS_I2C_MST_CLOCK_400HZ 0x0D 179 #define BIT_I2C_SLV0_DLY_EN 0x01 180 #define BIT_I2C_SLV1_DLY_EN 0x02 181 #define BIT_I2C_SLV2_DLY_EN 0x04 182 #define BIT_I2C_SLV3_DLY_EN 0x08 184 #define ICM_WHOAMI_20948 0xEA 186 #define MPU9250_ACCEL_DEFAULT_RATE 1000 187 #define MPU9250_ACCEL_MAX_OUTPUT_RATE 280 188 #define MPU9250_ACCEL_DEFAULT_DRIVER_FILTER_FREQ 30 189 #define MPU9250_GYRO_DEFAULT_RATE 1000 191 #define MPU9250_GYRO_MAX_OUTPUT_RATE MPU9250_ACCEL_MAX_OUTPUT_RATE 192 #define MPU9250_GYRO_DEFAULT_DRIVER_FILTER_FREQ 30 194 #define MPU9250_DEFAULT_ONCHIP_FILTER_FREQ 92 196 #define MPUIOCGIS_I2C (unsigned)(DEVIOCGDEVICEID+100) 207 #define PX4_I2C_EXT_ICM20948_0 0x68 208 #define PX4_I2C_EXT_ICM20948_1 0x69 222 #define BANK_REG_MASK 0x0300 223 #define REG_BANK(r) (((r) & BANK_REG_MASK)>>4) 224 #define REG_ADDRESS(r) ((r) & ~BANK_REG_MASK) 226 #define ICMREG_20948_BANK_SEL 0x7F 228 #define ICMREG_20948_WHOAMI (0x00 | BANK0) 229 #define ICMREG_20948_USER_CTRL (0x03 | BANK0) 230 #define ICMREG_20948_PWR_MGMT_1 (0x06 | BANK0) 231 #define ICMREG_20948_PWR_MGMT_2 (0x07 | BANK0) 232 #define ICMREG_20948_INT_PIN_CFG (0x0F | BANK0) 233 #define ICMREG_20948_INT_ENABLE (0x10 | BANK0) 234 #define ICMREG_20948_INT_ENABLE_1 (0x11 | BANK0) 235 #define ICMREG_20948_ACCEL_XOUT_H (0x2D | BANK0) 236 #define ICMREG_20948_INT_ENABLE_2 (0x12 | BANK0) 237 #define ICMREG_20948_INT_ENABLE_3 (0x13 | BANK0) 238 #define ICMREG_20948_EXT_SLV_SENS_DATA_00 (0x3B | BANK0) 239 #define ICMREG_20948_GYRO_SMPLRT_DIV (0x00 | BANK2) 240 #define ICMREG_20948_GYRO_CONFIG_1 (0x01 | BANK2) 241 #define ICMREG_20948_GYRO_CONFIG_2 (0x02 | BANK2) 242 #define ICMREG_20948_ACCEL_SMPLRT_DIV_1 (0x10 | BANK2) 243 #define ICMREG_20948_ACCEL_SMPLRT_DIV_2 (0x11 | BANK2) 244 #define ICMREG_20948_ACCEL_CONFIG (0x14 | BANK2) 245 #define ICMREG_20948_ACCEL_CONFIG_2 (0x15 | BANK2) 246 #define ICMREG_20948_I2C_MST_CTRL (0x01 | BANK3) 247 #define ICMREG_20948_I2C_SLV0_ADDR (0x03 | BANK3) 248 #define ICMREG_20948_I2C_SLV0_REG (0x04 | BANK3) 249 #define ICMREG_20948_I2C_SLV0_CTRL (0x05 | BANK3) 250 #define ICMREG_20948_I2C_SLV0_DO (0x06 | BANK3) 260 #define ICM_BIT_PWR_MGMT_1_ENABLE 0x00 261 #define ICM_BIT_USER_CTRL_I2C_MST_DISABLE 0x00 263 #define ICM_BITS_GYRO_DLPF_CFG_197HZ 0x01 264 #define ICM_BITS_GYRO_DLPF_CFG_151HZ 0x09 265 #define ICM_BITS_GYRO_DLPF_CFG_119HZ 0x11 266 #define ICM_BITS_GYRO_DLPF_CFG_51HZ 0x19 267 #define ICM_BITS_GYRO_DLPF_CFG_23HZ 0x21 268 #define ICM_BITS_GYRO_DLPF_CFG_11HZ 0x29 269 #define ICM_BITS_GYRO_DLPF_CFG_5HZ 0x31 270 #define ICM_BITS_GYRO_DLPF_CFG_361HZ 0x39 271 #define ICM_BITS_GYRO_DLPF_CFG_MASK 0x39 273 #define ICM_BITS_GYRO_FS_SEL_250DPS 0x00 274 #define ICM_BITS_GYRO_FS_SEL_500DPS 0x02 275 #define ICM_BITS_GYRO_FS_SEL_1000DPS 0x04 276 #define ICM_BITS_GYRO_FS_SEL_2000DPS 0x06 277 #define ICM_BITS_GYRO_FS_SEL_MASK 0x06 279 #define ICM_BITS_ACCEL_DLPF_CFG_246HZ 0x09 280 #define ICM_BITS_ACCEL_DLPF_CFG_111HZ 0x11 281 #define ICM_BITS_ACCEL_DLPF_CFG_50HZ 0x19 282 #define ICM_BITS_ACCEL_DLPF_CFG_23HZ 0x21 283 #define ICM_BITS_ACCEL_DLPF_CFG_11HZ 0x29 284 #define ICM_BITS_ACCEL_DLPF_CFG_5HZ 0x31 285 #define ICM_BITS_ACCEL_DLPF_CFG_473HZ 0x39 286 #define ICM_BITS_ACCEL_DLPF_CFG_MASK 0x39 288 #define ICM_BITS_ACCEL_FS_SEL_250DPS 0x00 289 #define ICM_BITS_ACCEL_FS_SEL_500DPS 0x02 290 #define ICM_BITS_ACCEL_FS_SEL_1000DPS 0x04 291 #define ICM_BITS_ACCEL_FS_SEL_2000DPS 0x06 292 #define ICM_BITS_ACCEL_FS_SEL_MASK 0x06 294 #define ICM_BITS_DEC3_CFG_4 0x00 295 #define ICM_BITS_DEC3_CFG_8 0x01 296 #define ICM_BITS_DEC3_CFG_16 0x10 297 #define ICM_BITS_DEC3_CFG_32 0x11 298 #define ICM_BITS_DEC3_CFG_MASK 0x11 300 #define ICM_BITS_I2C_MST_CLOCK_370KHZ 0x00 301 #define ICM_BITS_I2C_MST_CLOCK_400HZ 0x07 // recommended by datasheet for 400kHz target clock 305 #define MPU_OR_ICM(m,i) ((_whoami==ICM_WHOAMI_20948) ? i : m) 308 #pragma pack(push, 1) 328 #pragma pack(push, 1) 347 #define MPU_MAX_WRITE_BUFFER_SIZE (2) 357 #define MPU9250_LOW_BUS_SPEED 0 358 #define MPU9250_HIGH_BUS_SPEED 0x8000 359 #define MPU9250_REG_MASK 0x00FF 360 # define MPU9250_IS_HIGH_SPEED(r) ((r) & MPU9250_HIGH_BUS_SPEED) 361 # define MPU9250_REG(r) ((r) & MPU9250_REG_MASK) 362 # define MPU9250_SET_SPEED(r, s) ((r)|(s)) 363 # define MPU9250_HIGH_SPEED_OP(r) MPU9250_SET_SPEED((r), MPU9250_HIGH_BUS_SPEED) 364 # define MPU9250_LOW_SPEED_OP(r) ((r) &~MPU9250_HIGH_BUS_SPEED) 367 extern device::Device *ICM20948_SPI_interface(
int bus, uint32_t cs,
bool external_bus);
368 extern device::Device *ICM20948_I2C_interface(
int bus, uint32_t address,
bool external_bus);
371 typedef device::Device *(*ICM20948_constructor)(int, uint32_t, bool);
381 const char *path_mag,
383 bool magnetometer_only);
388 uint8_t get_whoami();
409 uint8_t _selected_bank;
423 unsigned _call_interval;
425 ringbuffer::RingBuffer *_accel_reports;
428 float _accel_range_scale;
429 float _accel_range_m_s2;
432 ringbuffer::RingBuffer *_gyro_reports;
435 float _gyro_range_scale;
436 float _gyro_range_rad_s;
439 unsigned _dlpf_freq_icm_gyro;
440 unsigned _dlpf_freq_icm_accel;
442 unsigned _sample_rate;
452 uint8_t _register_wait;
453 uint64_t _reset_wait;
472 #define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) 475 static constexpr
int ICM20948_NUM_CHECKED_REGISTERS{15};
476 static const uint16_t _icm20948_checked_registers[ICM20948_NUM_CHECKED_REGISTERS];
478 const uint16_t *_checked_registers;
480 uint8_t _checked_values[ICM20948_NUM_CHECKED_REGISTERS];
481 uint8_t _checked_bad[ICM20948_NUM_CHECKED_REGISTERS];
482 unsigned _checked_next;
483 unsigned _num_checked_registers;
487 float _last_temperature;
489 bool check_null_data(uint16_t *data, uint8_t size);
490 bool check_duplicate(uint8_t *accel_data);
492 uint8_t _last_accel_data[6];
542 static void cycle_trampoline(
void *arg);
544 void use_i2c(
bool on_true) { _use_hrt = !on_true; }
548 bool is_i2c(
void) {
return !_use_hrt; }
562 static void measure_trampoline(
void *arg);
578 int select_register_bank(uint8_t bank);
588 uint8_t read_reg(
unsigned reg, uint32_t speed = MPU9250_LOW_BUS_SPEED);
589 uint16_t read_reg16(
unsigned reg);
601 uint8_t read_reg_range(
unsigned start_reg, uint32_t speed, uint8_t *buf, uint16_t count);
609 void write_reg(
unsigned reg, uint8_t value);
620 void modify_reg(
unsigned reg, uint8_t clearbits, uint8_t setbits);
628 void write_checked_reg(
unsigned reg, uint8_t value);
639 void modify_checked_reg(
unsigned reg, uint8_t clearbits, uint8_t setbits);
647 int set_accel_range(
unsigned max_g);
652 uint16_t swap16(uint16_t val) {
return (val >> 8) | (val << 8); }
659 bool is_external() {
return _interface->external(); }
664 void _set_dlpf_filter(uint16_t frequency_hz);
669 void _set_sample_rate(
unsigned desired_sample_rate_hz);
674 int _set_pollrate(
unsigned long rate);
679 void check_registers(
void);
A flexible ringbuffer class.
Accelerometer driver interface.
Gyroscope driver interface.
gyro scaling factors; Vout = (Vin * Vscale) + Voffset
Definition: drv_gyro.h:54
__BEGIN_DECLS typedef void * orb_advert_t
ORB topic advertiser handle.
Definition: uORB.h:134
Helper class implementing the accel driver node.
Definition: accel.h:41
Helper class implementing the magnetometer driver node.
Definition: mag.h:132
High-resolution timer with callouts and timekeeping.
accel scaling factors; Vout = Vscale * (Vin + Voffset)
Definition: drv_accel.h:54
Definition: integrator.h:48
Report conversation within the mpu, including command byte and interrupt status.
Definition: icm20948.h:333
Definition of commonly used conversions.
Definition: icm20948.h:377
void reset(enum BMP280_BUS busid)
Reset the driver.
Definition: bmp280.cpp:743
Rotation
Enum for board and external compass rotations.
Definition: rotation.h:51
Fundamental base class for all physical drivers (I2C, SPI).
Definition: Device.hpp:65
API for the uORB lightweight object broker.
Report conversation within the mpu, including command byte and interrupt status.
Definition: icm20948.h:313
Simple error/warning functions, heavily inspired by the BSD functions of the same names...
Helper class implementing the gyro driver node.
Definition: gyro.h:41
Callout record.
Definition: drv_hrt.h:72
Definition: LowPassFilter2p.hpp:43
Performance measuring tools.