aboutsummaryrefslogtreecommitdiff
path: root/include/linux/CwMcuSensor.h
blob: 6d2dde647e3917cf950daeb19ee5f9605572a4b8 (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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
/* CwMcuSensor.c - driver file for HTC SensorHUB
 *
 * Copyright (C) 2014 HTC Ltd.
 *
 * 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.
 *
 */

#ifndef __CWMCUSENSOR_H__
#define __CWMCUSENSOR_H__
#include <linux/ioctl.h>

#define CWMCU_I2C_NAME "CwMcuSensor"

enum ABS_status {
	CW_SCAN_ID = 0,
	CW_SCAN_X,
	CW_SCAN_Y,
	CW_SCAN_Z,
	CW_SCAN_XX,
	CW_SCAN_YY,
	CW_SCAN_ZZ,
	CW_SCAN_TIMESTAMP,
};


typedef enum {
	CW_ACCELERATION                = 0,
	CW_MAGNETIC                    = 1,
	CW_GYRO                        = 2,
	CW_LIGHT                       = 3,
	CW_PRESSURE                    = 5,
	CW_ORIENTATION                 = 6,
	CW_ROTATIONVECTOR              = 7,
	CW_LINEARACCELERATION          = 8,
	CW_GRAVITY                     = 9,
	HTC_MAGIC_COVER                = 12,
	CW_MAGNETIC_UNCALIBRATED       = 16,
	CW_GYROSCOPE_UNCALIBRATED      = 17,
	CW_GAME_ROTATION_VECTOR        = 18,
	CW_GEOMAGNETIC_ROTATION_VECTOR = 19,
	CW_SIGNIFICANT_MOTION          = 20,
	CW_STEP_DETECTOR               = 21,
	CW_STEP_COUNTER                = 22,
	HTC_FACEDOWN_DETECTION         = 23,
	CW_SENSORS_ID_FW /* Be careful, do not exceed 31, Firmware ID limit */,
	CW_ACCELERATION_W                = 32,
	CW_MAGNETIC_W                    = 33,
	CW_GYRO_W                        = 34,
	CW_PRESSURE_W                    = 37,
	CW_ORIENTATION_W                 = 38,
	CW_ROTATIONVECTOR_W              = 39,
	CW_LINEARACCELERATION_W          = 40,
	CW_GRAVITY_W                     = 41,
	CW_MAGNETIC_UNCALIBRATED_W       = 48,
	CW_GYROSCOPE_UNCALIBRATED_W      = 49,
	CW_GAME_ROTATION_VECTOR_W        = 50,
	CW_GEOMAGNETIC_ROTATION_VECTOR_W = 51,
	CW_STEP_DETECTOR_W               = 53,
	CW_STEP_COUNTER_W                = 54,
	CW_SENSORS_ID_TOTAL              = 55, /* Includes Wake up version */
	TIME_DIFF_EXHAUSTED            = 97,
	CW_TIME_BASE                   = 98,
	CW_META_DATA                   = 99,
	CW_MAGNETIC_UNCALIBRATED_BIAS  = 100,
	CW_GYROSCOPE_UNCALIBRATED_BIAS = 101
} CW_SENSORS_ID;

#define NS_PER_US 1000000LL

#define FIRMWARE_VERSION 0x10

#define HTC_SYSTEM_STATUS_REG                      0x1E

#define CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_ACC                0x60
#define CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_ACC              0x68
#define CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_ACC              0x68
#define CW_I2C_REG_SENSORS_CALIBRATOR_TARGET_ACC	        0x69
#define CW_I2C_REG_SENSORS_CALIBRATOR_RESULT_RL_ACC             0x6A

#define CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_MAG                0x70
#define CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_MAG              0x78
#define CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_MAG              0x78
#define CW_I2C_REG_SENSORS_ACCURACY_MAG                         0x79


#define CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_GYRO               0x80
#define CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_GYRO             0x88
#define CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_GYRO             0x88

#define CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_LIGHT              0x90
#define CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_LIGHT            0x98
#define CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_LIGHT            0x98

#define CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_PRESSURE           0xB0
#define CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_PRESSURE         0xB8
#define CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_PRESSURE         0xB8
#define PRESSURE_UPDATE_RATE                                    0xB6
#define PRESSURE_WAKE_UPDATE_RATE                               0xB7

#define CWMCU_MAX_DELAY		200
#define CWMCU_NO_POLLING_DELAY		10000

#define G_SENSORS_STATUS                                        0x60
#define ACCE_UPDATE_RATE                                        0x66
#define ACCE_WAKE_UPDATE_RATE                                   0x67
#define ECOMPASS_SENSORS_STATUS                                 0x70
#define MAGN_UPDATE_RATE                                        0x76
#define MAGN_WAKE_UPDATE_RATE                                   0x77
#define GYRO_SENSORS_STATUS                                     0x80
#define GYRO_UPDATE_RATE                                        0x86
#define GYRO_WAKE_UPDATE_RATE                                   0x87
#define LIGHT_SENSORS_STATUS                                    0x90
#define LIGHT_UPDATE_PERIOD                                     0x96
#define LIGHT_SENSORS_CALIBRATION_DATA				0x98

#define ORIE_UPDATE_RATE                                        0xC0
#define ROTA_UPDATE_RATE                                        0xC1
#define LINE_UPDATE_RATE                                        0xC2
#define GRAV_UPDATE_RATE                                        0xC3
#define MAGN_UNCA_UPDATE_RATE                                   0xC4
#define GYRO_UNCA_UPDATE_RATE                                   0xC5
#define GAME_ROTA_UPDATE_RATE                                   0xC6
#define GEOM_ROTA_UPDATE_RATE                                   0xC7
#define SIGN_UPDATE_RATE                                        0xC8

#define ORIE_WAKE_UPDATE_RATE                                   0xC9
#define ROTA_WAKE_UPDATE_RATE                                   0xCA
#define LINE_WAKE_UPDATE_RATE                                   0xCB
#define GRAV_WAKE_UPDATE_RATE                                   0xCC
#define MAGN_UNCA_WAKE_UPDATE_RATE                              0xCD
#define GYRO_UNCA_WAKE_UPDATE_RATE                              0xCE
#define GAME_ROTA_WAKE_UPDATE_RATE                              0xCF
#define GEOM_ROTA_WAKE_UPDATE_RATE                              0xD2
#define STEP_COUNTER_UPDATE_PERIOD                              0xD3

#define STEP_COUNTER_MASK ((1ULL << CW_STEP_COUNTER) | \
			   (1ULL << CW_STEP_COUNTER_W))

