drivers: use updated I2C SPI driver interface

This commit is contained in:
Beat Küng
2021-07-08 12:59:35 -04:00
committed by Daniel Agar
parent c5aef9d512
commit e644036325
218 changed files with 812 additions and 2001 deletions
@@ -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());
}
@@ -53,11 +53,9 @@ using namespace AKM_AK09916;
class AK09916 : public device::I2C, public I2CSPIDriver<AK09916>
{
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();
@@ -36,31 +36,13 @@
#include <px4_platform_common/getopt.h>
#include <px4_platform_common/module.h>
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) {
@@ -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());
}
@@ -53,11 +53,9 @@ using namespace AKM_AK8963;
class AK8963 : public device::I2C, public I2CSPIDriver<AK8963>
{
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();
@@ -36,31 +36,13 @@
#include <px4_platform_common/getopt.h>
#include <px4_platform_common/module.h>
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) {
@@ -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());
}
@@ -53,11 +53,9 @@ using namespace Bosch_BMM150;
class BMM150 : public device::I2C, public I2CSPIDriver<BMM150>
{
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();
@@ -36,31 +36,13 @@
#include <px4_platform_common/getopt.h>
#include <px4_platform_common/module.h>
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) {
+3 -3
View File
@@ -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),
+2 -3
View File
@@ -86,11 +86,10 @@
class HMC5883 : public I2CSPIDriver<HMC5883>
{
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();
@@ -42,6 +42,8 @@
#include <drivers/device/Device.hpp>
#include <drivers/device/spi.h>
#define HMC5883L_ADDRESS 0x1E
#define ADDR_ID_A 0x0a
#define ADDR_ID_B 0x0b
#define ADDR_ID_C 0x0c
@@ -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
@@ -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")) {
@@ -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());
}
@@ -53,11 +53,9 @@ using namespace iSentek_IST8308;
class IST8308 : public device::I2C, public I2CSPIDriver<IST8308>
{
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();
@@ -36,31 +36,13 @@
#include <px4_platform_common/getopt.h>
#include <px4_platform_common/module.h>
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) {
@@ -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());
}
@@ -53,11 +53,9 @@ using namespace iSentek_IST8310;
class IST8310 : public device::I2C, public I2CSPIDriver<IST8310>
{
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();
@@ -36,26 +36,6 @@
#include <px4_platform_common/getopt.h>
#include <px4_platform_common/module.h>
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");
+3 -3
View File
@@ -42,9 +42,9 @@
#include <px4_platform_common/time.h>
#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")),
+3 -3
View File
@@ -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<LIS2MDL>
{
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();
@@ -53,8 +53,6 @@
#include "board_config.h"
#include "lis2mdl.h"
#define LIS2MDLL_ADDRESS 0x1e
class LIS2MDL_I2C : public device::I2C
{
public:
@@ -41,16 +41,15 @@
#include <px4_platform_common/getopt.h>
#include <px4_platform_common/module.h>
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")) {
+3 -3
View File
@@ -42,9 +42,9 @@
#include <px4_platform_common/time.h>
#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")),
+5 -3
View File
@@ -92,14 +92,16 @@ enum OPERATING_MODE {
SINGLE
};
#define LIS3MDLL_ADDRESS 0x1e
class LIS3MDL : public I2CSPIDriver<LIS3MDL>
{
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;
@@ -53,8 +53,6 @@
#include "board_config.h"
#include "lis3mdl.h"
#define LIS3MDLL_ADDRESS 0x1e
class LIS3MDL_I2C : public device::I2C
{
public:
@@ -41,16 +41,15 @@
#include <px4_platform_common/getopt.h>
#include <px4_platform_common/module.h>
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")) {
@@ -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"))
@@ -85,12 +85,9 @@ static constexpr uint8_t OUTZ_H_REG_M = 0x6D;
class LSM303AGR : public device::SPI, public I2CSPIDriver<LSM303AGR>
{
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;
@@ -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;
@@ -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());
}
@@ -53,12 +53,9 @@ using namespace ST_LSM9DS1_MAG;
class LSM9DS1_MAG : public device::SPI, public I2CSPIDriver<LSM9DS1_MAG>
{
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();
@@ -36,26 +36,6 @@
#include <px4_platform_common/getopt.h>
#include <px4_platform_common/module.h>
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");
@@ -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());
}
@@ -53,11 +53,9 @@ using namespace QST_QMC5883L;
class QMC5883L : public device::I2C, public I2CSPIDriver<QMC5883L>
{
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();
@@ -36,31 +36,13 @@
#include <px4_platform_common/getopt.h>
#include <px4_platform_common/module.h>
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) {
+3 -3
View File
@@ -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")),
+4 -3
View File
@@ -97,14 +97,15 @@ enum OPERATING_MODE {
SINGLE
};
#define RM3100_ADDRESS 0x20
class RM3100 : public I2CSPIDriver<RM3100>
{
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;
@@ -53,8 +53,6 @@
#include "board_config.h"
#include "rm3100.h"
#define RM3100_ADDRESS 0x20
class RM3100_I2C : public device::I2C
{
public:
@@ -41,16 +41,15 @@
#include <px4_platform_common/getopt.h>
#include <px4_platform_common/module.h>
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")) {
@@ -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());
}
@@ -53,11 +53,9 @@ using namespace VTT_VCM1193L;
class VCM1193L : public device::I2C, public I2CSPIDriver<VCM1193L>
{
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();
@@ -35,25 +35,6 @@
#include <px4_platform_common/module.h>
#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");