PX4 Firmware
PX4 Autopilot Software http://px4.io
ist8310.cpp File Reference

Driver for the IST8310 magnetometer connected via I2C. More...

#include <px4_platform_common/px4_config.h>
#include <px4_platform_common/defines.h>
#include <px4_platform_common/getopt.h>
#include <sys/types.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include <semaphore.h>
#include <string.h>
#include <fcntl.h>
#include <poll.h>
#include <errno.h>
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#include <nuttx/arch.h>
#include <nuttx/clock.h>
#include <board_config.h>
#include <perf/perf_counter.h>
#include <systemlib/err.h>
#include <drivers/device/i2c.h>
#include <drivers/drv_mag.h>
#include <drivers/drv_hrt.h>
#include <drivers/device/ringbuffer.h>
#include <drivers/drv_device.h>
#include <uORB/uORB.h>
#include <float.h>
#include <lib/conversion/rotation.h>
#include <px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp>
Include dependency graph for ist8310.cpp:

Go to the source code of this file.

Classes

class  IST8310
 
struct  IST8310::_scale
 
struct  ist8310::ist8310_bus_option
 

Namespaces

 ist8310
 Local functions in support of the shell command.
 

Macros

#define IST8310_CONVERSION_INTERVAL   (1000000 / 100) /* microseconds */
 
#define IST8310_BUS_I2C_ADDR   0xE
 
#define IST8310_DEFAULT_BUS_SPEED   400000
 
#define IST8310_RESOLUTION   0.3
 
#define ADDR_WAI   0 /* WAI means 'Who Am I'*/
 
#define WAI_EXPECTED_VALUE   0x10
 
#define ADDR_STAT1   0x02
 
#define STAT1_DRDY_SHFITS   0x0
 
#define STAT1_DRDY   (1 << STAT1_DRDY_SHFITS)
 
#define STAT1_DRO_SHFITS   0x1
 
#define STAT1_DRO   (1 << STAT1_DRO_SHFITS)
 
#define ADDR_DATA_OUT_X_LSB   0x03
 
#define ADDR_DATA_OUT_X_MSB   0x04
 
#define ADDR_DATA_OUT_Y_LSB   0x05
 
#define ADDR_DATA_OUT_Y_MSB   0x06
 
#define ADDR_DATA_OUT_Z_LSB   0x07
 
#define ADDR_DATA_OUT_Z_MSB   0x08
 
#define ADDR_STAT2   0x09
 
#define STAT2_INT_SHFITS   3
 
#define STAT2_INT   (1 << STAT2_INT_SHFITS)
 
#define ADDR_CTRL1   0x0a
 
#define CTRL1_MODE_SHFITS   0
 
#define CTRL1_MODE_STDBY   (0 << CTRL1_MODE_SHFITS)
 
#define CTRL1_MODE_SINGLE   (1 << CTRL1_MODE_SHFITS)
 
#define ADDR_CTRL2   0x0b
 
#define CTRL2_SRST_SHFITS   0 /* Begin POR (auto cleared) */
 
#define CTRL2_SRST   (1 << CTRL2_SRST_SHFITS)
 
#define CTRL2_DRP_SHIFTS   2
 
#define CTRL2_DRP   (1 << CTRL2_DRP_SHIFTS)
 
#define CTRL2_DREN_SHIFTS   3
 
#define CTRL2_DREN   (1 << CTRL2_DREN_SHIFTS)
 
#define ADDR_CTRL3   0x41
 
#define CTRL3_SAMPLEAVG_16   0x24 /* Sample Averaging 16 */
 
#define CTRL3_SAMPLEAVG_8   0x1b /* Sample Averaging 8 */
 
#define CTRL3_SAMPLEAVG_4   0x12 /* Sample Averaging 4 */
 
#define CTRL3_SAMPLEAVG_2   0x09 /* Sample Averaging 2 */
 
#define ADDR_CTRL4   0x42
 
#define CTRL4_SRPD   0xC0 /* Set Reset Pulse Duration */
 
