diff --git a/src/drivers/boards/px4fmu-v4/board_config.h b/src/drivers/boards/px4fmu-v4/board_config.h index 490bba0269ca..ede35c082488 100644 --- a/src/drivers/boards/px4fmu-v4/board_config.h +++ b/src/drivers/boards/px4fmu-v4/board_config.h @@ -133,7 +133,6 @@ #define PX4_SPI_BUS_SENSORS 1 #define PX4_SPI_BUS_RAMTRON 2 #define PX4_SPI_BUS_BARO PX4_SPI_BUS_RAMTRON -#define PX4_SPI_BUS_EXT 1 /* Use these in place of the uint32_t enumeration to select a specific SPI device on SPI1 */ #define PX4_SPIDEV_GYRO PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSORS, 1) @@ -148,7 +147,7 @@ #define PX4_SPIDEV_ICM_20602 PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSORS, 11) #define PX4_SPIDEV_BMI055_ACC PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSORS, 12) #define PX4_SPIDEV_BMI055_GYR PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSORS, 13) -#define PX4_SPIDEV_EXT_MPU PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSORS, 14) +#define PX4_SPIDEV_MPU2 PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSORS, 14) /* onboard MS5611 and FRAM are both on bus SPI2 * spi_dev_e:SPIDEV_FLASH has the value 2 and is used in the NuttX ramtron driver diff --git a/src/drivers/boards/px4fmu-v4/spi.c b/src/drivers/boards/px4fmu-v4/spi.c index d67c6a8dcd18..873cac955689 100644 --- a/src/drivers/boards/px4fmu-v4/spi.c +++ b/src/drivers/boards/px4fmu-v4/spi.c @@ -121,7 +121,7 @@ __EXPORT void stm32_spi1select(FAR struct spi_dev_s *dev, uint32_t devid, bool s case PX4_SPIDEV_ICM_20602: case PX4_SPIDEV_ICM_20608: case PX4_SPIDEV_BMI055_ACC: - case PX4_SPIDEV_EXT_MPU: + case PX4_SPIDEV_MPU2: /* Making sure the other peripherals are not selected */ px4_arch_gpiowrite(GPIO_SPI1_CS_PORTC_PIN2, 1); px4_arch_gpiowrite(GPIO_SPI1_CS_PORTC_PIN15, !selected); @@ -237,6 +237,4 @@ __EXPORT void board_spi_reset(int ms) stm32_configgpio(GPIO_SPI1_SCK); stm32_configgpio(GPIO_SPI1_MISO); stm32_configgpio(GPIO_SPI1_MOSI); - - } diff --git a/src/drivers/imu/mpu9250/main.cpp b/src/drivers/imu/mpu9250/main.cpp index 2ee7861ad31e..73c047d42563 100644 --- a/src/drivers/imu/mpu9250/main.cpp +++ b/src/drivers/imu/mpu9250/main.cpp @@ -74,6 +74,11 @@ #define MPU_DEVICE_PATH_ACCEL "/dev/mpu9250_accel" #define MPU_DEVICE_PATH_GYRO "/dev/mpu9250_gyro" #define MPU_DEVICE_PATH_MAG "/dev/mpu9250_mag" + +#define MPU_DEVICE_PATH_ACCEL_1 "/dev/mpu9250_accel1" +#define MPU_DEVICE_PATH_GYRO_1 "/dev/mpu9250_gyro1" +#define MPU_DEVICE_PATH_MAG_1 "/dev/mpu9250_mag1" + #define MPU_DEVICE_PATH_ACCEL_EXT "/dev/mpu9250_accel_ext" #define MPU_DEVICE_PATH_GYRO_EXT "/dev/mpu9250_gyro_ext" #define MPU_DEVICE_PATH_MAG_EXT "/dev/mpu9250_mag_ext" @@ -87,6 +92,7 @@ enum MPU9250_BUS { MPU9250_BUS_I2C_INTERNAL, MPU9250_BUS_I2C_EXTERNAL, MPU9250_BUS_SPI_INTERNAL, + MPU9250_BUS_SPI_INTERNAL2, MPU9250_BUS_SPI_EXTERNAL }; @@ -109,21 +115,25 @@ struct mpu9250_bus_option { MPU9250_constructor interface_constructor; bool magpassthrough; uint8_t busnum; + uint32_t address; MPU9250 *dev; } bus_options[] = { #if defined (USE_I2C) # if defined(PX4_I2C_BUS_ONBOARD) - { MPU9250_BUS_I2C_INTERNAL, MPU_DEVICE_PATH_ACCEL, MPU_DEVICE_PATH_GYRO, MPU_DEVICE_PATH_MAG, &MPU9250_I2C_interface, false, PX4_I2C_BUS_ONBOARD, NULL }, + { MPU9250_BUS_I2C_INTERNAL, MPU_DEVICE_PATH_ACCEL, MPU_DEVICE_PATH_GYRO, MPU_DEVICE_PATH_MAG, &MPU9250_I2C_interface, false, PX4_I2C_BUS_ONBOARD, PX4_I2C_OBDEV_MPU9250, NULL }, # endif # if defined(PX4_I2C_BUS_EXPANSION) - { MPU9250_BUS_I2C_EXTERNAL, MPU_DEVICE_PATH_ACCEL_EXT, MPU_DEVICE_PATH_GYRO_EXT, MPU_DEVICE_PATH_MAG_EXT, &MPU9250_I2C_interface, false, PX4_I2C_BUS_EXPANSION, NULL }, + { MPU9250_BUS_I2C_EXTERNAL, MPU_DEVICE_PATH_ACCEL_EXT, MPU_DEVICE_PATH_GYRO_EXT, MPU_DEVICE_PATH_MAG_EXT, &MPU9250_I2C_interface, false, PX4_I2C_BUS_EXPANSION, PX4_I2C_OBDEV_MPU9250, NULL }, # endif #endif #ifdef PX4_SPIDEV_MPU - { MPU9250_BUS_SPI_INTERNAL, MPU_DEVICE_PATH_ACCEL, MPU_DEVICE_PATH_GYRO, MPU_DEVICE_PATH_MAG, &MPU9250_SPI_interface, true, PX4_SPI_BUS_SENSORS, NULL }, + { MPU9250_BUS_SPI_INTERNAL, MPU_DEVICE_PATH_ACCEL, MPU_DEVICE_PATH_GYRO, MPU_DEVICE_PATH_MAG, &MPU9250_SPI_interface, true, PX4_SPI_BUS_SENSORS, PX4_SPIDEV_MPU, NULL }, +#endif +#ifdef PX4_SPIDEV_MPU2 + { MPU9250_BUS_SPI_INTERNAL2, MPU_DEVICE_PATH_ACCEL_1, MPU_DEVICE_PATH_GYRO_1, MPU_DEVICE_PATH_MAG_1, &MPU9250_SPI_interface, true, PX4_SPI_BUS_SENSORS, PX4_SPIDEV_MPU2, NULL }, #endif -#if defined(PX4_SPI_BUS_EXT) - { MPU9250_BUS_SPI_EXTERNAL, MPU_DEVICE_PATH_ACCEL_EXT, MPU_DEVICE_PATH_GYRO_EXT, MPU_DEVICE_PATH_MAG_EXT, &MPU9250_SPI_interface, true, PX4_SPI_BUS_EXT, NULL }, +#if defined(PX4_SPI_BUS_EXT) && defined(PX4_SPIDEV_EXT_MPU) + { MPU9250_BUS_SPI_EXTERNAL, MPU_DEVICE_PATH_ACCEL_EXT, MPU_DEVICE_PATH_GYRO_EXT, MPU_DEVICE_PATH_MAG_EXT, &MPU9250_SPI_interface, true, PX4_SPI_BUS_EXT, PX4_SPIDEV_EXT_MPU, NULL }, #endif }; @@ -169,7 +179,7 @@ start_bus(struct mpu9250_bus_option &bus, enum Rotation rotation, bool external) return false; } - device::Device *interface = bus.interface_constructor(bus.busnum, external); + device::Device *interface = bus.interface_constructor(bus.busnum, bus.address, external); if (interface == nullptr) { warnx("no device on bus %u", (unsigned)bus.busid); @@ -453,10 +463,15 @@ testerror(enum MPU9250_BUS busid) void usage() { - warnx("missing command: try 'start', 'info', 'test', 'stop',\n'reset', 'regdump', 'testerror'"); - warnx("options:"); - warnx(" -X (external bus)"); - warnx(" -R rotation"); + PX4_INFO("missing command: try 'start', 'info', 'test', 'stop',\n'reset', 'regdump', 'testerror'"); + PX4_INFO("options:"); + PX4_INFO(" -X (i2c external bus)"); + PX4_INFO(" -I (i2c internal bus)"); + PX4_INFO(" -s (spi internal bus)"); + PX4_INFO(" -S (spi external bus)"); + PX4_INFO(" -t (spi internal bus, 2nd instance)"); + PX4_INFO(" -R rotation"); + } } // namespace @@ -470,7 +485,7 @@ mpu9250_main(int argc, char *argv[]) enum Rotation rotation = ROTATION_NONE; /* jump over start/off/etc and look at options first */ - while ((ch = getopt(argc, argv, "XISsR:")) != EOF) { + while ((ch = getopt(argc, argv, "XISstR:")) != EOF) { switch (ch) { case 'X': busid = MPU9250_BUS_I2C_EXTERNAL; @@ -488,6 +503,10 @@ mpu9250_main(int argc, char *argv[]) busid = MPU9250_BUS_SPI_INTERNAL; break; + case 't': + busid = MPU9250_BUS_SPI_INTERNAL2; + break; + case 'R': rotation = (enum Rotation)atoi(optarg); break; diff --git a/src/drivers/imu/mpu9250/mpu9250.h b/src/drivers/imu/mpu9250/mpu9250.h index c35f7450240c..15f11927aedc 100644 --- a/src/drivers/imu/mpu9250/mpu9250.h +++ b/src/drivers/imu/mpu9250/mpu9250.h @@ -231,14 +231,11 @@ struct MPUReport { # define MPU9250_LOW_SPEED_OP(r) MPU9250_REG((r)) /* interface factories */ -extern device::Device *MPU9250_SPI_interface(int bus, bool external_bus); -extern device::Device *MPU9250_I2C_interface(int bus, bool external_bus); +extern device::Device *MPU9250_SPI_interface(int bus, uint32_t cs, bool external_bus); +extern device::Device *MPU9250_I2C_interface(int bus, uint32_t address, bool external_bus); extern int MPU9250_probe(device::Device *dev, int device_type); -typedef device::Device *(*MPU9250_constructor)(int, bool); - - - +typedef device::Device *(*MPU9250_constructor)(int, uint32_t, bool); class MPU9250_mag; class MPU9250_gyro; diff --git a/src/drivers/imu/mpu9250/mpu9250_i2c.cpp b/src/drivers/imu/mpu9250/mpu9250_i2c.cpp index c76a58873300..2b3bf0f5a57c 100644 --- a/src/drivers/imu/mpu9250/mpu9250_i2c.cpp +++ b/src/drivers/imu/mpu9250/mpu9250_i2c.cpp @@ -61,15 +61,14 @@ #ifdef USE_I2C -device::Device *MPU9250_I2C_interface(int bus, bool external_bus); +device::Device *MPU9250_I2C_interface(int bus, uint32_t address, bool external_bus); class MPU9250_I2C : public device::I2C { public: - MPU9250_I2C(int bus); - virtual ~MPU9250_I2C(); + MPU9250_I2C(int bus, uint32_t address); + virtual ~MPU9250_I2C() = default; - virtual int init(); virtual int read(unsigned address, void *data, unsigned count); virtual int write(unsigned address, void *data, unsigned count); @@ -80,34 +79,22 @@ class MPU9250_I2C : public device::I2C }; - device::Device * -MPU9250_I2C_interface(int bus, bool external_bus) +MPU9250_I2C_interface(int bus, uint32_t address, bool external_bus) { - return new MPU9250_I2C(bus); + return new MPU9250_I2C(bus, address); } -MPU9250_I2C::MPU9250_I2C(int bus) : - I2C("MPU9250_I2C", nullptr, bus, PX4_I2C_OBDEV_MPU9250, 400000) +MPU9250_I2C::MPU9250_I2C(int bus, uint32_t address) : + I2C("MPU9250_I2C", nullptr, bus, address, 400000) { _device_id.devid_s.devtype = DRV_ACC_DEVTYPE_MPU9250; } -MPU9250_I2C::~MPU9250_I2C() -{ -} - -int -MPU9250_I2C::init() -{ - /* this will call probe() */ - return I2C::init(); -} - int MPU9250_I2C::ioctl(unsigned operation, unsigned &arg) { - int ret; + int ret = PX4_ERROR; switch (operation) { @@ -155,7 +142,6 @@ MPU9250_I2C::read(unsigned reg_speed, void *data, unsigned count) return transfer(&cmd, 1, &((uint8_t *)data)[offset], count); } - int MPU9250_I2C::probe() { diff --git a/src/drivers/imu/mpu9250/mpu9250_spi.cpp b/src/drivers/imu/mpu9250/mpu9250_spi.cpp index c880231c164e..6f3279b29173 100644 --- a/src/drivers/imu/mpu9250/mpu9250_spi.cpp +++ b/src/drivers/imu/mpu9250/mpu9250_spi.cpp @@ -64,15 +64,6 @@ #define DIR_READ 0x80 #define DIR_WRITE 0x00 - -#if PX4_SPIDEV_MPU -#ifdef PX4_SPI_BUS_EXT -#define EXTERNAL_BUS PX4_SPI_BUS_EXT -#else -#define EXTERNAL_BUS 0 -#endif - - /* * The MPU9250 can only handle high SPI bus speeds of 20Mhz on the sensor and * interrupt status registers. All other registers have a maximum 1MHz @@ -86,16 +77,15 @@ #define MPU9250_HIGH_SPI_BUS_SPEED 20*1000*1000 -device::Device *MPU9250_SPI_interface(int bus, bool external_bus); +device::Device *MPU9250_SPI_interface(int bus, uint32_t cs, bool external_bus); class MPU9250_SPI : public device::SPI { public: MPU9250_SPI(int bus, uint32_t device); - virtual ~MPU9250_SPI(); + virtual ~MPU9250_SPI() = default; - virtual int init(); virtual int read(unsigned address, void *data, unsigned count); virtual int write(unsigned address, void *data, unsigned count); @@ -111,24 +101,17 @@ class MPU9250_SPI : public device::SPI }; device::Device * -MPU9250_SPI_interface(int bus, bool external_bus) +MPU9250_SPI_interface(int bus, uint32_t cs, bool external_bus) { - uint32_t cs = SPIDEV_NONE(0); device::Device *interface = nullptr; if (external_bus) { -#if defined(PX4_SPI_BUS_EXT) && defined(PX4_SPIDEV_EXT_MPU) - cs = PX4_SPIDEV_EXT_MPU; -#else +#if !(defined(PX4_SPI_BUS_EXT) && defined(PX4_SPIDEV_EXT_MPU)) errx(0, "External SPI not available"); #endif - - } else { - cs = PX4_SPIDEV_MPU; } if (cs != SPIDEV_NONE(0)) { - interface = new MPU9250_SPI(bus, cs); } @@ -141,25 +124,6 @@ MPU9250_SPI::MPU9250_SPI(int bus, uint32_t device) : _device_id.devid_s.devtype = DRV_ACC_DEVTYPE_MPU9250; } -MPU9250_SPI::~MPU9250_SPI() -{ -} - -int -MPU9250_SPI::init() -{ - int ret; - - ret = SPI::init(); - - if (ret != OK) { - DEVICE_DEBUG("SPI init failed"); - return -EIO; - } - - return OK; -} - int MPU9250_SPI::ioctl(unsigned operation, unsigned &arg) { @@ -198,7 +162,6 @@ MPU9250_SPI::set_bus_frequency(unsigned ®_speed) reg_speed = MPU9250_REG(reg_speed); } - int MPU9250_SPI::write(unsigned reg_speed, void *data, unsigned count) { @@ -287,5 +250,3 @@ MPU9250_SPI::probe() return ret; } - -#endif // PX4_SPIDEV_MPU