#define IIO_CONTINUOUS_MASK ((1ULL << CW_ACCELERATION) | \
			     (1ULL << CW_MAGNETIC) | \
			     (1ULL << CW_GYRO) | \
			     (1ULL << CW_PRESSURE) | \
			     (1ULL << CW_ORIENTATION) | \
			     (1ULL << CW_ROTATIONVECTOR) | \
			     (1ULL << CW_LINEARACCELERATION) | \
			     (1ULL << CW_GRAVITY) | \
			     (1ULL << CW_MAGNETIC_UNCALIBRATED) | \
			     (1ULL << CW_GYROSCOPE_UNCALIBRATED) | \
			     (1ULL << CW_GAME_ROTATION_VECTOR) | \
			     (1ULL << CW_GEOMAGNETIC_ROTATION_VECTOR) | \
			     (1ULL << CW_STEP_DETECTOR) | \
			     (1ULL << CW_STEP_COUNTER) | \
			     (1ULL << CW_ACCELERATION_W) | \
			     (1ULL << CW_MAGNETIC_W) | \
			     (1ULL << CW_GYRO_W) | \
			     (1ULL << CW_PRESSURE_W) | \
			     (1ULL << CW_ORIENTATION_W) | \
			     (1ULL << CW_ROTATIONVECTOR_W) | \
			     (1ULL << CW_LINEARACCELERATION_W) | \
			     (1ULL << CW_GRAVITY_W) | \
			     (1ULL << CW_MAGNETIC_UNCALIBRATED_W) | \
			     (1ULL << CW_GYROSCOPE_UNCALIBRATED_W) | \
			     (1ULL << CW_GAME_ROTATION_VECTOR_W) | \
			     (1ULL << CW_GEOMAGNETIC_ROTATION_VECTOR_W) | \
			     (1ULL << CW_STEP_DETECTOR_W) | \
			     (1ULL << CW_STEP_COUNTER_W))

