summaryrefslogtreecommitdiff
path: root/drivers/iio/magnetometer/inv_compass/inv_yas53x_iio.h
blob: 92bf0af7ec7ea2e801612e781a07de77ce1d1576 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
* Copyright (C) 2012 Invensense, Inc.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
*/

/**
 *  @addtogroup DRIVERS
 *  @brief      Hardware drivers.
 *
 *  @{
 *      @file  inv_yas53x_iio.h
 *      @brief Struct definitions for the Invensense implementation
 *              of yas53x driver.
 */

#ifndef _INV_GYRO_H_
#define _INV_GYRO_H_

#include <linux/i2c.h>
#include <linux/kfifo.h>
#include <linux/miscdevice.h>
#include <linux/input.h>
#include <linux/spinlock.h>
#include <linux/mpu.h>

#include "iio.h"
#include "buffer.h"
#include "trigger.h"

#define YAS_MAG_MAX_FILTER_LEN			30
struct yas_adaptive_filter {
	int num;
	int index;
	int filter_len;
	int filter_noise;
	int sequence[YAS_MAG_MAX_FILTER_LEN];
};

struct yas_thresh_filter {
	int threshold;
	int last;
};

struct yas_filter {
	int filter_len;
	int filter_thresh;
	int filter_noise[3];
	struct yas_adaptive_filter adap_filter[3];
	struct yas_thresh_filter thresh_filter[3];
};

/**
 *  struct inv_compass_state - Driver state variables.
 *  @plat_data:         mpu platform data from board file.
 *  @client:		i2c client handle.
 *  @chan_info:         channel information.
 *  @trig:              IIO trigger.
 *  @work:              work structure.
 *  @delay:             delay to schedule the next work.
 *  @overflow_bound:    bound to determine overflow.
 *  @center:            center of the measurement.
 *  @compass_data[3]:   compass data store.
 *  @offset[3]:         yas530 specific data.
 *  @base_compass_data[3]: first measure data after reset.
 *  @first_measure_after_reset:1: flag for first measurement after reset.
 *  @first_read_after_reset:1: flag for first read after reset.
 *  @reset_timer: timer to accumulate overflow conditions.
 *  @overunderflow:1:     overflow and underflow flag.
 *  @filter: filter data structure.
 *  @read_data:         function pointer of reading data from device.
 *  @get_cal_data: function pointer of reading cal data.
 */
struct inv_compass_state {
	struct mpu_platform_data plat_data;
	struct i2c_client *client;
	struct iio_trigger  *trig;
	struct delayed_work work;
	s16 delay;
	s16 overflow_bound;
	s16 upper_bound;
	s16 lower_bound;
	s16 center;
	s16 compass_data[3];
	s8 offset[3];
	s16 base_compass_data[3];
	u8 first_measure_after_reset:1;
	u8 first_read_after_reset:1;
	u8 overunderflow:1;
	s32 reset_timer;
	struct yas_filter filter;
	int (*read_data)(struct inv_compass_state *st,
			  int *, u16 *, u16 *, u16 *, u16 *);
	int (*get_cal_data)(struct inv_compass_state *);
};

/* scan element definition */
enum inv_mpu_scan {
	INV_YAS53X_SCAN_MAGN_X,
	INV_YAS53X_SCAN_MAGN_Y,
	INV_YAS53X_SCAN_MAGN_Z,
	INV_YAS53X_SCAN_TIMESTAMP,
};

#define YAS530_REGADDR_DEVICE_ID          0x80
#define YAS530_REGADDR_ACTUATE_INIT_COIL  0x81
#define YAS530_REGADDR_MEASURE_COMMAND    0x82
#define YAS530_REGADDR_CONFIG             0x83
#define YAS530_REGADDR_MEASURE_INTERVAL   0x84
#define YAS530_REGADDR_OFFSET_X           0x85
#define YAS530_REGADDR_OFFSET_Y1          0x86
#define YAS530_REGADDR_OFFSET_Y2          0x87
#define YAS530_REGADDR_TEST1              0x88
#define YAS530_REGADDR_TEST2              0x89
#define YAS530_REGADDR_CAL                0x90
#define YAS530_REGADDR_MEASURE_DATA       0xb0

#define YAS530_MAX_DELAY                  200
#define YAS530_MIN_DELAY                  5
#define YAS530_SCALE                      107374182L

#define YAS_YAS530_VERSION_A		0	/* YAS530  (MS-3E Aver) */
#define YAS_YAS530_VERSION_B		1	/* YAS530B (MS-3E Bver) */
#define YAS_YAS530_VERSION_A_COEF	380
#define YAS_YAS530_VERSION_B_COEF	550
#define YAS_YAS530_DATA_CENTER		2048
#define YAS_YAS530_DATA_OVERFLOW	4095
#define YAS_YAS530_CAL_DATA_SIZE        16

/*filter related defines */
#define YAS_MAG_DEFAULT_FILTER_NOISE_X          144 /* sd: 1200 nT */
#define YAS_MAG_DEFAULT_FILTER_NOISE_Y          144 /* sd: 1200 nT */
#define YAS_MAG_DEFAULT_FILTER_NOISE_Z          144 /* sd: 1200 nT */
#define YAS_MAG_DEFAULT_FILTER_LEN              20

#define YAS530_MAG_DEFAULT_FILTER_THRESH        100
#define YAS532_MAG_DEFAULT_FILTER_THRESH        300

#define YAS_YAS532_533_VERSION_AB	0 /* YAS532_533AB (MS-3R/3F ABver) */
#define YAS_YAS532_533_VERSION_AC	1 /* YAS532_533AC (MS-3R/3F ACver) */
#define YAS_YAS532_533_VERSION_AB_COEF	1800
#define YAS_YAS532_533_VERSION_AC_COEF	900
#define YAS_YAS532_533_DATA_CENTER      4096
#define YAS_YAS532_533_DATA_OVERFLOW	8190
#define YAS_YAS532_533_CAL_DATA_SIZE    14

#define YAS_MAG_DISTURBURNCE_THRESHOLD  1600
#define YAS_RESET_COIL_TIME_THRESHOLD   3000

#define INV_ERROR_COMPASS_DATA_OVERFLOW  (-1)
#define INV_ERROR_COMPASS_DATA_NOT_READY (-2)

int inv_yas53x_configure_ring(struct iio_dev *indio_dev);
void inv_yas53x_unconfigure_ring(struct iio_dev *indio_dev);
int inv_yas53x_probe_trigger(struct iio_dev *indio_dev);
void inv_yas53x_remove_trigger(struct iio_dev *indio_dev);
void set_yas53x_enable(struct iio_dev *indio_dev, bool enable);
void inv_read_yas53x_fifo(struct iio_dev *indio_dev);
int yas53x_read(struct inv_compass_state *st, short rawfixed[3],
				s32 *overunderflow);
int yas53x_resume(struct inv_compass_state *st);

#endif  /* #ifndef _INV_GYRO_H_ */