#define ADDR_STR   0x0c
 
#define STR_SELF_TEST_SHFITS   6
 
#define STR_SELF_TEST_ON   (1 << STR_SELF_TEST_SHFITS)
 
#define STR_SELF_TEST_OFF   (0 << STR_SELF_TEST_SHFITS)
 
#define ADDR_Y11_Low   0x9c
 
#define ADDR_Y11_High   0x9d
 
#define ADDR_Y12_Low   0x9e
 
#define ADDR_Y12_High   0x9f
 
#define ADDR_Y13_Low   0xa0
 
#define ADDR_Y13_High   0xa1
 
#define ADDR_Y21_Low   0xa2
 
#define ADDR_Y21_High   0xa3
 
#define ADDR_Y22_Low   0xa4
 
#define ADDR_Y22_High   0xa5
 
#define ADDR_Y23_Low   0xa6
 
#define ADDR_Y23_High   0xa7
 
#define ADDR_Y31_Low   0xa8
 
#define ADDR_Y31_High   0xa9
 
#define ADDR_Y32_Low   0xaa
 
#define ADDR_Y32_High   0xab
 
#define ADDR_Y33_Low   0xac
 
#define ADDR_Y33_High   0xad
 
#define ADDR_TEMPL   0x1c
 
#define ADDR_TEMPH   0x1d
 
#define NUM_BUS_OPTIONS   (sizeof(bus_options)/sizeof(bus_options[0]))
 

Enumerations

enum  IST8310_BUS {
  IST8310_BUS_ALL = 0, IST8310_BUS_I2C_EXTERNAL = 1, IST8310_BUS_I2C_EXTERNAL1 = 2, IST8310_BUS_I2C_EXTERNAL2 = 3,
  IST8310_BUS_I2C_EXTERNAL3 = 4, IST8310_BUS_I2C_INTERNAL = 5
}
 

Functions

__EXPORT int ist8310_main (int argc, char *argv[])
 
void ist8310::start (enum IST8310_BUS busid, int address, enum Rotation rotation)
 Start the driver. More...
 
bool ist8310::start_bus (struct ist8310_bus_option &bus, int address, enum Rotation rotation)
 start driver for a specific bus option More...
 
struct ist8310_bus_option & ist8310::find_bus (enum IST8310_BUS busid)
 find a bus structure for a busid More...
 
void ist8310::test (enum IST8310_BUS busid)
 Perform some basic functional tests on the driver; make sure we can collect data from the sensor in polled and automatic modes. More...
 
void ist8310::reset (enum IST8310_BUS busid)
 Reset the driver. More...
 
int ist8310::info (enum IST8310_BUS busid)
 Print a little info about the driver. More...
 
int ist8310::calibrate (enum IST8310_BUS busid)
 Automatic scale calibration. More...
 
void ist8310::usage ()
 Prints info about the driver argument usage. More...
 

Variables

static const int16_t IST8310_MAX_VAL_XY = (1600 / IST8310_RESOLUTION) + 1
 
static const int16_t IST8310_MIN_VAL_XY = -IST8310_MAX_VAL_XY
 
static const int16_t IST8310_MAX_VAL_Z = (2500 / IST8310_RESOLUTION) + 1
 
static const int16_t IST8310_MIN_VAL_Z = -IST8310_MAX_VAL_Z
 
struct ist8310::ist8310_bus_option ist8310::bus_options []
 

Detailed Description

Driver for the IST8310 magnetometer connected via I2C.

Author
David Sidrane
Maelok Dong

Definition in file ist8310.cpp.

Macro Definition Documentation

◆ ADDR_CTRL1

#define ADDR_CTRL1   0x0a

Definition at line 128 of file ist8310.cpp.

Referenced by IST8310::measure().

◆ ADDR_CTRL2

#define ADDR_CTRL2   0x0b

Definition at line 133 of file ist8310.cpp.

Referenced by IST8310::reset().

◆ ADDR_CTRL3

#define ADDR_CTRL3   0x41