#define CW_I2C_REG_WATCHDOG_STATUS                              0xE6
#define WATCHDOG_STATUS_LEN                                     12

#define CW_I2C_REG_EXCEPTION_BUFFER_LEN                   0xFD
#define EXCEPTION_BUFFER_LEN_SIZE                         4
#define CW_I2C_REG_EXCEPTION_BUFFER                       0xFE
#define EXCEPTION_BLOCK_LEN                               16

#define CW_I2C_REG_WARN_MSG_ENABLE                        0xFA
#define CW_I2C_REG_WARN_MSG_BUFFER_LEN                    0xFB
#define WARN_MSG_BUFFER_LEN_SIZE                          8
#define CW_I2C_REG_WARN_MSG_BUFFER                        0xFC
#define WARN_MSG_BLOCK_LEN                                16
#define WARN_MSG_PER_ITEM_LEN                             120

#define CW_I2C_REG_WATCH_DOG_ENABLE                       0xF9

#define UPDATE_RATE_NORMAL              1
#define UPDATE_RATE_UI                  2
#define UPDATE_RATE_GAME                3
#define UPDATE_RATE_FASTEST             4
#define UPDATE_RATE_RATE_10Hz           5
#define UPDATE_RATE_RATE_25Hz           6

#define GENSOR_POSITION			0x65
#define COMPASS_POSITION		0x75
#define GYRO_POSITION			0x85

#define num_sensors			CW_SENSORS_ID_TOTAL

#define CWSTM32_BATCH_MODE_COMMAND	0x40  /* R/W         1 Byte
					       * Bit 2: Timeout flag (R/WC)
					       * Bit 4: Buffer full flag (R/WC)
					       */

#define CWSTM32_BATCH_MODE_DATA_QUEUE	0x45  /* R/W         9 Bytes */
#define CWSTM32_BATCH_MODE_TIMEOUT	0x46  /* R/W         4 Bytes    (ms) */
#define CWSTM32_BATCH_MODE_DATA_COUNTER	0x47  /* R/W         4 Bytes
					       * (4 bytes, from low byte to
					       *  high byte */
#define CWSTM32_BATCH_FLUSH		0x48  /* W        1 Byte (sensors_id) */

#define CWSTM32_WAKE_UP_BATCH_MODE_DATA_QUEUE	0x55  /* R/W         9 Bytes */
#define CWSTM32_WAKE_UP_BATCH_MODE_TIMEOUT      0x56  /* R/W         4 Bytes
						       * (ms) */
#define CWSTM32_WAKE_UP_BATCH_MODE_DATA_COUNTER	0x57  /* R/W         4 Bytes
						       * (4 bytes, from low byte
						       *  to high byte) */

#define SYNC_TIMESTAMP_BIT		(1 << 1)
#define TIMESTAMP_SYNC_CODE		(98)

#define CW_I2C_REG_MCU_TIME                     0x11

#define MAX_EVENT_COUNT                         2500

/* If queue is empty */
#define CWMCU_NODATA	0xFF

#define CWSTM32_ENABLE_REG			0x01
#define CWSTM32_READ_SEQUENCE_DATA_REG  	0x0F

#define CWSTM32_WRITE_POSITION_Acceleration	0x20
#define CWSTM32_WRITE_POSITION_Magnetic		0x21
#define CWSTM32_WRITE_POSITION_Gyro		0x22

#define CWSTM32_WRITE_CLEAN_COUNT_Pedometer	0x30

#define CWSTM32_INT_ST1                         0x08
#define CWSTM32_INT_ST2                         0x09
#define CWSTM32_INT_ST3                         0x0A
#define CWSTM32_INT_ST4                         0x0B
#define CWSTM32_ERR_ST                          0x1F

#define CW_BATCH_ENABLE_REG                     0x41
#define CW_WAKE_UP_BATCH_ENABLE_REG             0x51

#define CW_CPU_STATUS_REG                       0xD1

/* INT_ST1 */
#define CW_MCU_INT_BIT_LIGHT                    (1 << 3)

/* INT_ST2 */
#define CW_MCU_INT_BIT_MAGIC_COVER              (1 << 4)

/* INT_ST3 */
#define CW_MCU_INT_BIT_SIGNIFICANT_MOTION       (1 << 4)
#define CW_MCU_INT_BIT_STEP_DETECTOR            (1 << 5)
#define CW_MCU_INT_BIT_STEP_COUNTER             (1 << 6)
#define CW_MCU_INT_BIT_FACEDOWN_DETECTION       (1 << 7)

/* ERR_ST */
#define CW_MCU_INT_BIT_ERROR_WARN_MSG           (1 << 5)
#define CW_MCU_INT_BIT_ERROR_MCU_EXCEPTION      (1 << 6)
#define CW_MCU_INT_BIT_ERROR_WATCHDOG_RESET     (1 << 7)

/* batch_st */
#define CW_MCU_INT_BIT_BATCH_TIMEOUT      (1 << 2)
#define CW_MCU_INT_BIT_BATCH_BUFFER_FULL  (1 << 4)
#define CW_MCU_INT_BIT_BATCH_TRIGGER_READ (CW_MCU_INT_BIT_BATCH_TIMEOUT |\
					   CW_MCU_INT_BIT_BATCH_BUFFER_FULL)
