diff --git a/ROMFS/px4fmu_common/init.d/rc.sensors b/ROMFS/px4fmu_common/init.d/rc.sensors index 565b7958dc..2ed1652814 100644 --- a/ROMFS/px4fmu_common/init.d/rc.sensors +++ b/ROMFS/px4fmu_common/init.d/rc.sensors @@ -226,10 +226,7 @@ then # compasses hmc5883 -T -X -q start - if ! iis2mdc -X -q start - then - lis2mdl -X -q start - fi + iis2mdc -X -q start ist8308 -X -q start ist8310 -X -q start if ! lis3mdl -X -q start diff --git a/boards/ark/cannode/init/rc.board_sensors b/boards/ark/cannode/init/rc.board_sensors index e9cf85f510..110ba6132b 100644 --- a/boards/ark/cannode/init/rc.board_sensors +++ b/boards/ark/cannode/init/rc.board_sensors @@ -107,7 +107,7 @@ icm20948_i2c_passthrough -X -q start hmc5883 -T -X -q start ist8308 -X -q start ist8310 -X -q start -lis2mdl -X -q start +iis2mdc -X -q start lis3mdl -X -q start qmc5883l -X -q start rm3100 -X -q start diff --git a/boards/nxp/ucans32k146/init/rc.board_sensors b/boards/nxp/ucans32k146/init/rc.board_sensors index f6f8320763..4672b17e10 100644 --- a/boards/nxp/ucans32k146/init/rc.board_sensors +++ b/boards/nxp/ucans32k146/init/rc.board_sensors @@ -37,7 +37,7 @@ fi hmc5883 -T -X -q start ist8308 -X -q start ist8310 -X -q start -lis2mdl -X -q start +iis2mdc -X -q start lis3mdl -X -q start qmc5883l -X -q start rm3100 -X -q start diff --git a/docs/en/modules/modules_driver_magnetometer.md b/docs/en/modules/modules_driver_magnetometer.md index 6431362a49..8ea5164488 100644 --- a/docs/en/modules/modules_driver_magnetometer.md +++ b/docs/en/modules/modules_driver_magnetometer.md @@ -192,13 +192,13 @@ ist8310 [arguments...] status print status info ``` -## lis2mdl -Source: [drivers/magnetometer/lis2mdl](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/magnetometer/lis2mdl) +## iis2mdc +Source: [drivers/magnetometer/iis2mdc](https://github.com/PX4/PX4-Autopilot/tree/main/src/drivers/magnetometer/iis2mdc) - + ### Usage ``` -lis2mdl [arguments...] +iis2mdc [arguments...] Commands: start [-I] Internal I2C bus(es) diff --git a/src/drivers/drv_sensor.h b/src/drivers/drv_sensor.h index 8b33acb0f1..4560ed1f58 100644 --- a/src/drivers/drv_sensor.h +++ b/src/drivers/drv_sensor.h @@ -62,7 +62,6 @@ #define DRV_MAG_DEVTYPE_VCM1193L 0x0A #define DRV_MAG_DEVTYPE_IST8308 0x0B -#define DRV_MAG_DEVTYPE_LIS2MDL 0x0C #define DRV_MAG_DEVTYPE_MMC5983MA 0x0D #define DRV_MAG_DEVTYPE_IIS2MDC 0x0E diff --git a/src/drivers/magnetometer/CMakeLists.txt b/src/drivers/magnetometer/CMakeLists.txt index 07bf93cddc..da1dac554e 100644 --- a/src/drivers/magnetometer/CMakeLists.txt +++ b/src/drivers/magnetometer/CMakeLists.txt @@ -36,7 +36,6 @@ add_subdirectory(bosch) add_subdirectory(hmc5883) add_subdirectory(qmc5883l) add_subdirectory(isentek) -add_subdirectory(lis2mdl) add_subdirectory(lis3mdl) add_subdirectory(lsm303agr) add_subdirectory(memsic) diff --git a/src/drivers/magnetometer/lis2mdl/CMakeLists.txt b/src/drivers/magnetometer/lis2mdl/CMakeLists.txt deleted file mode 100644 index 55fc23d0ef..0000000000 --- a/src/drivers/magnetometer/lis2mdl/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -############################################################################ -# -# Copyright (c) 2020 PX4 Development Team. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# 3. Neither the name PX4 nor the names of its contributors may be -# used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -############################################################################ -px4_add_module( - MODULE drivers__lis2mdl - MAIN lis2mdl - SRCS - lis2mdl_i2c.cpp - lis2mdl_spi.cpp - lis2mdl_main.cpp - lis2mdl.cpp - ) diff --git a/src/drivers/magnetometer/lis2mdl/Kconfig b/src/drivers/magnetometer/lis2mdl/Kconfig deleted file mode 100644 index 07e9e4d5b8..0000000000 --- a/src/drivers/magnetometer/lis2mdl/Kconfig +++ /dev/null @@ -1,5 +0,0 @@ -menuconfig DRIVERS_MAGNETOMETER_LIS2MDL - bool "lis2mdl" - default n - ---help--- - Enable support for lis2mdl diff --git a/src/drivers/magnetometer/lis2mdl/lis2mdl.cpp b/src/drivers/magnetometer/lis2mdl/lis2mdl.cpp deleted file mode 100644 index 52858158a8..0000000000 --- a/src/drivers/magnetometer/lis2mdl/lis2mdl.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file lis2mdl.cpp - * - * Driver for the LIS2MDL magnetometer connected via I2C or SPI. - * - * Based on the LIS2MDL driver. - */ - -#include -#include "lis2mdl.h" - -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")), - _range_errors(perf_alloc(PC_COUNT, MODULE_NAME": range_errors")), - _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), - _measure_interval(0) -{ - _px4_mag.set_scale(0.0015f); /* 49.152f / (2^15) */ -} - -LIS2MDL::~LIS2MDL() -{ - // free perf counters - perf_free(_sample_perf); - perf_free(_comms_errors); - perf_free(_range_errors); - perf_free(_conf_errors); - - delete _interface; -} - -int -LIS2MDL::measure() -{ - struct { - uint8_t status; - uint8_t x[2]; - uint8_t y[2]; - uint8_t z[2]; - } lis_report; - - struct { - int16_t x; - int16_t y; - int16_t z; - int16_t t; - } report; - - uint8_t buf_rx[2] = {}; - - _px4_mag.set_error_count(perf_event_count(_comms_errors)); - - perf_begin(_sample_perf); - - const hrt_abstime timestamp_sample = hrt_absolute_time(); - int ret = _interface->read(ADDR_STATUS_REG, (uint8_t *)&lis_report, sizeof(lis_report)); - - /** - * Silicon Bug: the X axis will be read instead of the temperature registers if you do a sequential read through XYZ. - * The temperature registers must be addressed directly. - */ - ret = _interface->read(ADDR_OUT_T_L, (uint8_t *)&buf_rx, sizeof(buf_rx)); - - if (ret != OK) { - perf_end(_sample_perf); - perf_count(_comms_errors); - return ret; - } - - perf_end(_sample_perf); - - if ((lis_report.status & (1 << 3)) == 0) { // check data ready - return 0; - } - - report.x = (int16_t)((lis_report.x[1] << 8) | lis_report.x[0]); - report.y = (int16_t)((lis_report.y[1] << 8) | lis_report.y[0]); - report.z = (int16_t)((lis_report.z[1] << 8) | lis_report.z[0]); - - report.t = (int16_t)((buf_rx[1] << 8) | buf_rx[0]); - - float temperature = report.t; - _px4_mag.set_temperature(25.0f + (temperature / 8.0f)); - - /* swap x and y axis */ - _px4_mag.update(timestamp_sample, report.y, report.x, report.z); - - return PX4_OK; -} - -void -LIS2MDL::RunImpl() -{ - /* _measure_interval == 0 is used as _task_should_exit */ - if (_measure_interval == 0) { - return; - } - - if (measure() != OK) { - PX4_DEBUG("measure error"); - } - - /* schedule a fresh cycle call when the measurement is done */ - ScheduleDelayed(LIS2MDL_CONVERSION_INTERVAL); -} - -int -LIS2MDL::init() -{ - - int ret = write_reg(ADDR_CFG_REG_A, CFG_REG_A_ODR | CFG_REG_A_MD | CFG_REG_A_TEMP_COMP_EN); - ret = write_reg(ADDR_CFG_REG_B, 0); - ret = write_reg(ADDR_CFG_REG_C, CFG_REG_C_BDU); - - _measure_interval = LIS2MDL_CONVERSION_INTERVAL; - start(); - - return ret; -} - -void -LIS2MDL::print_status() -{ - I2CSPIDriverBase::print_status(); - perf_print_counter(_sample_perf); - perf_print_counter(_comms_errors); - PX4_INFO("poll interval: %u", _measure_interval); -} - -void -LIS2MDL::start() -{ - /* schedule a cycle to start things */ - ScheduleNow(); -} - -int -LIS2MDL::read_reg(uint8_t reg, uint8_t &val) -{ - uint8_t buf = val; - int ret = _interface->read(reg, &buf, 1); - val = buf; - return ret; -} - -int -LIS2MDL::write_reg(uint8_t reg, uint8_t val) -{ - uint8_t buf = val; - return _interface->write(reg, &buf, 1); -} diff --git a/src/drivers/magnetometer/lis2mdl/lis2mdl.h b/src/drivers/magnetometer/lis2mdl/lis2mdl.h deleted file mode 100644 index 1296ddfa4d..0000000000 --- a/src/drivers/magnetometer/lis2mdl/lis2mdl.h +++ /dev/null @@ -1,153 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file lis2mdl.h - * - * Shared defines for the LIS2MDL driver. - */ - -#pragma once - -#include -#include -#include -#include -#include -#include - -/** - * LIS2MDL internal constants and data structures. - */ - -/* Max measurement rate is 20Hz */ -#define LIS2MDL_CONVERSION_INTERVAL (1000000 / 20) - -#define ADDR_WHO_AM_I 0x4f -#define ID_WHO_AM_I 0x40 - -#define ADDR_CFG_REG_A 0x60 -#define ADDR_CFG_REG_B 0x61 -#define ADDR_CFG_REG_C 0x62 -#define ADDR_INT_CTRL_REG 0x63 - -#define ADDR_STATUS_REG 0x67 -#define ADDR_OUT_X_L 0x68 -#define ADDR_OUT_X_H 0x69 -#define ADDR_OUT_Y_L 0x6a -#define ADDR_OUT_Y_H 0x6b -#define ADDR_OUT_Z_L 0x6c -#define ADDR_OUT_Z_H 0x6d -#define ADDR_OUT_T_L 0x6e -#define ADDR_OUT_T_H 0x6f - -#define CFG_REG_A_TEMP_COMP_EN (1 << 7) -#define CFG_REG_A_ODR (1 << 2) /* 20Hz (100Hz or 50Hz creates spikes randomly) */ -#define CFG_REG_A_MD (0 << 0) /* continuous mode */ - -#define CFG_REG_B_LPF (1 << 0) /* LPF */ - -#define CFG_REG_C_BDU (1 << 4) /* avoids reading of incorrect data due to async reads */ - -/* interface factories */ -extern device::Device *LIS2MDL_SPI_interface(const I2CSPIDriverConfig &config); -extern device::Device *LIS2MDL_I2C_interface(const I2CSPIDriverConfig &config); - -#define LIS2MDLL_ADDRESS 0x1e - -class LIS2MDL : public I2CSPIDriver -{ -public: - LIS2MDL(device::Device *interface, const I2CSPIDriverConfig &config); - virtual ~LIS2MDL(); - - static I2CSPIDriverBase *instantiate(const I2CSPIDriverConfig &config, int runtime_instance); - static void print_usage(); - - virtual int init(); - - void print_status() override; - - /** - * Configures the device with default register values. - */ - int set_default_register_values(); - - void RunImpl(); - -private: - PX4Magnetometer _px4_mag; - - device::Device *_interface; - - perf_counter_t _comms_errors; - perf_counter_t _conf_errors; - perf_counter_t _range_errors; - perf_counter_t _sample_perf; - - unsigned int _measure_interval; - - /** - * Issue a measurement command & publish data. - * - * @return OK if the measurement command was successful. - */ - int measure(); - - /** - * @brief Initialises the automatic measurement state machine and start it. - * - * @note This function is called at open and error time. It might make sense - * to make it more aggressive about resetting the bus in case of errors. - */ - void start(); - - /** - * @brief Reads a register. - * - * @param reg The register to read. - * @param val The value read. - * @return OK on read success. - */ - int read_reg(uint8_t reg, uint8_t &val); - - /** - * @brief Writes a register. - * - * @param reg The register to write. - * @param val The value to write. - * @return OK on write success. - */ - int write_reg(uint8_t reg, uint8_t val); - -}; diff --git a/src/drivers/magnetometer/lis2mdl/lis2mdl_i2c.cpp b/src/drivers/magnetometer/lis2mdl/lis2mdl_i2c.cpp deleted file mode 100644 index f5f8987d07..0000000000 --- a/src/drivers/magnetometer/lis2mdl/lis2mdl_i2c.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file lis2mdl_i2c.cpp - * - * I2C interface for LIS2MDL - */ - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "board_config.h" -#include "lis2mdl.h" - -class LIS2MDL_I2C : public device::I2C -{ -public: - LIS2MDL_I2C(const I2CSPIDriverConfig &config); - virtual ~LIS2MDL_I2C() = default; - - virtual int read(unsigned address, void *data, unsigned count); - virtual int write(unsigned address, void *data, unsigned count); - -protected: - virtual int probe(); - -}; - -device::Device * -LIS2MDL_I2C_interface(const I2CSPIDriverConfig &config); - -device::Device * -LIS2MDL_I2C_interface(const I2CSPIDriverConfig &config) -{ - return new LIS2MDL_I2C(config); -} - -LIS2MDL_I2C::LIS2MDL_I2C(const I2CSPIDriverConfig &config) : - I2C(config) -{ -} - -int -LIS2MDL_I2C::probe() -{ - uint8_t data = 0; - - _retries = 1; - - if (read(ADDR_WHO_AM_I, &data, 1)) { - DEVICE_DEBUG("read_reg fail"); - return -EIO; - } - - if (data != ID_WHO_AM_I) { - DEVICE_DEBUG("LIS2MDL bad ID: %02x", data); - return -EIO; - } - - return OK; -} - -int -LIS2MDL_I2C::read(unsigned address, void *data, unsigned count) -{ - uint8_t cmd = address; - return transfer(&cmd, 1, (uint8_t *)data, count); -} - -int -LIS2MDL_I2C::write(unsigned address, void *data, unsigned count) -{ - uint8_t buf[32]; - - if (sizeof(buf) < (count + 1)) { - return -EIO; - } - - buf[0] = address; - memcpy(&buf[1], data, count); - - return transfer(&buf[0], count + 1, nullptr, 0); -} diff --git a/src/drivers/magnetometer/lis2mdl/lis2mdl_main.cpp b/src/drivers/magnetometer/lis2mdl/lis2mdl_main.cpp deleted file mode 100644 index 326bac75a8..0000000000 --- a/src/drivers/magnetometer/lis2mdl/lis2mdl_main.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2020-2021 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file lis2mdl_main.cpp - * - * Driver for the LIS2MDL magnetometer connected via I2C or SPI. - */ - -#include "lis2mdl.h" -#include -#include - -I2CSPIDriverBase *LIS2MDL::instantiate(const I2CSPIDriverConfig &config, int runtime_instance) -{ - device::Device *interface = nullptr; - - if (config.bus_type == BOARD_I2C_BUS) { - interface = LIS2MDL_I2C_interface(config); - - } else if (config.bus_type == BOARD_SPI_BUS) { - interface = LIS2MDL_SPI_interface(config); - } - - if (interface == nullptr) { - PX4_ERR("alloc failed"); - return nullptr; - } - - if (interface->init() != OK) { - delete interface; - PX4_DEBUG("no device on bus %i (devid 0x%x)", config.bus, config.spi_devid); - return nullptr; - } - - LIS2MDL *dev = new LIS2MDL(interface, config); - - if (dev == nullptr) { - delete interface; - return nullptr; - } - - if (OK != dev->init()) { - delete dev; - return nullptr; - } - - return dev; -} - -void LIS2MDL::print_usage() -{ - PRINT_MODULE_USAGE_NAME("lis2mdl", "driver"); - 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(); -} - -extern "C" int lis2mdl_main(int argc, char *argv[]) -{ - using ThisDriver = LIS2MDL; - int ch; - BusCLIArguments cli{true, true}; - cli.i2c_address = LIS2MDLL_ADDRESS; - cli.default_i2c_frequency = 400000; - cli.default_spi_frequency = 11 * 1000 * 1000; - - while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { - switch (ch) { - case 'R': - cli.rotation = (enum Rotation)atoi(cli.optArg()); - break; - } - } - - const char *verb = cli.optArg(); - - if (!verb) { - ThisDriver::print_usage(); - return -1; - } - - BusInstanceIterator iterator(MODULE_NAME, cli, DRV_MAG_DEVTYPE_LIS2MDL); - - if (!strcmp(verb, "start")) { - return ThisDriver::module_start(cli, iterator); - } - - if (!strcmp(verb, "stop")) { - return ThisDriver::module_stop(iterator); - } - - if (!strcmp(verb, "status")) { - return ThisDriver::module_status(iterator); - } - - ThisDriver::print_usage(); - return -1; -} diff --git a/src/drivers/magnetometer/lis2mdl/lis2mdl_spi.cpp b/src/drivers/magnetometer/lis2mdl/lis2mdl_spi.cpp deleted file mode 100644 index 0f65bd9582..0000000000 --- a/src/drivers/magnetometer/lis2mdl/lis2mdl_spi.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file lis2mdl_spi.cpp - * - * SPI interface for LIS2MDL - */ - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "board_config.h" -#include "lis2mdl.h" - -/* SPI protocol address bits */ -#define DIR_READ (1<<7) -#define DIR_WRITE (0<<7) -#define ADDR_INCREMENT (1<<6) - -class LIS2MDL_SPI : public device::SPI -{ -public: - LIS2MDL_SPI(const I2CSPIDriverConfig &config); - virtual ~LIS2MDL_SPI() = default; - - virtual int init(); - virtual int read(unsigned address, void *data, unsigned count); - virtual int write(unsigned address, void *data, unsigned count); -}; - -device::Device * -LIS2MDL_SPI_interface(const I2CSPIDriverConfig &config); - -device::Device * -LIS2MDL_SPI_interface(const I2CSPIDriverConfig &config) -{ - return new LIS2MDL_SPI(config); -} - -LIS2MDL_SPI::LIS2MDL_SPI(const I2CSPIDriverConfig &config) : - SPI(config) -{ -} - -int -LIS2MDL_SPI::init() -{ - int ret; - - ret = SPI::init(); - - if (ret != OK) { - DEVICE_DEBUG("SPI init failed"); - return -EIO; - } - - // read WHO_AM_I value - uint8_t data = 0; - - if (read(ADDR_WHO_AM_I, &data, 1)) { - DEVICE_DEBUG("LIS2MDL read_reg fail"); - } - - if (data != ID_WHO_AM_I) { - DEVICE_DEBUG("LIS2MDL bad ID: %02x", data); - return -EIO; - } - - return OK; -} - -int -LIS2MDL_SPI::read(unsigned address, void *data, unsigned count) -{ - uint8_t buf[32]; - - if (sizeof(buf) < (count + 1)) { - return -EIO; - } - - buf[0] = address | DIR_READ | ADDR_INCREMENT; - - int ret = transfer(&buf[0], &buf[0], count + 1); - memcpy(data, &buf[1], count); - return ret; -} - -int -LIS2MDL_SPI::write(unsigned address, void *data, unsigned count) -{ - uint8_t buf[32]; - - if (sizeof(buf) < (count + 1)) { - return -EIO; - } - - buf[0] = address | DIR_WRITE; - memcpy(&buf[1], data, count); - - return transfer(&buf[0], &buf[0], count + 1); -}