/* SPDX-License-Identifier: GPL-2.0 */
#include <linux/iio/iio.h>
#include <linux/mutex.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/i2c.h>
/**
* enum mpu3050_fullscale - indicates the full range of the sensor in deg / sec
*/
enum mpu3050_fullscale {
FS_250_DPS = 0 ,
FS_500_DPS,
FS_1000_DPS,
FS_2000_DPS,
};
/**
* enum mpu3050_lpf - indicates the low pass filter width
*/
enum mpu3050_lpf {
/* This implicity sets sample frequency to 8 kHz */
LPF_256_HZ_NOLPF = 0 ,
/* All others sets the sample frequency to 1 kHz */
LPF_188_HZ,
LPF_98_HZ,
LPF_42_HZ,
LPF_20_HZ,
LPF_10_HZ,
LPF_5_HZ,
LPF_2100_HZ_NOLPF,
};
enum mpu3050_axis {
AXIS_X = 0 ,
AXIS_Y,
AXIS_Z,
AXIS_MAX,
};
/**
* struct mpu3050 - instance state container for the device
* @ dev : parent device for this instance
* @ orientation : mounting matrix , flipped axis etc
* @ map : regmap to reach the registers
* @ lock : serialization lock to marshal all requests
* @ irq : the IRQ used for this device
* @ regs : the regulators to power this device
* @ fullscale : the current fullscale setting for the device
* @ lpf : digital low pass filter setting for the device
* @ divisor : base frequency divider : divides 8 or 1 kHz
* @ calibration : the three signed 16 - bit calibration settings that
* get written into the offset registers for each axis to compensate
* for DC offsets
* @ trig : trigger for the MPU - 3050 interrupt , if present
* @ hw_irq_trigger : hardware interrupt trigger is in use
* @ irq_actl : interrupt is active low
* @ irq_latch : latched IRQ , this means that it is a level IRQ
* @ irq_opendrain : the interrupt line shall be configured open drain
* @ pending_fifo_footer : tells us if there is a pending footer in the FIFO
* that we have to read out first when handling the FIFO
* @ hw_timestamp : latest hardware timestamp from the trigger IRQ , when in
* use
* @ i2cmux : an I2C mux reflecting the fact that this sensor is a hub with
* a pass - through I2C interface coming out of it : this device needs to be
* powered up in order to reach devices on the other side of this mux
*/
struct mpu3050 {
struct device *dev;
struct iio_mount_matrix orientation;
struct regmap *map;
struct mutex lock;
int irq;
struct regulator_bulk_data regs[2 ];
enum mpu3050_fullscale fullscale;
enum mpu3050_lpf lpf;
u8 divisor;
s16 calibration[3 ];
struct iio_trigger *trig;
bool hw_irq_trigger;
bool irq_actl;
bool irq_latch;
bool irq_opendrain;
bool pending_fifo_footer;
s64 hw_timestamp;
struct i2c_mux_core *i2cmux;
};
/* Probe called from different transports */
int mpu3050_common_probe(struct device *dev,
struct regmap *map,
int irq,
const char *name);
void mpu3050_common_remove(struct device *dev);
/* PM ops */
extern const struct dev_pm_ops mpu3050_dev_pm_ops;
Messung V0.5 in Prozent C=98 H=99 G=98
[Dauer der Verarbeitung: 0.11 Sekunden, vorverarbeitet 2026-09-27]