#define CW_MCU_INT_BIT_BATCH_INT_MASK     CW_MCU_INT_BIT_BATCH_TRIGGER_READ

#define IIO_SENSORS_MASK (((u64)(~0ULL)) & ~(1ULL << HTC_MAGIC_COVER) & \
					   ~(1ULL << (HTC_MAGIC_COVER+32)))

#define CW_MCU_BIT_LIGHT_POLLING		(1 << 5)

#define FW_DOES_NOT_EXIST                       (1 << 0)
#define FW_UPDATE_QUEUED                        (1 << 1)
#define FW_ERASE_FAILED                         (1 << 2)
#define FW_FLASH_FAILED                         (1 << 3)

#define	CW_MCU_I2C_SENSORS_REG_START		(0x20)

#define CWSTM32_READ_Gesture_Flip                               (CW_MCU_I2C_SENSORS_REG_START + HTC_GESTURE_FLIP)
#define CWSTM32_READ_Acceleration    		(CW_MCU_I2C_SENSORS_REG_START + CW_ACCELERATION)
#define CWSTM32_READ_Magnetic						(CW_MCU_I2C_SENSORS_REG_START + CW_MAGNETIC)
#define CWSTM32_READ_Gyro    						(CW_MCU_I2C_SENSORS_REG_START + CW_GYRO)
#define CWSTM32_READ_Light    					(CW_MCU_I2C_SENSORS_REG_START + CW_LIGHT)
#define CWSTM32_READ_Pressure	    			(CW_MCU_I2C_SENSORS_REG_START + CW_PRESSURE)
#define CWSTM32_READ_Orientation    		(CW_MCU_I2C_SENSORS_REG_START + CW_ORIENTATION)
#define CWSTM32_READ_RotationVector    	(CW_MCU_I2C_SENSORS_REG_START + CW_ROTATIONVECTOR)
#define CWSTM32_READ_LinearAcceleration (CW_MCU_I2C_SENSORS_REG_START + CW_LINEARACCELERATION)
#define CWSTM32_READ_Gravity    				(CW_MCU_I2C_SENSORS_REG_START + CW_GRAVITY)
#define CWSTM32_READ_Hall_Sensor                 	        0x2C
#define CWSTM32_READ_MAGNETIC_UNCALIBRATED			0x30
#define CWSTM32_READ_GYROSCOPE_UNCALIBRATED			0x31
#define CWSTM32_READ_GAME_ROTATION_VECTOR			0x32
#define CWSTM32_READ_GEOMAGNETIC_ROTATION_VECTOR		0x33
#define CWSTM32_READ_SIGNIFICANT_MOTION				0x34
#define CWSTM32_READ_STEP_DETECTOR				0x35
#define CWSTM32_READ_STEP_COUNTER				0x36
#define CWSTM32_READ_FACEDOWN_DETECTION				0x3A

#ifdef __KERNEL__
struct cwmcu_platform_data {
	unsigned char acceleration_axes;
	unsigned char magnetic_axes;
	unsigned char gyro_axes;
	uint32_t gpio_wake_mcu;
	uint32_t gpio_reset;
	uint32_t gpio_chip_mode;
	uint32_t gpio_mcu_irq;
	int gs_chip_layout;

};
#endif /* __KERNEL */

#endif /* __CWMCUSENSOR_H__ */