Definition at line 141 of file ist8310.cpp.

Referenced by IST8310::check_conf(), and IST8310::reset().

◆ ADDR_CTRL4

#define ADDR_CTRL4   0x42

Definition at line 147 of file ist8310.cpp.

Referenced by IST8310::check_conf(), and IST8310::reset().

◆ ADDR_DATA_OUT_X_LSB

#define ADDR_DATA_OUT_X_LSB   0x03

Definition at line 117 of file ist8310.cpp.

Referenced by IST8310::collect().

◆ ADDR_DATA_OUT_X_MSB

#define ADDR_DATA_OUT_X_MSB   0x04

Definition at line 118 of file ist8310.cpp.

◆ ADDR_DATA_OUT_Y_LSB

#define ADDR_DATA_OUT_Y_LSB   0x05

Definition at line 119 of file ist8310.cpp.

◆ ADDR_DATA_OUT_Y_MSB

#define ADDR_DATA_OUT_Y_MSB   0x06

Definition at line 120 of file ist8310.cpp.

◆ ADDR_DATA_OUT_Z_LSB

#define ADDR_DATA_OUT_Z_LSB   0x07

Definition at line 121 of file ist8310.cpp.

◆ ADDR_DATA_OUT_Z_MSB

#define ADDR_DATA_OUT_Z_MSB   0x08

Definition at line 122 of file ist8310.cpp.

◆ ADDR_STAT1

#define ADDR_STAT1   0x02

Definition at line 111 of file ist8310.cpp.

◆ ADDR_STAT2

#define ADDR_STAT2   0x09

Definition at line 124 of file ist8310.cpp.

◆ ADDR_STR

#define ADDR_STR   0x0c

Definition at line 150 of file ist8310.cpp.

Referenced by IST8310::set_selftest().

◆ ADDR_TEMPH

#define ADDR_TEMPH   0x1d

Definition at line 175 of file ist8310.cpp.

◆ ADDR_TEMPL

#define ADDR_TEMPL   0x1c

Definition at line 174 of file ist8310.cpp.

◆ ADDR_WAI

#define ADDR_WAI   0 /* WAI means 'Who Am I'*/

Definition at line 108 of file ist8310.cpp.

Referenced by IST8310::probe().

◆ ADDR_Y11_High

#define ADDR_Y11_High   0x9d

Definition at line 156 of file ist8310.cpp.

◆ ADDR_Y11_Low

#define ADDR_Y11_Low   0x9c

Definition at line 155 of file ist8310.cpp.

◆ ADDR_Y12_High

#define ADDR_Y12_High   0x9f

Definition at line 158 of file ist8310.cpp.

◆ ADDR_Y12_Low

#define ADDR_Y12_Low   0x9e

Definition at line 157 of file ist8310.cpp.

◆ ADDR_Y13_High

#define ADDR_Y13_High   0xa1

Definition at line 160 of file ist8310.cpp.

◆ ADDR_Y13_Low

#define ADDR_Y13_Low   0xa0

Definition at line 159 of file ist8310.cpp.

◆ ADDR_Y21_High

#define ADDR_Y21_High   0xa3

Definition at line 162 of file ist8310.cpp.

◆ ADDR_Y21_Low

#define ADDR_Y21_Low   0xa2

Definition at line 161 of file ist8310.cpp.

◆ ADDR_Y22_High

#define ADDR_Y22_High   0xa5

Definition at line 164 of file ist8310.cpp.

◆ ADDR_Y22_Low

#define ADDR_Y22_Low   0xa4

Definition at line 163 of file ist8310.cpp.

◆ ADDR_Y23_High

#define ADDR_Y23_High   0xa7

Definition at line 166 of file ist8310.cpp.

◆ ADDR_Y23_Low

#define ADDR_Y23_Low   0xa6

Definition at line 165 of file ist8310.cpp.

◆ ADDR_Y31_High

#define ADDR_Y31_High   0xa9

Definition at line 168 of file ist8310.cpp.

