diff --git a/src/drivers/adc/ads1115/ADS1115.cpp b/src/drivers/adc/ads1115/ADS1115.cpp index a54fb8b91d..1e36c37570 100644 --- a/src/drivers/adc/ads1115/ADS1115.cpp +++ b/src/drivers/adc/ads1115/ADS1115.cpp @@ -47,7 +47,18 @@ int ADS1115::init() config[0] = CONFIG_HIGH_OS_NOACT | CONFIG_HIGH_MUX_P0NG | CONFIG_HIGH_PGA_6144 | CONFIG_HIGH_MODE_SS; config[1] = CONFIG_LOW_DR_250SPS | CONFIG_LOW_COMP_MODE_TRADITIONAL | CONFIG_LOW_COMP_POL_RESET | CONFIG_LOW_COMP_LAT_NONE | CONFIG_LOW_COMP_QU_DISABLE; - return writeReg(ADDRESSPOINTER_REG_CONFIG, config, 2); + ret = writeReg(ADDRESSPOINTER_REG_CONFIG, config, 2); + + if (ret != PX4_OK) { + PX4_ERR("writeReg failed (%i)", ret); + return ret; + } + + setChannel(ADS1115::A0); // prepare for the first measure. + + ScheduleOnInterval(SAMPLE_INTERVAL / 4, SAMPLE_INTERVAL / 4); + + return PX4_OK; } int ADS1115::setChannel(ADS1115::ChannelSelection ch) @@ -194,4 +205,4 @@ int ADS1115::writeReg(uint8_t addr, uint8_t *buf, size_t len) buffer[0] = addr; memcpy(buffer + 1, buf, sizeof(uint8_t)*len); return transfer(buffer, len + 1, nullptr, 0); -} \ No newline at end of file +} diff --git a/src/drivers/adc/ads1115/ADS1115.h b/src/drivers/adc/ads1115/ADS1115.h index 9681c8ef26..ca1aa194c7 100644 --- a/src/drivers/adc/ads1115/ADS1115.h +++ b/src/drivers/adc/ads1115/ADS1115.h @@ -105,24 +105,17 @@ using namespace time_literals; class ADS1115 : public device::I2C, public I2CSPIDriver { public: - ADS1115(I2CSPIBusOption bus_option, int bus, int addr, int bus_frequency); + ADS1115(const I2CSPIDriverConfig &config); ~ADS1115() override; - int Begin(); - int init() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); - static void print_usage(); void RunImpl(); protected: - adc_report_s _adc_report = {}; - void print_status() override; void exit_and_cleanup() override; @@ -133,9 +126,11 @@ private: static const hrt_abstime SAMPLE_INTERVAL{50_ms}; + adc_report_s _adc_report{}; + perf_counter_t _cycle_perf; - int _channel_cycle_count = 0; + int _channel_cycle_count{0}; // ADS1115 logic part enum ChannelSelection { @@ -159,4 +154,4 @@ private: int writeReg(uint8_t addr, uint8_t *buf, size_t len); -}; \ No newline at end of file +}; diff --git a/src/drivers/adc/ads1115/ads1115_main.cpp b/src/drivers/adc/ads1115/ads1115_main.cpp index 7e312bf993..110ccda800 100644 --- a/src/drivers/adc/ads1115/ads1115_main.cpp +++ b/src/drivers/adc/ads1115/ads1115_main.cpp @@ -42,9 +42,9 @@ #include #include -ADS1115::ADS1115(I2CSPIBusOption bus_option, int bus, int addr, int bus_frequency) : - I2C(DRV_ADC_DEVTYPE_ADS1115, nullptr, bus, addr, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, addr), +ADS1115::ADS1115(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), _cycle_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": single-sample")) { _adc_report.device_id = this->get_device_id(); @@ -63,22 +63,6 @@ ADS1115::~ADS1115() perf_free(_cycle_perf); } -int ADS1115::Begin() -{ - int ret = init(); - - if (ret != PX4_OK) { - PX4_ERR("ADS1115 init failed"); - return ret; - } - - setChannel(ADS1115::A0); // prepare for the first measure. - - ScheduleOnInterval(SAMPLE_INTERVAL / 4, SAMPLE_INTERVAL / 4); - - return PX4_OK; -} - void ADS1115::exit_and_cleanup() { I2CSPIDriverBase::exit_and_cleanup(); // nothing to do @@ -140,25 +124,6 @@ void ADS1115::RunImpl() perf_end(_cycle_perf); } -I2CSPIDriverBase *ADS1115::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ADS1115 *instance = new ADS1115(iterator.configuredBusOption(), iterator.bus(), cli.i2c_address, - cli.bus_frequency); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->Begin()) { - delete instance; - return nullptr; - } - - return instance; -} - void ADS1115::print_usage() { PRINT_MODULE_USAGE_NAME("ads1115", "driver"); @@ -176,17 +141,12 @@ void ADS1115::print_status() extern "C" int ads1115_main(int argc, char *argv[]) { - int ch; using ThisDriver = ADS1115; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = 400000; cli.i2c_address = 0x48; - while ((ch = cli.getOpt(argc, argv, "")) != EOF) { - - } - - const char *verb = cli.optArg(); + const char *verb = cli.parseDefaultArguments(argc, argv); if (!verb) { ThisDriver::print_usage(); diff --git a/src/drivers/barometer/bmp280/BMP280.cpp b/src/drivers/barometer/bmp280/BMP280.cpp index dc2fc51ed6..b1b3e76e84 100644 --- a/src/drivers/barometer/bmp280/BMP280.cpp +++ b/src/drivers/barometer/bmp280/BMP280.cpp @@ -33,9 +33,8 @@ #include "BMP280.hpp" -BMP280::BMP280(I2CSPIBusOption bus_option, int bus, bmp280::IBMP280 *interface) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus, - interface->get_device_address()), +BMP280::BMP280(const I2CSPIDriverConfig &config, bmp280::IBMP280 *interface) : + I2CSPIDriver(config), _px4_baro(interface->get_device_id()), _interface(interface), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": sample")), diff --git a/src/drivers/barometer/bmp280/BMP280.hpp b/src/drivers/barometer/bmp280/BMP280.hpp index 3759062801..e65884f267 100644 --- a/src/drivers/barometer/bmp280/BMP280.hpp +++ b/src/drivers/barometer/bmp280/BMP280.hpp @@ -45,11 +45,10 @@ class BMP280 : public I2CSPIDriver { public: - BMP280(I2CSPIBusOption bus_option, int bus, bmp280::IBMP280 *interface); + BMP280(const I2CSPIDriverConfig &config, bmp280::IBMP280 *interface); virtual ~BMP280(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); int init(); diff --git a/src/drivers/barometer/bmp280/bmp280_main.cpp b/src/drivers/barometer/bmp280/bmp280_main.cpp index 1ad42885ac..3cd1f7a3a7 100644 --- a/src/drivers/barometer/bmp280/bmp280_main.cpp +++ b/src/drivers/barometer/bmp280/bmp280_main.cpp @@ -50,30 +50,29 @@ BMP280::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *BMP280::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *BMP280::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { bmp280::IBMP280 *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = bmp280_i2c_interface(iterator.bus(), cli.i2c_address, cli.bus_frequency); + if (config.bus_type == BOARD_I2C_BUS) { + interface = bmp280_i2c_interface(config.bus, config.i2c_address, config.bus_frequency); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = bmp280_spi_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = bmp280_spi_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { - PX4_ERR("failed creating interface for bus %i (devid 0x%" PRIx32 ")", iterator.bus(), iterator.devid()); + PX4_ERR("failed creating interface for bus %i (devid 0x%" PRIx32 ")", config.bus, config.spi_devid); return nullptr; } if (interface->init() != OK) { delete interface; - PX4_DEBUG("no device on bus %i (devid 0x%" PRIx32 ")", iterator.bus(), iterator.devid()); + PX4_DEBUG("no device on bus %i (devid 0x%" PRIx32 ")", config.bus, config.spi_devid); return nullptr; } - BMP280 *dev = new BMP280(iterator.configuredBusOption(), iterator.bus(), interface); + BMP280 *dev = new BMP280(config, interface); if (dev == nullptr) { delete interface; diff --git a/src/drivers/barometer/bmp388/bmp388.cpp b/src/drivers/barometer/bmp388/bmp388.cpp index 8a28ecdbf8..7c6817e19b 100644 --- a/src/drivers/barometer/bmp388/bmp388.cpp +++ b/src/drivers/barometer/bmp388/bmp388.cpp @@ -41,9 +41,8 @@ #include "bmp388.h" -BMP388::BMP388(I2CSPIBusOption bus_option, int bus, IBMP388 *interface) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus, - interface->get_device_address()), +BMP388::BMP388(const I2CSPIDriverConfig &config, IBMP388 *interface) : + I2CSPIDriver(config), _px4_baro(interface->get_device_id()), _interface(interface), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), diff --git a/src/drivers/barometer/bmp388/bmp388.h b/src/drivers/barometer/bmp388/bmp388.h index 295bae374b..6f1a3f854d 100644 --- a/src/drivers/barometer/bmp388/bmp388.h +++ b/src/drivers/barometer/bmp388/bmp388.h @@ -308,11 +308,10 @@ public: class BMP388 : public I2CSPIDriver { public: - BMP388(I2CSPIBusOption bus_option, int bus, IBMP388 *interface); + BMP388(const I2CSPIDriverConfig &config, IBMP388 *interface); virtual ~BMP388(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); virtual int init(); diff --git a/src/drivers/barometer/bmp388/bmp388_main.cpp b/src/drivers/barometer/bmp388/bmp388_main.cpp index e1baad8e5b..ff32ee2068 100644 --- a/src/drivers/barometer/bmp388/bmp388_main.cpp +++ b/src/drivers/barometer/bmp388/bmp388_main.cpp @@ -48,30 +48,29 @@ BMP388::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *BMP388::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *BMP388::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { IBMP388 *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = bmp388_i2c_interface(iterator.bus(), cli.i2c_address, cli.bus_frequency); + if (config.bus_type == BOARD_I2C_BUS) { + interface = bmp388_i2c_interface(config.bus, config.i2c_address, config.bus_frequency); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = bmp388_spi_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = bmp388_spi_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { - PX4_ERR("failed creating interface for bus %i (devid 0x%" PRIx32 ")", iterator.bus(), iterator.devid()); + PX4_ERR("failed creating interface for bus %i (devid 0x%" PRIx32 ")", config.bus, config.spi_devid); return nullptr; } if (interface->init() != OK) { delete interface; - PX4_DEBUG("no device on bus %i (devid 0x%" PRIx32 ")", iterator.bus(), iterator.devid()); + PX4_DEBUG("no device on bus %i (devid 0x%" PRIx32 ")", config.bus, config.spi_devid); return nullptr; } - BMP388 *dev = new BMP388(iterator.configuredBusOption(), iterator.bus(), interface); + BMP388 *dev = new BMP388(config, interface); if (dev == nullptr) { delete interface; diff --git a/src/drivers/barometer/dps310/DPS310.cpp b/src/drivers/barometer/dps310/DPS310.cpp index 3aba3feb0b..29f21e1051 100644 --- a/src/drivers/barometer/dps310/DPS310.cpp +++ b/src/drivers/barometer/dps310/DPS310.cpp @@ -46,9 +46,8 @@ static void getTwosComplement(T &raw, uint8_t length) } } -DPS310::DPS310(I2CSPIBusOption bus_option, int bus, device::Device *interface) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus, - interface->get_device_address()), +DPS310::DPS310(const I2CSPIDriverConfig &config, device::Device *interface) : + I2CSPIDriver(config), _px4_barometer(interface->get_device_id()), _interface(interface), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), diff --git a/src/drivers/barometer/dps310/DPS310.hpp b/src/drivers/barometer/dps310/DPS310.hpp index 9308ee6ce9..9bbb19db9a 100644 --- a/src/drivers/barometer/dps310/DPS310.hpp +++ b/src/drivers/barometer/dps310/DPS310.hpp @@ -56,11 +56,10 @@ using Infineon_DPS310::Register; class DPS310 : public I2CSPIDriver { public: - DPS310(I2CSPIBusOption bus_option, int bus, device::Device *interface); + DPS310(const I2CSPIDriverConfig &config, device::Device *interface); virtual ~DPS310(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); int init(); diff --git a/src/drivers/barometer/dps310/dps310_main.cpp b/src/drivers/barometer/dps310/dps310_main.cpp index 62ad03084a..26341ef53f 100644 --- a/src/drivers/barometer/dps310/dps310_main.cpp +++ b/src/drivers/barometer/dps310/dps310_main.cpp @@ -55,30 +55,29 @@ DPS310::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *DPS310::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *DPS310::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { device::Device *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = DPS310_I2C_interface(iterator.bus(), cli.i2c_address, cli.bus_frequency); + if (config.bus_type == BOARD_I2C_BUS) { + interface = DPS310_I2C_interface(config.bus, config.i2c_address, config.bus_frequency); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = DPS310_SPI_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = DPS310_SPI_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { - PX4_ERR("failed creating interface for bus %i (devid 0x%" PRIx32 ")", iterator.bus(), iterator.devid()); + PX4_ERR("failed creating interface for bus %i (devid 0x%" PRIx32 ")", config.bus, config.spi_devid); return nullptr; } if (interface->init() != OK) { delete interface; - PX4_DEBUG("no device on bus %i (devid 0x%" PRIx32 ")", iterator.bus(), iterator.devid()); + PX4_DEBUG("no device on bus %i (devid 0x%" PRIx32 ")", config.bus, config.spi_devid); return nullptr; } - DPS310 *dev = new DPS310(iterator.configuredBusOption(), iterator.bus(), interface); + DPS310 *dev = new DPS310(config, interface); if (dev == nullptr) { delete interface; diff --git a/src/drivers/barometer/lps22hb/LPS22HB.cpp b/src/drivers/barometer/lps22hb/LPS22HB.cpp index 1c09faac15..c176aa452a 100644 --- a/src/drivers/barometer/lps22hb/LPS22HB.cpp +++ b/src/drivers/barometer/lps22hb/LPS22HB.cpp @@ -42,8 +42,8 @@ /* Max measurement rate is 25Hz */ #define LPS22HB_CONVERSION_INTERVAL (1000000 / 25) /* microseconds */ -LPS22HB::LPS22HB(I2CSPIBusOption bus_option, int bus, device::Device *interface) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus), +LPS22HB::LPS22HB(const I2CSPIDriverConfig &config, device::Device *interface) : + I2CSPIDriver(config), _px4_baro(interface->get_device_id()), _interface(interface), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), diff --git a/src/drivers/barometer/lps22hb/LPS22HB.hpp b/src/drivers/barometer/lps22hb/LPS22HB.hpp index b95c254149..dbf38dde6d 100644 --- a/src/drivers/barometer/lps22hb/LPS22HB.hpp +++ b/src/drivers/barometer/lps22hb/LPS22HB.hpp @@ -70,6 +70,8 @@ static constexpr uint8_t PRESS_OUT_H = 0x2A; static constexpr uint8_t TEMP_OUT_L = 0x2B; static constexpr uint8_t TEMP_OUT_H = 0x2C; +#define LPS22HB_ADDRESS 0x5D + /* interface factories */ extern device::Device *LPS22HB_SPI_interface(int bus, uint32_t devid, int bus_frequency, spi_mode_e spi_mode); extern device::Device *LPS22HB_I2C_interface(int bus, int bus_frequency); @@ -77,11 +79,10 @@ extern device::Device *LPS22HB_I2C_interface(int bus, int bus_frequency); class LPS22HB : public I2CSPIDriver { public: - LPS22HB(I2CSPIBusOption bus_option, int bus, device::Device *interface); + LPS22HB(const I2CSPIDriverConfig &config, device::Device *interface); virtual ~LPS22HB(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); int init(); diff --git a/src/drivers/barometer/lps22hb/LPS22HB_I2C.cpp b/src/drivers/barometer/lps22hb/LPS22HB_I2C.cpp index 1b4a3dee59..03e188fd9d 100644 --- a/src/drivers/barometer/lps22hb/LPS22HB_I2C.cpp +++ b/src/drivers/barometer/lps22hb/LPS22HB_I2C.cpp @@ -41,8 +41,6 @@ #include -#define LPS22HB_ADDRESS 0x5D - device::Device *LPS22HB_I2C_interface(int bus, int bus_frequency); class LPS22HB_I2C : public device::I2C diff --git a/src/drivers/barometer/lps22hb/lps22hb_main.cpp b/src/drivers/barometer/lps22hb/lps22hb_main.cpp index f5fbffd8cf..a39198938b 100644 --- a/src/drivers/barometer/lps22hb/lps22hb_main.cpp +++ b/src/drivers/barometer/lps22hb/lps22hb_main.cpp @@ -43,30 +43,29 @@ void LPS22HB::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *LPS22HB::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *LPS22HB::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { device::Device *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = LPS22HB_I2C_interface(iterator.bus(), cli.bus_frequency); + if (config.bus_type == BOARD_I2C_BUS) { + interface = LPS22HB_I2C_interface(config.bus, config.bus_frequency); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = LPS22HB_SPI_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = LPS22HB_SPI_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { - PX4_ERR("failed creating interface for bus %i (devid 0x%" PRIx32 ")", iterator.bus(), iterator.devid()); + PX4_ERR("failed creating interface for bus %i (devid 0x%" PRIx32 ")", config.bus, config.spi_devid); return nullptr; } if (interface->init() != OK) { delete interface; - PX4_DEBUG("no device on bus %i (devid 0x%" PRIx32 ")", iterator.bus(), iterator.devid()); + PX4_DEBUG("no device on bus %i (devid 0x%" PRIx32 ")", config.bus, config.spi_devid); return nullptr; } - LPS22HB *dev = new LPS22HB(iterator.configuredBusOption(), iterator.bus(), interface); + LPS22HB *dev = new LPS22HB(config, interface); if (dev == nullptr) { delete interface; @@ -95,6 +94,8 @@ extern "C" __EXPORT int lps22hb_main(int argc, char *argv[]) return -1; } + cli.i2c_address = LPS22HB_ADDRESS; + BusInstanceIterator iterator(MODULE_NAME, cli, DRV_BARO_DEVTYPE_LPS22HB); if (!strcmp(verb, "start")) { diff --git a/src/drivers/barometer/lps25h/LPS25H.cpp b/src/drivers/barometer/lps25h/LPS25H.cpp index c08aeaa392..b5a6cd7cc4 100644 --- a/src/drivers/barometer/lps25h/LPS25H.cpp +++ b/src/drivers/barometer/lps25h/LPS25H.cpp @@ -33,8 +33,8 @@ #include "LPS25H.hpp" -LPS25H::LPS25H(I2CSPIBusOption bus_option, int bus, device::Device *interface) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus), +LPS25H::LPS25H(const I2CSPIDriverConfig &config, device::Device *interface) : + I2CSPIDriver(config), _px4_barometer(interface->get_device_id()), _interface(interface), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), diff --git a/src/drivers/barometer/lps25h/LPS25H.hpp b/src/drivers/barometer/lps25h/LPS25H.hpp index e1b0996dfc..101e8ceed0 100644 --- a/src/drivers/barometer/lps25h/LPS25H.hpp +++ b/src/drivers/barometer/lps25h/LPS25H.hpp @@ -155,11 +155,10 @@ class LPS25H : public I2CSPIDriver { public: - LPS25H(I2CSPIBusOption bus_option, int bus, device::Device *interface); + LPS25H(const I2CSPIDriverConfig &config, device::Device *interface); ~LPS25H() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); int init(); diff --git a/src/drivers/barometer/lps25h/lps25h.h b/src/drivers/barometer/lps25h/lps25h.h index 8b05c1d58d..57b18944cc 100644 --- a/src/drivers/barometer/lps25h/lps25h.h +++ b/src/drivers/barometer/lps25h/lps25h.h @@ -50,6 +50,8 @@ #define ID_WHO_AM_I 0xBD +#define LPS25H_ADDRESS 0x5D + /* interface factories */ extern device::Device *LPS25H_SPI_interface(int bus, uint32_t devid, int bus_frequency, spi_mode_e spi_mode); extern device::Device *LPS25H_I2C_interface(int bus, int bus_frequency); diff --git a/src/drivers/barometer/lps25h/lps25h_i2c.cpp b/src/drivers/barometer/lps25h/lps25h_i2c.cpp index 03ecf2c9e5..94be577667 100644 --- a/src/drivers/barometer/lps25h/lps25h_i2c.cpp +++ b/src/drivers/barometer/lps25h/lps25h_i2c.cpp @@ -41,8 +41,6 @@ #include -#define LPS25H_ADDRESS 0x5D - device::Device *LPS25H_I2C_interface(int bus, int bus_frequency); class LPS25H_I2C : public device::I2C diff --git a/src/drivers/barometer/lps25h/lps25h_main.cpp b/src/drivers/barometer/lps25h/lps25h_main.cpp index 9d31e528a4..564a53905c 100644 --- a/src/drivers/barometer/lps25h/lps25h_main.cpp +++ b/src/drivers/barometer/lps25h/lps25h_main.cpp @@ -47,30 +47,29 @@ LPS25H::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *LPS25H::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *LPS25H::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { device::Device *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = LPS25H_I2C_interface(iterator.bus(), cli.bus_frequency); + if (config.bus_type == BOARD_I2C_BUS) { + interface = LPS25H_I2C_interface(config.bus, config.bus_frequency); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = LPS25H_SPI_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = LPS25H_SPI_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { - PX4_ERR("failed creating interface for bus %i (devid 0x%" PRIx32 ")", iterator.bus(), iterator.devid()); + PX4_ERR("failed creating interface for bus %i (devid 0x%" PRIx32 ")", config.bus, config.spi_devid); return nullptr; } if (interface->init() != OK) { delete interface; - PX4_DEBUG("no device on bus %i (devid 0x%" PRIx32 ")", iterator.bus(), iterator.devid()); + PX4_DEBUG("no device on bus %i (devid 0x%" PRIx32 ")", config.bus, config.spi_devid); return nullptr; } - LPS25H *dev = new LPS25H(iterator.configuredBusOption(), iterator.bus(), interface); + LPS25H *dev = new LPS25H(config, interface); if (dev == nullptr) { delete interface; @@ -99,6 +98,8 @@ extern "C" int lps25h_main(int argc, char *argv[]) return -1; } + cli.i2c_address = LPS25H_ADDRESS; + BusInstanceIterator iterator(MODULE_NAME, cli, DRV_BARO_DEVTYPE_LPS25H); if (!strcmp(verb, "start")) { diff --git a/src/drivers/barometer/lps33hw/lps33hw.cpp b/src/drivers/barometer/lps33hw/lps33hw.cpp index ee36e6996f..4379ad2e2f 100644 --- a/src/drivers/barometer/lps33hw/lps33hw.cpp +++ b/src/drivers/barometer/lps33hw/lps33hw.cpp @@ -47,14 +47,13 @@ static void getTwosComplement(T &raw, uint8_t length) } } -LPS33HW::LPS33HW(I2CSPIBusOption bus_option, int bus, device::Device *interface, bool keep_retrying) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus, - interface->get_device_address()), +LPS33HW::LPS33HW(const I2CSPIDriverConfig &config, device::Device *interface) : + I2CSPIDriver(config), _px4_barometer(interface->get_device_id()), _interface(interface), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), _comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": comm errors")), - _keep_retrying(keep_retrying) + _keep_retrying(config.keep_running) { } diff --git a/src/drivers/barometer/lps33hw/lps33hw.hpp b/src/drivers/barometer/lps33hw/lps33hw.hpp index 2dd9663550..3545064500 100644 --- a/src/drivers/barometer/lps33hw/lps33hw.hpp +++ b/src/drivers/barometer/lps33hw/lps33hw.hpp @@ -55,11 +55,10 @@ using ST_LPS33HW::Register; class LPS33HW : public I2CSPIDriver { public: - LPS33HW(I2CSPIBusOption bus_option, int bus, device::Device *interface, bool keep_retrying); + LPS33HW(const I2CSPIDriverConfig &config, device::Device *interface); virtual ~LPS33HW(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); int init(); diff --git a/src/drivers/barometer/lps33hw/lps33hw_main.cpp b/src/drivers/barometer/lps33hw/lps33hw_main.cpp index 88e1279902..47cfdd8299 100644 --- a/src/drivers/barometer/lps33hw/lps33hw_main.cpp +++ b/src/drivers/barometer/lps33hw/lps33hw_main.cpp @@ -56,30 +56,29 @@ LPS33HW::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *LPS33HW::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *LPS33HW::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { device::Device *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = LPS33HW_I2C_interface(iterator.bus(), cli.i2c_address, cli.bus_frequency); + if (config.bus_type == BOARD_I2C_BUS) { + interface = LPS33HW_I2C_interface(config.bus, config.i2c_address, config.bus_frequency); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = LPS33HW_SPI_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = LPS33HW_SPI_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { - PX4_ERR("failed creating interface for bus %i (devid 0x%" PRIx32 ")", iterator.bus(), iterator.devid()); + PX4_ERR("failed creating interface for bus %i (devid 0x%" PRIx32 ")", config.bus, config.spi_devid); return nullptr; } if (interface->init() != OK) { delete interface; - PX4_DEBUG("no device on bus %i (devid 0x%" PRIx32 ")", iterator.bus(), iterator.devid()); + PX4_DEBUG("no device on bus %i (devid 0x%" PRIx32 ")", config.bus, config.spi_devid); return nullptr; } - LPS33HW *dev = new LPS33HW(iterator.configuredBusOption(), iterator.bus(), interface, cli.keep_running); + LPS33HW *dev = new LPS33HW(config, interface); if (dev == nullptr) { delete interface; diff --git a/src/drivers/barometer/mpl3115a2/MPL3115A2.cpp b/src/drivers/barometer/mpl3115a2/MPL3115A2.cpp index 7c3ca88b90..9063f5d0c5 100644 --- a/src/drivers/barometer/mpl3115a2/MPL3115A2.cpp +++ b/src/drivers/barometer/mpl3115a2/MPL3115A2.cpp @@ -33,8 +33,6 @@ #include "MPL3115A2.hpp" -#define MPL3115A2_ADDRESS 0x60 - #define MPL3115A2_REG_WHO_AM_I 0x0c #define MPL3115A2_WHO_AM_I 0xC4 @@ -54,9 +52,9 @@ #define MPL3115A2_OSR 2 /* Over Sample rate of 4 18MS Minimum time between data samples */ #define MPL3115A2_CTRL_TRIGGER (CTRL_REG1_OST | CTRL_REG1_OS(MPL3115A2_OSR)) -MPL3115A2::MPL3115A2(I2CSPIBusOption bus_option, const int bus, int bus_frequency) : - I2C(DRV_BARO_DEVTYPE_MPL3115A2, MODULE_NAME, bus, MPL3115A2_ADDRESS, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), +MPL3115A2::MPL3115A2(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), _px4_barometer(get_device_id()), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), _measure_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": measure")), diff --git a/src/drivers/barometer/mpl3115a2/MPL3115A2.hpp b/src/drivers/barometer/mpl3115a2/MPL3115A2.hpp index fccf0f274f..e2b2c5dc73 100644 --- a/src/drivers/barometer/mpl3115a2/MPL3115A2.hpp +++ b/src/drivers/barometer/mpl3115a2/MPL3115A2.hpp @@ -48,14 +48,14 @@ #include #include +#define MPL3115A2_ADDRESS 0x60 + class MPL3115A2 : public device::I2C, public I2CSPIDriver { public: - MPL3115A2(I2CSPIBusOption bus_option, const int bus, int bus_frequency); + MPL3115A2(const I2CSPIDriverConfig &config); ~MPL3115A2() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); diff --git a/src/drivers/barometer/mpl3115a2/mpl3115a2_main.cpp b/src/drivers/barometer/mpl3115a2/mpl3115a2_main.cpp index ea9d61d67a..19b6312db3 100644 --- a/src/drivers/barometer/mpl3115a2/mpl3115a2_main.cpp +++ b/src/drivers/barometer/mpl3115a2/mpl3115a2_main.cpp @@ -43,31 +43,16 @@ MPL3115A2::print_usage() PRINT_MODULE_USAGE_SUBCATEGORY("baro"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x60); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *MPL3115A2::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - MPL3115A2 *dev = new MPL3115A2(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency); - - if (dev == nullptr) { - return nullptr; - } - - if (OK != dev->init()) { - delete dev; - return nullptr; - } - - return dev; -} - extern "C" int mpl3115a2_main(int argc, char *argv[]) { using ThisDriver = MPL3115A2; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = 400000; + cli.i2c_address = MPL3115A2_ADDRESS; const char *verb = cli.parseDefaultArguments(argc, argv); diff --git a/src/drivers/barometer/ms5611/MS5611.hpp b/src/drivers/barometer/ms5611/MS5611.hpp index 3003cb8e50..cde1ff753b 100644 --- a/src/drivers/barometer/ms5611/MS5611.hpp +++ b/src/drivers/barometer/ms5611/MS5611.hpp @@ -87,12 +87,10 @@ enum MS56XX_DEVICE_TYPES { class MS5611 : public I2CSPIDriver { public: - MS5611(device::Device *interface, ms5611::prom_u &prom_buf, enum MS56XX_DEVICE_TYPES device_type, - I2CSPIBusOption bus_option, int bus); + MS5611(device::Device *interface, ms5611::prom_u &prom_buf, const I2CSPIDriverConfig &config); ~MS5611() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); int init(); diff --git a/src/drivers/barometer/ms5611/ms5611.cpp b/src/drivers/barometer/ms5611/ms5611.cpp index 480237a958..a3e7e04508 100644 --- a/src/drivers/barometer/ms5611/ms5611.cpp +++ b/src/drivers/barometer/ms5611/ms5611.cpp @@ -41,17 +41,25 @@ #include -MS5611::MS5611(device::Device *interface, ms5611::prom_u &prom_buf, enum MS56XX_DEVICE_TYPES device_type, - I2CSPIBusOption bus_option, int bus) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus, 0, device_type), +MS5611::MS5611(device::Device *interface, ms5611::prom_u &prom_buf, const I2CSPIDriverConfig &config) : + I2CSPIDriver(config), _px4_barometer(interface->get_device_id()), _interface(interface), _prom(prom_buf.s), - _device_type(device_type), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), _measure_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": measure")), _comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": com_err")) { + switch (config.devid_driver_index) { + case DRV_BARO_DEVTYPE_MS5611: + _device_type = MS5611_DEVICE; + break; + + case DRV_BARO_DEVTYPE_MS5607: + default: + _device_type = MS5607_DEVICE; + break; + } } MS5611::~MS5611() diff --git a/src/drivers/barometer/ms5611/ms5611.h b/src/drivers/barometer/ms5611/ms5611.h index e4d6ff5156..6e959be8a1 100644 --- a/src/drivers/barometer/ms5611/ms5611.h +++ b/src/drivers/barometer/ms5611/ms5611.h @@ -58,6 +58,10 @@ #define IOCTL_RESET 2 #define IOCTL_MEASURE 3 +#define MS5611_ADDRESS_1 0x76 /* address select pins pulled high (PX4FMU series v1.6+) */ +#define MS5611_ADDRESS_2 0x77 /* address select pins pulled low (PX4FMU prototypes) */ + + namespace ms5611 { diff --git a/src/drivers/barometer/ms5611/ms5611_i2c.cpp b/src/drivers/barometer/ms5611/ms5611_i2c.cpp index d5fbab39c3..89d90a4f55 100644 --- a/src/drivers/barometer/ms5611/ms5611_i2c.cpp +++ b/src/drivers/barometer/ms5611/ms5611_i2c.cpp @@ -41,9 +41,6 @@ #include "ms5611.h" -#define MS5611_ADDRESS_1 0x76 /* address select pins pulled high (PX4FMU series v1.6+) */ -#define MS5611_ADDRESS_2 0x77 /* address select pins pulled low (PX4FMU prototypes) */ - class MS5611_I2C : public device::I2C { public: diff --git a/src/drivers/barometer/ms5611/ms5611_main.cpp b/src/drivers/barometer/ms5611/ms5611_main.cpp index c04bcd0545..c1f05c6189 100644 --- a/src/drivers/barometer/ms5611/ms5611_main.cpp +++ b/src/drivers/barometer/ms5611/ms5611_main.cpp @@ -40,17 +40,16 @@ #include "MS5611.hpp" #include "ms5611.h" -I2CSPIDriverBase *MS5611::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *MS5611::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { ms5611::prom_u prom_buf; device::Device *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = MS5611_i2c_interface(prom_buf, iterator.devid(), iterator.bus(), cli.bus_frequency); + if (config.bus_type == BOARD_I2C_BUS) { + interface = MS5611_i2c_interface(prom_buf, config.spi_devid, config.bus, config.bus_frequency); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = MS5611_spi_interface(prom_buf, iterator.devid(), iterator.bus(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = MS5611_spi_interface(prom_buf, config.spi_devid, config.bus, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { @@ -60,12 +59,11 @@ I2CSPIDriverBase *MS5611::instantiate(const BusCLIArguments &cli, const BusInsta if (interface->init() != OK) { delete interface; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); + PX4_DEBUG("no device on bus %i (devid 0x%x)", config.bus, config.spi_devid); return nullptr; } - MS5611 *dev = new MS5611(interface, prom_buf, (MS56XX_DEVICE_TYPES)cli.type, iterator.configuredBusOption(), - iterator.bus()); + MS5611 *dev = new MS5611(interface, prom_buf, config); if (dev == nullptr) { delete interface; @@ -95,7 +93,6 @@ extern "C" int ms5611_main(int argc, char *argv[]) using ThisDriver = MS5611; int ch; BusCLIArguments cli{true, true}; - cli.type = MS5611_DEVICE; cli.default_i2c_frequency = 400000; cli.default_spi_frequency = 20 * 1000 * 1000; uint16_t dev_type_driver = DRV_BARO_DEVTYPE_MS5611; @@ -106,11 +103,9 @@ extern "C" int ms5611_main(int argc, char *argv[]) int val = atoi(cli.optArg()); if (val == 5611) { - cli.type = MS5611_DEVICE; dev_type_driver = DRV_BARO_DEVTYPE_MS5611; } else if (val == 5607) { - cli.type = MS5607_DEVICE; dev_type_driver = DRV_BARO_DEVTYPE_MS5607; } } @@ -125,6 +120,8 @@ extern "C" int ms5611_main(int argc, char *argv[]) return -1; } + cli.i2c_address = MS5611_ADDRESS_1; + BusInstanceIterator iterator(MODULE_NAME, cli, dev_type_driver); if (!strcmp(verb, "start")) { diff --git a/src/drivers/batt_smbus/batt_smbus.cpp b/src/drivers/batt_smbus/batt_smbus.cpp index 80b76e1acf..c7b7ab5fe9 100644 --- a/src/drivers/batt_smbus/batt_smbus.cpp +++ b/src/drivers/batt_smbus/batt_smbus.cpp @@ -47,9 +47,8 @@ extern "C" __EXPORT int batt_smbus_main(int argc, char *argv[]); -BATT_SMBUS::BATT_SMBUS(I2CSPIBusOption bus_option, const int bus, SMBus *interface) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus, - interface->get_device_address()), +BATT_SMBUS::BATT_SMBUS(const I2CSPIDriverConfig &config, SMBus *interface) : + I2CSPIDriver(config), _interface(interface) { int32_t battsource = 1; @@ -534,15 +533,14 @@ $ batt_smbus -X write_flash 19069 2 27 0 PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *BATT_SMBUS::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *BATT_SMBUS::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { - SMBus *interface = new SMBus(DRV_BAT_DEVTYPE_SMBUS, iterator.bus(), cli.i2c_address); + SMBus *interface = new SMBus(DRV_BAT_DEVTYPE_SMBUS, config.bus, config.i2c_address); if (interface == nullptr) { PX4_ERR("alloc failed"); return nullptr; } - BATT_SMBUS *instance = new BATT_SMBUS(iterator.configuredBusOption(), iterator.bus(), interface); + BATT_SMBUS *instance = new BATT_SMBUS(config, interface); if (instance == nullptr) { PX4_ERR("alloc failed"); diff --git a/src/drivers/batt_smbus/batt_smbus.h b/src/drivers/batt_smbus/batt_smbus.h index a707e14f32..864125ea2a 100644 --- a/src/drivers/batt_smbus/batt_smbus.h +++ b/src/drivers/batt_smbus/batt_smbus.h @@ -127,12 +127,11 @@ enum class SMBUS_DEVICE_TYPE { class BATT_SMBUS : public I2CSPIDriver { public: - BATT_SMBUS(I2CSPIBusOption bus_option, const int bus, SMBus *interface); + BATT_SMBUS(const I2CSPIDriverConfig &config, SMBus *interface); ~BATT_SMBUS(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); friend SMBus; diff --git a/src/drivers/differential_pressure/ets/ets_airspeed.cpp b/src/drivers/differential_pressure/ets/ets_airspeed.cpp index f4c23624e3..2dbc4073a8 100644 --- a/src/drivers/differential_pressure/ets/ets_airspeed.cpp +++ b/src/drivers/differential_pressure/ets/ets_airspeed.cpp @@ -63,15 +63,15 @@ class ETSAirspeed : public Airspeed, public I2CSPIDriver { public: - ETSAirspeed(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address = I2C_ADDRESS); + ETSAirspeed(const I2CSPIDriverConfig &config); virtual ~ETSAirspeed() = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); + + int init() override; protected: int measure() override; int collect() override; @@ -82,13 +82,25 @@ protected: */ extern "C" __EXPORT int ets_airspeed_main(int argc, char *argv[]); -ETSAirspeed::ETSAirspeed(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address) - : Airspeed(bus, bus_frequency, address, CONVERSION_INTERVAL), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address) +ETSAirspeed::ETSAirspeed(const I2CSPIDriverConfig &config) + : Airspeed(config.bus, config.bus_frequency, config.i2c_address, CONVERSION_INTERVAL), + I2CSPIDriver(config) { _device_id.devid_s.devtype = DRV_DIFF_PRESS_DEVTYPE_MS4525; } +int ETSAirspeed::init() +{ + int ret = Airspeed::init(); + + if (ret == PX4_OK) { + ScheduleNow(); + } + + return ret; +} + + int ETSAirspeed::measure() { @@ -209,26 +221,6 @@ ETSAirspeed::RunImpl() ScheduleDelayed(CONVERSION_INTERVAL); } -I2CSPIDriverBase *ETSAirspeed::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ETSAirspeed *instance = new ETSAirspeed(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - instance->ScheduleNow(); - return instance; -} - - void ETSAirspeed::print_usage() { @@ -236,6 +228,7 @@ ETSAirspeed::print_usage() PRINT_MODULE_USAGE_SUBCATEGORY("airspeed_sensor"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x75); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } @@ -245,6 +238,7 @@ ets_airspeed_main(int argc, char *argv[]) using ThisDriver = ETSAirspeed; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = 100000; + cli.i2c_address = I2C_ADDRESS; const char *verb = cli.parseDefaultArguments(argc, argv); diff --git a/src/drivers/differential_pressure/ms4525/ms4525_airspeed.cpp b/src/drivers/differential_pressure/ms4525/ms4525_airspeed.cpp index 3481dc5e4f..d9a50eb77f 100644 --- a/src/drivers/differential_pressure/ms4525/ms4525_airspeed.cpp +++ b/src/drivers/differential_pressure/ms4525/ms4525_airspeed.cpp @@ -77,16 +77,16 @@ enum MS_DEVICE_TYPE { class MEASAirspeed : public Airspeed, public I2CSPIDriver { public: - MEASAirspeed(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address = I2C_ADDRESS_MS4525DO); + MEASAirspeed(const I2CSPIDriverConfig &config); virtual ~MEASAirspeed() = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); + int init() override; + protected: int measure() override; @@ -100,13 +100,24 @@ protected: */ extern "C" __EXPORT int ms4525_airspeed_main(int argc, char *argv[]); -MEASAirspeed::MEASAirspeed(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address) - : Airspeed(bus, bus_frequency, address, CONVERSION_INTERVAL), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address) +MEASAirspeed::MEASAirspeed(const I2CSPIDriverConfig &config) + : Airspeed(config.bus, config.bus_frequency, config.i2c_address, CONVERSION_INTERVAL), + I2CSPIDriver(config) { _device_id.devid_s.devtype = DRV_DIFF_PRESS_DEVTYPE_MS4525; } +int MEASAirspeed::init() +{ + int ret = Airspeed::init(); + + if (ret == PX4_OK) { + ScheduleNow(); + } + + return ret; +} + int MEASAirspeed::measure() { @@ -266,27 +277,6 @@ MEASAirspeed::RunImpl() ScheduleDelayed(CONVERSION_INTERVAL); } -I2CSPIDriverBase *MEASAirspeed::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - MEASAirspeed *instance = new MEASAirspeed(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, - cli.i2c_address); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - instance->ScheduleNow(); - return instance; -} - - void MEASAirspeed::print_usage() { @@ -329,8 +319,7 @@ ms4525_airspeed_main(int argc, char *argv[]) cli.i2c_address = I2C_ADDRESS_MS4515DO; } - BusInstanceIterator iterator(MODULE_NAME, cli, - DRV_DIFF_PRESS_DEVTYPE_MS4525); + BusInstanceIterator iterator(MODULE_NAME, cli, DRV_DIFF_PRESS_DEVTYPE_MS4525); if (!strcmp(verb, "start")) { return ThisDriver::module_start(cli, iterator); diff --git a/src/drivers/differential_pressure/ms5525/MS5525.cpp b/src/drivers/differential_pressure/ms5525/MS5525.cpp index c5debb50af..21118e69b7 100644 --- a/src/drivers/differential_pressure/ms5525/MS5525.cpp +++ b/src/drivers/differential_pressure/ms5525/MS5525.cpp @@ -33,6 +33,17 @@ #include "MS5525.hpp" +int MS5525::init() +{ + int ret = Airspeed::init(); + + if (ret == PX4_OK) { + ScheduleNow(); + } + + return ret; +} + int MS5525::measure() { diff --git a/src/drivers/differential_pressure/ms5525/MS5525.hpp b/src/drivers/differential_pressure/ms5525/MS5525.hpp index 4b4c8d4905..8f70eff2f0 100644 --- a/src/drivers/differential_pressure/ms5525/MS5525.hpp +++ b/src/drivers/differential_pressure/ms5525/MS5525.hpp @@ -51,20 +51,20 @@ static constexpr int64_t CONVERSION_INTERVAL = (1000000 / MEAS_RATE); /* microse class MS5525 : public Airspeed, public I2CSPIDriver { public: - MS5525(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address = I2C_ADDRESS_1_MS5525DSO) : - Airspeed(bus, bus_frequency, address, CONVERSION_INTERVAL), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address) + MS5525(const I2CSPIDriverConfig &config) : + Airspeed(config.bus, config.bus_frequency, config.i2c_address, CONVERSION_INTERVAL), + I2CSPIDriver(config) { } virtual ~MS5525() = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); + int init() override; + private: int measure() override; diff --git a/src/drivers/differential_pressure/ms5525/MS5525_main.cpp b/src/drivers/differential_pressure/ms5525/MS5525_main.cpp index 991736558f..e663d3c849 100644 --- a/src/drivers/differential_pressure/ms5525/MS5525_main.cpp +++ b/src/drivers/differential_pressure/ms5525/MS5525_main.cpp @@ -35,26 +35,6 @@ extern "C" __EXPORT int ms5525_airspeed_main(int argc, char *argv[]); -I2CSPIDriverBase *MS5525::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - MS5525 *instance = new MS5525(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - instance->ScheduleNow(); - return instance; -} - - void MS5525::print_usage() { @@ -62,6 +42,7 @@ MS5525::print_usage() PRINT_MODULE_USAGE_SUBCATEGORY("airspeed_sensor"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x76); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } @@ -71,6 +52,7 @@ ms5525_airspeed_main(int argc, char *argv[]) using ThisDriver = MS5525; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = 100000; + cli.i2c_address = I2C_ADDRESS_1_MS5525DSO; const char *verb = cli.parseDefaultArguments(argc, argv); @@ -79,8 +61,7 @@ ms5525_airspeed_main(int argc, char *argv[]) return -1; } - BusInstanceIterator iterator(MODULE_NAME, cli, - DRV_DIFF_PRESS_DEVTYPE_MS5525); + BusInstanceIterator iterator(MODULE_NAME, cli, DRV_DIFF_PRESS_DEVTYPE_MS5525); if (!strcmp(verb, "start")) { return ThisDriver::module_start(cli, iterator); diff --git a/src/drivers/differential_pressure/sdp3x/SDP3X.cpp b/src/drivers/differential_pressure/sdp3x/SDP3X.cpp index 2655308d7c..b5d4231d54 100644 --- a/src/drivers/differential_pressure/sdp3x/SDP3X.cpp +++ b/src/drivers/differential_pressure/sdp3x/SDP3X.cpp @@ -124,10 +124,16 @@ SDP3X::read_scale() return PX4_OK; } -void SDP3X::start() +int SDP3X::init() { - // make sure to wait 10ms after configuring the measurement mode - ScheduleDelayed(10_ms); + int ret = Airspeed::init(); + + if (ret == PX4_OK) { + // make sure to wait 10ms after configuring the measurement mode + ScheduleDelayed(10_ms); + } + + return ret; } int diff --git a/src/drivers/differential_pressure/sdp3x/SDP3X.hpp b/src/drivers/differential_pressure/sdp3x/SDP3X.hpp index cc7685f33a..f740d7b3b1 100644 --- a/src/drivers/differential_pressure/sdp3x/SDP3X.hpp +++ b/src/drivers/differential_pressure/sdp3x/SDP3X.hpp @@ -69,23 +69,20 @@ class SDP3X : public Airspeed, public I2CSPIDriver { public: - SDP3X(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address = I2C_ADDRESS_1_SDP3X, - bool keep_retrying = false) : - Airspeed(bus, bus_frequency, address, CONVERSION_INTERVAL), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address), - _keep_retrying{keep_retrying} + SDP3X(const I2CSPIDriverConfig &config) : + Airspeed(config.bus, config.bus_frequency, config.i2c_address, CONVERSION_INTERVAL), + I2CSPIDriver(config), + _keep_retrying{config.keep_running} { } virtual ~SDP3X() = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); - void start(); + int init() override; private: enum class State { diff --git a/src/drivers/differential_pressure/sdp3x/SDP3X_main.cpp b/src/drivers/differential_pressure/sdp3x/SDP3X_main.cpp index c24e5b6bd2..9281276280 100644 --- a/src/drivers/differential_pressure/sdp3x/SDP3X_main.cpp +++ b/src/drivers/differential_pressure/sdp3x/SDP3X_main.cpp @@ -35,27 +35,6 @@ extern "C" __EXPORT int sdp3x_airspeed_main(int argc, char *argv[]); -I2CSPIDriverBase *SDP3X::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - SDP3X *instance = new SDP3X(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, cli.i2c_address, - cli.keep_running); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - instance->start(); - return instance; -} - - void SDP3X::print_usage() { diff --git a/src/drivers/distance_sensor/gy_us42/GY_US42.cpp b/src/drivers/distance_sensor/gy_us42/GY_US42.cpp index 81643d8791..4c3198cd42 100644 --- a/src/drivers/distance_sensor/gy_us42/GY_US42.cpp +++ b/src/drivers/distance_sensor/gy_us42/GY_US42.cpp @@ -33,10 +33,10 @@ #include "GY_US42.hpp" -GY_US42::GY_US42(I2CSPIBusOption bus_option, const int bus, const uint8_t rotation, int bus_frequency, int address) : - I2C(DRV_DIST_DEVTYPE_GY_US42, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_rangefinder(get_device_id(), rotation) +GY_US42::GY_US42(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_rangefinder(get_device_id(), config.rotation) { _px4_rangefinder.set_max_distance(GY_US42_MAX_DISTANCE); _px4_rangefinder.set_min_distance(GY_US42_MIN_DISTANCE); diff --git a/src/drivers/distance_sensor/gy_us42/GY_US42.hpp b/src/drivers/distance_sensor/gy_us42/GY_US42.hpp index f051a5f974..4aeb007db6 100644 --- a/src/drivers/distance_sensor/gy_us42/GY_US42.hpp +++ b/src/drivers/distance_sensor/gy_us42/GY_US42.hpp @@ -63,12 +63,9 @@ class GY_US42 : public device::I2C, public I2CSPIDriver { public: - GY_US42(I2CSPIBusOption bus_option, const int bus, const uint8_t rotation, int bus_frequency, - int address = GY_US42_BASEADDR); + GY_US42(const I2CSPIDriverConfig &config); ~GY_US42() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init() override; diff --git a/src/drivers/distance_sensor/gy_us42/GY_US42_main.cpp b/src/drivers/distance_sensor/gy_us42/GY_US42_main.cpp index 857254b696..8e660d90c7 100644 --- a/src/drivers/distance_sensor/gy_us42/GY_US42_main.cpp +++ b/src/drivers/distance_sensor/gy_us42/GY_US42_main.cpp @@ -47,36 +47,18 @@ GY_US42::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *GY_US42::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - GY_US42 *instance = new GY_US42(iterator.configuredBusOption(), iterator.bus(), cli.orientation, cli.bus_frequency); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" __EXPORT int gy_us42_main(int argc, char *argv[]) { int ch; using ThisDriver = GY_US42; BusCLIArguments cli{true, false}; - cli.orientation = distance_sensor_s::ROTATION_DOWNWARD_FACING; + cli.rotation = (Rotation)distance_sensor_s::ROTATION_DOWNWARD_FACING; cli.default_i2c_frequency = 100000; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { case 'R': - cli.orientation = atoi(cli.optArg()); + cli.rotation = (Rotation)atoi(cli.optArg()); break; } } diff --git a/src/drivers/distance_sensor/lightware_laser_i2c/lightware_laser_i2c.cpp b/src/drivers/distance_sensor/lightware_laser_i2c/lightware_laser_i2c.cpp index 2a8f470509..2e4c6ba97d 100644 --- a/src/drivers/distance_sensor/lightware_laser_i2c/lightware_laser_i2c.cpp +++ b/src/drivers/distance_sensor/lightware_laser_i2c/lightware_laser_i2c.cpp @@ -60,13 +60,10 @@ using namespace time_literals; class LightwareLaser : public device::I2C, public I2CSPIDriver { public: - LightwareLaser(I2CSPIBusOption bus_option, const int bus, const uint8_t rotation, int bus_frequency, - int address = LIGHTWARE_LASER_BASEADDR); + LightwareLaser(const I2CSPIDriverConfig &config); ~LightwareLaser() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init() override; @@ -132,11 +129,10 @@ private: int _consecutive_errors{0}; }; -LightwareLaser::LightwareLaser(I2CSPIBusOption bus_option, const int bus, const uint8_t rotation, int bus_frequency, - int address) : - I2C(DRV_DIST_DEVTYPE_LIGHTWARE_LASER, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_rangefinder(get_device_id(), rotation) +LightwareLaser::LightwareLaser(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_rangefinder(get_device_id(), config.rotation) { _px4_rangefinder.set_device_type(DRV_DIST_DEVTYPE_LIGHTWARE_LASER); } @@ -205,7 +201,13 @@ int LightwareLaser::init() } /* do I2C init (and probe) first */ - return I2C::init(); + ret = I2C::init(); + + if (ret == PX4_OK) { + start(); + } + + return ret; } int LightwareLaser::readRegister(Register reg, uint8_t *data, int len) @@ -422,41 +424,24 @@ Setup/usage information: https://docs.px4.io/master/en/sensor/sfxx_lidar.html PRINT_MODULE_USAGE_SUBCATEGORY("distance_sensor"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x66); PRINT_MODULE_USAGE_PARAM_INT('R', 25, 0, 25, "Sensor rotation - downward facing by default", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *LightwareLaser::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - LightwareLaser* instance = new LightwareLaser(iterator.configuredBusOption(), iterator.bus(), cli.orientation, cli.bus_frequency); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - instance->start(); - return instance; -} - extern "C" __EXPORT int lightware_laser_i2c_main(int argc, char *argv[]) { int ch; using ThisDriver = LightwareLaser; BusCLIArguments cli{true, false}; - cli.orientation = distance_sensor_s::ROTATION_DOWNWARD_FACING; + cli.rotation = (Rotation)distance_sensor_s::ROTATION_DOWNWARD_FACING; cli.default_i2c_frequency = 400000; + cli.i2c_address = LIGHTWARE_LASER_BASEADDR; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { case 'R': - cli.orientation = atoi(cli.optArg()); + cli.rotation = (Rotation)atoi(cli.optArg()); break; } } diff --git a/src/drivers/distance_sensor/ll40ls/LidarLiteI2C.cpp b/src/drivers/distance_sensor/ll40ls/LidarLiteI2C.cpp index e009db68d2..333e6c283a 100644 --- a/src/drivers/distance_sensor/ll40ls/LidarLiteI2C.cpp +++ b/src/drivers/distance_sensor/ll40ls/LidarLiteI2C.cpp @@ -41,11 +41,10 @@ #include "LidarLiteI2C.h" -LidarLiteI2C::LidarLiteI2C(I2CSPIBusOption bus_option, const int bus, const uint8_t orientation, int bus_frequency, - const int address) : - I2C(DRV_RNG_DEVTYPE_LL40LS, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_rangefinder(get_device_id(), orientation) +LidarLiteI2C::LidarLiteI2C(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_rangefinder(get_device_id(), config.rotation) { _px4_rangefinder.set_min_distance(LL40LS_MIN_DISTANCE); _px4_rangefinder.set_max_distance(LL40LS_MAX_DISTANCE); @@ -72,6 +71,7 @@ LidarLiteI2C::init() return PX4_ERROR; } + start(); return PX4_OK; } diff --git a/src/drivers/distance_sensor/ll40ls/LidarLiteI2C.h b/src/drivers/distance_sensor/ll40ls/LidarLiteI2C.h index b43cea4dea..1a18ab3045 100644 --- a/src/drivers/distance_sensor/ll40ls/LidarLiteI2C.h +++ b/src/drivers/distance_sensor/ll40ls/LidarLiteI2C.h @@ -94,12 +94,9 @@ static constexpr uint32_t LL40LS_CONVERSION_TIMEOUT{100_ms}; class LidarLiteI2C : public device::I2C, public I2CSPIDriver { public: - LidarLiteI2C(I2CSPIBusOption bus_option, const int bus, const uint8_t orientation, int bus_frequency, - const int address = LL40LS_BASEADDR); + LidarLiteI2C(const I2CSPIDriverConfig &config); virtual ~LidarLiteI2C(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); diff --git a/src/drivers/distance_sensor/ll40ls/ll40ls.cpp b/src/drivers/distance_sensor/ll40ls/ll40ls.cpp index 3b44f22a04..0a4dc94001 100644 --- a/src/drivers/distance_sensor/ll40ls/ll40ls.cpp +++ b/src/drivers/distance_sensor/ll40ls/ll40ls.cpp @@ -64,30 +64,12 @@ Setup/usage information: https://docs.px4.io/master/en/sensor/lidar_lite.html PRINT_MODULE_USAGE_SUBCATEGORY("distance_sensor"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x62); PRINT_MODULE_USAGE_PARAM_INT('R', 25, 0, 25, "Sensor rotation - downward facing by default", true); PRINT_MODULE_USAGE_COMMAND("regdump"); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *LidarLiteI2C::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - LidarLiteI2C* instance = new LidarLiteI2C(iterator.configuredBusOption(), iterator.bus(), cli.orientation, cli.bus_frequency); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - instance->start(); - return instance; -} - void LidarLiteI2C::custom_method(const BusCLIArguments &cli) { @@ -99,13 +81,14 @@ extern "C" __EXPORT int ll40ls_main(int argc, char *argv[]) int ch; using ThisDriver = LidarLiteI2C; BusCLIArguments cli{true, false}; - cli.orientation = distance_sensor_s::ROTATION_DOWNWARD_FACING; + cli.rotation = (Rotation)distance_sensor_s::ROTATION_DOWNWARD_FACING; cli.default_i2c_frequency = 100000; + cli.i2c_address = LL40LS_BASEADDR; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { case 'R': - cli.orientation = (enum Rotation)atoi(cli.optArg()); + cli.rotation = (enum Rotation)atoi(cli.optArg()); break; } } diff --git a/src/drivers/distance_sensor/mappydot/MappyDot.cpp b/src/drivers/distance_sensor/mappydot/MappyDot.cpp index 86a647743a..3144237ab8 100644 --- a/src/drivers/distance_sensor/mappydot/MappyDot.cpp +++ b/src/drivers/distance_sensor/mappydot/MappyDot.cpp @@ -144,11 +144,9 @@ using namespace time_literals; class MappyDot : public device::I2C, public ModuleParams, public I2CSPIDriver { public: - MappyDot(I2CSPIBusOption bus_option, const int bus, int bus_frequency); + MappyDot(const I2CSPIDriverConfig &config); virtual ~MappyDot(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); /** @@ -221,10 +219,10 @@ private: }; -MappyDot::MappyDot(I2CSPIBusOption bus_option, const int bus, int bus_frequency) : - I2C(DRV_DIST_DEVTYPE_MAPPYDOT, MODULE_NAME, bus, MAPPYDOT_BASE_ADDR, bus_frequency), +MappyDot::MappyDot(const I2CSPIDriverConfig &config) : + I2C(config), ModuleParams(nullptr), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus) + I2CSPIDriver(config) { set_device_type(DRV_DIST_DEVTYPE_MAPPYDOT); } @@ -382,6 +380,7 @@ MappyDot::init() PX4_INFO("%i sensors connected", _sensor_count); + start(); return PX4_OK; } @@ -417,9 +416,6 @@ MappyDot::RunImpl() void MappyDot::start() { - // Fetch parameter values. - ModuleParams::updateParams(); - // Schedule the driver to run on a set interval ScheduleOnInterval(MAPPYDOT_MEASUREMENT_INTERVAL_USEC, 10000); } @@ -434,25 +430,6 @@ MappyDot::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *MappyDot::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - MappyDot *instance = new MappyDot(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - instance->start(); - return instance; -} - extern "C" __EXPORT int mappydot_main(int argc, char *argv[]) { using ThisDriver = MappyDot; @@ -466,6 +443,8 @@ extern "C" __EXPORT int mappydot_main(int argc, char *argv[]) return -1; } + cli.i2c_address = MAPPYDOT_BASE_ADDR; + BusInstanceIterator iterator(MODULE_NAME, cli, DRV_DIST_DEVTYPE_MAPPYDOT); if (!strcmp(verb, "start")) { diff --git a/src/drivers/distance_sensor/mb12xx/mb12xx.cpp b/src/drivers/distance_sensor/mb12xx/mb12xx.cpp index a94b954d59..da8d5321b0 100644 --- a/src/drivers/distance_sensor/mb12xx/mb12xx.cpp +++ b/src/drivers/distance_sensor/mb12xx/mb12xx.cpp @@ -88,14 +88,12 @@ using namespace time_literals; class MB12XX : public device::I2C, public ModuleParams, public I2CSPIDriver { public: - MB12XX(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address); + MB12XX(const I2CSPIDriverConfig &config); virtual ~MB12XX(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); - virtual int init() override; + int init() override; /** * Diagnostics - print some basic information about the driver. @@ -175,10 +173,10 @@ private: ); }; -MB12XX::MB12XX(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address) : - I2C(DRV_DIST_DEVTYPE_MB12XX, MODULE_NAME, bus, address, bus_frequency), +MB12XX::MB12XX(const I2CSPIDriverConfig &config) : + I2C(config), ModuleParams(nullptr), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address) + I2CSPIDriver(config) { set_device_type(DRV_DIST_DEVTYPE_MB12XX); } @@ -319,12 +317,13 @@ MB12XX::init() return PX4_ERROR; } - // If more than one sonar is detected, adjust the meaure interval to avoid sensor interference. + // If more than one sonar is detected, adjust the measure interval to avoid sensor interference. if (_sensor_count > 1) { _measure_interval = MB12XX_INTERVAL_BETWEEN_SUCCESIVE_FIRES; } PX4_INFO("Total sensors connected: %i", _sensor_count); + start(); return PX4_OK; } @@ -407,26 +406,6 @@ MB12XX::custom_method(const BusCLIArguments &cli) set_address(cli.i2c_address); } -I2CSPIDriverBase *MB12XX::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - MB12XX *instance = new MB12XX(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, cli.i2c_address); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - instance->start(); - return instance; -} - - void MB12XX::print_usage() { @@ -434,7 +413,6 @@ MB12XX::print_usage() PRINT_MODULE_USAGE_SUBCATEGORY("distance_sensor"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); - PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x70); PRINT_MODULE_USAGE_COMMAND("set_address"); PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x70); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); @@ -444,7 +422,6 @@ extern "C" __EXPORT int mb12xx_main(int argc, char *argv[]) { using ThisDriver = MB12XX; BusCLIArguments cli{true, false}; - cli.i2c_address = MB12XX_BASE_ADDR; cli.default_i2c_frequency = MB12XX_BUS_SPEED; const char *verb = cli.parseDefaultArguments(argc, argv); @@ -454,6 +431,8 @@ extern "C" __EXPORT int mb12xx_main(int argc, char *argv[]) return -1; } + cli.i2c_address = MB12XX_BASE_ADDR; + BusInstanceIterator iterator(MODULE_NAME, cli, DRV_DIST_DEVTYPE_MB12XX); if (!strcmp(verb, "start")) { diff --git a/src/drivers/distance_sensor/srf02/SRF02.cpp b/src/drivers/distance_sensor/srf02/SRF02.cpp index 6b223072c6..70ef61833b 100644 --- a/src/drivers/distance_sensor/srf02/SRF02.cpp +++ b/src/drivers/distance_sensor/srf02/SRF02.cpp @@ -33,10 +33,10 @@ #include "SRF02.hpp" -SRF02::SRF02(I2CSPIBusOption bus_option, const int bus, const uint8_t rotation, int bus_frequency, int address) : - I2C(DRV_DIST_DEVTYPE_SRF02, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_rangefinder(get_device_id(), rotation) +SRF02::SRF02(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_rangefinder(get_device_id(), config.rotation) { _px4_rangefinder.set_device_type(DRV_DIST_DEVTYPE_SRF02); _px4_rangefinder.set_rangefinder_type(distance_sensor_s::MAV_DISTANCE_SENSOR_ULTRASOUND); @@ -69,7 +69,13 @@ int SRF02::init() // XXX we should find out why we need to wait 200 ms here px4_usleep(200000); - return measure(); + int ret = measure(); + + if (ret == PX4_OK) { + start(); + } + + return ret; } int SRF02::collect() diff --git a/src/drivers/distance_sensor/srf02/SRF02.hpp b/src/drivers/distance_sensor/srf02/SRF02.hpp index e074a02f81..798ddaaaaf 100644 --- a/src/drivers/distance_sensor/srf02/SRF02.hpp +++ b/src/drivers/distance_sensor/srf02/SRF02.hpp @@ -65,12 +65,9 @@ class SRF02 : public device::I2C, public I2CSPIDriver { public: - SRF02(I2CSPIBusOption bus_option, const int bus, const uint8_t rotation, int bus_frequency, - int address = SRF02_BASEADDR); + SRF02(const I2CSPIDriverConfig &config); ~SRF02() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init() override; diff --git a/src/drivers/distance_sensor/srf02/srf02_main.cpp b/src/drivers/distance_sensor/srf02/srf02_main.cpp index 72c11d6561..6c49020be7 100644 --- a/src/drivers/distance_sensor/srf02/srf02_main.cpp +++ b/src/drivers/distance_sensor/srf02/srf02_main.cpp @@ -43,41 +43,24 @@ SRF02::print_usage() PRINT_MODULE_USAGE_SUBCATEGORY("distance_sensor"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x70); PRINT_MODULE_USAGE_PARAM_INT('R', 25, 0, 25, "Sensor rotation - downward facing by default", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *SRF02::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - SRF02 *instance = new SRF02(iterator.configuredBusOption(), iterator.bus(), cli.orientation, cli.bus_frequency); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - instance->start(); - return instance; -} - extern "C" __EXPORT int srf02_main(int argc, char *argv[]) { int ch; using ThisDriver = SRF02; BusCLIArguments cli{true, false}; - cli.orientation = distance_sensor_s::ROTATION_DOWNWARD_FACING; + cli.rotation = (Rotation)distance_sensor_s::ROTATION_DOWNWARD_FACING; cli.default_i2c_frequency = 100000; + cli.i2c_address = SRF02_BASEADDR; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { case 'R': - cli.orientation = atoi(cli.optArg()); + cli.rotation = (Rotation)atoi(cli.optArg()); break; } } diff --git a/src/drivers/distance_sensor/teraranger/TERARANGER.cpp b/src/drivers/distance_sensor/teraranger/TERARANGER.cpp index 4a7456d858..8067f4e86f 100644 --- a/src/drivers/distance_sensor/teraranger/TERARANGER.cpp +++ b/src/drivers/distance_sensor/teraranger/TERARANGER.cpp @@ -73,10 +73,10 @@ static uint8_t crc8(uint8_t *p, uint8_t len) return crc & 0xFF; } -TERARANGER::TERARANGER(I2CSPIBusOption bus_option, const int bus, const uint8_t rotation, int bus_frequency) : - I2C(DRV_DIST_DEVTYPE_TERARANGER, MODULE_NAME, bus, TERARANGER_ONE_BASEADDR, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_rangefinder(get_device_id(), rotation) +TERARANGER::TERARANGER(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_rangefinder(get_device_id(), config.rotation) { // up the retries since the device misses the first measure attempts I2C::_retries = 3; @@ -212,6 +212,8 @@ int TERARANGER::init() return PX4_ERROR; } + start(); + return PX4_OK; } diff --git a/src/drivers/distance_sensor/teraranger/TERARANGER.hpp b/src/drivers/distance_sensor/teraranger/TERARANGER.hpp index e1f9facd19..67dad8c115 100644 --- a/src/drivers/distance_sensor/teraranger/TERARANGER.hpp +++ b/src/drivers/distance_sensor/teraranger/TERARANGER.hpp @@ -75,11 +75,9 @@ using namespace time_literals; class TERARANGER : public device::I2C, public I2CSPIDriver { public: - TERARANGER(I2CSPIBusOption bus_option, const int bus, const uint8_t rotation, int bus_frequency); + TERARANGER(const I2CSPIDriverConfig &config); ~TERARANGER() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); virtual int init() override; diff --git a/src/drivers/distance_sensor/teraranger/teraranger_main.cpp b/src/drivers/distance_sensor/teraranger/teraranger_main.cpp index cbb3b71a72..0b0efcaa7e 100644 --- a/src/drivers/distance_sensor/teraranger/teraranger_main.cpp +++ b/src/drivers/distance_sensor/teraranger/teraranger_main.cpp @@ -53,41 +53,24 @@ Setup/usage information: https://docs.px4.io/master/en/sensor/rangefinders.html# PRINT_MODULE_USAGE_SUBCATEGORY("distance_sensor"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x30); PRINT_MODULE_USAGE_PARAM_INT('R', 25, 0, 25, "Sensor rotation - downward facing by default", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *TERARANGER::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - TERARANGER *instance = new TERARANGER(iterator.configuredBusOption(), iterator.bus(), cli.orientation, cli.bus_frequency); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - instance->start(); - return instance; -} - extern "C" __EXPORT int teraranger_main(int argc, char *argv[]) { int ch; using ThisDriver = TERARANGER; BusCLIArguments cli{true, false}; - cli.orientation = distance_sensor_s::ROTATION_DOWNWARD_FACING; + cli.rotation = (Rotation)distance_sensor_s::ROTATION_DOWNWARD_FACING; cli.default_i2c_frequency = 100000; + cli.i2c_address = TERARANGER_ONE_BASEADDR; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { case 'R': - cli.orientation = atoi(cli.optArg()); + cli.rotation = (Rotation)atoi(cli.optArg()); break; } } diff --git a/src/drivers/distance_sensor/vl53l0x/VL53L0X.cpp b/src/drivers/distance_sensor/vl53l0x/VL53L0X.cpp index 3bc5214a20..f8cb207dfb 100644 --- a/src/drivers/distance_sensor/vl53l0x/VL53L0X.cpp +++ b/src/drivers/distance_sensor/vl53l0x/VL53L0X.cpp @@ -59,10 +59,10 @@ #define VL53L0X_BUS_CLOCK 400000 // 400kHz bus clock speed -VL53L0X::VL53L0X(I2CSPIBusOption bus_option, const int bus, const uint8_t rotation, int bus_frequency, int address) : - I2C(DRV_DIST_DEVTYPE_VL53L0X, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_rangefinder(get_device_id(), rotation) +VL53L0X::VL53L0X(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_rangefinder(get_device_id(), config.rotation) { // VL53L0X typical range 0-2 meters with 25 degree field of view _px4_rangefinder.set_min_distance(0.f); @@ -82,6 +82,18 @@ VL53L0X::~VL53L0X() perf_free(_comms_errors); } +int VL53L0X::init() +{ + int ret = I2C::init(); + + if (ret != PX4_OK) { + return ret; + } + + ScheduleNow(); + return PX4_OK; +} + int VL53L0X::collect() { // Read from the sensor. @@ -489,12 +501,6 @@ int VL53L0X::singleRefCalibration(const uint8_t byte) return PX4_OK; } -void VL53L0X::start() -{ - // Schedule the first cycle. - ScheduleNow(); -} - int VL53L0X::writeRegister(const uint8_t reg_address, const uint8_t value) { uint8_t cmd[2] {reg_address, value}; @@ -537,41 +543,24 @@ void VL53L0X::print_usage() PRINT_MODULE_USAGE_SUBCATEGORY("distance_sensor"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x29); PRINT_MODULE_USAGE_PARAM_INT('R', 25, 0, 25, "Sensor rotation - downward facing by default", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *VL53L0X::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - VL53L0X *instance = new VL53L0X(iterator.configuredBusOption(), iterator.bus(), cli.orientation, cli.bus_frequency); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - instance->start(); - return instance; -} - extern "C" __EXPORT int vl53l0x_main(int argc, char *argv[]) { int ch; using ThisDriver = VL53L0X; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = 400000; - cli.orientation = distance_sensor_s::ROTATION_DOWNWARD_FACING; + cli.rotation = (Rotation)distance_sensor_s::ROTATION_DOWNWARD_FACING; + cli.i2c_address = VL53L0X_BASEADDR; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { case 'R': - cli.orientation = atoi(cli.optArg()); + cli.rotation = (Rotation)atoi(cli.optArg()); break; } } diff --git a/src/drivers/distance_sensor/vl53l0x/VL53L0X.hpp b/src/drivers/distance_sensor/vl53l0x/VL53L0X.hpp index c07917d9a0..49ebd71c6f 100644 --- a/src/drivers/distance_sensor/vl53l0x/VL53L0X.hpp +++ b/src/drivers/distance_sensor/vl53l0x/VL53L0X.hpp @@ -54,13 +54,10 @@ class VL53L0X : public device::I2C, public I2CSPIDriver { public: - VL53L0X(I2CSPIBusOption bus_option, const int bus, const uint8_t rotation, int bus_frequency, - int address = VL53L0X_BASEADDR); + VL53L0X(const I2CSPIDriverConfig &config); ~VL53L0X() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); /** @@ -68,17 +65,14 @@ public: */ void print_status() override; - /** - * Initialise the automatic measurement state machine and start it. - */ - void start(); - /** * Perform a poll cycle; collect from the previous measurement * and start a new one. */ void RunImpl(); + int init() override; + private: int probe() override; diff --git a/src/drivers/distance_sensor/vl53l1x/vl53l1x.cpp b/src/drivers/distance_sensor/vl53l1x/vl53l1x.cpp index c91a8e8ea2..866fa19685 100644 --- a/src/drivers/distance_sensor/vl53l1x/vl53l1x.cpp +++ b/src/drivers/distance_sensor/vl53l1x/vl53l1x.cpp @@ -140,10 +140,10 @@ static const uint8_t status_rtn[24] = { 255, 255, 255, 5, 2, 4, 1, 7, 3, 0, /* end ST */ -VL53L1X::VL53L1X(I2CSPIBusOption bus_option, const int bus, const uint8_t rotation, int bus_frequency, int address) : - I2C(DRV_DIST_DEVTYPE_VL53L1X, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_rangefinder(get_device_id(), rotation) +VL53L1X::VL53L1X(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_rangefinder(get_device_id(), config.rotation) { // VL53L1X typical range 0-2 meters with 25 degree field of view _px4_rangefinder.set_min_distance(0.f); @@ -231,12 +231,6 @@ void VL53L1X::RunImpl() ScheduleDelayed(VL53L1X_SAMPLE_RATE); } -void VL53L1X::start() -{ - // Schedule the first cycle. - ScheduleNow(); -} - int VL53L1X::init() { int ret = PX4_OK; @@ -258,21 +252,18 @@ int VL53L1X::init() return PX4_ERROR; } - PX4_INFO("vl53l1x init success"); + PX4_DEBUG("vl53l1x init success"); + ScheduleNow(); return PX4_OK; } -void VL53L1X::stop() -{ - VL53L1X_StopRanging(); -} - void VL53L1X::print_usage() { PRINT_MODULE_USAGE_NAME("vl53l1x", "driver"); PRINT_MODULE_USAGE_SUBCATEGORY("distance_sensor"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x29); PRINT_MODULE_USAGE_PARAM_INT('R', 25, 1, 25, "Sensor rotation - downward facing by default", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } @@ -658,37 +649,19 @@ int8_t VL53L1X::VL53L1X_ConfigBig(uint16_t DM, uint16_t TimingBudgetInMs) /* end ST */ -I2CSPIDriverBase *VL53L1X::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - VL53L1X *instance = new VL53L1X(iterator.configuredBusOption(), iterator.bus(), cli.orientation, cli.bus_frequency); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - instance->start(); - return instance; -} - extern "C" __EXPORT int vl53l1x_main(int argc, char *argv[]) { int ch; using ThisDriver = VL53L1X; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = 400000; - cli.orientation = distance_sensor_s::ROTATION_DOWNWARD_FACING; + cli.rotation = (Rotation)distance_sensor_s::ROTATION_DOWNWARD_FACING; + cli.i2c_address = VL53L1X_BASEADDR; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { case 'R': - cli.orientation = atoi(cli.optArg()); + cli.rotation = (Rotation)atoi(cli.optArg()); break; } } diff --git a/src/drivers/distance_sensor/vl53l1x/vl53l1x.hpp b/src/drivers/distance_sensor/vl53l1x/vl53l1x.hpp index 3ac79644f7..1b5799e5fc 100644 --- a/src/drivers/distance_sensor/vl53l1x/vl53l1x.hpp +++ b/src/drivers/distance_sensor/vl53l1x/vl53l1x.hpp @@ -98,13 +98,10 @@ class VL53L1X : public device::I2C, public I2CSPIDriver { public: - VL53L1X(I2CSPIBusOption bus_option, const int bus, const uint8_t rotation, int bus_frequency, - int address = VL53L1X_BASEADDR); + VL53L1X(const I2CSPIDriverConfig &config); ~VL53L1X() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); /** @@ -112,16 +109,6 @@ public: */ void print_status() override; - /** - * Initialise the automatic measurement state machine and start it. - */ - void start(); - - /** - * Stop the automatic measurement state machine. - */ - void stop(); - virtual int init() override; /** diff --git a/src/drivers/imu/adis16477/ADIS16477.cpp b/src/drivers/imu/adis16477/ADIS16477.cpp index e0eec84b4a..98c9787eac 100644 --- a/src/drivers/imu/adis16477/ADIS16477.cpp +++ b/src/drivers/imu/adis16477/ADIS16477.cpp @@ -53,15 +53,14 @@ static constexpr uint32_t ADIS16477_DEFAULT_RATE = 1000; using namespace time_literals; -ADIS16477::ADIS16477(I2CSPIBusOption bus_option, int bus, int32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_ADIS16477, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation), +ADIS16477::ADIS16477(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), _bad_transfers(perf_alloc(PC_COUNT, MODULE_NAME": bad transfers")), - _drdy_gpio(drdy_gpio) + _drdy_gpio(config.drdy_gpio) { #ifdef GPIO_SPI1_RESET_ADIS16477 // Configure hardware reset line diff --git a/src/drivers/imu/adis16477/ADIS16477.hpp b/src/drivers/imu/adis16477/ADIS16477.hpp index 9a4d7ae80e..acd046e139 100644 --- a/src/drivers/imu/adis16477/ADIS16477.hpp +++ b/src/drivers/imu/adis16477/ADIS16477.hpp @@ -50,12 +50,9 @@ class ADIS16477 : public device::SPI, public I2CSPIDriver { public: - ADIS16477(I2CSPIBusOption bus_option, int bus, int32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + ADIS16477(const I2CSPIDriverConfig &config); virtual ~ADIS16477(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init(); diff --git a/src/drivers/imu/adis16477/adis16477_main.cpp b/src/drivers/imu/adis16477/adis16477_main.cpp index 1f42c34caf..d58f72e6df 100644 --- a/src/drivers/imu/adis16477/adis16477_main.cpp +++ b/src/drivers/imu/adis16477/adis16477_main.cpp @@ -47,25 +47,6 @@ ADIS16477::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ADIS16477::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ADIS16477 *instance = new ADIS16477(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int adis16477_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/adis16497/ADIS16497.cpp b/src/drivers/imu/adis16497/ADIS16497.cpp index 6d5396fb92..9b39f4a071 100644 --- a/src/drivers/imu/adis16497/ADIS16497.cpp +++ b/src/drivers/imu/adis16497/ADIS16497.cpp @@ -70,15 +70,14 @@ static constexpr uint32_t ADIS16497_DEFAULT_RATE = 1000; using namespace time_literals; -ADIS16497::ADIS16497(I2CSPIBusOption bus_option, int bus, int32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_ADIS16497, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation), +ADIS16497::ADIS16497(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), _bad_transfers(perf_alloc(PC_COUNT, MODULE_NAME": bad transfers")), - _drdy_gpio(drdy_gpio) + _drdy_gpio(config.drdy_gpio) { #ifdef GPIO_SPI1_RESET_ADIS16497 // Configure hardware reset line diff --git a/src/drivers/imu/adis16497/ADIS16497.hpp b/src/drivers/imu/adis16497/ADIS16497.hpp index a3f6e30473..5b7372c52f 100644 --- a/src/drivers/imu/adis16497/ADIS16497.hpp +++ b/src/drivers/imu/adis16497/ADIS16497.hpp @@ -86,12 +86,9 @@ static constexpr uint32_t crc32_tab[] = { class ADIS16497 : public device::SPI, public I2CSPIDriver { public: - ADIS16497(I2CSPIBusOption bus_option, int bus, int32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + ADIS16497(const I2CSPIDriverConfig &config); virtual ~ADIS16497(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init() override; diff --git a/src/drivers/imu/adis16497/adis16497_main.cpp b/src/drivers/imu/adis16497/adis16497_main.cpp index 63219bb777..d7e16832a9 100644 --- a/src/drivers/imu/adis16497/adis16497_main.cpp +++ b/src/drivers/imu/adis16497/adis16497_main.cpp @@ -47,25 +47,6 @@ ADIS16497::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ADIS16497::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ADIS16497 *instance = new ADIS16497(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int adis16497_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/analog_devices/adis16448/ADIS16448.cpp b/src/drivers/imu/analog_devices/adis16448/ADIS16448.cpp index c78045de9a..66309058a3 100644 --- a/src/drivers/imu/analog_devices/adis16448/ADIS16448.cpp +++ b/src/drivers/imu/analog_devices/adis16448/ADIS16448.cpp @@ -95,15 +95,14 @@ static int16_t convert12BitToINT16(uint16_t word) return output; } -ADIS16448::ADIS16448(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_ADIS16448, MODULE_NAME, bus, device, SPIDEV_MODE3, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), // TODO: DRDY disabled - _px4_accel(get_device_id(), rotation), +ADIS16448::ADIS16448(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), // TODO: DRDY disabled + _px4_accel(get_device_id(), config.rotation), _px4_baro(get_device_id()), - _px4_gyro(get_device_id(), rotation), - _px4_mag(get_device_id(), rotation) + _px4_gyro(get_device_id(), config.rotation), + _px4_mag(get_device_id(), config.rotation) { } diff --git a/src/drivers/imu/analog_devices/adis16448/ADIS16448.hpp b/src/drivers/imu/analog_devices/adis16448/ADIS16448.hpp index 6a86f5ae23..f57deeffb8 100644 --- a/src/drivers/imu/analog_devices/adis16448/ADIS16448.hpp +++ b/src/drivers/imu/analog_devices/adis16448/ADIS16448.hpp @@ -58,12 +58,9 @@ using namespace Analog_Devices_ADIS16448; class ADIS16448 : public device::SPI, public I2CSPIDriver { public: - ADIS16448(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_drdy_gpio_t drdy_gpio); + ADIS16448(const I2CSPIDriverConfig &config); ~ADIS16448() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/analog_devices/adis16448/adis16448_main.cpp b/src/drivers/imu/analog_devices/adis16448/adis16448_main.cpp index 3068d19821..55489ce3f9 100644 --- a/src/drivers/imu/analog_devices/adis16448/adis16448_main.cpp +++ b/src/drivers/imu/analog_devices/adis16448/adis16448_main.cpp @@ -46,25 +46,6 @@ void ADIS16448::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ADIS16448::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ADIS16448 *instance = new ADIS16448(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int adis16448_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/analog_devices/adis16470/ADIS16470.cpp b/src/drivers/imu/analog_devices/adis16470/ADIS16470.cpp index 882fdf93a1..bafa61ea0f 100644 --- a/src/drivers/imu/analog_devices/adis16470/ADIS16470.cpp +++ b/src/drivers/imu/analog_devices/adis16470/ADIS16470.cpp @@ -40,13 +40,12 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -ADIS16470::ADIS16470(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_ADIS16470, MODULE_NAME, bus, device, SPIDEV_MODE3, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +ADIS16470::ADIS16470(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { } diff --git a/src/drivers/imu/analog_devices/adis16470/ADIS16470.hpp b/src/drivers/imu/analog_devices/adis16470/ADIS16470.hpp index 9577495bae..31c68e926d 100644 --- a/src/drivers/imu/analog_devices/adis16470/ADIS16470.hpp +++ b/src/drivers/imu/analog_devices/adis16470/ADIS16470.hpp @@ -56,12 +56,9 @@ using namespace Analog_Devices_ADIS16470; class ADIS16470 : public device::SPI, public I2CSPIDriver { public: - ADIS16470(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_drdy_gpio_t drdy_gpio); + ADIS16470(const I2CSPIDriverConfig &config); ~ADIS16470() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/analog_devices/adis16470/adis16470_main.cpp b/src/drivers/imu/analog_devices/adis16470/adis16470_main.cpp index dd80dfcb75..079cd2535c 100644 --- a/src/drivers/imu/analog_devices/adis16470/adis16470_main.cpp +++ b/src/drivers/imu/analog_devices/adis16470/adis16470_main.cpp @@ -46,25 +46,6 @@ void ADIS16470::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ADIS16470::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ADIS16470 *instance = new ADIS16470(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int adis16470_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/bosch/bmi055/BMI055.cpp b/src/drivers/imu/bosch/bmi055/BMI055.cpp index 4b6582adeb..dc11e1b96b 100644 --- a/src/drivers/imu/bosch/bmi055/BMI055.cpp +++ b/src/drivers/imu/bosch/bmi055/BMI055.cpp @@ -36,18 +36,15 @@ #include "BMI055_Accelerometer.hpp" #include "BMI055_Gyroscope.hpp" -I2CSPIDriverBase *BMI055::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *BMI055::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { BMI055 *instance = nullptr; - if (cli.type == DRV_ACC_DEVTYPE_BMI055) { - instance = new Bosch::BMI055::Accelerometer::BMI055_Accelerometer(iterator.configuredBusOption(), iterator.bus(), - iterator.devid(), cli.rotation, cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); + if (config.devid_driver_index == DRV_ACC_DEVTYPE_BMI055) { + instance = new Bosch::BMI055::Accelerometer::BMI055_Accelerometer(config); - } else if (cli.type == DRV_GYR_DEVTYPE_BMI055) { - instance = new Bosch::BMI055::Gyroscope::BMI055_Gyroscope(iterator.configuredBusOption(), iterator.bus(), - iterator.devid(), cli.rotation, cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); + } else if (config.devid_driver_index == DRV_GYR_DEVTYPE_BMI055) { + instance = new Bosch::BMI055::Gyroscope::BMI055_Gyroscope(config); } if (!instance) { @@ -63,11 +60,10 @@ I2CSPIDriverBase *BMI055::instantiate(const BusCLIArguments &cli, const BusInsta return instance; } -BMI055::BMI055(uint8_t devtype, const char *name, I2CSPIBusOption bus_option, int bus, uint32_t device, - enum spi_mode_e mode, uint32_t frequency, spi_drdy_gpio_t drdy_gpio) : - SPI(devtype, name, bus, device, mode, frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, devtype), - _drdy_gpio(drdy_gpio) +BMI055::BMI055(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio) { } diff --git a/src/drivers/imu/bosch/bmi055/BMI055.hpp b/src/drivers/imu/bosch/bmi055/BMI055.hpp index af0e857ccf..4ee625cfe2 100644 --- a/src/drivers/imu/bosch/bmi055/BMI055.hpp +++ b/src/drivers/imu/bosch/bmi055/BMI055.hpp @@ -43,13 +43,11 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) { return (msb << 8u) class BMI055 : public device::SPI, public I2CSPIDriver { public: - BMI055(uint8_t devtype, const char *name, I2CSPIBusOption bus_option, int bus, uint32_t device, enum spi_mode_e mode, - uint32_t frequency, spi_drdy_gpio_t drdy_gpio); + BMI055(const I2CSPIDriverConfig &config); virtual ~BMI055() = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); virtual void RunImpl() = 0; diff --git a/src/drivers/imu/bosch/bmi055/BMI055_Accelerometer.cpp b/src/drivers/imu/bosch/bmi055/BMI055_Accelerometer.cpp index 27ed70a0ac..50c9d09c9b 100644 --- a/src/drivers/imu/bosch/bmi055/BMI055_Accelerometer.cpp +++ b/src/drivers/imu/bosch/bmi055/BMI055_Accelerometer.cpp @@ -40,12 +40,11 @@ using namespace time_literals; namespace Bosch::BMI055::Accelerometer { -BMI055_Accelerometer::BMI055_Accelerometer(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, - int bus_frequency, spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - BMI055(DRV_ACC_DEVTYPE_BMI055, "BMI055_Accelerometer", bus_option, bus, device, spi_mode, bus_frequency, drdy_gpio), - _px4_accel(get_device_id(), rotation) +BMI055_Accelerometer::BMI055_Accelerometer(const I2CSPIDriverConfig &config) : + BMI055(config), + _px4_accel(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (config.drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME"_accel: DRDY missed"); } diff --git a/src/drivers/imu/bosch/bmi055/BMI055_Accelerometer.hpp b/src/drivers/imu/bosch/bmi055/BMI055_Accelerometer.hpp index 80ef7831b2..299db7aa09 100644 --- a/src/drivers/imu/bosch/bmi055/BMI055_Accelerometer.hpp +++ b/src/drivers/imu/bosch/bmi055/BMI055_Accelerometer.hpp @@ -45,8 +45,7 @@ namespace Bosch::BMI055::Accelerometer class BMI055_Accelerometer : public BMI055 { public: - BMI055_Accelerometer(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + BMI055_Accelerometer(const I2CSPIDriverConfig &config); ~BMI055_Accelerometer() override; void RunImpl() override; diff --git a/src/drivers/imu/bosch/bmi055/BMI055_Gyroscope.cpp b/src/drivers/imu/bosch/bmi055/BMI055_Gyroscope.cpp index 6a18c2a7c5..e7761b27c4 100644 --- a/src/drivers/imu/bosch/bmi055/BMI055_Gyroscope.cpp +++ b/src/drivers/imu/bosch/bmi055/BMI055_Gyroscope.cpp @@ -40,12 +40,11 @@ using namespace time_literals; namespace Bosch::BMI055::Gyroscope { -BMI055_Gyroscope::BMI055_Gyroscope(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, - int bus_frequency, spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - BMI055(DRV_GYR_DEVTYPE_BMI055, "BMI055_Gyroscope", bus_option, bus, device, spi_mode, bus_frequency, drdy_gpio), - _px4_gyro(get_device_id(), rotation) +BMI055_Gyroscope::BMI055_Gyroscope(const I2CSPIDriverConfig &config) : + BMI055(config), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (config.drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME"_gyro: DRDY missed"); } diff --git a/src/drivers/imu/bosch/bmi055/BMI055_Gyroscope.hpp b/src/drivers/imu/bosch/bmi055/BMI055_Gyroscope.hpp index 54331abdc2..0428b66807 100644 --- a/src/drivers/imu/bosch/bmi055/BMI055_Gyroscope.hpp +++ b/src/drivers/imu/bosch/bmi055/BMI055_Gyroscope.hpp @@ -45,8 +45,7 @@ namespace Bosch::BMI055::Gyroscope class BMI055_Gyroscope : public BMI055 { public: - BMI055_Gyroscope(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + BMI055_Gyroscope(const I2CSPIDriverConfig &config); ~BMI055_Gyroscope() override; void RunImpl() override; diff --git a/src/drivers/imu/bosch/bmi055/bmi055_main.cpp b/src/drivers/imu/bosch/bmi055/bmi055_main.cpp index 293e620bde..62ff574675 100644 --- a/src/drivers/imu/bosch/bmi055/bmi055_main.cpp +++ b/src/drivers/imu/bosch/bmi055/bmi055_main.cpp @@ -53,17 +53,20 @@ extern "C" int bmi055_main(int argc, char *argv[]) int ch; using ThisDriver = BMI055; BusCLIArguments cli{false, true}; - cli.type = 0; + uint16_t type = 0; cli.default_spi_frequency = 10000000; + const char *name = MODULE_NAME; while ((ch = cli.getOpt(argc, argv, "AGR:")) != EOF) { switch (ch) { case 'A': - cli.type = DRV_ACC_DEVTYPE_BMI055; + type = DRV_ACC_DEVTYPE_BMI055; + name = MODULE_NAME "_accel"; break; case 'G': - cli.type = DRV_GYR_DEVTYPE_BMI055; + type = DRV_GYR_DEVTYPE_BMI055; + name = MODULE_NAME "_gyro"; break; case 'R': @@ -74,12 +77,12 @@ extern "C" int bmi055_main(int argc, char *argv[]) const char *verb = cli.optArg(); - if (!verb) { + if (!verb || type == 0) { ThisDriver::print_usage(); return -1; } - BusInstanceIterator iterator(MODULE_NAME, cli, cli.type); + BusInstanceIterator iterator(name, cli, type); if (!strcmp(verb, "start")) { return ThisDriver::module_start(cli, iterator); diff --git a/src/drivers/imu/bosch/bmi088/BMI088.cpp b/src/drivers/imu/bosch/bmi088/BMI088.cpp index e5cb4d69f9..63c6b895f2 100644 --- a/src/drivers/imu/bosch/bmi088/BMI088.cpp +++ b/src/drivers/imu/bosch/bmi088/BMI088.cpp @@ -36,18 +36,15 @@ #include "BMI088_Accelerometer.hpp" #include "BMI088_Gyroscope.hpp" -I2CSPIDriverBase *BMI088::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *BMI088::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { BMI088 *instance = nullptr; - if (cli.type == DRV_ACC_DEVTYPE_BMI088) { - instance = new Bosch::BMI088::Accelerometer::BMI088_Accelerometer(iterator.configuredBusOption(), iterator.bus(), - iterator.devid(), cli.rotation, cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); + if (config.devid_driver_index == DRV_ACC_DEVTYPE_BMI088) { + instance = new Bosch::BMI088::Accelerometer::BMI088_Accelerometer(config); - } else if (cli.type == DRV_GYR_DEVTYPE_BMI088) { - instance = new Bosch::BMI088::Gyroscope::BMI088_Gyroscope(iterator.configuredBusOption(), iterator.bus(), - iterator.devid(), cli.rotation, cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); + } else if (config.devid_driver_index == DRV_GYR_DEVTYPE_BMI088) { + instance = new Bosch::BMI088::Gyroscope::BMI088_Gyroscope(config); } if (!instance) { @@ -63,11 +60,10 @@ I2CSPIDriverBase *BMI088::instantiate(const BusCLIArguments &cli, const BusInsta return instance; } -BMI088::BMI088(uint8_t devtype, const char *name, I2CSPIBusOption bus_option, int bus, uint32_t device, - enum spi_mode_e mode, uint32_t frequency, spi_drdy_gpio_t drdy_gpio) : - SPI(devtype, name, bus, device, mode, frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, devtype), - _drdy_gpio(drdy_gpio) +BMI088::BMI088(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio) { } diff --git a/src/drivers/imu/bosch/bmi088/BMI088.hpp b/src/drivers/imu/bosch/bmi088/BMI088.hpp index 7f750feebf..7bfdd5e0f7 100644 --- a/src/drivers/imu/bosch/bmi088/BMI088.hpp +++ b/src/drivers/imu/bosch/bmi088/BMI088.hpp @@ -43,13 +43,11 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) { return (msb << 8u) class BMI088 : public device::SPI, public I2CSPIDriver { public: - BMI088(uint8_t devtype, const char *name, I2CSPIBusOption bus_option, int bus, uint32_t device, enum spi_mode_e mode, - uint32_t frequency, spi_drdy_gpio_t drdy_gpio); + BMI088(const I2CSPIDriverConfig &config); virtual ~BMI088() = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); virtual void RunImpl() = 0; diff --git a/src/drivers/imu/bosch/bmi088/BMI088_Accelerometer.cpp b/src/drivers/imu/bosch/bmi088/BMI088_Accelerometer.cpp index 9c9697c571..a7b516f2c4 100644 --- a/src/drivers/imu/bosch/bmi088/BMI088_Accelerometer.cpp +++ b/src/drivers/imu/bosch/bmi088/BMI088_Accelerometer.cpp @@ -40,12 +40,11 @@ using namespace time_literals; namespace Bosch::BMI088::Accelerometer { -BMI088_Accelerometer::BMI088_Accelerometer(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, - int bus_frequency, spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - BMI088(DRV_ACC_DEVTYPE_BMI088, "BMI088_Accelerometer", bus_option, bus, device, spi_mode, bus_frequency, drdy_gpio), - _px4_accel(get_device_id(), rotation) +BMI088_Accelerometer::BMI088_Accelerometer(const I2CSPIDriverConfig &config) : + BMI088(config), + _px4_accel(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (config.drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME"_accel: DRDY missed"); } diff --git a/src/drivers/imu/bosch/bmi088/BMI088_Accelerometer.hpp b/src/drivers/imu/bosch/bmi088/BMI088_Accelerometer.hpp index a7818e60dd..3ecf1b2d87 100644 --- a/src/drivers/imu/bosch/bmi088/BMI088_Accelerometer.hpp +++ b/src/drivers/imu/bosch/bmi088/BMI088_Accelerometer.hpp @@ -45,8 +45,7 @@ namespace Bosch::BMI088::Accelerometer class BMI088_Accelerometer : public BMI088 { public: - BMI088_Accelerometer(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + BMI088_Accelerometer(const I2CSPIDriverConfig &config); ~BMI088_Accelerometer() override; void RunImpl() override; diff --git a/src/drivers/imu/bosch/bmi088/BMI088_Gyroscope.cpp b/src/drivers/imu/bosch/bmi088/BMI088_Gyroscope.cpp index ef8e6a759e..e841600591 100644 --- a/src/drivers/imu/bosch/bmi088/BMI088_Gyroscope.cpp +++ b/src/drivers/imu/bosch/bmi088/BMI088_Gyroscope.cpp @@ -40,12 +40,11 @@ using namespace time_literals; namespace Bosch::BMI088::Gyroscope { -BMI088_Gyroscope::BMI088_Gyroscope(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, - int bus_frequency, spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - BMI088(DRV_GYR_DEVTYPE_BMI088, "BMI088_Gyroscope", bus_option, bus, device, spi_mode, bus_frequency, drdy_gpio), - _px4_gyro(get_device_id(), rotation) +BMI088_Gyroscope::BMI088_Gyroscope(const I2CSPIDriverConfig &config) : + BMI088(config), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (config.drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME"_gyro: DRDY missed"); } diff --git a/src/drivers/imu/bosch/bmi088/BMI088_Gyroscope.hpp b/src/drivers/imu/bosch/bmi088/BMI088_Gyroscope.hpp index dc6aa32b3b..47be30af98 100644 --- a/src/drivers/imu/bosch/bmi088/BMI088_Gyroscope.hpp +++ b/src/drivers/imu/bosch/bmi088/BMI088_Gyroscope.hpp @@ -45,8 +45,7 @@ namespace Bosch::BMI088::Gyroscope class BMI088_Gyroscope : public BMI088 { public: - BMI088_Gyroscope(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + BMI088_Gyroscope(const I2CSPIDriverConfig &config); ~BMI088_Gyroscope() override; void RunImpl() override; diff --git a/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088.cpp b/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088.cpp index 1e00b839ca..54a8b2eed2 100644 --- a/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088.cpp +++ b/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088.cpp @@ -36,18 +36,15 @@ #include "BMI088_Accelerometer.hpp" #include "BMI088_Gyroscope.hpp" -I2CSPIDriverBase *BMI088::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *BMI088::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { BMI088 *instance = nullptr; - if (cli.type == DRV_ACC_DEVTYPE_BMI088) { - instance = new Bosch::BMI088::Accelerometer::BMI088_Accelerometer(iterator.configuredBusOption(), iterator.bus(), - cli.i2c_address, cli.rotation, cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); + if (config.devid_driver_index == DRV_ACC_DEVTYPE_BMI088) { + instance = new Bosch::BMI088::Accelerometer::BMI088_Accelerometer(config); - } else if (cli.type == DRV_GYR_DEVTYPE_BMI088) { - instance = new Bosch::BMI088::Gyroscope::BMI088_Gyroscope(iterator.configuredBusOption(), iterator.bus(), - cli.i2c_address, cli.rotation, cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); + } else if (config.devid_driver_index == DRV_GYR_DEVTYPE_BMI088) { + instance = new Bosch::BMI088::Gyroscope::BMI088_Gyroscope(config); } if (!instance) { @@ -63,11 +60,10 @@ I2CSPIDriverBase *BMI088::instantiate(const BusCLIArguments &cli, const BusInsta return instance; } -BMI088::BMI088(uint8_t devtype, const char *name, I2CSPIBusOption bus_option, int bus, uint32_t device, - enum spi_mode_e mode, uint32_t frequency, spi_drdy_gpio_t drdy_gpio) : - I2C(devtype, name, bus, device, frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, devtype), - _drdy_gpio(drdy_gpio) +BMI088::BMI088(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio) { } diff --git a/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088.hpp b/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088.hpp index 1acf72e4e5..33b5f612fc 100644 --- a/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088.hpp +++ b/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088.hpp @@ -43,13 +43,11 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) { return (msb << 8u) class BMI088 : public device::I2C, public I2CSPIDriver { public: - BMI088(uint8_t devtype, const char *name, I2CSPIBusOption bus_option, int bus, uint32_t device, enum spi_mode_e mode, - uint32_t frequency, spi_drdy_gpio_t drdy_gpio); + BMI088(const I2CSPIDriverConfig &config); virtual ~BMI088() = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); virtual void RunImpl() = 0; diff --git a/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Accelerometer.cpp b/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Accelerometer.cpp index e7d00b354f..5accde470c 100644 --- a/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Accelerometer.cpp +++ b/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Accelerometer.cpp @@ -39,12 +39,11 @@ using namespace time_literals; namespace Bosch::BMI088::Accelerometer { -BMI088_Accelerometer::BMI088_Accelerometer(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, - int bus_frequency, spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - BMI088(DRV_ACC_DEVTYPE_BMI088, "BMI088_Accelerometer", bus_option, bus, device, spi_mode, bus_frequency, drdy_gpio), - _px4_accel(get_device_id(), rotation) +BMI088_Accelerometer::BMI088_Accelerometer(const I2CSPIDriverConfig &config) : + BMI088(config), + _px4_accel(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (config.drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME"_accel: DRDY missed"); } diff --git a/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Accelerometer.hpp b/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Accelerometer.hpp index b46bd23c51..edb540a270 100644 --- a/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Accelerometer.hpp +++ b/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Accelerometer.hpp @@ -45,8 +45,7 @@ namespace Bosch::BMI088::Accelerometer class BMI088_Accelerometer : public BMI088 { public: - BMI088_Accelerometer(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + BMI088_Accelerometer(const I2CSPIDriverConfig &config); ~BMI088_Accelerometer() override; void RunImpl() override; diff --git a/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Gyroscope.cpp b/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Gyroscope.cpp index 3475ff58d9..88bf5ad9f6 100644 --- a/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Gyroscope.cpp +++ b/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Gyroscope.cpp @@ -40,12 +40,11 @@ using namespace time_literals; namespace Bosch::BMI088::Gyroscope { -BMI088_Gyroscope::BMI088_Gyroscope(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, - int bus_frequency, spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - BMI088(DRV_GYR_DEVTYPE_BMI088, "BMI088_Gyroscope", bus_option, bus, device, spi_mode, bus_frequency, drdy_gpio), - _px4_gyro(get_device_id(), rotation) +BMI088_Gyroscope::BMI088_Gyroscope(const I2CSPIDriverConfig &config) : + BMI088(config), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (config.drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME"_gyro: DRDY missed"); } diff --git a/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Gyroscope.hpp b/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Gyroscope.hpp index 865e1069d1..4ccbb8e26b 100644 --- a/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Gyroscope.hpp +++ b/src/drivers/imu/bosch/bmi088/bmi088_i2c/BMI088_Gyroscope.hpp @@ -45,8 +45,7 @@ namespace Bosch::BMI088::Gyroscope class BMI088_Gyroscope : public BMI088 { public: - BMI088_Gyroscope(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + BMI088_Gyroscope(const I2CSPIDriverConfig &config); ~BMI088_Gyroscope() override; void RunImpl() override; diff --git a/src/drivers/imu/bosch/bmi088/bmi088_i2c/bmi088_i2c_main.cpp b/src/drivers/imu/bosch/bmi088/bmi088_i2c/bmi088_i2c_main.cpp index e5d7f0b414..34f5c46f9c 100644 --- a/src/drivers/imu/bosch/bmi088/bmi088_i2c/bmi088_i2c_main.cpp +++ b/src/drivers/imu/bosch/bmi088/bmi088_i2c/bmi088_i2c_main.cpp @@ -45,7 +45,7 @@ void BMI088::print_usage() PRINT_MODULE_USAGE_PARAM_FLAG('A', "Accel", true); PRINT_MODULE_USAGE_PARAM_FLAG('G', "Gyro", true); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); - PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x76); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x18); PRINT_MODULE_USAGE_PARAM_INT('R', 0, 0, 35, "Rotation", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } @@ -54,21 +54,24 @@ extern "C" int bmi088_i2c_main(int argc, char *argv[]) { int ch; using ThisDriver = BMI088; - BusCLIArguments cli{true, true}; + BusCLIArguments cli{true, false}; cli.i2c_address = 0x18; cli.default_i2c_frequency = 400 * 1000; - cli.default_spi_frequency = 400 * 1000; + uint16_t type = 0; + const char *name = MODULE_NAME; while ((ch = cli.getOpt(argc, argv, "AGR:")) != EOF) { switch (ch) { case 'A': - cli.type = DRV_ACC_DEVTYPE_BMI088; + type = DRV_ACC_DEVTYPE_BMI088; + name = MODULE_NAME "_accel"; cli.i2c_address = 0x18; break; case 'G': - cli.type = DRV_GYR_DEVTYPE_BMI088; + type = DRV_GYR_DEVTYPE_BMI088; + name = MODULE_NAME "_gyro"; cli.i2c_address = 0x69; break; @@ -80,12 +83,12 @@ extern "C" int bmi088_i2c_main(int argc, char *argv[]) const char *verb = cli.optArg(); - if (!verb) { + if (!verb || type == 0) { ThisDriver::print_usage(); return -1; } - BusInstanceIterator iterator(MODULE_NAME, cli, cli.type); + BusInstanceIterator iterator(name, cli, type); if (!strcmp(verb, "start")) { return ThisDriver::module_start(cli, iterator); diff --git a/src/drivers/imu/bosch/bmi088/bmi088_main.cpp b/src/drivers/imu/bosch/bmi088/bmi088_main.cpp index 348e3705c0..155ca904ae 100644 --- a/src/drivers/imu/bosch/bmi088/bmi088_main.cpp +++ b/src/drivers/imu/bosch/bmi088/bmi088_main.cpp @@ -53,17 +53,20 @@ extern "C" int bmi088_main(int argc, char *argv[]) int ch; using ThisDriver = BMI088; BusCLIArguments cli{false, true}; - cli.type = 0; + uint16_t type = 0; cli.default_spi_frequency = 10000000; + const char *name = MODULE_NAME; while ((ch = cli.getOpt(argc, argv, "AGR:")) != EOF) { switch (ch) { case 'A': - cli.type = DRV_ACC_DEVTYPE_BMI088; + type = DRV_ACC_DEVTYPE_BMI088; + name = MODULE_NAME "_accel"; break; case 'G': - cli.type = DRV_GYR_DEVTYPE_BMI088; + type = DRV_GYR_DEVTYPE_BMI088; + name = MODULE_NAME "_gyro"; break; case 'R': @@ -74,12 +77,12 @@ extern "C" int bmi088_main(int argc, char *argv[]) const char *verb = cli.optArg(); - if (!verb) { + if (!verb || type == 0) { ThisDriver::print_usage(); return -1; } - BusInstanceIterator iterator(MODULE_NAME, cli, cli.type); + BusInstanceIterator iterator(name, cli, type); if (!strcmp(verb, "start")) { return ThisDriver::module_start(cli, iterator); diff --git a/src/drivers/imu/fxas21002c/FXAS21002C.cpp b/src/drivers/imu/fxas21002c/FXAS21002C.cpp index 0a7e9161ae..9f755f4d8d 100644 --- a/src/drivers/imu/fxas21002c/FXAS21002C.cpp +++ b/src/drivers/imu/fxas21002c/FXAS21002C.cpp @@ -65,11 +65,10 @@ static constexpr uint8_t _checked_registers[] { using namespace time_literals; -FXAS21002C::FXAS21002C(device::Device *interface, I2CSPIBusOption bus_option, int bus, enum Rotation rotation, - int i2c_address) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus, i2c_address), +FXAS21002C::FXAS21002C(device::Device *interface, const I2CSPIDriverConfig &config) : + I2CSPIDriver(config), _interface(interface), - _px4_gyro(_interface->get_device_id(), rotation), + _px4_gyro(_interface->get_device_id(), config.rotation), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), _errors(perf_alloc(PC_COUNT, MODULE_NAME": err")), _bad_registers(perf_alloc(PC_COUNT, MODULE_NAME": bad register")), diff --git a/src/drivers/imu/fxas21002c/FXAS21002C.hpp b/src/drivers/imu/fxas21002c/FXAS21002C.hpp index 57ba1a719a..0c21eb70fd 100644 --- a/src/drivers/imu/fxas21002c/FXAS21002C.hpp +++ b/src/drivers/imu/fxas21002c/FXAS21002C.hpp @@ -191,11 +191,10 @@ struct RawGyroReport { class FXAS21002C : public I2CSPIDriver { public: - FXAS21002C(device::Device *interface, I2CSPIBusOption bus_option, int bus, enum Rotation rotation, int i2c_address); + FXAS21002C(device::Device *interface, const I2CSPIDriverConfig &config); virtual ~FXAS21002C(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); int init(); diff --git a/src/drivers/imu/fxas21002c/fxas21002c_main.cpp b/src/drivers/imu/fxas21002c/fxas21002c_main.cpp index 991f089766..4d359d99da 100644 --- a/src/drivers/imu/fxas21002c/fxas21002c_main.cpp +++ b/src/drivers/imu/fxas21002c/fxas21002c_main.cpp @@ -50,16 +50,15 @@ FXAS21002C::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *FXAS21002C::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *FXAS21002C::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { device::Device *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = FXAS21002C_I2C_interface(iterator.bus(), cli.bus_frequency, cli.i2c_address); + if (config.bus_type == BOARD_I2C_BUS) { + interface = FXAS21002C_I2C_interface(config.bus, config.bus_frequency, config.i2c_address); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = FXAS21002C_SPI_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = FXAS21002C_SPI_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { @@ -67,8 +66,7 @@ I2CSPIDriverBase *FXAS21002C::instantiate(const BusCLIArguments &cli, const BusI return nullptr; } - FXAS21002C *dev = new FXAS21002C(interface, iterator.configuredBusOption(), iterator.bus(), cli.rotation, - cli.i2c_address); + FXAS21002C *dev = new FXAS21002C(interface, config); if (dev == nullptr) { delete interface; diff --git a/src/drivers/imu/fxos8701cq/FXOS8701CQ.cpp b/src/drivers/imu/fxos8701cq/FXOS8701CQ.cpp index ff22e5f242..fc5a22d214 100644 --- a/src/drivers/imu/fxos8701cq/FXOS8701CQ.cpp +++ b/src/drivers/imu/fxos8701cq/FXOS8701CQ.cpp @@ -53,13 +53,12 @@ const uint8_t FXOS8701CQ::_checked_registers[FXOS8701C_NUM_CHECKED_REGISTERS] = FXOS8701CQ_M_CTRL_REG2, }; -FXOS8701CQ::FXOS8701CQ(device::Device *interface, I2CSPIBusOption bus_option, int bus, enum Rotation rotation, - int i2c_address) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus, i2c_address), +FXOS8701CQ::FXOS8701CQ(device::Device *interface, const I2CSPIDriverConfig &config) : + I2CSPIDriver(config), _interface(interface), - _px4_accel(interface->get_device_id(), rotation), + _px4_accel(interface->get_device_id(), config.rotation), #if !defined(BOARD_HAS_NOISY_FXOS8700_MAG) - _px4_mag(interface->get_device_id(), rotation), + _px4_mag(interface->get_device_id(), config.rotation), _mag_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": mag read")), #endif _accel_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": acc read")), diff --git a/src/drivers/imu/fxos8701cq/FXOS8701CQ.hpp b/src/drivers/imu/fxos8701cq/FXOS8701CQ.hpp index c9ace08ae2..98837b10a0 100644 --- a/src/drivers/imu/fxos8701cq/FXOS8701CQ.hpp +++ b/src/drivers/imu/fxos8701cq/FXOS8701CQ.hpp @@ -138,11 +138,10 @@ extern device::Device *FXOS8701CQ_I2C_interface(int bus, int bus_frequency, int class FXOS8701CQ : public I2CSPIDriver { public: - FXOS8701CQ(device::Device *interface, I2CSPIBusOption bus_option, int bus, enum Rotation rotation, int i2c_address); + FXOS8701CQ(device::Device *interface, const I2CSPIDriverConfig &config); virtual ~FXOS8701CQ(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); int init(); diff --git a/src/drivers/imu/fxos8701cq/fxos8701cq_main.cpp b/src/drivers/imu/fxos8701cq/fxos8701cq_main.cpp index 0341c6fc51..c0670242ac 100644 --- a/src/drivers/imu/fxos8701cq/fxos8701cq_main.cpp +++ b/src/drivers/imu/fxos8701cq/fxos8701cq_main.cpp @@ -56,16 +56,15 @@ FXOS8701CQ::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *FXOS8701CQ::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *FXOS8701CQ::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { device::Device *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = FXOS8701CQ_I2C_interface(iterator.bus(), cli.bus_frequency, cli.i2c_address); + if (config.bus_type == BOARD_I2C_BUS) { + interface = FXOS8701CQ_I2C_interface(config.bus, config.bus_frequency, config.i2c_address); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = FXOS8701CQ_SPI_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = FXOS8701CQ_SPI_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { @@ -73,8 +72,7 @@ I2CSPIDriverBase *FXOS8701CQ::instantiate(const BusCLIArguments &cli, const BusI return nullptr; } - FXOS8701CQ *dev = new FXOS8701CQ(interface, iterator.configuredBusOption(), iterator.bus(), cli.rotation, - cli.i2c_address); + FXOS8701CQ *dev = new FXOS8701CQ(interface, config); if (dev == nullptr) { delete interface; diff --git a/src/drivers/imu/invensense/icm20602/ICM20602.cpp b/src/drivers/imu/invensense/icm20602/ICM20602.cpp index eb5f67c45b..a064f80ed6 100644 --- a/src/drivers/imu/invensense/icm20602/ICM20602.cpp +++ b/src/drivers/imu/invensense/icm20602/ICM20602.cpp @@ -40,15 +40,14 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -ICM20602::ICM20602(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_ICM20602, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +ICM20602::ICM20602(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (_drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); } diff --git a/src/drivers/imu/invensense/icm20602/ICM20602.hpp b/src/drivers/imu/invensense/icm20602/ICM20602.hpp index bcfba10397..34a4fb118c 100644 --- a/src/drivers/imu/invensense/icm20602/ICM20602.hpp +++ b/src/drivers/imu/invensense/icm20602/ICM20602.hpp @@ -56,12 +56,9 @@ using namespace InvenSense_ICM20602; class ICM20602 : public device::SPI, public I2CSPIDriver { public: - ICM20602(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + ICM20602(const I2CSPIDriverConfig &config); ~ICM20602() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/icm20602/icm20602_main.cpp b/src/drivers/imu/invensense/icm20602/icm20602_main.cpp index c6cb801060..28c88d0fb7 100644 --- a/src/drivers/imu/invensense/icm20602/icm20602_main.cpp +++ b/src/drivers/imu/invensense/icm20602/icm20602_main.cpp @@ -46,25 +46,6 @@ void ICM20602::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ICM20602::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ICM20602 *instance = new ICM20602(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int icm20602_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/invensense/icm20608g/ICM20608G.cpp b/src/drivers/imu/invensense/icm20608g/ICM20608G.cpp index 3475d227bc..837ddffaad 100644 --- a/src/drivers/imu/invensense/icm20608g/ICM20608G.cpp +++ b/src/drivers/imu/invensense/icm20608g/ICM20608G.cpp @@ -40,15 +40,14 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -ICM20608G::ICM20608G(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_ICM20608G, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +ICM20608G::ICM20608G(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (_drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); } diff --git a/src/drivers/imu/invensense/icm20608g/ICM20608G.hpp b/src/drivers/imu/invensense/icm20608g/ICM20608G.hpp index 7736f2d565..a6400ceb57 100644 --- a/src/drivers/imu/invensense/icm20608g/ICM20608G.hpp +++ b/src/drivers/imu/invensense/icm20608g/ICM20608G.hpp @@ -56,12 +56,9 @@ using namespace InvenSense_ICM20608G; class ICM20608G : public device::SPI, public I2CSPIDriver { public: - ICM20608G(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + ICM20608G(const I2CSPIDriverConfig &config); ~ICM20608G() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/icm20608g/icm20608g_main.cpp b/src/drivers/imu/invensense/icm20608g/icm20608g_main.cpp index a0377c66e5..f32d4ba620 100644 --- a/src/drivers/imu/invensense/icm20608g/icm20608g_main.cpp +++ b/src/drivers/imu/invensense/icm20608g/icm20608g_main.cpp @@ -46,25 +46,6 @@ void ICM20608G::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ICM20608G::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ICM20608G *instance = new ICM20608G(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int icm20608g_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/invensense/icm20649/ICM20649.cpp b/src/drivers/imu/invensense/icm20649/ICM20649.cpp index 03e4066414..ac15c04246 100644 --- a/src/drivers/imu/invensense/icm20649/ICM20649.cpp +++ b/src/drivers/imu/invensense/icm20649/ICM20649.cpp @@ -40,15 +40,14 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -ICM20649::ICM20649(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_ICM20649, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +ICM20649::ICM20649(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (_drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); } diff --git a/src/drivers/imu/invensense/icm20649/ICM20649.hpp b/src/drivers/imu/invensense/icm20649/ICM20649.hpp index 95e5b8ed06..cffaf9d76c 100644 --- a/src/drivers/imu/invensense/icm20649/ICM20649.hpp +++ b/src/drivers/imu/invensense/icm20649/ICM20649.hpp @@ -56,12 +56,9 @@ using namespace InvenSense_ICM20649; class ICM20649 : public device::SPI, public I2CSPIDriver { public: - ICM20649(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + ICM20649(const I2CSPIDriverConfig &config); ~ICM20649() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/icm20649/icm20649_main.cpp b/src/drivers/imu/invensense/icm20649/icm20649_main.cpp index 853c95a142..d46a59e291 100644 --- a/src/drivers/imu/invensense/icm20649/icm20649_main.cpp +++ b/src/drivers/imu/invensense/icm20649/icm20649_main.cpp @@ -46,25 +46,6 @@ void ICM20649::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ICM20649::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ICM20649 *instance = new ICM20649(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int icm20649_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/invensense/icm20689/ICM20689.cpp b/src/drivers/imu/invensense/icm20689/ICM20689.cpp index e974f0d81e..9c48369f6b 100644 --- a/src/drivers/imu/invensense/icm20689/ICM20689.cpp +++ b/src/drivers/imu/invensense/icm20689/ICM20689.cpp @@ -40,15 +40,14 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -ICM20689::ICM20689(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_ICM20689, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +ICM20689::ICM20689(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (_drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); } diff --git a/src/drivers/imu/invensense/icm20689/ICM20689.hpp b/src/drivers/imu/invensense/icm20689/ICM20689.hpp index 919409744d..794011e155 100644 --- a/src/drivers/imu/invensense/icm20689/ICM20689.hpp +++ b/src/drivers/imu/invensense/icm20689/ICM20689.hpp @@ -56,12 +56,9 @@ using namespace InvenSense_ICM20689; class ICM20689 : public device::SPI, public I2CSPIDriver { public: - ICM20689(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + ICM20689(const I2CSPIDriverConfig &config); ~ICM20689() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/icm20689/icm20689_main.cpp b/src/drivers/imu/invensense/icm20689/icm20689_main.cpp index 5562d83e14..bd2d31527f 100644 --- a/src/drivers/imu/invensense/icm20689/icm20689_main.cpp +++ b/src/drivers/imu/invensense/icm20689/icm20689_main.cpp @@ -46,25 +46,6 @@ void ICM20689::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ICM20689::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ICM20689 *instance = new ICM20689(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int icm20689_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/invensense/icm20948/ICM20948.cpp b/src/drivers/imu/invensense/icm20948/ICM20948.cpp index ff91703d82..0b8da3cb9b 100644 --- a/src/drivers/imu/invensense/icm20948/ICM20948.cpp +++ b/src/drivers/imu/invensense/icm20948/ICM20948.cpp @@ -42,22 +42,23 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -ICM20948::ICM20948(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio, bool enable_magnetometer) : - SPI(DRV_IMU_DEVTYPE_ICM20948, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +ICM20948::ICM20948(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (_drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); } ConfigureSampleRate(_px4_gyro.get_max_rate_hz()); + bool enable_magnetometer = config.custom1 == 1; + if (enable_magnetometer) { - _slave_ak09916_magnetometer = new AKM_AK09916::ICM20948_AK09916(*this, rotation); + _slave_ak09916_magnetometer = new AKM_AK09916::ICM20948_AK09916(*this, config.rotation); if (_slave_ak09916_magnetometer) { for (auto &r : _register_bank3_cfg) { diff --git a/src/drivers/imu/invensense/icm20948/ICM20948.hpp b/src/drivers/imu/invensense/icm20948/ICM20948.hpp index 2f9c93d6af..6a2fff6bd9 100644 --- a/src/drivers/imu/invensense/icm20948/ICM20948.hpp +++ b/src/drivers/imu/invensense/icm20948/ICM20948.hpp @@ -58,12 +58,9 @@ using namespace InvenSense_ICM20948; class ICM20948 : public device::SPI, public I2CSPIDriver { public: - ICM20948(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio, bool enable_magnetometer = false); + ICM20948(const I2CSPIDriverConfig &config); ~ICM20948() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/icm20948/ICM20948_I2C_Passthrough.cpp b/src/drivers/imu/invensense/icm20948/ICM20948_I2C_Passthrough.cpp index ebdf3e00b1..c5cd3555a0 100644 --- a/src/drivers/imu/invensense/icm20948/ICM20948_I2C_Passthrough.cpp +++ b/src/drivers/imu/invensense/icm20948/ICM20948_I2C_Passthrough.cpp @@ -40,10 +40,9 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -ICM20948_I2C_Passthrough::ICM20948_I2C_Passthrough(I2CSPIBusOption bus_option, int bus, int bus_frequency, - const int address) : - I2C(DRV_IMU_DEVTYPE_ICM20948, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address) +ICM20948_I2C_Passthrough::ICM20948_I2C_Passthrough(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config) { } diff --git a/src/drivers/imu/invensense/icm20948/ICM20948_I2C_Passthrough.hpp b/src/drivers/imu/invensense/icm20948/ICM20948_I2C_Passthrough.hpp index 76ff259ce0..bb3a998f49 100644 --- a/src/drivers/imu/invensense/icm20948/ICM20948_I2C_Passthrough.hpp +++ b/src/drivers/imu/invensense/icm20948/ICM20948_I2C_Passthrough.hpp @@ -53,11 +53,9 @@ using namespace InvenSense_ICM20948; class ICM20948_I2C_Passthrough : public device::I2C, public I2CSPIDriver { public: - ICM20948_I2C_Passthrough(I2CSPIBusOption bus_option, int bus, int bus_frequency, const int address); + ICM20948_I2C_Passthrough(const I2CSPIDriverConfig &config); ~ICM20948_I2C_Passthrough() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/icm20948/icm20948_i2c_passthrough_main.cpp b/src/drivers/imu/invensense/icm20948/icm20948_i2c_passthrough_main.cpp index 5230399d51..ea98288acd 100644 --- a/src/drivers/imu/invensense/icm20948/icm20948_i2c_passthrough_main.cpp +++ b/src/drivers/imu/invensense/icm20948/icm20948_i2c_passthrough_main.cpp @@ -46,25 +46,6 @@ void ICM20948_I2C_Passthrough::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ICM20948_I2C_Passthrough::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ICM20948_I2C_Passthrough *instance = new ICM20948_I2C_Passthrough(iterator.configuredBusOption(), iterator.bus(), - cli.bus_frequency, cli.i2c_address); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int icm20948_i2c_passthrough_main(int argc, char *argv[]) { using ThisDriver = ICM20948_I2C_Passthrough; diff --git a/src/drivers/imu/invensense/icm20948/icm20948_main.cpp b/src/drivers/imu/invensense/icm20948/icm20948_main.cpp index 2fed4115e5..bab15cb3cd 100644 --- a/src/drivers/imu/invensense/icm20948/icm20948_main.cpp +++ b/src/drivers/imu/invensense/icm20948/icm20948_main.cpp @@ -47,26 +47,6 @@ void ICM20948::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ICM20948::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - bool mag = (cli.custom1 == 1); - ICM20948 *instance = new ICM20948(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO(), mag); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int icm20948_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/invensense/icm40609d/ICM40609D.cpp b/src/drivers/imu/invensense/icm40609d/ICM40609D.cpp index 881be246f9..eb4576a646 100644 --- a/src/drivers/imu/invensense/icm40609d/ICM40609D.cpp +++ b/src/drivers/imu/invensense/icm40609d/ICM40609D.cpp @@ -40,15 +40,14 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -ICM40609D::ICM40609D(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_ICM40609D, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), +ICM40609D::ICM40609D(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (_drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); } diff --git a/src/drivers/imu/invensense/icm40609d/ICM40609D.hpp b/src/drivers/imu/invensense/icm40609d/ICM40609D.hpp index 1b7578246a..778f823e42 100644 --- a/src/drivers/imu/invensense/icm40609d/ICM40609D.hpp +++ b/src/drivers/imu/invensense/icm40609d/ICM40609D.hpp @@ -56,12 +56,9 @@ using namespace InvenSense_ICM40609D; class ICM40609D : public device::SPI, public I2CSPIDriver { public: - ICM40609D(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + ICM40609D(const I2CSPIDriverConfig &config); ~ICM40609D() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/icm40609d/icm40609d_main.cpp b/src/drivers/imu/invensense/icm40609d/icm40609d_main.cpp index f007df8585..92480f0599 100644 --- a/src/drivers/imu/invensense/icm40609d/icm40609d_main.cpp +++ b/src/drivers/imu/invensense/icm40609d/icm40609d_main.cpp @@ -46,25 +46,6 @@ void ICM40609D::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ICM40609D::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ICM40609D *instance = new ICM40609D(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int icm40609d_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/invensense/icm42605/ICM42605.cpp b/src/drivers/imu/invensense/icm42605/ICM42605.cpp index 60827cd0a7..be4ba11ff0 100644 --- a/src/drivers/imu/invensense/icm42605/ICM42605.cpp +++ b/src/drivers/imu/invensense/icm42605/ICM42605.cpp @@ -40,15 +40,14 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -ICM42605::ICM42605(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_ICM42605, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +ICM42605::ICM42605(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (_drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); } diff --git a/src/drivers/imu/invensense/icm42605/ICM42605.hpp b/src/drivers/imu/invensense/icm42605/ICM42605.hpp index bc3a4670ce..cc4f0b0ab1 100644 --- a/src/drivers/imu/invensense/icm42605/ICM42605.hpp +++ b/src/drivers/imu/invensense/icm42605/ICM42605.hpp @@ -56,12 +56,9 @@ using namespace InvenSense_ICM42605; class ICM42605 : public device::SPI, public I2CSPIDriver { public: - ICM42605(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + ICM42605(const I2CSPIDriverConfig &config); ~ICM42605() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/icm42605/icm42605_main.cpp b/src/drivers/imu/invensense/icm42605/icm42605_main.cpp index f07fd19224..4dd6fa2e37 100644 --- a/src/drivers/imu/invensense/icm42605/icm42605_main.cpp +++ b/src/drivers/imu/invensense/icm42605/icm42605_main.cpp @@ -46,25 +46,6 @@ void ICM42605::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ICM42605::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ICM42605 *instance = new ICM42605(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int icm42605_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/invensense/icm42688p/ICM42688P.cpp b/src/drivers/imu/invensense/icm42688p/ICM42688P.cpp index e2f22c046d..290dc0a180 100644 --- a/src/drivers/imu/invensense/icm42688p/ICM42688P.cpp +++ b/src/drivers/imu/invensense/icm42688p/ICM42688P.cpp @@ -40,15 +40,14 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -ICM42688P::ICM42688P(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_ICM42688P, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +ICM42688P::ICM42688P(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (config.drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); } diff --git a/src/drivers/imu/invensense/icm42688p/ICM42688P.hpp b/src/drivers/imu/invensense/icm42688p/ICM42688P.hpp index 07464e3911..ac6d4599af 100644 --- a/src/drivers/imu/invensense/icm42688p/ICM42688P.hpp +++ b/src/drivers/imu/invensense/icm42688p/ICM42688P.hpp @@ -56,12 +56,9 @@ using namespace InvenSense_ICM42688P; class ICM42688P : public device::SPI, public I2CSPIDriver { public: - ICM42688P(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + ICM42688P(const I2CSPIDriverConfig &config); ~ICM42688P() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/icm42688p/icm42688p_main.cpp b/src/drivers/imu/invensense/icm42688p/icm42688p_main.cpp index 262028e016..618d57fea2 100644 --- a/src/drivers/imu/invensense/icm42688p/icm42688p_main.cpp +++ b/src/drivers/imu/invensense/icm42688p/icm42688p_main.cpp @@ -46,25 +46,6 @@ void ICM42688P::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *ICM42688P::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - ICM42688P *instance = new ICM42688P(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int icm42688p_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/invensense/mpu6000/MPU6000.cpp b/src/drivers/imu/invensense/mpu6000/MPU6000.cpp index 86c69ed07b..d8915623cb 100644 --- a/src/drivers/imu/invensense/mpu6000/MPU6000.cpp +++ b/src/drivers/imu/invensense/mpu6000/MPU6000.cpp @@ -40,15 +40,14 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -MPU6000::MPU6000(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_MPU6000, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +MPU6000::MPU6000(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (config.drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); } diff --git a/src/drivers/imu/invensense/mpu6000/MPU6000.hpp b/src/drivers/imu/invensense/mpu6000/MPU6000.hpp index 86eb5b9ecc..902a657191 100644 --- a/src/drivers/imu/invensense/mpu6000/MPU6000.hpp +++ b/src/drivers/imu/invensense/mpu6000/MPU6000.hpp @@ -56,12 +56,9 @@ using namespace InvenSense_MPU6000; class MPU6000 : public device::SPI, public I2CSPIDriver { public: - MPU6000(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + MPU6000(const I2CSPIDriverConfig &config); ~MPU6000() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/mpu6000/mpu6000_main.cpp b/src/drivers/imu/invensense/mpu6000/mpu6000_main.cpp index 9d2cc3fa9f..f1ed1b24be 100644 --- a/src/drivers/imu/invensense/mpu6000/mpu6000_main.cpp +++ b/src/drivers/imu/invensense/mpu6000/mpu6000_main.cpp @@ -46,25 +46,6 @@ void MPU6000::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *MPU6000::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - MPU6000 *instance = new MPU6000(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int mpu6000_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/invensense/mpu6500/MPU6500.cpp b/src/drivers/imu/invensense/mpu6500/MPU6500.cpp index a172b50e38..d7d3dc1ab5 100644 --- a/src/drivers/imu/invensense/mpu6500/MPU6500.cpp +++ b/src/drivers/imu/invensense/mpu6500/MPU6500.cpp @@ -40,15 +40,14 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -MPU6500::MPU6500(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio) : - SPI(DRV_IMU_DEVTYPE_MPU6500, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +MPU6500::MPU6500(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (config.drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); } diff --git a/src/drivers/imu/invensense/mpu6500/MPU6500.hpp b/src/drivers/imu/invensense/mpu6500/MPU6500.hpp index 7f594a98b5..0fb6a21b53 100644 --- a/src/drivers/imu/invensense/mpu6500/MPU6500.hpp +++ b/src/drivers/imu/invensense/mpu6500/MPU6500.hpp @@ -56,12 +56,9 @@ using namespace InvenSense_MPU6500; class MPU6500 : public device::SPI, public I2CSPIDriver { public: - MPU6500(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); + MPU6500(const I2CSPIDriverConfig &config); ~MPU6500() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/mpu6500/mpu6500_main.cpp b/src/drivers/imu/invensense/mpu6500/mpu6500_main.cpp index 1fbb99faf2..99d25eb424 100644 --- a/src/drivers/imu/invensense/mpu6500/mpu6500_main.cpp +++ b/src/drivers/imu/invensense/mpu6500/mpu6500_main.cpp @@ -46,25 +46,6 @@ void MPU6500::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *MPU6500::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - MPU6500 *instance = new MPU6500(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int mpu6500_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/invensense/mpu9250/MPU9250.cpp b/src/drivers/imu/invensense/mpu9250/MPU9250.cpp index 7c67e33487..8c0bd97398 100644 --- a/src/drivers/imu/invensense/mpu9250/MPU9250.cpp +++ b/src/drivers/imu/invensense/mpu9250/MPU9250.cpp @@ -42,22 +42,23 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -MPU9250::MPU9250(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio, bool enable_magnetometer) : - SPI(DRV_IMU_DEVTYPE_MPU9250, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +MPU9250::MPU9250(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (_drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); } ConfigureSampleRate(_px4_gyro.get_max_rate_hz()); + bool enable_magnetometer = config.custom1 == 1; + if (enable_magnetometer) { - _slave_ak8963_magnetometer = new AKM_AK8963::MPU9250_AK8963(*this, rotation); + _slave_ak8963_magnetometer = new AKM_AK8963::MPU9250_AK8963(*this, config.rotation); if (_slave_ak8963_magnetometer) { for (auto &r : _register_cfg) { diff --git a/src/drivers/imu/invensense/mpu9250/MPU9250.hpp b/src/drivers/imu/invensense/mpu9250/MPU9250.hpp index 3c35bab383..8ce4c78f4c 100644 --- a/src/drivers/imu/invensense/mpu9250/MPU9250.hpp +++ b/src/drivers/imu/invensense/mpu9250/MPU9250.hpp @@ -58,12 +58,9 @@ using namespace InvenSense_MPU9250; class MPU9250 : public device::SPI, public I2CSPIDriver { public: - MPU9250(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio, bool enable_magnetometer = false); + MPU9250(const I2CSPIDriverConfig &config); ~MPU9250() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/mpu9250/MPU9250_I2C.cpp b/src/drivers/imu/invensense/mpu9250/MPU9250_I2C.cpp index d6a7902450..16191c0818 100644 --- a/src/drivers/imu/invensense/mpu9250/MPU9250_I2C.cpp +++ b/src/drivers/imu/invensense/mpu9250/MPU9250_I2C.cpp @@ -40,15 +40,14 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -MPU9250_I2C::MPU9250_I2C(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, - int bus_frequency, int address, spi_drdy_gpio_t drdy_gpio) : - I2C(DRV_IMU_DEVTYPE_MPU9250, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +MPU9250_I2C::MPU9250_I2C(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { - if (drdy_gpio != 0) { + if (_drdy_gpio != 0) { _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); } diff --git a/src/drivers/imu/invensense/mpu9250/MPU9250_I2C.hpp b/src/drivers/imu/invensense/mpu9250/MPU9250_I2C.hpp index e45697a3e0..06004376cc 100644 --- a/src/drivers/imu/invensense/mpu9250/MPU9250_I2C.hpp +++ b/src/drivers/imu/invensense/mpu9250/MPU9250_I2C.hpp @@ -56,12 +56,9 @@ using namespace InvenSense_MPU9250; class MPU9250_I2C : public device::I2C, public I2CSPIDriver { public: - MPU9250_I2C(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - int address, spi_drdy_gpio_t drdy_gpio); + MPU9250_I2C(const I2CSPIDriverConfig &config); ~MPU9250_I2C() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/invensense/mpu9250/mpu9250_i2c_main.cpp b/src/drivers/imu/invensense/mpu9250/mpu9250_i2c_main.cpp index c0af7e6b9c..8f58afcd96 100644 --- a/src/drivers/imu/invensense/mpu9250/mpu9250_i2c_main.cpp +++ b/src/drivers/imu/invensense/mpu9250/mpu9250_i2c_main.cpp @@ -47,25 +47,6 @@ void MPU9250_I2C::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *MPU9250_I2C::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - MPU9250_I2C *instance = new MPU9250_I2C(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.i2c_address, iterator.DRDYGPIO()); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int mpu9250_i2c_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/invensense/mpu9250/mpu9250_main.cpp b/src/drivers/imu/invensense/mpu9250/mpu9250_main.cpp index a10ea14038..a5297fa9d8 100644 --- a/src/drivers/imu/invensense/mpu9250/mpu9250_main.cpp +++ b/src/drivers/imu/invensense/mpu9250/mpu9250_main.cpp @@ -47,26 +47,6 @@ void MPU9250::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *MPU9250::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - bool mag = (cli.custom1 == 1); - MPU9250 *instance = new MPU9250(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO(), mag); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int mpu9250_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/l3gd20/L3GD20.cpp b/src/drivers/imu/l3gd20/L3GD20.cpp index 7e3ae88078..152673048c 100644 --- a/src/drivers/imu/l3gd20/L3GD20.cpp +++ b/src/drivers/imu/l3gd20/L3GD20.cpp @@ -35,11 +35,10 @@ constexpr uint8_t L3GD20::_checked_registers[]; -L3GD20::L3GD20(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode) : - SPI(DRV_GYR_DEVTYPE_L3GD20, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_gyro(get_device_id(), rotation), +L3GD20::L3GD20(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _px4_gyro(get_device_id(), config.rotation), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), _errors(perf_alloc(PC_COUNT, MODULE_NAME": err")), _bad_registers(perf_alloc(PC_COUNT, MODULE_NAME": bad_reg")), diff --git a/src/drivers/imu/l3gd20/L3GD20.hpp b/src/drivers/imu/l3gd20/L3GD20.hpp index 88ee5d6772..71bd532681 100644 --- a/src/drivers/imu/l3gd20/L3GD20.hpp +++ b/src/drivers/imu/l3gd20/L3GD20.hpp @@ -161,12 +161,9 @@ class L3GD20 : public device::SPI, public I2CSPIDriver { public: - L3GD20(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode); + L3GD20(const I2CSPIDriverConfig &config); ~L3GD20() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/l3gd20/l3gd20_main.cpp b/src/drivers/imu/l3gd20/l3gd20_main.cpp index e6312858db..4c0a25ad20 100644 --- a/src/drivers/imu/l3gd20/l3gd20_main.cpp +++ b/src/drivers/imu/l3gd20/l3gd20_main.cpp @@ -49,25 +49,6 @@ L3GD20::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *L3GD20::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - L3GD20 *instance = new L3GD20(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - void L3GD20::custom_method(const BusCLIArguments &cli) { switch (cli.custom1) { diff --git a/src/drivers/imu/lsm303d/LSM303D.cpp b/src/drivers/imu/lsm303d/LSM303D.cpp index e4887f2835..de470a1102 100644 --- a/src/drivers/imu/lsm303d/LSM303D.cpp +++ b/src/drivers/imu/lsm303d/LSM303D.cpp @@ -53,12 +53,11 @@ static constexpr uint8_t _checked_registers[] = { ADDR_CTRL_REG7 }; -LSM303D::LSM303D(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode) : - SPI(DRV_IMU_DEVTYPE_LSM303D, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_accel(get_device_id(), rotation), - _px4_mag(get_device_id(), rotation), +LSM303D::LSM303D(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _px4_accel(get_device_id(), config.rotation), + _px4_mag(get_device_id(), config.rotation), _accel_sample_perf(perf_alloc(PC_ELAPSED, "lsm303d: acc_read")), _mag_sample_perf(perf_alloc(PC_ELAPSED, "lsm303d: mag_read")), _bad_registers(perf_alloc(PC_COUNT, "lsm303d: bad_reg")), diff --git a/src/drivers/imu/lsm303d/LSM303D.hpp b/src/drivers/imu/lsm303d/LSM303D.hpp index 3687d4fc6e..a521cfbd13 100644 --- a/src/drivers/imu/lsm303d/LSM303D.hpp +++ b/src/drivers/imu/lsm303d/LSM303D.hpp @@ -141,12 +141,9 @@ class LSM303D : public device::SPI, public I2CSPIDriver { public: - LSM303D(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode); + LSM303D(const I2CSPIDriverConfig &config); ~LSM303D() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/lsm303d/lsm303d_main.cpp b/src/drivers/imu/lsm303d/lsm303d_main.cpp index 148099eb2c..47220012e4 100644 --- a/src/drivers/imu/lsm303d/lsm303d_main.cpp +++ b/src/drivers/imu/lsm303d/lsm303d_main.cpp @@ -52,25 +52,6 @@ LSM303D::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *LSM303D::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - LSM303D *instance = new LSM303D(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int lsm303d_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/imu/st/lsm9ds1/LSM9DS1.cpp b/src/drivers/imu/st/lsm9ds1/LSM9DS1.cpp index fc98fc2793..8a30b4530f 100644 --- a/src/drivers/imu/st/lsm9ds1/LSM9DS1.cpp +++ b/src/drivers/imu/st/lsm9ds1/LSM9DS1.cpp @@ -40,12 +40,11 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -LSM9DS1::LSM9DS1(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode) : - SPI(DRV_IMU_DEVTYPE_ST_LSM9DS1_AG, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_accel(get_device_id(), rotation), - _px4_gyro(get_device_id(), rotation) +LSM9DS1::LSM9DS1(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _px4_accel(get_device_id(), config.rotation), + _px4_gyro(get_device_id(), config.rotation) { ConfigureSampleRate(_px4_gyro.get_max_rate_hz()); } diff --git a/src/drivers/imu/st/lsm9ds1/LSM9DS1.hpp b/src/drivers/imu/st/lsm9ds1/LSM9DS1.hpp index 15bbc3be6e..206fe43834 100644 --- a/src/drivers/imu/st/lsm9ds1/LSM9DS1.hpp +++ b/src/drivers/imu/st/lsm9ds1/LSM9DS1.hpp @@ -55,12 +55,9 @@ using namespace ST_LSM9DS1; class LSM9DS1 : public device::SPI, public I2CSPIDriver { public: - LSM9DS1(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode); + LSM9DS1(const I2CSPIDriverConfig &config); ~LSM9DS1() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/imu/st/lsm9ds1/lsm9ds1_main.cpp b/src/drivers/imu/st/lsm9ds1/lsm9ds1_main.cpp index 2cb0bc9660..bdbb1c9355 100644 --- a/src/drivers/imu/st/lsm9ds1/lsm9ds1_main.cpp +++ b/src/drivers/imu/st/lsm9ds1/lsm9ds1_main.cpp @@ -46,25 +46,6 @@ void LSM9DS1::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *LSM9DS1::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - LSM9DS1 *instance = new LSM9DS1(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int lsm9ds1_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/irlock/irlock.cpp b/src/drivers/irlock/irlock.cpp index 25e3bbf6b6..c8428ae2ef 100644 --- a/src/drivers/irlock/irlock.cpp +++ b/src/drivers/irlock/irlock.cpp @@ -92,11 +92,9 @@ struct irlock_s { class IRLOCK : public device::I2C, public I2CSPIDriver { public: - IRLOCK(I2CSPIBusOption bus_option, const int bus, int bus_frequency, const int address); + IRLOCK(const I2CSPIDriverConfig &config); ~IRLOCK() override = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init() override; @@ -119,9 +117,9 @@ private: uORB::Publication _irlock_report_topic{ORB_ID(irlock_report)}; }; -IRLOCK::IRLOCK(I2CSPIBusOption bus_option, const int bus, int bus_frequency, const int address) : - I2C(DRV_SENS_DEVTYPE_IRLOCK, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address) +IRLOCK::IRLOCK(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config) { } @@ -272,24 +270,6 @@ void IRLOCK::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *IRLOCK::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - IRLOCK *instance = new IRLOCK(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, cli.i2c_address); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" __EXPORT int irlock_main(int argc, char *argv[]) { using ThisDriver = IRLOCK; diff --git a/src/drivers/lights/rgbled/rgbled.cpp b/src/drivers/lights/rgbled/rgbled.cpp index d7f0063b34..dddeabc9c6 100644 --- a/src/drivers/lights/rgbled/rgbled.cpp +++ b/src/drivers/lights/rgbled/rgbled.cpp @@ -68,11 +68,9 @@ using namespace time_literals; class RGBLED : public device::I2C, public I2CSPIDriver { public: - RGBLED(I2CSPIBusOption bus_option, const int bus, int bus_frequency, const int address); + RGBLED(const I2CSPIDriverConfig &config); virtual ~RGBLED() = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init() override; @@ -102,9 +100,9 @@ private: void update_params(); }; -RGBLED::RGBLED(I2CSPIBusOption bus_option, const int bus, int bus_frequency, const int address) : - I2C(DRV_LED_DEVTYPE_RGBLED, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address) +RGBLED::RGBLED(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config) { } @@ -334,24 +332,6 @@ RGBLED::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *RGBLED::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - RGBLED *instance = new RGBLED(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, cli.i2c_address); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" __EXPORT int rgbled_main(int argc, char *argv[]) { using ThisDriver = RGBLED; diff --git a/src/drivers/lights/rgbled_ncp5623c/rgbled_ncp5623c.cpp b/src/drivers/lights/rgbled_ncp5623c/rgbled_ncp5623c.cpp index a9251eda4b..76aff089a9 100755 --- a/src/drivers/lights/rgbled_ncp5623c/rgbled_ncp5623c.cpp +++ b/src/drivers/lights/rgbled_ncp5623c/rgbled_ncp5623c.cpp @@ -66,11 +66,9 @@ using namespace time_literals; class RGBLED_NCP5623C : public device::I2C, public I2CSPIDriver { public: - RGBLED_NCP5623C(I2CSPIBusOption bus_option, const int bus, int bus_frequency, const int address); + RGBLED_NCP5623C(const I2CSPIDriverConfig &config); virtual ~RGBLED_NCP5623C() = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init() override; @@ -100,9 +98,9 @@ private: int write(uint8_t reg, uint8_t data); }; -RGBLED_NCP5623C::RGBLED_NCP5623C(I2CSPIBusOption bus_option, const int bus, int bus_frequency, const int address) : - I2C(DRV_LED_DEVTYPE_RGBLED_NCP5623C, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address) +RGBLED_NCP5623C::RGBLED_NCP5623C(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config) { } @@ -249,25 +247,6 @@ RGBLED_NCP5623C::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *RGBLED_NCP5623C::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - RGBLED_NCP5623C *instance = new RGBLED_NCP5623C(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, - cli.i2c_address); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" __EXPORT int rgbled_ncp5623c_main(int argc, char *argv[]) { using ThisDriver = RGBLED_NCP5623C; diff --git a/src/drivers/magnetometer/akm/ak09916/AK09916.cpp b/src/drivers/magnetometer/akm/ak09916/AK09916.cpp index da79675638..27e4a82aad 100644 --- a/src/drivers/magnetometer/akm/ak09916/AK09916.cpp +++ b/src/drivers/magnetometer/akm/ak09916/AK09916.cpp @@ -40,10 +40,10 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -AK09916::AK09916(I2CSPIBusOption bus_option, int bus, int bus_frequency, enum Rotation rotation) : - I2C(DRV_MAG_DEVTYPE_AK09916, MODULE_NAME, bus, I2C_ADDRESS_DEFAULT, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_mag(get_device_id(), rotation) +AK09916::AK09916(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_mag(get_device_id(), config.rotation) { _px4_mag.set_external(external()); } diff --git a/src/drivers/magnetometer/akm/ak09916/AK09916.hpp b/src/drivers/magnetometer/akm/ak09916/AK09916.hpp index 90046dcb8c..98ad0dcb9a 100644 --- a/src/drivers/magnetometer/akm/ak09916/AK09916.hpp +++ b/src/drivers/magnetometer/akm/ak09916/AK09916.hpp @@ -53,11 +53,9 @@ using namespace AKM_AK09916; class AK09916 : public device::I2C, public I2CSPIDriver { public: - AK09916(I2CSPIBusOption bus_option, int bus, int bus_frequency, enum Rotation rotation = ROTATION_NONE); + AK09916(const I2CSPIDriverConfig &config); ~AK09916() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/magnetometer/akm/ak09916/ak09916_main.cpp b/src/drivers/magnetometer/akm/ak09916/ak09916_main.cpp index 5a93294353..01d5cce823 100644 --- a/src/drivers/magnetometer/akm/ak09916/ak09916_main.cpp +++ b/src/drivers/magnetometer/akm/ak09916/ak09916_main.cpp @@ -36,31 +36,13 @@ #include #include -I2CSPIDriverBase *AK09916::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - AK09916 *instance = new AK09916(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, cli.rotation); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); - return nullptr; - } - - return instance; -} - void AK09916::print_usage() { PRINT_MODULE_USAGE_NAME("ak09916", "driver"); PRINT_MODULE_USAGE_SUBCATEGORY("magnetometer"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x0c); PRINT_MODULE_USAGE_PARAM_INT('R', 0, 0, 35, "Rotation", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } @@ -71,6 +53,7 @@ extern "C" __EXPORT int ak09916_main(int argc, char *argv[]) using ThisDriver = AK09916; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = I2C_SPEED; + cli.i2c_address = I2C_ADDRESS_DEFAULT; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { diff --git a/src/drivers/magnetometer/akm/ak8963/AK8963.cpp b/src/drivers/magnetometer/akm/ak8963/AK8963.cpp index b1722c25d9..2222ee3e04 100644 --- a/src/drivers/magnetometer/akm/ak8963/AK8963.cpp +++ b/src/drivers/magnetometer/akm/ak8963/AK8963.cpp @@ -40,10 +40,10 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -AK8963::AK8963(I2CSPIBusOption bus_option, int bus, int bus_frequency, enum Rotation rotation) : - I2C(DRV_MAG_DEVTYPE_AK8963, MODULE_NAME, bus, I2C_ADDRESS_DEFAULT, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_mag(get_device_id(), rotation) +AK8963::AK8963(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_mag(get_device_id(), config.rotation) { _px4_mag.set_external(external()); } diff --git a/src/drivers/magnetometer/akm/ak8963/AK8963.hpp b/src/drivers/magnetometer/akm/ak8963/AK8963.hpp index a0f1881c9c..cf80d68621 100644 --- a/src/drivers/magnetometer/akm/ak8963/AK8963.hpp +++ b/src/drivers/magnetometer/akm/ak8963/AK8963.hpp @@ -53,11 +53,9 @@ using namespace AKM_AK8963; class AK8963 : public device::I2C, public I2CSPIDriver { public: - AK8963(I2CSPIBusOption bus_option, int bus, int bus_frequency, enum Rotation rotation = ROTATION_NONE); + AK8963(const I2CSPIDriverConfig &config); ~AK8963() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/magnetometer/akm/ak8963/ak8963_main.cpp b/src/drivers/magnetometer/akm/ak8963/ak8963_main.cpp index 0bdb0e46b0..206275ccdc 100644 --- a/src/drivers/magnetometer/akm/ak8963/ak8963_main.cpp +++ b/src/drivers/magnetometer/akm/ak8963/ak8963_main.cpp @@ -36,31 +36,13 @@ #include #include -I2CSPIDriverBase *AK8963::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - AK8963 *instance = new AK8963(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, cli.rotation); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); - return nullptr; - } - - return instance; -} - void AK8963::print_usage() { PRINT_MODULE_USAGE_NAME("ak8963", "driver"); PRINT_MODULE_USAGE_SUBCATEGORY("magnetometer"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x0c); PRINT_MODULE_USAGE_PARAM_INT('R', 0, 0, 35, "Rotation", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } @@ -71,6 +53,7 @@ extern "C" __EXPORT int ak8963_main(int argc, char *argv[]) using ThisDriver = AK8963; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = I2C_SPEED; + cli.i2c_address = I2C_ADDRESS_DEFAULT; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { diff --git a/src/drivers/magnetometer/bosch/bmm150/BMM150.cpp b/src/drivers/magnetometer/bosch/bmm150/BMM150.cpp index 214b57ac0f..0088e742af 100644 --- a/src/drivers/magnetometer/bosch/bmm150/BMM150.cpp +++ b/src/drivers/magnetometer/bosch/bmm150/BMM150.cpp @@ -35,10 +35,10 @@ using namespace time_literals; -BMM150::BMM150(I2CSPIBusOption bus_option, int bus, int bus_frequency, enum Rotation rotation) : - I2C(DRV_MAG_DEVTYPE_BMM150, MODULE_NAME, bus, I2C_ADDRESS_DEFAULT, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_mag(get_device_id(), rotation) +BMM150::BMM150(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_mag(get_device_id(), config.rotation) { _px4_mag.set_external(external()); } diff --git a/src/drivers/magnetometer/bosch/bmm150/BMM150.hpp b/src/drivers/magnetometer/bosch/bmm150/BMM150.hpp index 97ed6cf159..9e3e201caa 100644 --- a/src/drivers/magnetometer/bosch/bmm150/BMM150.hpp +++ b/src/drivers/magnetometer/bosch/bmm150/BMM150.hpp @@ -53,11 +53,9 @@ using namespace Bosch_BMM150; class BMM150 : public device::I2C, public I2CSPIDriver { public: - BMM150(I2CSPIBusOption bus_option, int bus, int bus_frequency, enum Rotation rotation = ROTATION_NONE); + BMM150(const I2CSPIDriverConfig &config); ~BMM150() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/magnetometer/bosch/bmm150/bmm150_main.cpp b/src/drivers/magnetometer/bosch/bmm150/bmm150_main.cpp index 246ccc9293..a388935338 100644 --- a/src/drivers/magnetometer/bosch/bmm150/bmm150_main.cpp +++ b/src/drivers/magnetometer/bosch/bmm150/bmm150_main.cpp @@ -36,31 +36,13 @@ #include #include -I2CSPIDriverBase *BMM150::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - BMM150 *instance = new BMM150(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, cli.rotation); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); - return nullptr; - } - - return instance; -} - void BMM150::print_usage() { PRINT_MODULE_USAGE_NAME("bmm150", "driver"); PRINT_MODULE_USAGE_SUBCATEGORY("magnetometer"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x10); PRINT_MODULE_USAGE_PARAM_INT('R', 0, 0, 35, "Rotation", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } @@ -71,6 +53,7 @@ extern "C" int bmm150_main(int argc, char *argv[]) using ThisDriver = BMM150; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = I2C_SPEED; + cli.i2c_address = I2C_ADDRESS_DEFAULT; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { diff --git a/src/drivers/magnetometer/hmc5883/HMC5883.cpp b/src/drivers/magnetometer/hmc5883/HMC5883.cpp index 42cdf7708a..fdf0a9353e 100644 --- a/src/drivers/magnetometer/hmc5883/HMC5883.cpp +++ b/src/drivers/magnetometer/hmc5883/HMC5883.cpp @@ -33,9 +33,9 @@ #include "HMC5883.hpp" -HMC5883::HMC5883(device::Device *interface, enum Rotation rotation, I2CSPIBusOption bus_option, int bus) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus), - _px4_mag(interface->get_device_id(), rotation), +HMC5883::HMC5883(device::Device *interface, const I2CSPIDriverConfig &config) : + I2CSPIDriver(config), + _px4_mag(interface->get_device_id(), config.rotation), _interface(interface), _range_ga(1.9f), _collect_phase(false), diff --git a/src/drivers/magnetometer/hmc5883/HMC5883.hpp b/src/drivers/magnetometer/hmc5883/HMC5883.hpp index d5dc45ce37..9192fb5565 100644 --- a/src/drivers/magnetometer/hmc5883/HMC5883.hpp +++ b/src/drivers/magnetometer/hmc5883/HMC5883.hpp @@ -86,11 +86,10 @@ class HMC5883 : public I2CSPIDriver { public: - HMC5883(device::Device *interface, enum Rotation rotation, I2CSPIBusOption bus_option, int bus); + HMC5883(device::Device *interface, const I2CSPIDriverConfig &config); virtual ~HMC5883(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/magnetometer/hmc5883/hmc5883.h b/src/drivers/magnetometer/hmc5883/hmc5883.h index 2b46e753a1..c4ffa91d07 100644 --- a/src/drivers/magnetometer/hmc5883/hmc5883.h +++ b/src/drivers/magnetometer/hmc5883/hmc5883.h @@ -42,6 +42,8 @@ #include #include +#define HMC5883L_ADDRESS 0x1E + #define ADDR_ID_A 0x0a #define ADDR_ID_B 0x0b #define ADDR_ID_C 0x0c diff --git a/src/drivers/magnetometer/hmc5883/hmc5883_i2c.cpp b/src/drivers/magnetometer/hmc5883/hmc5883_i2c.cpp index 628263d163..dbb274d4c3 100644 --- a/src/drivers/magnetometer/hmc5883/hmc5883_i2c.cpp +++ b/src/drivers/magnetometer/hmc5883/hmc5883_i2c.cpp @@ -42,8 +42,6 @@ #include "hmc5883.h" -#define HMC5883L_ADDRESS 0x1E - device::Device *HMC5883_I2C_interface(int bus, int bus_frequency); class HMC5883_I2C : public device::I2C diff --git a/src/drivers/magnetometer/hmc5883/hmc5883_main.cpp b/src/drivers/magnetometer/hmc5883/hmc5883_main.cpp index 08896d08b5..a8fa83f4f6 100644 --- a/src/drivers/magnetometer/hmc5883/hmc5883_main.cpp +++ b/src/drivers/magnetometer/hmc5883/hmc5883_main.cpp @@ -45,16 +45,15 @@ extern "C" __EXPORT int hmc5883_main(int argc, char *argv[]); -I2CSPIDriverBase *HMC5883::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *HMC5883::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { device::Device *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = HMC5883_I2C_interface(iterator.bus(), cli.bus_frequency); + if (config.bus_type == BOARD_I2C_BUS) { + interface = HMC5883_I2C_interface(config.bus, config.bus_frequency); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = HMC5883_SPI_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = HMC5883_SPI_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { @@ -64,11 +63,11 @@ I2CSPIDriverBase *HMC5883::instantiate(const BusCLIArguments &cli, const BusInst if (interface->init() != OK) { delete interface; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); + PX4_DEBUG("no device on bus %i (devid 0x%x)", config.bus, config.spi_devid); return nullptr; } - HMC5883 *dev = new HMC5883(interface, cli.rotation, iterator.configuredBusOption(), iterator.bus()); + HMC5883 *dev = new HMC5883(interface, config); if (dev == nullptr) { delete interface; @@ -80,7 +79,7 @@ I2CSPIDriverBase *HMC5883::instantiate(const BusCLIArguments &cli, const BusInst return nullptr; } - bool enable_temp_compensation = cli.custom1 == 1; + bool enable_temp_compensation = config.custom1 == 1; if (enable_temp_compensation) { dev->set_temperature_compensation(1); @@ -127,6 +126,8 @@ extern "C" int hmc5883_main(int argc, char *argv[]) return -1; } + cli.i2c_address = HMC5883L_ADDRESS; + BusInstanceIterator iterator(MODULE_NAME, cli, DRV_MAG_DEVTYPE_HMC5883); if (!strcmp(verb, "start")) { diff --git a/src/drivers/magnetometer/isentek/ist8308/IST8308.cpp b/src/drivers/magnetometer/isentek/ist8308/IST8308.cpp index 9a905d679d..7e80aeae90 100644 --- a/src/drivers/magnetometer/isentek/ist8308/IST8308.cpp +++ b/src/drivers/magnetometer/isentek/ist8308/IST8308.cpp @@ -40,10 +40,10 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -IST8308::IST8308(I2CSPIBusOption bus_option, int bus, int bus_frequency, enum Rotation rotation) : - I2C(DRV_MAG_DEVTYPE_IST8308, MODULE_NAME, bus, I2C_ADDRESS_DEFAULT, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_mag(get_device_id(), rotation) +IST8308::IST8308(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_mag(get_device_id(), config.rotation) { _px4_mag.set_external(external()); } diff --git a/src/drivers/magnetometer/isentek/ist8308/IST8308.hpp b/src/drivers/magnetometer/isentek/ist8308/IST8308.hpp index bf2d6600a7..1a958b8e47 100644 --- a/src/drivers/magnetometer/isentek/ist8308/IST8308.hpp +++ b/src/drivers/magnetometer/isentek/ist8308/IST8308.hpp @@ -53,11 +53,9 @@ using namespace iSentek_IST8308; class IST8308 : public device::I2C, public I2CSPIDriver { public: - IST8308(I2CSPIBusOption bus_option, int bus, int bus_frequency, enum Rotation rotation = ROTATION_NONE); + IST8308(const I2CSPIDriverConfig &config); ~IST8308() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/magnetometer/isentek/ist8308/ist8308_main.cpp b/src/drivers/magnetometer/isentek/ist8308/ist8308_main.cpp index 7963b86453..cedf12da62 100644 --- a/src/drivers/magnetometer/isentek/ist8308/ist8308_main.cpp +++ b/src/drivers/magnetometer/isentek/ist8308/ist8308_main.cpp @@ -36,31 +36,13 @@ #include #include -I2CSPIDriverBase *IST8308::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - IST8308 *instance = new IST8308(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, cli.rotation); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); - return nullptr; - } - - return instance; -} - void IST8308::print_usage() { PRINT_MODULE_USAGE_NAME("ist8308", "driver"); PRINT_MODULE_USAGE_SUBCATEGORY("magnetometer"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x0c); PRINT_MODULE_USAGE_PARAM_INT('R', 0, 0, 35, "Rotation", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } @@ -71,6 +53,7 @@ extern "C" int ist8308_main(int argc, char *argv[]) using ThisDriver = IST8308; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = I2C_SPEED; + cli.i2c_address = I2C_ADDRESS_DEFAULT; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { diff --git a/src/drivers/magnetometer/isentek/ist8310/IST8310.cpp b/src/drivers/magnetometer/isentek/ist8310/IST8310.cpp index 4a5cf6c536..cc98c5df60 100644 --- a/src/drivers/magnetometer/isentek/ist8310/IST8310.cpp +++ b/src/drivers/magnetometer/isentek/ist8310/IST8310.cpp @@ -40,10 +40,10 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -IST8310::IST8310(I2CSPIBusOption bus_option, int bus, uint8_t addr, int bus_frequency, enum Rotation rotation) : - I2C(DRV_MAG_DEVTYPE_IST8310, MODULE_NAME, bus, addr, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, addr), - _px4_mag(get_device_id(), rotation) +IST8310::IST8310(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_mag(get_device_id(), config.rotation) { _px4_mag.set_external(external()); } diff --git a/src/drivers/magnetometer/isentek/ist8310/IST8310.hpp b/src/drivers/magnetometer/isentek/ist8310/IST8310.hpp index 90921ec043..a251f49cf0 100644 --- a/src/drivers/magnetometer/isentek/ist8310/IST8310.hpp +++ b/src/drivers/magnetometer/isentek/ist8310/IST8310.hpp @@ -53,11 +53,9 @@ using namespace iSentek_IST8310; class IST8310 : public device::I2C, public I2CSPIDriver { public: - IST8310(I2CSPIBusOption bus_option, int bus, uint8_t addr, int bus_frequency, enum Rotation rotation = ROTATION_NONE); + IST8310(const I2CSPIDriverConfig &config); ~IST8310() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/magnetometer/isentek/ist8310/ist8310_main.cpp b/src/drivers/magnetometer/isentek/ist8310/ist8310_main.cpp index 72499133ac..eee1a01c1d 100644 --- a/src/drivers/magnetometer/isentek/ist8310/ist8310_main.cpp +++ b/src/drivers/magnetometer/isentek/ist8310/ist8310_main.cpp @@ -36,26 +36,6 @@ #include #include -I2CSPIDriverBase *IST8310::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - IST8310 *instance = new IST8310(iterator.configuredBusOption(), iterator.bus(), cli.i2c_address, cli.bus_frequency, - cli.rotation); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); - return nullptr; - } - - return instance; -} - void IST8310::print_usage() { PRINT_MODULE_USAGE_NAME("ist8310", "driver"); diff --git a/src/drivers/magnetometer/lis2mdl/lis2mdl.cpp b/src/drivers/magnetometer/lis2mdl/lis2mdl.cpp index 314371e472..25824e660e 100644 --- a/src/drivers/magnetometer/lis2mdl/lis2mdl.cpp +++ b/src/drivers/magnetometer/lis2mdl/lis2mdl.cpp @@ -42,9 +42,9 @@ #include #include "lis2mdl.h" -LIS2MDL::LIS2MDL(device::Device *interface, enum Rotation rotation, I2CSPIBusOption bus_option, int bus) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus), - _px4_mag(interface->get_device_id(), rotation), +LIS2MDL::LIS2MDL(device::Device *interface, const I2CSPIDriverConfig &config) : + I2CSPIDriver(config), + _px4_mag(interface->get_device_id(), config.rotation), _interface(interface), _comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": comms_errors")), _conf_errors(perf_alloc(PC_COUNT, MODULE_NAME": conf_errors")), diff --git a/src/drivers/magnetometer/lis2mdl/lis2mdl.h b/src/drivers/magnetometer/lis2mdl/lis2mdl.h index fda1cb9c94..197739b2ca 100644 --- a/src/drivers/magnetometer/lis2mdl/lis2mdl.h +++ b/src/drivers/magnetometer/lis2mdl/lis2mdl.h @@ -83,15 +83,15 @@ extern device::Device *LIS2MDL_SPI_interface(int bus, uint32_t devid, int bus_frequency, spi_mode_e spi_mode); extern device::Device *LIS2MDL_I2C_interface(int bus, int bus_frequency); +#define LIS2MDLL_ADDRESS 0x1e class LIS2MDL : public I2CSPIDriver { public: - LIS2MDL(device::Device *interface, enum Rotation rotation, I2CSPIBusOption bus_option, int bus); + LIS2MDL(device::Device *interface, const I2CSPIDriverConfig &config); virtual ~LIS2MDL(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); virtual int init(); diff --git a/src/drivers/magnetometer/lis2mdl/lis2mdl_i2c.cpp b/src/drivers/magnetometer/lis2mdl/lis2mdl_i2c.cpp index fff9180378..907661430a 100644 --- a/src/drivers/magnetometer/lis2mdl/lis2mdl_i2c.cpp +++ b/src/drivers/magnetometer/lis2mdl/lis2mdl_i2c.cpp @@ -53,8 +53,6 @@ #include "board_config.h" #include "lis2mdl.h" -#define LIS2MDLL_ADDRESS 0x1e - class LIS2MDL_I2C : public device::I2C { public: diff --git a/src/drivers/magnetometer/lis2mdl/lis2mdl_main.cpp b/src/drivers/magnetometer/lis2mdl/lis2mdl_main.cpp index 0a06f1434e..11f8c8f3d4 100644 --- a/src/drivers/magnetometer/lis2mdl/lis2mdl_main.cpp +++ b/src/drivers/magnetometer/lis2mdl/lis2mdl_main.cpp @@ -41,16 +41,15 @@ #include #include -I2CSPIDriverBase *LIS2MDL::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *LIS2MDL::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { device::Device *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = LIS2MDL_I2C_interface(iterator.bus(), cli.bus_frequency); + if (config.bus_type == BOARD_I2C_BUS) { + interface = LIS2MDL_I2C_interface(config.bus, config.bus_frequency); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = LIS2MDL_SPI_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = LIS2MDL_SPI_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { @@ -60,11 +59,11 @@ I2CSPIDriverBase *LIS2MDL::instantiate(const BusCLIArguments &cli, const BusInst if (interface->init() != OK) { delete interface; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); + PX4_DEBUG("no device on bus %i (devid 0x%x)", config.bus, config.spi_devid); return nullptr; } - LIS2MDL *dev = new LIS2MDL(interface, cli.rotation, iterator.configuredBusOption(), iterator.bus()); + LIS2MDL *dev = new LIS2MDL(interface, config); if (dev == nullptr) { delete interface; @@ -85,6 +84,7 @@ void LIS2MDL::print_usage() PRINT_MODULE_USAGE_SUBCATEGORY("magnetometer"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, true); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x1e); PRINT_MODULE_USAGE_PARAM_INT('R', 0, 0, 35, "Rotation", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } @@ -112,6 +112,8 @@ extern "C" int lis2mdl_main(int argc, char *argv[]) return -1; } + cli.i2c_address = LIS2MDLL_ADDRESS; + BusInstanceIterator iterator(MODULE_NAME, cli, DRV_MAG_DEVTYPE_LIS2MDL); if (!strcmp(verb, "start")) { diff --git a/src/drivers/magnetometer/lis3mdl/lis3mdl.cpp b/src/drivers/magnetometer/lis3mdl/lis3mdl.cpp index e82f1d664b..e61ec75856 100644 --- a/src/drivers/magnetometer/lis3mdl/lis3mdl.cpp +++ b/src/drivers/magnetometer/lis3mdl/lis3mdl.cpp @@ -42,9 +42,9 @@ #include #include "lis3mdl.h" -LIS3MDL::LIS3MDL(device::Device *interface, enum Rotation rotation, I2CSPIBusOption bus_option, int bus) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus), - _px4_mag(interface->get_device_id(), rotation), +LIS3MDL::LIS3MDL(device::Device *interface, const I2CSPIDriverConfig &config) : + I2CSPIDriver(config), + _px4_mag(interface->get_device_id(), config.rotation), _interface(interface), _comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": comms_errors")), _conf_errors(perf_alloc(PC_COUNT, MODULE_NAME": conf_errors")), diff --git a/src/drivers/magnetometer/lis3mdl/lis3mdl.h b/src/drivers/magnetometer/lis3mdl/lis3mdl.h index 6d698620f8..f36d99972d 100644 --- a/src/drivers/magnetometer/lis3mdl/lis3mdl.h +++ b/src/drivers/magnetometer/lis3mdl/lis3mdl.h @@ -92,14 +92,16 @@ enum OPERATING_MODE { SINGLE }; +#define LIS3MDLL_ADDRESS 0x1e + + class LIS3MDL : public I2CSPIDriver { public: - LIS3MDL(device::Device *interface, enum Rotation rotation, I2CSPIBusOption bus_option, int bus); + LIS3MDL(device::Device *interface, const I2CSPIDriverConfig &config); virtual ~LIS3MDL(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); void custom_method(const BusCLIArguments &cli) override; diff --git a/src/drivers/magnetometer/lis3mdl/lis3mdl_i2c.cpp b/src/drivers/magnetometer/lis3mdl/lis3mdl_i2c.cpp index 0540d7d8f1..12245cf5fb 100644 --- a/src/drivers/magnetometer/lis3mdl/lis3mdl_i2c.cpp +++ b/src/drivers/magnetometer/lis3mdl/lis3mdl_i2c.cpp @@ -53,8 +53,6 @@ #include "board_config.h" #include "lis3mdl.h" -#define LIS3MDLL_ADDRESS 0x1e - class LIS3MDL_I2C : public device::I2C { public: diff --git a/src/drivers/magnetometer/lis3mdl/lis3mdl_main.cpp b/src/drivers/magnetometer/lis3mdl/lis3mdl_main.cpp index 0c2784cacf..edd1f280f3 100644 --- a/src/drivers/magnetometer/lis3mdl/lis3mdl_main.cpp +++ b/src/drivers/magnetometer/lis3mdl/lis3mdl_main.cpp @@ -41,16 +41,15 @@ #include #include -I2CSPIDriverBase *LIS3MDL::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *LIS3MDL::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { device::Device *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = LIS3MDL_I2C_interface(iterator.bus(), cli.bus_frequency); + if (config.bus_type == BOARD_I2C_BUS) { + interface = LIS3MDL_I2C_interface(config.bus, config.bus_frequency); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = LIS3MDL_SPI_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = LIS3MDL_SPI_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { @@ -60,11 +59,11 @@ I2CSPIDriverBase *LIS3MDL::instantiate(const BusCLIArguments &cli, const BusInst if (interface->init() != OK) { delete interface; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); + PX4_DEBUG("no device on bus %i (devid 0x%x)", config.bus, config.spi_devid); return nullptr; } - LIS3MDL *dev = new LIS3MDL(interface, cli.rotation, iterator.configuredBusOption(), iterator.bus()); + LIS3MDL *dev = new LIS3MDL(interface, config); if (dev == nullptr) { delete interface; @@ -119,6 +118,8 @@ extern "C" int lis3mdl_main(int argc, char *argv[]) return -1; } + cli.i2c_address = LIS3MDLL_ADDRESS; + BusInstanceIterator iterator(MODULE_NAME, cli, DRV_MAG_DEVTYPE_LIS3MDL); if (!strcmp(verb, "start")) { diff --git a/src/drivers/magnetometer/lsm303agr/LSM303AGR.cpp b/src/drivers/magnetometer/lsm303agr/LSM303AGR.cpp index f952c11171..6826dc138b 100644 --- a/src/drivers/magnetometer/lsm303agr/LSM303AGR.cpp +++ b/src/drivers/magnetometer/lsm303agr/LSM303AGR.cpp @@ -61,11 +61,10 @@ static constexpr uint8_t LSM303AGR_WHO_AM_I_M = 0x40; */ #define LSM303AGR_TIMER_REDUCTION 200 -LSM303AGR::LSM303AGR(I2CSPIBusOption bus_option, int bus, int device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode) : - SPI(DRV_MAG_DEVTYPE_LSM303AGR, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_mag(get_device_id(), rotation), +LSM303AGR::LSM303AGR(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _px4_mag(get_device_id(), config.rotation), _mag_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": mag_read")), _bad_registers(perf_alloc(PC_COUNT, MODULE_NAME": bad_reg")), _bad_values(perf_alloc(PC_COUNT, MODULE_NAME": bad_val")) diff --git a/src/drivers/magnetometer/lsm303agr/LSM303AGR.hpp b/src/drivers/magnetometer/lsm303agr/LSM303AGR.hpp index 79b228c8ab..1a5a5bf5f0 100644 --- a/src/drivers/magnetometer/lsm303agr/LSM303AGR.hpp +++ b/src/drivers/magnetometer/lsm303agr/LSM303AGR.hpp @@ -85,12 +85,9 @@ static constexpr uint8_t OUTZ_H_REG_M = 0x6D; class LSM303AGR : public device::SPI, public I2CSPIDriver { public: - LSM303AGR(I2CSPIBusOption bus_option, int bus, int device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode); + LSM303AGR(const I2CSPIDriverConfig &config); virtual ~LSM303AGR(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init() override; diff --git a/src/drivers/magnetometer/lsm303agr/lsm303agr_main.cpp b/src/drivers/magnetometer/lsm303agr/lsm303agr_main.cpp index df45f051d9..b3363dfee3 100644 --- a/src/drivers/magnetometer/lsm303agr/lsm303agr_main.cpp +++ b/src/drivers/magnetometer/lsm303agr/lsm303agr_main.cpp @@ -46,25 +46,6 @@ LSM303AGR::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *LSM303AGR::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - LSM303AGR *instance = new LSM303AGR(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" int lsm303agr_main(int argc, char *argv[]) { int ch; diff --git a/src/drivers/magnetometer/lsm9ds1_mag/LSM9DS1_MAG.cpp b/src/drivers/magnetometer/lsm9ds1_mag/LSM9DS1_MAG.cpp index 3e4260659e..689d0e612a 100644 --- a/src/drivers/magnetometer/lsm9ds1_mag/LSM9DS1_MAG.cpp +++ b/src/drivers/magnetometer/lsm9ds1_mag/LSM9DS1_MAG.cpp @@ -40,11 +40,10 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -LSM9DS1_MAG::LSM9DS1_MAG(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, - int bus_frequency, spi_mode_e spi_mode) : - SPI(DRV_MAG_DEVTYPE_ST_LSM9DS1_M, MODULE_NAME, bus, device, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_mag(get_device_id(), rotation) +LSM9DS1_MAG::LSM9DS1_MAG(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _px4_mag(get_device_id(), config.rotation) { _px4_mag.set_external(external()); } diff --git a/src/drivers/magnetometer/lsm9ds1_mag/LSM9DS1_MAG.hpp b/src/drivers/magnetometer/lsm9ds1_mag/LSM9DS1_MAG.hpp index e97c7aca7b..6218b4d0ff 100644 --- a/src/drivers/magnetometer/lsm9ds1_mag/LSM9DS1_MAG.hpp +++ b/src/drivers/magnetometer/lsm9ds1_mag/LSM9DS1_MAG.hpp @@ -53,12 +53,9 @@ using namespace ST_LSM9DS1_MAG; class LSM9DS1_MAG : public device::SPI, public I2CSPIDriver { public: - LSM9DS1_MAG(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - spi_mode_e spi_mode); + LSM9DS1_MAG(const I2CSPIDriverConfig &config); ~LSM9DS1_MAG() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/magnetometer/lsm9ds1_mag/lsm9ds1_mag_main.cpp b/src/drivers/magnetometer/lsm9ds1_mag/lsm9ds1_mag_main.cpp index 4c9b7b9dbc..f2cb5fdfa2 100644 --- a/src/drivers/magnetometer/lsm9ds1_mag/lsm9ds1_mag_main.cpp +++ b/src/drivers/magnetometer/lsm9ds1_mag/lsm9ds1_mag_main.cpp @@ -36,26 +36,6 @@ #include #include -I2CSPIDriverBase *LSM9DS1_MAG::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - LSM9DS1_MAG *instance = new LSM9DS1_MAG(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); - return nullptr; - } - - return instance; -} - void LSM9DS1_MAG::print_usage() { PRINT_MODULE_USAGE_NAME("lsm9ds1_mag", "driver"); diff --git a/src/drivers/magnetometer/qmc5883l/QMC5883L.cpp b/src/drivers/magnetometer/qmc5883l/QMC5883L.cpp index 3efc443711..8adb51818a 100644 --- a/src/drivers/magnetometer/qmc5883l/QMC5883L.cpp +++ b/src/drivers/magnetometer/qmc5883l/QMC5883L.cpp @@ -40,10 +40,10 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -QMC5883L::QMC5883L(I2CSPIBusOption bus_option, int bus, int bus_frequency, enum Rotation rotation) : - I2C(DRV_MAG_DEVTYPE_QMC5883L, MODULE_NAME, bus, I2C_ADDRESS_DEFAULT, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_mag(get_device_id(), rotation) +QMC5883L::QMC5883L(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_mag(get_device_id(), config.rotation) { _px4_mag.set_external(external()); } diff --git a/src/drivers/magnetometer/qmc5883l/QMC5883L.hpp b/src/drivers/magnetometer/qmc5883l/QMC5883L.hpp index a0e23e3daa..85209720af 100644 --- a/src/drivers/magnetometer/qmc5883l/QMC5883L.hpp +++ b/src/drivers/magnetometer/qmc5883l/QMC5883L.hpp @@ -53,11 +53,9 @@ using namespace QST_QMC5883L; class QMC5883L : public device::I2C, public I2CSPIDriver { public: - QMC5883L(I2CSPIBusOption bus_option, int bus, int bus_frequency, enum Rotation rotation = ROTATION_NONE); + QMC5883L(const I2CSPIDriverConfig &config); ~QMC5883L() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/magnetometer/qmc5883l/qmc5883l_main.cpp b/src/drivers/magnetometer/qmc5883l/qmc5883l_main.cpp index 6d9190bbae..6757b7f9a7 100644 --- a/src/drivers/magnetometer/qmc5883l/qmc5883l_main.cpp +++ b/src/drivers/magnetometer/qmc5883l/qmc5883l_main.cpp @@ -36,31 +36,13 @@ #include #include -I2CSPIDriverBase * -QMC5883L::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, int runtime_instance) -{ - QMC5883L *instance = new QMC5883L(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, cli.rotation); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); - return nullptr; - } - - return instance; -} - void QMC5883L::print_usage() { PRINT_MODULE_USAGE_NAME("qmc5883l", "driver"); PRINT_MODULE_USAGE_SUBCATEGORY("magnetometer"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x0d); PRINT_MODULE_USAGE_PARAM_INT('R', 0, 0, 35, "Rotation", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } @@ -71,6 +53,7 @@ extern "C" int qmc5883l_main(int argc, char *argv[]) using ThisDriver = QMC5883L; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = I2C_SPEED; + cli.i2c_address = I2C_ADDRESS_DEFAULT; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { diff --git a/src/drivers/magnetometer/rm3100/rm3100.cpp b/src/drivers/magnetometer/rm3100/rm3100.cpp index d7a21e80f2..d9974e92eb 100644 --- a/src/drivers/magnetometer/rm3100/rm3100.cpp +++ b/src/drivers/magnetometer/rm3100/rm3100.cpp @@ -41,9 +41,9 @@ #include "rm3100.h" -RM3100::RM3100(device::Device *interface, enum Rotation rotation, I2CSPIBusOption bus_option, int bus) : - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus), - _px4_mag(interface->get_device_id(), rotation), +RM3100::RM3100(device::Device *interface, const I2CSPIDriverConfig &config) : + I2CSPIDriver(config), + _px4_mag(interface->get_device_id(), config.rotation), _interface(interface), _comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": comms_errors")), _conf_errors(perf_alloc(PC_COUNT, MODULE_NAME": conf_errors")), diff --git a/src/drivers/magnetometer/rm3100/rm3100.h b/src/drivers/magnetometer/rm3100/rm3100.h index ee10595ee4..bedcf635b4 100644 --- a/src/drivers/magnetometer/rm3100/rm3100.h +++ b/src/drivers/magnetometer/rm3100/rm3100.h @@ -97,14 +97,15 @@ enum OPERATING_MODE { SINGLE }; +#define RM3100_ADDRESS 0x20 + class RM3100 : public I2CSPIDriver { public: - RM3100(device::Device *interface, enum Rotation rotation, I2CSPIBusOption bus_option, int bus); + RM3100(device::Device *interface, const I2CSPIDriverConfig &config); virtual ~RM3100(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); void custom_method(const BusCLIArguments &cli) override; diff --git a/src/drivers/magnetometer/rm3100/rm3100_i2c.cpp b/src/drivers/magnetometer/rm3100/rm3100_i2c.cpp index e9691ae2ab..19e9c60bb7 100644 --- a/src/drivers/magnetometer/rm3100/rm3100_i2c.cpp +++ b/src/drivers/magnetometer/rm3100/rm3100_i2c.cpp @@ -53,8 +53,6 @@ #include "board_config.h" #include "rm3100.h" -#define RM3100_ADDRESS 0x20 - class RM3100_I2C : public device::I2C { public: diff --git a/src/drivers/magnetometer/rm3100/rm3100_main.cpp b/src/drivers/magnetometer/rm3100/rm3100_main.cpp index 884d19d732..c63da901bb 100644 --- a/src/drivers/magnetometer/rm3100/rm3100_main.cpp +++ b/src/drivers/magnetometer/rm3100/rm3100_main.cpp @@ -41,16 +41,15 @@ #include #include -I2CSPIDriverBase *RM3100::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *RM3100::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { device::Device *interface = nullptr; - if (iterator.busType() == BOARD_I2C_BUS) { - interface = RM3100_I2C_interface(iterator.bus(), cli.bus_frequency); + if (config.bus_type == BOARD_I2C_BUS) { + interface = RM3100_I2C_interface(config.bus, config.bus_frequency); - } else if (iterator.busType() == BOARD_SPI_BUS) { - interface = RM3100_SPI_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } else if (config.bus_type == BOARD_SPI_BUS) { + interface = RM3100_SPI_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode); } if (interface == nullptr) { @@ -60,11 +59,11 @@ I2CSPIDriverBase *RM3100::instantiate(const BusCLIArguments &cli, const BusInsta if (interface->init() != OK) { delete interface; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); + PX4_DEBUG("no device on bus %i (devid 0x%x)", config.bus, config.spi_devid); return nullptr; } - RM3100 *dev = new RM3100(interface, cli.rotation, iterator.configuredBusOption(), iterator.bus()); + RM3100 *dev = new RM3100(interface, config); if (dev == nullptr) { delete interface; @@ -119,6 +118,8 @@ extern "C" int rm3100_main(int argc, char *argv[]) return -1; } + cli.i2c_address = RM3100_ADDRESS; + BusInstanceIterator iterator(MODULE_NAME, cli, DRV_MAG_DEVTYPE_RM3100); if (!strcmp(verb, "start")) { diff --git a/src/drivers/magnetometer/vtrantech/vcm1193l/VCM1193L.cpp b/src/drivers/magnetometer/vtrantech/vcm1193l/VCM1193L.cpp index 74a62059e3..24ceb46964 100644 --- a/src/drivers/magnetometer/vtrantech/vcm1193l/VCM1193L.cpp +++ b/src/drivers/magnetometer/vtrantech/vcm1193l/VCM1193L.cpp @@ -40,10 +40,10 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -VCM1193L::VCM1193L(I2CSPIBusOption bus_option, int bus, int bus_frequency, enum Rotation rotation) : - I2C(DRV_MAG_DEVTYPE_VCM1193L, MODULE_NAME, bus, I2C_ADDRESS_DEFAULT, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _px4_mag(get_device_id(), rotation) +VCM1193L::VCM1193L(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _px4_mag(get_device_id(), config.rotation) { _px4_mag.set_external(external()); } diff --git a/src/drivers/magnetometer/vtrantech/vcm1193l/VCM1193L.hpp b/src/drivers/magnetometer/vtrantech/vcm1193l/VCM1193L.hpp index 9814f6b5d0..c0bb0a6147 100644 --- a/src/drivers/magnetometer/vtrantech/vcm1193l/VCM1193L.hpp +++ b/src/drivers/magnetometer/vtrantech/vcm1193l/VCM1193L.hpp @@ -53,11 +53,9 @@ using namespace VTT_VCM1193L; class VCM1193L : public device::I2C, public I2CSPIDriver { public: - VCM1193L(I2CSPIBusOption bus_option, int bus, int bus_frequency, enum Rotation rotation = ROTATION_NONE); + VCM1193L(const I2CSPIDriverConfig &config); ~VCM1193L() override; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/magnetometer/vtrantech/vcm1193l/vcm1193l_main.cpp b/src/drivers/magnetometer/vtrantech/vcm1193l/vcm1193l_main.cpp index d99cbc8f72..d6c9f53fa4 100644 --- a/src/drivers/magnetometer/vtrantech/vcm1193l/vcm1193l_main.cpp +++ b/src/drivers/magnetometer/vtrantech/vcm1193l/vcm1193l_main.cpp @@ -35,25 +35,6 @@ #include #include "VCM1193L.hpp" -I2CSPIDriverBase * -VCM1193L::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, int runtime_instance) -{ - VCM1193L *instance = new VCM1193L(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, cli.rotation); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); - return nullptr; - } - - return instance; -} - void VCM1193L::print_usage() { PRINT_MODULE_USAGE_NAME("vcm1193l", "driver"); diff --git a/src/drivers/optical_flow/paw3902/PAW3902.cpp b/src/drivers/optical_flow/paw3902/PAW3902.cpp index eff5abf299..c61f8e0d39 100644 --- a/src/drivers/optical_flow/paw3902/PAW3902.cpp +++ b/src/drivers/optical_flow/paw3902/PAW3902.cpp @@ -38,13 +38,14 @@ static constexpr int16_t combine(uint8_t msb, uint8_t lsb) return (msb << 8u) | lsb; } -PAW3902::PAW3902(I2CSPIBusOption bus_option, int bus, int devid, int bus_frequency, spi_mode_e spi_mode, - spi_drdy_gpio_t drdy_gpio, float yaw_rotation_degrees) : - SPI(DRV_FLOW_DEVTYPE_PAW3902, MODULE_NAME, bus, devid, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - _drdy_gpio(drdy_gpio) +PAW3902::PAW3902(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), + _drdy_gpio(config.drdy_gpio) { - if (PX4_ISFINITE(yaw_rotation_degrees)) { + float yaw_rotation_degrees = (float)config.custom1; + + if (yaw_rotation_degrees >= 0.f) { PX4_INFO("using yaw rotation %.3f degrees (%.3f radians)", (double)yaw_rotation_degrees, (double)math::radians(yaw_rotation_degrees)); diff --git a/src/drivers/optical_flow/paw3902/PAW3902.hpp b/src/drivers/optical_flow/paw3902/PAW3902.hpp index 1a567e941e..65ec5b815a 100644 --- a/src/drivers/optical_flow/paw3902/PAW3902.hpp +++ b/src/drivers/optical_flow/paw3902/PAW3902.hpp @@ -62,12 +62,9 @@ using namespace PixArt_PAW3902JF; class PAW3902 : public device::SPI, public I2CSPIDriver { public: - PAW3902(I2CSPIBusOption bus_option, int bus, int devid, int bus_frequency, spi_mode_e spi_mode, - spi_drdy_gpio_t drdy_gpio, float yaw_rotation_degrees = NAN); + PAW3902(const I2CSPIDriverConfig &config); virtual ~PAW3902(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init() override; diff --git a/src/drivers/optical_flow/paw3902/paw3902_main.cpp b/src/drivers/optical_flow/paw3902/paw3902_main.cpp index 0090ae4746..733adc4573 100644 --- a/src/drivers/optical_flow/paw3902/paw3902_main.cpp +++ b/src/drivers/optical_flow/paw3902/paw3902_main.cpp @@ -43,31 +43,6 @@ void PAW3902::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *PAW3902::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - float yaw_rotation_degrees = NAN; - - if (cli.custom1 >= 0) { - yaw_rotation_degrees = cli.custom1; - } - - PAW3902 *instance = new PAW3902(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.bus_frequency, - cli.spi_mode, iterator.DRDYGPIO(), yaw_rotation_degrees); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" __EXPORT int paw3902_main(int argc, char *argv[]) { int ch = 0; diff --git a/src/drivers/optical_flow/pmw3901/PMW3901.cpp b/src/drivers/optical_flow/pmw3901/PMW3901.cpp index 006408fd35..78809cf554 100644 --- a/src/drivers/optical_flow/pmw3901/PMW3901.cpp +++ b/src/drivers/optical_flow/pmw3901/PMW3901.cpp @@ -35,13 +35,12 @@ static constexpr uint32_t TIME_us_TSWW = 11; // - actually 10.5us -PMW3901::PMW3901(I2CSPIBusOption bus_option, int bus, int devid, enum Rotation yaw_rotation, int bus_frequency, - spi_mode_e spi_mode) : - SPI(DRV_FLOW_DEVTYPE_PMW3901, MODULE_NAME, bus, devid, spi_mode, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), +PMW3901::PMW3901(const I2CSPIDriverConfig &config) : + SPI(config), + I2CSPIDriver(config), _sample_perf(perf_alloc(PC_ELAPSED, "pmw3901: read")), _comms_errors(perf_alloc(PC_COUNT, "pmw3901: com err")), - _yaw_rotation(yaw_rotation) + _yaw_rotation(config.rotation) { } diff --git a/src/drivers/optical_flow/pmw3901/PMW3901.hpp b/src/drivers/optical_flow/pmw3901/PMW3901.hpp index 6840f87bf5..13d850a66b 100644 --- a/src/drivers/optical_flow/pmw3901/PMW3901.hpp +++ b/src/drivers/optical_flow/pmw3901/PMW3901.hpp @@ -65,13 +65,10 @@ class PMW3901 : public device::SPI, public I2CSPIDriver { public: - PMW3901(I2CSPIBusOption bus_option, int bus, int devid, enum Rotation yaw_rotation, int bus_frequency, - spi_mode_e spi_mode); + PMW3901(const I2CSPIDriverConfig &config); virtual ~PMW3901(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); virtual int init(); diff --git a/src/drivers/optical_flow/pmw3901/pmw3901_main.cpp b/src/drivers/optical_flow/pmw3901/pmw3901_main.cpp index 740781d02f..c68f2e4fc8 100644 --- a/src/drivers/optical_flow/pmw3901/pmw3901_main.cpp +++ b/src/drivers/optical_flow/pmw3901/pmw3901_main.cpp @@ -46,25 +46,6 @@ PMW3901::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *PMW3901::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - PMW3901 *instance = new PMW3901(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, - cli.bus_frequency, cli.spi_mode); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - int pmw3901_main(int argc, char *argv[]) { diff --git a/src/drivers/optical_flow/px4flow/px4flow.cpp b/src/drivers/optical_flow/px4flow/px4flow.cpp index 27ba1bdd9e..5f9625cb2e 100644 --- a/src/drivers/optical_flow/px4flow/px4flow.cpp +++ b/src/drivers/optical_flow/px4flow/px4flow.cpp @@ -75,12 +75,9 @@ class PX4FLOW: public device::I2C, public I2CSPIDriver { public: - PX4FLOW(I2CSPIBusOption bus_option, int bus, int address, uint8_t sonar_rotation, int bus_frequency, - int conversion_interval = PX4FLOW_CONVERSION_INTERVAL_DEFAULT, enum Rotation rotation = ROTATION_NONE); + PX4FLOW(const I2CSPIDriverConfig &config); virtual ~PX4FLOW(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init() override; @@ -139,14 +136,13 @@ private: extern "C" __EXPORT int px4flow_main(int argc, char *argv[]); -PX4FLOW::PX4FLOW(I2CSPIBusOption bus_option, int bus, int address, uint8_t sonar_rotation, int bus_frequency, - int conversion_interval, enum Rotation rotation) : - I2C(DRV_FLOW_DEVTYPE_PX4FLOW, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address), - _sonar_rotation(sonar_rotation), +PX4FLOW::PX4FLOW(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), + _sonar_rotation(config.rotation), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), _comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": com_err")), - _sensor_rotation(rotation) + _sensor_rotation(Rotation::ROTATION_NONE) { } @@ -382,25 +378,6 @@ PX4FLOW::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *PX4FLOW::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - PX4FLOW *instance = new PX4FLOW(iterator.configuredBusOption(), iterator.bus(), cli.i2c_address, cli.orientation, - cli.bus_frequency); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - int px4flow_main(int argc, char *argv[]) { @@ -408,13 +385,13 @@ px4flow_main(int argc, char *argv[]) using ThisDriver = PX4FLOW; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = PX4FLOW_I2C_MAX_BUS_SPEED; - cli.orientation = distance_sensor_s::ROTATION_DOWNWARD_FACING; + cli.rotation = (Rotation)distance_sensor_s::ROTATION_DOWNWARD_FACING; cli.i2c_address = I2C_FLOW_ADDRESS_DEFAULT; while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { switch (ch) { case 'R': - cli.orientation = atoi(cli.optArg()); + cli.rotation = (Rotation)atoi(cli.optArg()); break; } } diff --git a/src/drivers/osd/atxxxx/atxxxx.cpp b/src/drivers/osd/atxxxx/atxxxx.cpp index 8b40635b97..82b674964f 100644 --- a/src/drivers/osd/atxxxx/atxxxx.cpp +++ b/src/drivers/osd/atxxxx/atxxxx.cpp @@ -46,10 +46,10 @@ using namespace time_literals; static constexpr uint32_t OSD_UPDATE_RATE{50_ms}; // 20 Hz -OSDatxxxx::OSDatxxxx(I2CSPIBusOption bus_option, int bus, int devid, int bus_frequency, spi_mode_e spi_mode) : - SPI(DRV_OSD_DEVTYPE_ATXXXX, MODULE_NAME, bus, devid, spi_mode, bus_frequency), +OSDatxxxx::OSDatxxxx(const I2CSPIDriverConfig &config) : + SPI(config), ModuleParams(nullptr), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus) + I2CSPIDriver(config) { } @@ -84,6 +84,10 @@ OSDatxxxx::init() } } + if (ret == PX4_OK) { + start(); + } + return ret; } @@ -503,27 +507,6 @@ It can be enabled with the OSD_ATXXXX_CFG parameter. PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *OSDatxxxx::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - OSDatxxxx *instance = new OSDatxxxx(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), - cli.bus_frequency, cli.spi_mode); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - instance->start(); - - return instance; -} - int atxxxx_main(int argc, char *argv[]) { diff --git a/src/drivers/osd/atxxxx/atxxxx.h b/src/drivers/osd/atxxxx/atxxxx.h index 27db949d4f..e821e65deb 100644 --- a/src/drivers/osd/atxxxx/atxxxx.h +++ b/src/drivers/osd/atxxxx/atxxxx.h @@ -68,11 +68,9 @@ extern "C" __EXPORT int atxxxx_main(int argc, char *argv[]); class OSDatxxxx : public device::SPI, public ModuleParams, public I2CSPIDriver { public: - OSDatxxxx(I2CSPIBusOption bus_option, int bus, int devid, int bus_frequency, spi_mode_e spi_mode); + OSDatxxxx(const I2CSPIDriverConfig &config); virtual ~OSDatxxxx() = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init() override; diff --git a/src/drivers/pca9685/pca9685.cpp b/src/drivers/pca9685/pca9685.cpp index 84b7604b1d..588c624c44 100644 --- a/src/drivers/pca9685/pca9685.cpp +++ b/src/drivers/pca9685/pca9685.cpp @@ -116,11 +116,9 @@ using namespace time_literals; class PCA9685 : public device::I2C, public I2CSPIDriver { public: - PCA9685(I2CSPIBusOption bus_option, int bus, int bus_frequency); + PCA9685(const I2CSPIDriverConfig &config); ~PCA9685() override = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void print_status(); @@ -177,9 +175,9 @@ private: }; -PCA9685::PCA9685(I2CSPIBusOption bus_option, int bus, int bus_frequency) : - I2C(DRV_PWM_DEVTYPE_PCA9685, MODULE_NAME, bus, ADDR, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), +PCA9685::PCA9685(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config), _mode(IOX_MODE_ON), _i2cpwm_interval(1_s / 60.0f), _comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": com_err")), @@ -436,29 +434,12 @@ PCA9685::print_usage() PRINT_MODULE_USAGE_NAME("pca9685", "driver"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x40); PRINT_MODULE_USAGE_COMMAND("reset"); PRINT_MODULE_USAGE_COMMAND_DESCR("test", "enter test mode"); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *PCA9685::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - PCA9685 *instance = new PCA9685(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency); - - if (!instance) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (OK != instance->init()) { - delete instance; - return nullptr; - } - - return instance; -} - void PCA9685::custom_method(const BusCLIArguments &cli) { switch (cli.custom1) { @@ -473,6 +454,7 @@ extern "C" int pca9685_main(int argc, char *argv[]) using ThisDriver = PCA9685; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = 100000; + cli.i2c_address = ADDR; const char *verb = cli.parseDefaultArguments(argc, argv); diff --git a/src/drivers/power_monitor/ina226/ina226.cpp b/src/drivers/power_monitor/ina226/ina226.cpp index ee74c612df..706d452705 100644 --- a/src/drivers/power_monitor/ina226/ina226.cpp +++ b/src/drivers/power_monitor/ina226/ina226.cpp @@ -41,10 +41,10 @@ #include "ina226.h" -INA226::INA226(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address, int battery_index) : - I2C(DRV_POWER_DEVTYPE_INA226, MODULE_NAME, bus, address, bus_frequency), +INA226::INA226(const I2CSPIDriverConfig &config, int battery_index) : + I2C(config), ModuleParams(nullptr), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address), + I2CSPIDriver(config), _sample_perf(perf_alloc(PC_ELAPSED, "ina226_read")), _comms_errors(perf_alloc(PC_COUNT, "ina226_com_err")), _collection_errors(perf_alloc(PC_COUNT, "ina226_collection_err")), diff --git a/src/drivers/power_monitor/ina226/ina226.h b/src/drivers/power_monitor/ina226/ina226.h index 58a377d908..78034a6cf1 100644 --- a/src/drivers/power_monitor/ina226/ina226.h +++ b/src/drivers/power_monitor/ina226/ina226.h @@ -152,11 +152,10 @@ using namespace time_literals; class INA226 : public device::I2C, public ModuleParams, public I2CSPIDriver { public: - INA226(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address, int battery_index); + INA226(const I2CSPIDriverConfig &config, int battery_index); virtual ~INA226(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); void RunImpl(); diff --git a/src/drivers/power_monitor/ina226/ina226_main.cpp b/src/drivers/power_monitor/ina226/ina226_main.cpp index 69ea5f3836..d1376ed5d1 100644 --- a/src/drivers/power_monitor/ina226/ina226_main.cpp +++ b/src/drivers/power_monitor/ina226/ina226_main.cpp @@ -35,20 +35,18 @@ #include "ina226.h" -I2CSPIDriverBase *INA226::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *INA226::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { - INA226 *instance = new INA226(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, cli.i2c_address, - cli.custom2); + INA226 *instance = new INA226(config, config.custom1); if (instance == nullptr) { PX4_ERR("alloc failed"); return nullptr; } - if (cli.keep_running) { + if (config.keep_running) { if (instance->force_init() != PX4_OK) { - PX4_INFO("Failed to init INA226 on bus %d, but will try again periodically.", iterator.bus()); + PX4_INFO("Failed to init INA226 on bus %d, but will try again periodically.", config.bus); } } else if (instance->init() != PX4_OK) { @@ -97,12 +95,12 @@ ina226_main(int argc, char *argv[]) cli.i2c_address = INA226_BASEADDR; cli.default_i2c_frequency = 100000; cli.support_keep_running = true; - cli.custom2 = 1; + cli.custom1 = 1; while ((ch = cli.getOpt(argc, argv, "t:")) != EOF) { switch (ch) { case 't': // battery index - cli.custom2 = (int)strtol(cli.optArg(), NULL, 0); + cli.custom1 = (int)strtol(cli.optArg(), NULL, 0); break; } } diff --git a/src/drivers/power_monitor/voxlpm/voxlpm.cpp b/src/drivers/power_monitor/voxlpm/voxlpm.cpp index 84b2be3ee6..ab4d8ed676 100644 --- a/src/drivers/power_monitor/voxlpm/voxlpm.cpp +++ b/src/drivers/power_monitor/voxlpm/voxlpm.cpp @@ -47,13 +47,13 @@ * Address 0x44 - measures battery voltage and current with a 0.0005 ohm sense resistor * Address 0x45 - measures 5VDC/12VDC ouptut voltage and current with a 0.005 ohm sense resistor */ -VOXLPM::VOXLPM(I2CSPIBusOption bus_option, const int bus, int bus_frequency, VOXLPM_CH_TYPE ch_type) : - I2C(DRV_POWER_DEVTYPE_VOXLPM, MODULE_NAME, bus, VOXLPM_INA231_ADDR_VBATT, bus_frequency), +VOXLPM::VOXLPM(const I2CSPIDriverConfig &config) : + I2C(config), ModuleParams(nullptr), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), + I2CSPIDriver(config), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": sample")), _comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": comms_errors")), - _ch_type(ch_type), + _ch_type((VOXLPM_CH_TYPE)config.custom1), _battery(1, this, _meas_interval_us) { } diff --git a/src/drivers/power_monitor/voxlpm/voxlpm.hpp b/src/drivers/power_monitor/voxlpm/voxlpm.hpp index 5717542ca8..afae6a6f0e 100644 --- a/src/drivers/power_monitor/voxlpm/voxlpm.hpp +++ b/src/drivers/power_monitor/voxlpm/voxlpm.hpp @@ -225,11 +225,10 @@ enum VOXLPM_CH_TYPE { class VOXLPM : public device::I2C, public ModuleParams, public I2CSPIDriver { public: - VOXLPM(I2CSPIBusOption bus_option, const int bus, int bus_frequency, VOXLPM_CH_TYPE ch_type); + VOXLPM(const I2CSPIDriverConfig &config); virtual ~VOXLPM(); - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); virtual int init(); diff --git a/src/drivers/power_monitor/voxlpm/voxlpm_main.cpp b/src/drivers/power_monitor/voxlpm/voxlpm_main.cpp index f84cbb483f..1cb2e232f6 100644 --- a/src/drivers/power_monitor/voxlpm/voxlpm_main.cpp +++ b/src/drivers/power_monitor/voxlpm/voxlpm_main.cpp @@ -36,21 +36,18 @@ #include "voxlpm.hpp" -I2CSPIDriverBase *VOXLPM::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) +I2CSPIDriverBase *VOXLPM::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { - VOXLPM *instance = new VOXLPM(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency, - (VOXLPM_CH_TYPE)cli.type); + VOXLPM *instance = new VOXLPM(config); if (instance == nullptr) { PX4_ERR("alloc failed"); return nullptr; } - if (cli.keep_running) { + if (config.keep_running) { if (OK != instance->force_init()) { - PX4_INFO("Failed to init voxlpm type: %d on bus: %d, but will try again periodically.", (VOXLPM_CH_TYPE)cli.type, - iterator.bus()); + PX4_INFO("Failed to init voxlpm type: %d on bus: %d, but will try again periodically.", config.custom1, config.bus); } } else if (OK != instance->init()) { @@ -68,6 +65,7 @@ VOXLPM::print_usage() PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x44); PRINT_MODULE_USAGE_PARAM_STRING('T', "VBATT", "VBATT|P5VDC|P12VDC", "Type", true); PRINT_MODULE_USAGE_PARAMS_I2C_KEEP_RUNNING_FLAG(); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); @@ -80,20 +78,21 @@ voxlpm_main(int argc, char *argv[]) using ThisDriver = VOXLPM; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = 400000; - cli.type = VOXLPM_CH_TYPE_VBATT; + cli.custom1 = VOXLPM_CH_TYPE_VBATT; cli.support_keep_running = true; + cli.i2c_address = VOXLPM_INA231_ADDR_VBATT; while ((ch = cli.getOpt(argc, argv, "T:")) != EOF) { switch (ch) { case 'T': if (strcmp(cli.optArg(), "VBATT") == 0) { - cli.type = VOXLPM_CH_TYPE_VBATT; + cli.custom1 = VOXLPM_CH_TYPE_VBATT; } else if (strcmp(cli.optArg(), "P5VDC") == 0) { - cli.type = VOXLPM_CH_TYPE_P5VDC; + cli.custom1 = VOXLPM_CH_TYPE_P5VDC; } else if (strcmp(cli.optArg(), "P12VDC") == 0) { - cli.type = VOXLPM_CH_TYPE_P12VDC; // same as P5VDC + cli.custom1 = VOXLPM_CH_TYPE_P12VDC; // same as P5VDC } else { PX4_ERR("unknown type"); diff --git a/src/drivers/rpm/pcf8583/PCF8583.cpp b/src/drivers/rpm/pcf8583/PCF8583.cpp index 7fbc4af4cb..cbc8c701a4 100644 --- a/src/drivers/rpm/pcf8583/PCF8583.cpp +++ b/src/drivers/rpm/pcf8583/PCF8583.cpp @@ -33,17 +33,15 @@ #include "PCF8583.hpp" -PCF8583::PCF8583(I2CSPIBusOption bus_option, const int bus, int bus_frequency) : - I2C(DRV_SENS_DEVTYPE_PCF8583, MODULE_NAME, bus, PCF8583_BASEADDR_DEFAULT, bus_frequency), +PCF8583::PCF8583(const I2CSPIDriverConfig &config) : + I2C(config), ModuleParams(nullptr), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus) + I2CSPIDriver(config) { } int PCF8583::init() { - set_device_address(_param_pcf8583_addr.get()); - if (I2C::init() != PX4_OK) { return PX4_ERROR; } diff --git a/src/drivers/rpm/pcf8583/PCF8583.hpp b/src/drivers/rpm/pcf8583/PCF8583.hpp index d55b288b22..34c19c2d43 100644 --- a/src/drivers/rpm/pcf8583/PCF8583.hpp +++ b/src/drivers/rpm/pcf8583/PCF8583.hpp @@ -57,11 +57,9 @@ class PCF8583 : public device::I2C, public ModuleParams, public I2CSPIDriver { public: - PCF8583(I2CSPIBusOption bus_option, const int bus, int bus_frequency); + PCF8583(const I2CSPIDriverConfig &config); ~PCF8583() override = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); void RunImpl(); @@ -85,7 +83,6 @@ private: uORB::Publication _rpm_pub{ORB_ID(rpm)}; DEFINE_PARAMETERS( - (ParamInt) _param_pcf8583_addr, (ParamInt) _param_pcf8583_pool, (ParamInt) _param_pcf8583_reset, (ParamInt) _param_pcf8583_magnet diff --git a/src/drivers/rpm/pcf8583/pcf8583_main.cpp b/src/drivers/rpm/pcf8583/pcf8583_main.cpp index a958e04305..c52c779254 100644 --- a/src/drivers/rpm/pcf8583/pcf8583_main.cpp +++ b/src/drivers/rpm/pcf8583/pcf8583_main.cpp @@ -42,32 +42,20 @@ PCF8583::print_usage() PRINT_MODULE_USAGE_NAME("pcf8583", "driver"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, false); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(80); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *PCF8583::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - PCF8583 *instance = new PCF8583(iterator.configuredBusOption(), iterator.bus(), cli.bus_frequency); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - return instance; -} extern "C" __EXPORT int pcf8583_main(int argc, char *argv[]) { using ThisDriver = PCF8583; BusCLIArguments cli{true, false}; cli.default_i2c_frequency = 400000; + int32_t addr{80}; + param_get(param_find("PCF8583_ADDR"), &addr); + cli.i2c_address = addr; + const char *verb = cli.parseDefaultArguments(argc, argv); if (!verb) { diff --git a/src/drivers/smart_battery/batmon/batmon.cpp b/src/drivers/smart_battery/batmon/batmon.cpp index d1c3880504..eba6ce2469 100644 --- a/src/drivers/smart_battery/batmon/batmon.cpp +++ b/src/drivers/smart_battery/batmon/batmon.cpp @@ -46,25 +46,14 @@ extern "C" __EXPORT int batmon_main(int argc, char *argv[]); -Batmon::Batmon(I2CSPIBusOption bus_option, const int bus, SMBus *interface): - SMBUS_SBS_BaseClass(bus_option, bus, interface) +Batmon::Batmon(const I2CSPIDriverConfig &config, SMBus *interface): + SMBUS_SBS_BaseClass(config, interface) { - } -Batmon::~Batmon() +I2CSPIDriverBase *Batmon::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) { - // Needn't change the parameter since there are other modules that may use it. - //int battsource = 0; - //param_set(param_find("BAT_SOURCE"), &battsource); -} - -I2CSPIDriverBase *Batmon::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) - -{ - //TODO there may be a better way to pass the driver ID, since iterator object should have it - SMBus *interface = new SMBus(DRV_BAT_DEVTYPE_BATMON_SMBUS, iterator.bus(), cli.i2c_address); + SMBus *interface = new SMBus(config.devid_driver_index, config.bus, config.i2c_address); int32_t batmon_en_param = 0; param_get(param_find("BATMON_DRIVER_EN"), &batmon_en_param); @@ -78,7 +67,7 @@ I2CSPIDriverBase *Batmon::instantiate(const BusCLIArguments &cli, const BusInsta return nullptr; } - Batmon *instance = new Batmon(iterator.configuredBusOption(), iterator.bus(), interface); + Batmon *instance = new Batmon(config, interface); if (instance == nullptr) { PX4_ERR("alloc failed"); diff --git a/src/drivers/smart_battery/batmon/batmon.h b/src/drivers/smart_battery/batmon/batmon.h index 1700e28a84..903a992515 100644 --- a/src/drivers/smart_battery/batmon/batmon.h +++ b/src/drivers/smart_battery/batmon/batmon.h @@ -54,16 +54,16 @@ class Batmon : public SMBUS_SBS_BaseClass { public: - Batmon(I2CSPIBusOption bus_option, const int bus, SMBus *interface); - ~Batmon(); + Batmon(const I2CSPIDriverConfig &config, SMBus *interface); + ~Batmon() = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); + static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); static void print_usage(); void RunImpl(); - enum { + + enum BATMON_REGISTERS { BATT_SMBUS_TEMP_EXTERNAL_1 = 0x48, BATT_SMBUS_TEMP_EXTERNAL_2 = 0x49, BATT_SMBUS_CELL_1_VOLTAGE = 0x3F, @@ -83,7 +83,7 @@ public: BATT_SMBUS_CELL_15_VOLTAGE = 0x31, BATT_SMBUS_CELL_16_VOLTAGE = 0x30, BATT_SMBUS_CELL_COUNT = 0x40 - } BATMON_REGISTERS; + }; private: diff --git a/src/drivers/telemetry/bst/bst.cpp b/src/drivers/telemetry/bst/bst.cpp index fccf100cee..867200c0ca 100644 --- a/src/drivers/telemetry/bst/bst.cpp +++ b/src/drivers/telemetry/bst/bst.cpp @@ -111,11 +111,9 @@ struct BSTBattery { class BST : public device::I2C, public I2CSPIDriver { public: - BST(I2CSPIBusOption bus_option, const int bus, int address, int bus_frequency); + BST(const I2CSPIDriverConfig &config); ~BST() override = default; - static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance); static void print_usage(); int init() override; @@ -179,9 +177,9 @@ private: } }; -BST::BST(I2CSPIBusOption bus_option, const int bus, int address, int bus_frequency) : - I2C(DRV_TEL_DEVTYPE_BST, MODULE_NAME, bus, address, bus_frequency), - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address) +BST::BST(const I2CSPIDriverConfig &config) : + I2C(config), + I2CSPIDriver(config) { } @@ -317,24 +315,6 @@ BST::print_usage() PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); } -I2CSPIDriverBase *BST::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - int runtime_instance) -{ - BST *instance = new BST(iterator.configuredBusOption(), iterator.bus(), cli.i2c_address, cli.bus_frequency); - - if (instance == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (instance->init() != PX4_OK) { - delete instance; - return nullptr; - } - - return instance; -} - extern "C" __EXPORT int bst_main(int argc, char *argv[]) { using ThisDriver = BST; diff --git a/src/lib/drivers/smbus_sbs/SBS.hpp b/src/lib/drivers/smbus_sbs/SBS.hpp index 3810bf3b1a..11b518cbed 100644 --- a/src/lib/drivers/smbus_sbs/SBS.hpp +++ b/src/lib/drivers/smbus_sbs/SBS.hpp @@ -58,7 +58,7 @@ template class SMBUS_SBS_BaseClass : public I2CSPIDriver { public: - SMBUS_SBS_BaseClass(I2CSPIBusOption bus_option, const int bus, SMBus *interface); + SMBUS_SBS_BaseClass(const I2CSPIDriverConfig &config, SMBus *interface); SMBUS_SBS_BaseClass(); ~SMBUS_SBS_BaseClass(); @@ -170,16 +170,12 @@ protected: }; template -SMBUS_SBS_BaseClass::SMBUS_SBS_BaseClass(I2CSPIBusOption bus_option, const int bus, SMBus *interface): - I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id()), bus_option, bus, - interface->get_device_address()), +SMBUS_SBS_BaseClass::SMBUS_SBS_BaseClass(const I2CSPIDriverConfig &config, SMBus *interface): + I2CSPIDriver(config), _interface(interface) { - static int SBS_instance_number = 0; battery_status_s new_report = {}; - SBS_instance_number++; - // TODO: there maybe a better way to assign instance number. This would - // result in continuously increasing instance number and possible overflow + int SBS_instance_number = 0; _batt_topic = orb_advertise_multi(ORB_ID(battery_status), &new_report, &SBS_instance_number); _interface->init(); }