Browse Source

ms5611: added -X option for external SPI bus

sbg
Andrew Tridgell 11 years ago committed by Lorenz Meier
parent
commit
ab90fe7832
  1. 46
      src/drivers/ms5611/ms5611.cpp
  2. 2
      src/drivers/ms5611/ms5611.h
  3. 10
      src/drivers/ms5611/ms5611_spi.cpp

46
src/drivers/ms5611/ms5611.cpp

@ -50,6 +50,7 @@
#include <stdio.h> #include <stdio.h>
#include <math.h> #include <math.h>
#include <unistd.h> #include <unistd.h>
#include <getopt.h>
#include <nuttx/arch.h> #include <nuttx/arch.h>
#include <nuttx/wqueue.h> #include <nuttx/wqueue.h>
@ -775,7 +776,7 @@ namespace ms5611
MS5611 *g_dev; MS5611 *g_dev;
void start(); void start(bool external_bus);
void test(); void test();
void reset(); void reset();
void info(); void info();
@ -832,7 +833,7 @@ crc4(uint16_t *n_prom)
* Start the driver. * Start the driver.
*/ */
void void
start() start(bool external_bus)
{ {
int fd; int fd;
prom_u prom_buf; prom_u prom_buf;
@ -845,7 +846,7 @@ start()
/* create the driver, try SPI first, fall back to I2C if unsuccessful */ /* create the driver, try SPI first, fall back to I2C if unsuccessful */
if (MS5611_spi_interface != nullptr) if (MS5611_spi_interface != nullptr)
interface = MS5611_spi_interface(prom_buf); interface = MS5611_spi_interface(prom_buf, external_bus);
if (interface == nullptr && (MS5611_i2c_interface != nullptr)) if (interface == nullptr && (MS5611_i2c_interface != nullptr))
interface = MS5611_i2c_interface(prom_buf); interface = MS5611_i2c_interface(prom_buf);
@ -1058,41 +1059,66 @@ calibrate(unsigned altitude)
} // namespace } // namespace
void
ms5611_usage()
{
warnx("missing command: try 'start', 'info', 'test', 'test2', 'reset', 'calibrate'");
warnx("options:");
warnx(" -X (external bus)");
}
int int
ms5611_main(int argc, char *argv[]) ms5611_main(int argc, char *argv[])
{ {
bool external_bus = false;
int ch;
/* jump over start/off/etc and look at options first */
while ((ch = getopt(argc, argv, "X")) != EOF) {
switch (ch) {
case 'X':
external_bus = true;
break;
default:
ms5611_usage();
exit(0);
}
}
const char *verb = argv[optind];
/* /*
* Start/load the driver. * Start/load the driver.
*/ */
if (!strcmp(argv[1], "start")) if (!strcmp(verb, "start"))
ms5611::start(); ms5611::start(external_bus);
/* /*
* Test the driver/device. * Test the driver/device.
*/ */
if (!strcmp(argv[1], "test")) if (!strcmp(verb, "test"))
ms5611::test(); ms5611::test();
/* /*
* Reset the driver. * Reset the driver.
*/ */
if (!strcmp(argv[1], "reset")) if (!strcmp(verb, "reset"))
ms5611::reset(); ms5611::reset();
/* /*
* Print driver information. * Print driver information.
*/ */
if (!strcmp(argv[1], "info")) if (!strcmp(verb, "info"))
ms5611::info(); ms5611::info();
/* /*
* Perform MSL pressure calibration given an altitude in metres * Perform MSL pressure calibration given an altitude in metres
*/ */
if (!strcmp(argv[1], "calibrate")) { if (!strcmp(verb, "calibrate")) {
if (argc < 2) if (argc < 2)
errx(1, "missing altitude"); errx(1, "missing altitude");
long altitude = strtol(argv[2], nullptr, 10); long altitude = strtol(argv[optind+1], nullptr, 10);
ms5611::calibrate(altitude); ms5611::calibrate(altitude);
} }

2
src/drivers/ms5611/ms5611.h

@ -80,6 +80,6 @@ extern bool crc4(uint16_t *n_prom);
} /* namespace */ } /* namespace */
/* interface factories */ /* interface factories */
extern device::Device *MS5611_spi_interface(ms5611::prom_u &prom_buf) weak_function; extern device::Device *MS5611_spi_interface(ms5611::prom_u &prom_buf, bool external_bus) weak_function;
extern device::Device *MS5611_i2c_interface(ms5611::prom_u &prom_buf) weak_function; extern device::Device *MS5611_i2c_interface(ms5611::prom_u &prom_buf) weak_function;

10
src/drivers/ms5611/ms5611_spi.cpp

@ -62,7 +62,7 @@
#ifdef PX4_SPIDEV_BARO #ifdef PX4_SPIDEV_BARO
device::Device *MS5611_spi_interface(ms5611::prom_u &prom_buf); device::Device *MS5611_spi_interface(ms5611::prom_u &prom_buf, bool external_bus);
class MS5611_SPI : public device::SPI class MS5611_SPI : public device::SPI
{ {
@ -115,9 +115,13 @@ private:
}; };
device::Device * device::Device *
MS5611_spi_interface(ms5611::prom_u &prom_buf) MS5611_spi_interface(ms5611::prom_u &prom_buf, bool external_bus)
{ {
return new MS5611_SPI(PX4_SPI_BUS_SENSORS, (spi_dev_e)PX4_SPIDEV_BARO, prom_buf); if (external_bus) {
return new MS5611_SPI(PX4_SPI_BUS_EXT, (spi_dev_e)PX4_SPIDEV_EXT_BARO, prom_buf);
} else {
return new MS5611_SPI(PX4_SPI_BUS_SENSORS, (spi_dev_e)PX4_SPIDEV_BARO, prom_buf);
}
} }
MS5611_SPI::MS5611_SPI(int bus, spi_dev_e device, ms5611::prom_u &prom_buf) : MS5611_SPI::MS5611_SPI(int bus, spi_dev_e device, ms5611::prom_u &prom_buf) :

Loading…
Cancel
Save