◆ ADDR_Y31_Low

#define ADDR_Y31_Low   0xa8

Definition at line 167 of file ist8310.cpp.

◆ ADDR_Y32_High

#define ADDR_Y32_High   0xab

Definition at line 170 of file ist8310.cpp.

◆ ADDR_Y32_Low

#define ADDR_Y32_Low   0xaa

Definition at line 169 of file ist8310.cpp.

◆ ADDR_Y33_High

#define ADDR_Y33_High   0xad

Definition at line 172 of file ist8310.cpp.

◆ ADDR_Y33_Low

#define ADDR_Y33_Low   0xac

Definition at line 171 of file ist8310.cpp.

◆ CTRL1_MODE_SHFITS

#define CTRL1_MODE_SHFITS   0

Definition at line 129 of file ist8310.cpp.

◆ CTRL1_MODE_SINGLE

#define CTRL1_MODE_SINGLE   (1 << CTRL1_MODE_SHFITS)

Definition at line 131 of file ist8310.cpp.

Referenced by IST8310::measure().

◆ CTRL1_MODE_STDBY

#define CTRL1_MODE_STDBY   (0 << CTRL1_MODE_SHFITS)

Definition at line 130 of file ist8310.cpp.

◆ CTRL2_DREN

#define CTRL2_DREN   (1 << CTRL2_DREN_SHIFTS)

Definition at line 139 of file ist8310.cpp.

◆ CTRL2_DREN_SHIFTS

#define CTRL2_DREN_SHIFTS   3

Definition at line 138 of file ist8310.cpp.

◆ CTRL2_DRP

#define CTRL2_DRP   (1 << CTRL2_DRP_SHIFTS)

Definition at line 137 of file ist8310.cpp.

◆ CTRL2_DRP_SHIFTS

#define CTRL2_DRP_SHIFTS   2

Definition at line 136 of file ist8310.cpp.

◆ CTRL2_SRST

#define CTRL2_SRST   (1 << CTRL2_SRST_SHFITS)

Definition at line 135 of file ist8310.cpp.

Referenced by IST8310::reset().

◆ CTRL2_SRST_SHFITS

#define CTRL2_SRST_SHFITS   0 /* Begin POR (auto cleared) */

Definition at line 134 of file ist8310.cpp.

◆ CTRL3_SAMPLEAVG_16

#define CTRL3_SAMPLEAVG_16   0x24 /* Sample Averaging 16 */

Definition at line 142 of file ist8310.cpp.

Referenced by IST8310::reset().

◆ CTRL3_SAMPLEAVG_2

#define CTRL3_SAMPLEAVG_2   0x09 /* Sample Averaging 2 */

Definition at line 145 of file ist8310.cpp.

◆ CTRL3_SAMPLEAVG_4

#define CTRL3_SAMPLEAVG_4   0x12 /* Sample Averaging 4 */

Definition at line 144 of file ist8310.cpp.

◆ CTRL3_SAMPLEAVG_8

#define CTRL3_SAMPLEAVG_8   0x1b /* Sample Averaging 8 */

Definition at line 143 of file ist8310.cpp.

◆ CTRL4_SRPD

#define CTRL4_SRPD   0xC0 /* Set Reset Pulse Duration */

Definition at line 148 of file ist8310.cpp.

Referenced by IST8310::reset().

◆ IST8310_BUS_I2C_ADDR

#define IST8310_BUS_I2C_ADDR   0xE

Definition at line 89 of file ist8310.cpp.

Referenced by ist8310_main(), and ist8310::usage().

◆ IST8310_CONVERSION_INTERVAL

#define IST8310_CONVERSION_INTERVAL   (1000000 / 100) /* microseconds */

Definition at line 87 of file ist8310.cpp.

Referenced by IST8310::ioctl(), IST8310::read(), and IST8310::Run().

◆ IST8310_DEFAULT_BUS_SPEED

#define IST8310_DEFAULT_BUS_SPEED   400000

Definition at line 90 of file ist8310.cpp.

