mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-01 11:06:04 +08:00
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
This commit is contained in:
@@ -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 @@
|
||||
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:
|
||||
*/
|
||||
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;
|
||||
|
||||
@@ -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 {
|
||||
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:
|
||||
*/
|
||||
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;
|
||||
|
||||
@@ -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
|
||||
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)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -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 (ret != PX4_OK) {
|
||||
perf_count(_comms_errors);
|
||||
return false;
|
||||
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;
|
||||
}
|
||||
|
||||
// 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);
|
||||
|
||||
|
||||
@@ -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 @@
|
||||
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)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user