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
+3 -3
View File
@@ -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")),
+2 -3
View File
@@ -152,11 +152,10 @@ using namespace time_literals;
class INA226 : public device::I2C, public ModuleParams, public I2CSPIDriver<INA226>
{
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();
@@ -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;
}
}
+4 -4
View File
@@ -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)
{
}
+2 -3
View File
@@ -225,11 +225,10 @@ enum VOXLPM_CH_TYPE {
class VOXLPM : public device::I2C, public ModuleParams, public I2CSPIDriver<VOXLPM>
{
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();
@@ -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");