59 #include <lib/cdev/CDev.hpp> 60 #include <lib/drivers/accelerometer/PX4Accelerometer.hpp> 61 #include <lib/drivers/device/i2c.h> 63 #include <lib/drivers/gyroscope/PX4Gyroscope.hpp> 64 #include <lib/ecl/geo/geo.h> 69 #include <px4_workqueue.h> 87 #if defined(PX4_I2C_MPU6050_ADDR) || \ 88 defined(PX4_I2C_MPU6000_ADDR) || \ 89 defined(PX4_I2C_ICM_20608_G_ADDR) 93 enum MPU_DEVICE_TYPE {
94 MPU_DEVICE_TYPE_MPU6000 = 6000,
95 MPU_DEVICE_TYPE_ICM20602 = 20602,
96 MPU_DEVICE_TYPE_ICM20608 = 20608,
97 MPU_DEVICE_TYPE_ICM20689 = 20689
100 #define DIR_READ 0x80 101 #define DIR_WRITE 0x00 103 #define MPU_DEVICE_PATH "/dev/mpu6000" 104 #define MPU_DEVICE_PATH1 "/dev/mpu6000_1" 105 #define MPU_DEVICE_PATH_EXT "/dev/mpu6000_ext" 106 #define MPU_DEVICE_PATH_EXT1 "/dev/mpu6000_ext1" 107 #define MPU_DEVICE_PATH_EXT2 "/dev/mpu6000_ext2" 110 #define ICM20602_DEVICE_PATH "/dev/icm20602" 111 #define ICM20602_DEVICE_PATH1 "/dev/icm20602_1" 112 #define ICM20602_DEVICE_PATH_EXT "/dev/icm20602_ext" 113 #define ICM20602_DEVICE_PATH_EXT1 "/dev/icm20602_ext1" 115 #define ICM20608_DEVICE_PATH "/dev/icm20608" 116 #define ICM20608_DEVICE_PATH1 "/dev/icm20608_1" 117 #define ICM20608_DEVICE_PATH_EXT "/dev/icm20608_ext" 118 #define ICM20608_DEVICE_PATH_EXT1 "/dev/icm20608_ext1" 120 #define ICM20689_DEVICE_PATH "/dev/icm20689" 123 #define MPUREG_WHOAMI 0x75 124 #define MPUREG_SMPLRT_DIV 0x19 125 #define MPUREG_CONFIG 0x1A 126 #define MPUREG_GYRO_CONFIG 0x1B 127 #define MPUREG_ACCEL_CONFIG 0x1C 128 #define MPUREG_FIFO_EN 0x23 129 #define MPUREG_INT_PIN_CFG 0x37 130 #define MPUREG_INT_ENABLE 0x38 131 #define MPUREG_INT_STATUS 0x3A 132 #define MPUREG_ACCEL_XOUT_H 0x3B 133 #define MPUREG_ACCEL_XOUT_L 0x3C 134 #define MPUREG_ACCEL_YOUT_H 0x3D 135 #define MPUREG_ACCEL_YOUT_L 0x3E 136 #define MPUREG_ACCEL_ZOUT_H 0x3F 137 #define MPUREG_ACCEL_ZOUT_L 0x40 138 #define MPUREG_TEMP_OUT_H 0x41 139 #define MPUREG_TEMP_OUT_L 0x42 140 #define MPUREG_GYRO_XOUT_H 0x43 141 #define MPUREG_GYRO_XOUT_L 0x44 142 #define MPUREG_GYRO_YOUT_H 0x45 143 #define MPUREG_GYRO_YOUT_L 0x46 144 #define MPUREG_GYRO_ZOUT_H 0x47 145 #define MPUREG_GYRO_ZOUT_L 0x48 146 #define MPUREG_USER_CTRL 0x6A 147 #define MPUREG_PWR_MGMT_1 0x6B 148 #define MPUREG_PWR_MGMT_2 0x6C 149 #define MPUREG_FIFO_COUNTH 0x72 150 #define MPUREG_FIFO_COUNTL 0x73 151 #define MPUREG_FIFO_R_W 0x74 152 #define MPUREG_PRODUCT_ID 0x0C 153 #define MPUREG_TRIM1 0x0D 154 #define MPUREG_TRIM2 0x0E 155 #define MPUREG_TRIM3 0x0F 156 #define MPUREG_TRIM4 0x10 157 #define MPU_GYRO_DLPF_CFG_256HZ_NOLPF2 0x00 // delay: 0.98ms 158 #define MPU_GYRO_DLPF_CFG_188HZ 0x01 // delay: 1.9ms 159 #define MPU_GYRO_DLPF_CFG_98HZ 0x02 // delay: 2.8ms 160 #define MPU_GYRO_DLPF_CFG_42HZ 0x03 // delay: 4.8ms 161 #define MPU_GYRO_DLPF_CFG_20HZ 0x04 // delay: 8.3ms 162 #define MPU_GYRO_DLPF_CFG_10HZ 0x05 // delay: 13.4ms 163 #define MPU_GYRO_DLPF_CFG_5HZ 0x06 // delay: 18.6ms 164 #define MPU_GYRO_DLPF_CFG_2100HZ_NOLPF 0x07 165 #define MPU_DLPF_CFG_MASK 0x07 168 #define BIT_SLEEP 0x40 169 #define BIT_H_RESET 0x80 170 #define BITS_CLKSEL 0x07 171 #define MPU_CLK_SEL_PLLGYROX 0x01 172 #define MPU_CLK_SEL_PLLGYROZ 0x03 173 #define MPU_EXT_SYNC_GYROX 0x02 174 #define BITS_GYRO_ST_X 0x80 175 #define BITS_GYRO_ST_Y 0x40 176 #define BITS_GYRO_ST_Z 0x20 177 #define BITS_FS_250DPS 0x00 178 #define BITS_FS_500DPS 0x08 179 #define BITS_FS_1000DPS 0x10 180 #define BITS_FS_2000DPS 0x18 181 #define BITS_FS_MASK 0x18 182 #define BIT_INT_ANYRD_2CLEAR 0x10 183 #define BIT_RAW_RDY_EN 0x01 184 #define BIT_I2C_IF_DIS 0x10 185 #define BIT_INT_STATUS_DATA 0x01 187 #define MPU_WHOAMI_6000 0x68 188 #define ICM_WHOAMI_20602 0x12 189 #define ICM_WHOAMI_20608 0xaf 190 #define ICM_WHOAMI_20689 0x98 194 #define ICMREG_ACCEL_CONFIG2 0x1D 195 #define ICM_ACC_DLPF_CFG_1046HZ_NOLPF 0x00 196 #define ICM_ACC_DLPF_CFG_218HZ 0x01 197 #define ICM_ACC_DLPF_CFG_99HZ 0x02 198 #define ICM_ACC_DLPF_CFG_44HZ 0x03 199 #define ICM_ACC_DLPF_CFG_21HZ 0x04 200 #define ICM_ACC_DLPF_CFG_10HZ 0x05 201 #define ICM_ACC_DLPF_CFG_5HZ 0x06 202 #define ICM_ACC_DLPF_CFG_420HZ 0x07 207 #define MPUREG_ICM_UNDOC1 0x11 208 #define MPUREG_ICM_UNDOC1_VALUE 0xc9 213 #define ICM20602_REV_01 1 214 #define ICM20602_REV_02 2 218 #define ICM20608_REV_FF 0xff // In the past, was thought to be not returning a value. But seem repeatable. 222 #define ICM20689_REV_FE 0xfe 223 #define ICM20689_REV_03 0x03 228 #define MPU6000ES_REV_C4 0x14 229 #define MPU6000ES_REV_C5 0x15 230 #define MPU6000ES_REV_D6 0x16 231 #define MPU6000ES_REV_D7 0x17 232 #define MPU6000ES_REV_D8 0x18 233 #define MPU6000_REV_C4 0x54 234 #define MPU6000_REV_C5 0x55 235 #define MPU6000_REV_D6 0x56 236 #define MPU6000_REV_D7 0x57 237 #define MPU6000_REV_D8 0x58 238 #define MPU6000_REV_D9 0x59 239 #define MPU6000_REV_D10 0x5A 240 #define MPU6050_REV_D8 0x28 // TODO:Need verification 242 #define MPU6000_ACCEL_DEFAULT_RANGE_G 16 244 #define MPU6000_GYRO_DEFAULT_RANGE_G 8 245 #define MPU6000_GYRO_DEFAULT_RATE 1000 248 #define MPU6000_DEFAULT_ONCHIP_FILTER_FREQ 98 250 #pragma pack(push, 1) 268 #define MPU_MAX_READ_BUFFER_SIZE (sizeof(MPUReport) + 1) 269 #define MPU_MAX_WRITE_BUFFER_SIZE (2) 277 #define MPU6000_LOW_BUS_SPEED 0 278 #define MPU6000_HIGH_BUS_SPEED 0x8000 279 # define MPU6000_IS_HIGH_SPEED(r) ((r) & MPU6000_HIGH_BUS_SPEED) 280 # define MPU6000_REG(r) ((r) &~MPU6000_HIGH_BUS_SPEED) 281 # define MPU6000_SET_SPEED(r, s) ((r)|(s)) 282 # define MPU6000_HIGH_SPEED_OP(r) MPU6000_SET_SPEED((r), MPU6000_HIGH_BUS_SPEED) 283 # define MPU6000_LOW_SPEED_OP(r) MPU6000_REG((r)) 286 extern device::Device *MPU6000_SPI_interface(
int bus,
int device_type,
bool external_bus);
287 extern device::Device *MPU6000_I2C_interface(
int bus,
int device_type,
bool external_bus);
293 #define MPU6000_TIMER_REDUCTION 200 297 MPU6000_BUS_I2C_INTERNAL,
298 MPU6000_BUS_I2C_EXTERNAL,
299 MPU6000_BUS_SPI_INTERNAL1,
300 MPU6000_BUS_SPI_INTERNAL2,
301 MPU6000_BUS_SPI_EXTERNAL1,
302 MPU6000_BUS_SPI_EXTERNAL2
319 void print_registers();
326 int factory_self_test();
362 unsigned _call_interval{1000};
367 unsigned _sample_rate{1000};
376 uint8_t _register_wait{0};
377 uint64_t _reset_wait{0};
382 static constexpr
int MPU6000_CHECKED_PRODUCT_ID_INDEX = 0;
383 static constexpr
int MPU6000_NUM_CHECKED_REGISTERS = 10;
385 static constexpr uint8_t _checked_registers[MPU6000_NUM_CHECKED_REGISTERS] {
398 uint8_t _checked_values[MPU6000_NUM_CHECKED_REGISTERS];
399 uint8_t _checked_next{0};
403 volatile bool _in_factory_test{
false};
406 uint16_t _last_accel[3] {};
407 bool _got_duplicate{
false};
417 bool is_icm_device() {
return !is_mpu_device(); }
421 bool is_mpu_device() {
return _device_type == MPU_DEVICE_TYPE_MPU6000; }
447 static void cycle_trampoline(
void *arg);
449 void use_i2c(
bool on_true) { _use_hrt = !on_true; }
453 bool is_i2c(
void) {
return !_use_hrt; }
465 static void measure_trampoline(
void *arg);
478 uint8_t read_reg(
unsigned reg, uint32_t speed = MPU6000_LOW_BUS_SPEED);
479 uint16_t read_reg16(
unsigned reg);
488 int write_reg(
unsigned reg, uint8_t value);
499 void modify_reg(
unsigned reg, uint8_t clearbits, uint8_t setbits);
507 void write_checked_reg(
unsigned reg, uint8_t value);
515 int set_accel_range(
unsigned max_g);
520 void _set_dlpf_filter(uint16_t frequency_hz);
521 void _set_icm_acc_dlpf_filter(uint16_t frequency_hz);
526 void _set_sample_rate(
unsigned desired_sample_rate_hz);
531 void check_registers(
void);
Configuration flags used in code.
A set of useful macros for enhanced runtime and compile time error detection and warning suppression...
Definition: PX4Gyroscope.hpp:46
High-resolution timer with callouts and timekeeping.
Base class for devices connected via SPI.
void test_error()
trigger an error
Definition: fxas21002c.cpp:1377
Report conversation within the mpu, including command byte and interrupt status.
Definition: icm20948.h:333
Definition: MPU6000.hpp:305
Definition of commonly used conversions.
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
Abstract class for any character device.
Definition: CDev.hpp:58
Thread safe version of getopt.
Callout record.
Definition: drv_hrt.h:72
Definition: PX4Accelerometer.hpp:46
Performance measuring tools.