diff --git a/src/drivers/barometer/dps310/DPS310.cpp b/src/drivers/barometer/dps310/DPS310.cpp index df3f95f858..b732b41ca6 100644 --- a/src/drivers/barometer/dps310/DPS310.cpp +++ b/src/drivers/barometer/dps310/DPS310.cpp @@ -46,8 +46,9 @@ static void getTwosComplement(T &raw, uint8_t length) } } -DPS310::DPS310(device::Device *interface) : - ScheduledWorkItem(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id())), +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()), _px4_barometer(interface->get_device_id()), _interface(interface), _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), @@ -58,8 +59,6 @@ DPS310::DPS310(device::Device *interface) : DPS310::~DPS310() { - stop(); - perf_free(_sample_perf); perf_free(_comms_errors); @@ -177,13 +176,7 @@ DPS310::start() } void -DPS310::stop() -{ - ScheduleClear(); -} - -void -DPS310::Run() +DPS310::RunImpl() { perf_begin(_sample_perf); @@ -287,8 +280,9 @@ DPS310::RegisterClearBits(Register reg, uint8_t clearbits) } void -DPS310::print_info() +DPS310::print_status() { + I2CSPIDriverBase::print_status(); perf_print_counter(_sample_perf); perf_print_counter(_comms_errors); diff --git a/src/drivers/barometer/dps310/DPS310.hpp b/src/drivers/barometer/dps310/DPS310.hpp index 19e7ead3e3..74395d68e7 100644 --- a/src/drivers/barometer/dps310/DPS310.hpp +++ b/src/drivers/barometer/dps310/DPS310.hpp @@ -43,6 +43,7 @@ #include #include #include +#include #include "Infineon_DPS310_Registers.hpp" @@ -52,22 +53,24 @@ namespace dps310 using Infineon_DPS310::CalibrationCoefficients; using Infineon_DPS310::Register; -class DPS310 : public px4::ScheduledWorkItem +class DPS310 : public I2CSPIDriver { public: - DPS310(device::Device *interface); + DPS310(I2CSPIBusOption bus_option, int bus, device::Device *interface); virtual ~DPS310(); + static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, + int runtime_instance); + static void print_usage(); + int init(); - void print_info(); + void print_status(); + void RunImpl(); private: - void Run() override; - void start(); - void stop(); int reset(); uint8_t RegisterRead(Register reg); @@ -75,7 +78,7 @@ private: void RegisterSetBits(Register reg, uint8_t setbits); void RegisterClearBits(Register reg, uint8_t clearbits); - static constexpr uint32_t SAMPLE_RATE{32}; // + static constexpr uint32_t SAMPLE_RATE{32}; PX4Barometer _px4_barometer; diff --git a/src/drivers/barometer/dps310/DPS310_I2C.cpp b/src/drivers/barometer/dps310/DPS310_I2C.cpp index d8b4f20527..870f3484c3 100644 --- a/src/drivers/barometer/dps310/DPS310_I2C.cpp +++ b/src/drivers/barometer/dps310/DPS310_I2C.cpp @@ -42,12 +42,12 @@ namespace dps310 { -device::Device *DPS310_I2C_interface(uint8_t bus, uint32_t address); +device::Device *DPS310_I2C_interface(uint8_t bus, uint32_t address, int bus_frequency); class DPS310_I2C : public device::I2C { public: - DPS310_I2C(uint8_t bus, uint32_t address); + DPS310_I2C(uint8_t bus, uint32_t address, int bus_frequency); virtual ~DPS310_I2C() = default; virtual int read(unsigned address, void *data, unsigned count); @@ -56,13 +56,13 @@ public: }; device::Device * -DPS310_I2C_interface(uint8_t bus, uint32_t address) +DPS310_I2C_interface(uint8_t bus, uint32_t address, int bus_frequency) { - return new DPS310_I2C(bus, address); + return new DPS310_I2C(bus, address, bus_frequency); } -DPS310_I2C::DPS310_I2C(uint8_t bus, uint32_t address) : - I2C("DPS310_I2C", nullptr, bus, address, 400000) +DPS310_I2C::DPS310_I2C(uint8_t bus, uint32_t address, int bus_frequency) : + I2C("DPS310_I2C", nullptr, bus, address, bus_frequency) { } diff --git a/src/drivers/barometer/dps310/DPS310_SPI.cpp b/src/drivers/barometer/dps310/DPS310_SPI.cpp index 101e9494f6..f33f6df6aa 100644 --- a/src/drivers/barometer/dps310/DPS310_SPI.cpp +++ b/src/drivers/barometer/dps310/DPS310_SPI.cpp @@ -46,12 +46,12 @@ namespace dps310 #define DIR_READ (1<<7) #define DIR_WRITE (0<<7) -device::Device *DPS310_SPI_interface(uint8_t bus, uint32_t device); +device::Device *DPS310_SPI_interface(uint8_t bus, uint32_t device, int bus_frequency, spi_mode_e spi_mode); class DPS310_SPI : public device::SPI { public: - DPS310_SPI(uint8_t bus, uint32_t device); + DPS310_SPI(uint8_t bus, uint32_t device, int bus_frequency, spi_mode_e spi_mode); virtual ~DPS310_SPI() = default; virtual int read(unsigned address, void *data, unsigned count); @@ -60,13 +60,13 @@ public: }; device::Device * -DPS310_SPI_interface(uint8_t bus, uint32_t device) +DPS310_SPI_interface(uint8_t bus, uint32_t device, int bus_frequency, spi_mode_e spi_mode) { - return new DPS310_SPI(bus, device); + return new DPS310_SPI(bus, device, bus_frequency, spi_mode); } -DPS310_SPI::DPS310_SPI(uint8_t bus, uint32_t device) : - SPI("DPS310_SPI", nullptr, bus, device, SPIDEV_MODE3, 10 * 1000 * 1000) +DPS310_SPI::DPS310_SPI(uint8_t bus, uint32_t device, int bus_frequency, spi_mode_e spi_mode) : + SPI("DPS310_SPI", nullptr, bus, device, spi_mode, bus_frequency) { } diff --git a/src/drivers/barometer/dps310/dps310_main.cpp b/src/drivers/barometer/dps310/dps310_main.cpp index b6ff30e78c..b00eb4398b 100644 --- a/src/drivers/barometer/dps310/dps310_main.cpp +++ b/src/drivers/barometer/dps310/dps310_main.cpp @@ -33,188 +33,94 @@ #include "DPS310.hpp" -#include - namespace dps310 { - -enum class DPS310_BUS { - ALL = 0, - I2C_INTERNAL, - I2C_EXTERNAL, - SPI_INTERNAL, - SPI_EXTERNAL -}; - -extern device::Device *DPS310_SPI_interface(uint8_t bus, uint32_t device); -extern device::Device *DPS310_I2C_interface(uint8_t bus, uint32_t device); -typedef device::Device *(*DPS310_constructor)(uint8_t, uint32_t); - -struct dps310_bus_option { - DPS310_BUS busid; - DPS310_constructor interface_constructor; - uint8_t busnum; - uint32_t address; - DPS310 *dev; -} bus_options[] = { -#if defined(PX4_SPI_BUS_2) && defined(PX4_SPIDEV_BARO) - { DPS310_BUS::SPI_INTERNAL, &DPS310_SPI_interface, PX4_SPI_BUS_2, PX4_SPIDEV_BARO, nullptr }, -#endif -#if defined(PX4_I2C_BUS_EXPANSION) && defined(PX4_I2C_OBDEV_DPS310) - { DPS310_BUS::I2C_EXTERNAL, &DPS310_I2C_interface, PX4_I2C_BUS_EXPANSION, PX4_I2C_OBDEV_DPS310, nullptr }, -#endif -}; - -// find a bus structure for a busid -static dps310_bus_option *find_bus(DPS310_BUS busid) -{ - for (dps310_bus_option &bus_option : bus_options) { - if ((busid == DPS310_BUS::ALL || - busid == bus_option.busid) && bus_option.dev != nullptr) { - - return &bus_option; - } - } - - return nullptr; +extern device::Device *DPS310_SPI_interface(uint8_t bus, uint32_t device, int bus_frequency, spi_mode_e spi_mode); +extern device::Device *DPS310_I2C_interface(uint8_t bus, uint32_t device, int bus_frequency); } -static bool start_bus(dps310_bus_option &bus) -{ - device::Device *interface = bus.interface_constructor(bus.busnum, bus.address); +#include +#include - if ((interface == nullptr) || (interface->init() != PX4_OK)) { - PX4_WARN("no device on bus %u", (unsigned)bus.busid); +using namespace dps310; + +void +DPS310::print_usage() +{ + PRINT_MODULE_USAGE_NAME("dps310", "driver"); + PRINT_MODULE_USAGE_SUBCATEGORY("baro"); + PRINT_MODULE_USAGE_COMMAND("start"); + PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, true); + PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x77); + PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); +} + +I2CSPIDriverBase *DPS310::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, + 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); + + } else if (iterator.busType() == BOARD_SPI_BUS) { + interface = DPS310_SPI_interface(iterator.bus(), iterator.devid(), cli.bus_frequency, cli.spi_mode); + } + + if (interface == nullptr) { + PX4_ERR("failed creating interface for bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); + return nullptr; + } + + if (interface->init() != OK) { delete interface; - return false; + PX4_DEBUG("no device on bus %i (devid 0x%x)", iterator.bus(), iterator.devid()); + return nullptr; } - DPS310 *dev = new DPS310(interface); + DPS310 *dev = new DPS310(iterator.configuredBusOption(), iterator.bus(), interface); - if (dev == nullptr || dev->init() != PX4_OK) { - PX4_ERR("driver start failed"); + if (dev == nullptr) { + delete interface; + return nullptr; + } + + if (OK != dev->init()) { delete dev; - return false; + return nullptr; } - bus.dev = dev; - - return true; + return dev; } -static int start(DPS310_BUS busid) -{ - for (dps310_bus_option &bus_option : bus_options) { - if (bus_option.dev != nullptr) { - // this device is already started - PX4_WARN("already started"); - continue; - } - - if (busid != DPS310_BUS::ALL && bus_option.busid != busid) { - // not the one that is asked for - continue; - } - - if (start_bus(bus_option)) { - return PX4_OK; - } - } - - return PX4_ERROR; -} - -static int stop(DPS310_BUS busid) -{ - dps310_bus_option *bus = find_bus(busid); - - if (bus != nullptr && bus->dev != nullptr) { - delete bus->dev; - bus->dev = nullptr; - - } else { - PX4_WARN("driver not running"); - return PX4_ERROR; - } - - return PX4_OK; -} - -static int status(DPS310_BUS busid) -{ - dps310_bus_option *bus = find_bus(busid); - - if (bus != nullptr && bus->dev != nullptr) { - bus->dev->print_info(); - return PX4_OK; - } - - PX4_WARN("driver not running"); - return PX4_ERROR; -} - -static int usage() -{ - PX4_INFO("missing command: try 'start', 'stop', 'status'"); - PX4_INFO("options:"); - PX4_INFO(" -X (i2c external bus)"); - PX4_INFO(" -I (i2c internal bus)"); - PX4_INFO(" -s (spi internal bus)"); - PX4_INFO(" -S (spi external bus)"); - - return 0; -} - -} // namespace dsp310 - extern "C" int dps310_main(int argc, char *argv[]) { - int myoptind = 1; - int ch; - const char *myoptarg = nullptr; + using ThisDriver = DPS310; + BusCLIArguments cli{true, true}; + cli.i2c_address = 0x77; + cli.default_spi_frequency = 10 * 1000 * 1000; - using namespace dps310; + const char *verb = cli.parseDefaultArguments(argc, argv); - DPS310_BUS busid = DPS310_BUS::ALL; - - while ((ch = px4_getopt(argc, argv, "XISs", &myoptind, &myoptarg)) != EOF) { - switch (ch) { - case 'X': - busid = DPS310_BUS::I2C_EXTERNAL; - break; - - case 'I': - busid = DPS310_BUS::I2C_INTERNAL; - break; - - case 'S': - busid = DPS310_BUS::SPI_EXTERNAL; - break; - - case 's': - busid = DPS310_BUS::SPI_INTERNAL; - break; - - default: - return usage(); - } + if (!verb) { + ThisDriver::print_usage(); + return -1; } - if (myoptind >= argc) { - return usage(); - } - - const char *verb = argv[myoptind]; + BusInstanceIterator iterator(MODULE_NAME, cli, DRV_BARO_DEVTYPE_DPS310); if (!strcmp(verb, "start")) { - return start(busid); - - } else if (!strcmp(verb, "stop")) { - return stop(busid); - - } else if (!strcmp(verb, "status")) { - return status(busid); + return ThisDriver::module_start(cli, iterator); } - return usage(); + if (!strcmp(verb, "stop")) { + return ThisDriver::module_stop(iterator); + } + + if (!strcmp(verb, "status")) { + return ThisDriver::module_status(iterator); + } + + ThisDriver::print_usage(); + return -1; }