◆ IST8310_RESOLUTION

#define IST8310_RESOLUTION   0.3

Definition at line 99 of file ist8310.cpp.

◆ NUM_BUS_OPTIONS

#define NUM_BUS_OPTIONS   (sizeof(bus_options)/sizeof(bus_options[0]))

Definition at line 1149 of file ist8310.cpp.

Referenced by ist8310::find_bus(), and ist8310::start().

◆ STAT1_DRDY

#define STAT1_DRDY   (1 << STAT1_DRDY_SHFITS)

Definition at line 113 of file ist8310.cpp.

◆ STAT1_DRDY_SHFITS

#define STAT1_DRDY_SHFITS   0x0

Definition at line 112 of file ist8310.cpp.

◆ STAT1_DRO

#define STAT1_DRO   (1 << STAT1_DRO_SHFITS)

Definition at line 115 of file ist8310.cpp.

◆ STAT1_DRO_SHFITS

#define STAT1_DRO_SHFITS   0x1

Definition at line 114 of file ist8310.cpp.

◆ STAT2_INT

#define STAT2_INT   (1 << STAT2_INT_SHFITS)

Definition at line 126 of file ist8310.cpp.

◆ STAT2_INT_SHFITS

#define STAT2_INT_SHFITS   3

Definition at line 125 of file ist8310.cpp.

◆ STR_SELF_TEST_OFF

#define STR_SELF_TEST_OFF   (0 << STR_SELF_TEST_SHFITS)

Definition at line 153 of file ist8310.cpp.

◆ STR_SELF_TEST_ON

#define STR_SELF_TEST_ON   (1 << STR_SELF_TEST_SHFITS)

Definition at line 152 of file ist8310.cpp.

Referenced by IST8310::set_selftest().

◆ STR_SELF_TEST_SHFITS

#define STR_SELF_TEST_SHFITS   6

Definition at line 151 of file ist8310.cpp.

◆ WAI_EXPECTED_VALUE

#define WAI_EXPECTED_VALUE   0x10

Definition at line 109 of file ist8310.cpp.

Referenced by IST8310::probe().

Enumeration Type Documentation

◆ IST8310_BUS

Enumerator
IST8310_BUS_ALL 
IST8310_BUS_I2C_EXTERNAL 
IST8310_BUS_I2C_EXTERNAL1 
IST8310_BUS_I2C_EXTERNAL2 
IST8310_BUS_I2C_EXTERNAL3 
IST8310_BUS_I2C_INTERNAL 

Definition at line 177 of file ist8310.cpp.

Function Documentation

◆ ist8310_main()

int ist8310_main ( int  argc,
char *  argv[] 
)

Definition at line 1406 of file ist8310.cpp.

References IST8310::calibrate(), ist8310::calibrate(), ist8310::info(), IST8310_BUS_ALL, IST8310_BUS_I2C_ADDR, ist8310::reset(), ROTATION_NONE, ist8310::start(), ist8310::test(), and ist8310::usage().

Here is the call graph for this function:

Variable Documentation

◆ IST8310_MAX_VAL_XY

const int16_t IST8310_MAX_VAL_XY = (1600 / IST8310_RESOLUTION) + 1
static

Definition at line 101 of file ist8310.cpp.

Referenced by IST8310::collect().

◆ IST8310_MAX_VAL_Z

const int16_t IST8310_MAX_VAL_Z = (2500 / IST8310_RESOLUTION) + 1
static

Definition at line 103 of file ist8310.cpp.

Referenced by IST8310::collect().

◆ IST8310_MIN_VAL_XY

const int16_t IST8310_MIN_VAL_XY = -IST8310_MAX_VAL_XY
static

Definition at line 102 of file ist8310.cpp.

Referenced by IST8310::collect().

◆ IST8310_MIN_VAL_Z

const int16_t IST8310_MIN_VAL_Z = -IST8310_MAX_VAL_Z
static

Definition at line 104 of file ist8310.cpp.

Referenced by IST8310::collect().