Browse Source

differential_pressure drivers: allow multiple instances of each driver

- the device path needs to be removed, as startup fails if it already
  exists
- sdp3x broadcasts a reset on startup, so do it only for the first I2C
  address
sbg
Beat Küng 5 years ago committed by Daniel Agar
parent
commit
68ef14002a
  1. 8
      src/drivers/differential_pressure/ets/ets_airspeed.cpp
  2. 8
      src/drivers/differential_pressure/ms4525/ms4525_airspeed.cpp
  3. 7
      src/drivers/differential_pressure/ms5525/MS5525.hpp
  4. 28
      src/drivers/differential_pressure/sdp3x/SDP3X.cpp
  5. 7
      src/drivers/differential_pressure/sdp3x/SDP3X.hpp
  6. 4
      src/lib/drivers/airspeed/airspeed.cpp
  7. 2
      src/lib/drivers/airspeed/airspeed.h

8
src/drivers/differential_pressure/ets/ets_airspeed.cpp

@ -47,7 +47,6 @@ @@ -47,7 +47,6 @@
/* I2C bus address */
#define I2C_ADDRESS 0x75 /* 7-bit address. 8-bit address is 0xEA */
#define ETS_PATH "/dev/ets_airspeed"
/* Register address */
#define READ_CMD 0x07 /* Read the data */
@ -64,8 +63,7 @@ @@ -64,8 +63,7 @@
class ETSAirspeed : public Airspeed, public I2CSPIDriver<ETSAirspeed>
{
public:
ETSAirspeed(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address = I2C_ADDRESS,
const char *path = ETS_PATH);
ETSAirspeed(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address = I2C_ADDRESS);
virtual ~ETSAirspeed() = default;
@ -84,8 +82,8 @@ protected: @@ -84,8 +82,8 @@ 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, const char *path)
: Airspeed(bus, bus_frequency, address, CONVERSION_INTERVAL, path),
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)
{
_device_id.devid_s.devtype = DRV_DIFF_PRESS_DEVTYPE_MS4525;

8
src/drivers/differential_pressure/ms4525/ms4525_airspeed.cpp

@ -65,7 +65,6 @@ enum MS_DEVICE_TYPE { @@ -65,7 +65,6 @@ enum MS_DEVICE_TYPE {
/* I2C bus address is 1010001x */
#define I2C_ADDRESS_MS4515DO 0x46
#define I2C_ADDRESS_MS4525DO 0x28 /**< 7-bit address. Depends on the order code (this is for code "I") */
#define PATH_MS4525 "/dev/ms4525"
/* Register address */
#define ADDR_READ_MR 0x00 /* write to this address to start conversion */
@ -79,8 +78,7 @@ enum MS_DEVICE_TYPE { @@ -79,8 +78,7 @@ enum MS_DEVICE_TYPE {
class MEASAirspeed : public Airspeed, public I2CSPIDriver<MEASAirspeed>
{
public:
MEASAirspeed(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address = I2C_ADDRESS_MS4525DO,
const char *path = PATH_MS4525);
MEASAirspeed(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address = I2C_ADDRESS_MS4525DO);
virtual ~MEASAirspeed() = default;
@ -111,8 +109,8 @@ protected: @@ -111,8 +109,8 @@ 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, const char *path)
: Airspeed(bus, bus_frequency, address, CONVERSION_INTERVAL, path),
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)
{
_device_id.devid_s.devtype = DRV_DIFF_PRESS_DEVTYPE_MS4525;

7
src/drivers/differential_pressure/ms5525/MS5525.hpp

@ -43,8 +43,6 @@ @@ -43,8 +43,6 @@
/* The MS5525DSO address is 111011Cx, where C is the complementary value of the pin CSB */
static constexpr uint8_t I2C_ADDRESS_1_MS5525DSO = 0x76;
static constexpr const char PATH_MS5525[] = "/dev/ms5525";
/* Measurement rate is 100Hz */
static constexpr unsigned MEAS_RATE = 100;
static constexpr float MEAS_DRIVER_FILTER_FREQ = 1.2f;
@ -53,9 +51,8 @@ static constexpr int64_t CONVERSION_INTERVAL = (1000000 / MEAS_RATE); /* microse @@ -53,9 +51,8 @@ static constexpr int64_t CONVERSION_INTERVAL = (1000000 / MEAS_RATE); /* microse
class MS5525 : public Airspeed, public I2CSPIDriver<MS5525>
{
public:
MS5525(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address = I2C_ADDRESS_1_MS5525DSO,
const char *path = PATH_MS5525) :
Airspeed(bus, bus_frequency, address, CONVERSION_INTERVAL, path),
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)
{
}

28
src/drivers/differential_pressure/sdp3x/SDP3X.cpp

@ -57,21 +57,25 @@ int SDP3X::write_command(uint16_t command) @@ -57,21 +57,25 @@ int SDP3X::write_command(uint16_t command)
bool
SDP3X::init_sdp3x()
{
// step 1 - reset on broadcast
uint16_t prev_addr = get_device_address();
set_device_address(SDP3X_RESET_ADDR);
uint8_t reset_cmd = SDP3X_RESET_CMD;
int ret = transfer(&reset_cmd, 1, nullptr, 0);
set_device_address(prev_addr);
int ret;
if (get_device_address() == I2C_ADDRESS_1_SDP3X) { // since we are broadcasting, only do it for the first device address
// step 1 - reset on broadcast
uint16_t prev_addr = get_device_address();
set_device_address(SDP3X_RESET_ADDR);
uint8_t reset_cmd = SDP3X_RESET_CMD;
ret = transfer(&reset_cmd, 1, nullptr, 0);
set_device_address(prev_addr);
if (ret != PX4_OK) {
perf_count(_comms_errors);
return false;
}
if (ret != PX4_OK) {
perf_count(_comms_errors);
return false;
// wait until sensor is ready
px4_usleep(20000);
}
// wait until sensor is ready
px4_usleep(20000);
// step 2 - configure
ret = write_command(SDP3X_CONT_MEAS_AVG_MODE);

7
src/drivers/differential_pressure/sdp3x/SDP3X.hpp

@ -61,8 +61,6 @@ @@ -61,8 +61,6 @@
#define SDP3X_SCALE_PRESSURE_SDP32 240
#define SDP3X_SCALE_PRESSURE_SDP33 20
#define PATH_SDP3X "/dev/sdp3x"
// Measurement rate is 20Hz
#define SPD3X_MEAS_RATE 100
#define SDP3X_MEAS_DRIVER_FILTER_FREQ 3.0f
@ -71,9 +69,8 @@ @@ -71,9 +69,8 @@
class SDP3X : public Airspeed, public I2CSPIDriver<SDP3X>
{
public:
SDP3X(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address = I2C_ADDRESS_1_SDP3X,
const char *path = PATH_SDP3X) :
Airspeed(bus, bus_frequency, address, CONVERSION_INTERVAL, path),
SDP3X(I2CSPIBusOption bus_option, const int bus, int bus_frequency, int address = I2C_ADDRESS_1_SDP3X) :
Airspeed(bus, bus_frequency, address, CONVERSION_INTERVAL),
I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus, address)
{
}

4
src/lib/drivers/airspeed/airspeed.cpp

@ -56,8 +56,8 @@ @@ -56,8 +56,8 @@
#include <drivers/airspeed/airspeed.h>
Airspeed::Airspeed(int bus, int bus_frequency, int address, unsigned conversion_interval, const char *path) :
I2C("Airspeed", path, bus, address, bus_frequency),
Airspeed::Airspeed(int bus, int bus_frequency, int address, unsigned conversion_interval) :
I2C("Airspeed", nullptr, bus, address, bus_frequency),
_sensor_ok(false),
_measure_interval(conversion_interval),
_collect_phase(false),

2
src/lib/drivers/airspeed/airspeed.h

@ -46,7 +46,7 @@ @@ -46,7 +46,7 @@
class __EXPORT Airspeed : public device::I2C
{
public:
Airspeed(int bus, int bus_frequency, int address, unsigned conversion_interval, const char *path);
Airspeed(int bus, int bus_frequency, int address, unsigned conversion_interval);
virtual ~Airspeed();
int init() override;

Loading…
Cancel
Save