aboutsummaryrefslogtreecommitdiff
path: root/drivers/misc/mediatek/magnetometer/mc6420/mc6420.h
blob: fb3571013e5cd5abdfd0b8a3043cd7d7f9e1c1d1 (plain) (blame)
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
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
/* include/linux/mc6420.h - MC6420 compass driver
 *
 * Copyright (C) 2012 mCube Inc.
 * Author: 
 *
 * 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.
 *
 */

/*
 * Definitions for mc6420 compass chip.
 */
#ifndef MC6420_H
    #define MC6420_H

/*******************************************************************************
 *** INCLUDE FILES
 *******************************************************************************/
#include <linux/ioctl.h>

/*******************************************************************************
 *** H/W CONFIGURATION
 *******************************************************************************/
/**************************
 *** MAG SENSOR I2C ADDR
 **************************/
#define MCMAG_PIN_LEVEL_GND     0x00
#define MCMAG_PIN_LEVEL_DVDD    0x01

#define MCMAG_I2C_PIN_A0_CONNECT_TO    MCMAG_PIN_LEVEL_GND

#if   (MCMAG_I2C_PIN_A0_CONNECT_TO == MCMAG_PIN_LEVEL_GND)
           #define MCMAG_I2C_ADDR    0x3C
#elif (MCMAG_I2C_PIN_A0_CONNECT_TO == MCMAG_PIN_LEVEL_DVDD)
           #define MCMAG_I2C_ADDR    0x38
#else
           #error "MCMAG_I2C_PIN_A0 should be correctly configured..."
#endif

/**************************************************************
 *** REG MAP (refer to MC6420 Spec.)
 **************************************************************/
#define MCMAG_REG_CH1_OUT_LSB           0x00
#define MCMAG_REG_CH1_OUT_MSB           0x01
#define MCMAG_REG_CH2_OUT_LSB           0x02
#define MCMAG_REG_CH2_OUT_MSB           0x03
#define MCMAG_REG_CH3_OUT_LSB           0x04
#define MCMAG_REG_CH3_OUT_MSB           0x05
#define MCMAG_REG_STATUS1_STATUS        0x06
#define MCMAG_REG_STATUS2_INTR          0x07
#define MCMAG_REG_TEMP_LSB              0x08
#define MCMAG_REG_TEMP_MSB              0x09
#define MCMAG_REG_SETUP1_RATE_MEAS      0x0A
#define MCMAG_REG_SETUP2_STATE          0x0B
#define MCMAG_REG_SETUP3_INTRL          0x0C
#define MCMAG_REG_SETUP4_SKIPCNT        0x0D
#define MCMAG_REG_SETUP5_EXOFF1         0x0E
#define MCMAG_REG_SETUP6_EXOFF2         0x0F
#define MCMAG_REG_SETUP7_EXGAIN1        0x10
#define MCMAG_REG_SETUP8_EXGAIN2        0x11
#define MCMAG_REG_SETUP9_THRLMT         0x12
#define MCMAG_REG_ENABLE1               0x13
#define MCMAG_REG_ENABLE2               0x14
#define MCMAG_REG_ENABLE3_INTREN        0x15
#define MCMAG_REG_PCODE                 0x16
#define MCMAG_REG_SCRATCH_PAD           0x17
#define MCMAG_REG_POWER_ON_RESET        0x18
#define MCMAG_REG_SAMPLE_RATE_CONTRL    0x19
#define MCMAG_REG_PW_PRE                0x1A
#define MCMAG_REG_SETPW                 0x1B
#define MCMAG_REG_CHIPID                0x1C
#define MCMAG_REG_SEC                   0x1D
#define MCMAG_REG_SINCIN1               0x1E
#define MCMAG_REG_TEST1                 0x1F
#define MCMAG_REG_TEST2                 0x20
#define MCMAG_REG_INTRLSEL              0x21
#define MCMAG_REG_RNGCH1                0x22
#define MCMAG_REG_RNGCH23               0x23
#define MCMAG_REG_T0_LSB                0x24
#define MCMAG_REG_T0_MSB                0x25
#define MCMAG_REG_SINCIN2               0x26
#define MCMAG_REG_ANA_CH1A              0x27
#define MCMAG_REG_ANA_CH1B              0x28
#define MCMAG_REG_ANA_CH1C              0x29
#define MCMAG_REG_ANA_CH2A              0x2A
#define MCMAG_REG_ANA_CH2B              0x2B
#define MCMAG_REG_ANA_CH2C              0x2C
#define MCMAG_REG_ANA_CH3A              0x2D
#define MCMAG_REG_ANA_CH3B              0x2E
#define MCMAG_REG_ANA_CH3C              0x2F
#define MCMAG_REG_PW_ADC_RST            0x30
#define MCMAG_REG_UNUSED                0x31
#define MCMAG_REG_LFSR_CFIG             0x32
#define MCMAG_REG_LFSR_CNT              0x33
#define MCMAG_REG_LFSR_SEED             0x34
#define MCMAG_REG_OTPCTRL               0x35
#define MCMAG_REG_OTPDIN                0x36
#define MCMAG_REG_OTPDOUT               0x37
#define MCMAG_REG_DEVIDFREQ             0x38
#define MCMAG_REG_BIASCHMP              0x39
#define MCMAG_REG_DGAIN1                0x3A
#define MCMAG_REG_DGAIN2                0x3B
#define MCMAG_REG_DGAIN3                0x3C
#define MCMAG_REG_AOFF0                 0x3D
#define MCMAG_REG_OFFSET01              0x3E
#define MCMAG_REG_OFFSET23              0x3F

/**************************************************************
 *** [REG STATUS1: 0x06]
 **************************************************************/
    #define MCMAG_STATUS1_ACQ_DATA_READY    0x01

/**************************************************************
 *** [REG SETUP1: 0x0A]
 **************************************************************/
    /**********************************************************
     *** MEASUREMENT CONFIGURATION
     **********************************************************/
    #define MCMAG_SETUP1_MEAS_NORMAL               0x00
    #define MCMAG_SETUP1_MEAS_SELFTEST_POSITIVE    0x01
    #define MCMAG_SETUP1_MEAS_SELFTEST_NEGATIVE    0x02

    /**********************************************************
     *** SAMPLE RATE
     **********************************************************/
    #define MCMAG_SAMPLE_RATE_10Hz     0x00
    #define MCMAG_SAMPLE_RATE_30Hz     0x04
    #define MCMAG_SAMPLE_RATE_100Hz    0x08
    #define MCMAG_SAMPLE_RATE_200Hz    0x0C

/**************************************************************
 *** [REG SETUP2: 0x0B]
 **************************************************************/
    /**********************************************************
     *** MAG STATE
     **********************************************************/
    #define MCMAG_SETUP2_STATE_STANDBY       0x00
    #define MCMAG_SETUP2_STATE_CONTINUOUS    0x01
    #define MCMAG_SETUP2_STATE_SINGLE        0x02

/**************************************************************
 *** [REG SETUP6: 0x0F]
 **************************************************************/
    /**********************************************************
     *** RANGE & SENSITIVITY
     **********************************************************/
    #define MCMAG_SETUP6_FIELD_RANGE_1    0x10
    #define MCMAG_SETUP6_FIELD_RANGE_2    0x20
    #define MCMAG_SETUP6_FIELD_RANGE_3    0x30
    #define MCMAG_SETUP6_FIELD_RANGE_4    0x40
    #define MCMAG_SETUP6_FIELD_RANGE_5    0x50

    #define MCMAG_SETUP6_FIELD_RANGE_MASK    0xF0

/**************************************************************
 *** [REG SETUP7: 0x10]
 **************************************************************/
    /**********************************************************
     *** CLOCK RATE
     **********************************************************/
    #define MCMAG_SETUP7_HF_DIGTAL_CLOCK_1MHz    0x00
    #define MCMAG_SETUP7_HF_DIGTAL_CLOCK_8MHz    0x80

/**************************************************************
 *** [REG ENABLE2: 0x14]
 **************************************************************/
    /**********************************************************
     *** FUNCTIONS
     **********************************************************/
    #define MCMAG_ENABLE2_IPP_OPEN_DRAIN     0x00
    #define MCMAG_ENABLE2_IPP_PUSH_PULL      0x20

    #define MCMAG_ENABLE2_IAH_ACTIVE_LOW     0x00
    #define MCMAG_ENABLE2_IAH_ACTIVE_HIGH    0x40

/**************************************************************
 *** CHIP ID
 **************************************************************/
    #define MCUBE_MARS_CHIPID0       0x10
    #define MCUBE_MARS_CHIPID1       0x11
    #define MCUBE_MARS_CHIPID2       0x12
    #define MCUBE_UNPROGRAMMED_ID    0x00

/*******************************************************************************
 *** S/W CONFIGURATION
 *******************************************************************************/
/**************************************************************
 *** BUFFER SIZE
 **************************************************************/
#define MCMAG_BUFFER_SIZE    64

/**************************************************************
 *** MAG DEFUALTS
 **************************************************************/
#define MCMAG_DEFAULT_SETUP7_HF              0x01
#define MCMAG_DEFAULT_SAMPLE_RATE_DIVIDER    0x0A
#define MCMAG_DEFAULT_ENABLE1                0x07
#define MCMAG_DEFAULT_ENABLE2                0x1F
#define MCMAG_DEFAULT_ENABLE3                0x00

/*******************************************************************************
 *** MCUBE TYPE DEFINITION
 *******************************************************************************/
/**************************************************************
 *** MCUBE RETURN CODE (TODO: replace these by system return code)
 **************************************************************/
typedef enum
{
    /* Generic return codes */
    MCUBE_SUCCESS = 0x00000000,
    MCUBE_FAILURE,
    MCUBE_UNKNOWN_SENSOR,
    MCUBE_NULL_SENS_CFG,
    MCUBE_NULL_SENSOR_PTR,
    MCUBE_NULL_DATA_PTR,
    MCUBE_INVALID_SENS_CNT,
    MCUBE_OFFSETS_UNCHANGED,
    /*Accelerometer Specific Error Codes */
    MCUBE_ACCEL_INVALID_CFG = 0x01000000,
    MCUBE_ACCEL_NULL_CFG,
    MCUBE_ACCEL_UNAVAILABLE,
    MCUBE_ACCEL_UNINITIALIZED,
    MCUBE_ACCEL_ALREADY_INIT,
    MCUBE_ACCEL_PWRDOWN_FAIL,
    MCUBE_ACCEL_DATA_OUTPTR_NULL,
    MCUBE_ACCEL_DATA_INPTR_NULL,
    MCUBE_ACCEL_DATA_INVALID,
    MCUBE_ACCEL_ALREADY_STARTED,
    MCUBE_ACCEL_ALREADY_STOPPED,
    MCUBE_ACCEL_UNKNOWN_CHIPID,
    MCUBE_ACCEL_DRV_STOP_FAIL,
    MCUBE_ACCEL_INVALID_OFFSET,
    /* Gyroscope specific error codes */
    MCUBE_GYRO_INVALID_CFG = 0x02000000,
    MCUBE_GYRO_UNAVAILABLE,
    MCUBE_GYRO_UNINITIALIZED,
    /* Magnetometer specific error codes */
    MCUBE_MAG_INVALID_CFG = 0x04000000,
    MCUBE_MAG_NULL_CFG,
    MCUBE_MAG_UNKNOWN_CHIPID,
    MCUBE_MAG_INVALID_CHIP_ID,
    MCUBE_MAG_PWRDOWN_FAIL,
    MCUBE_MAG_DRV_STOP_FAIL,
    MCUBE_MAG_DATA_INPTR_NULL,
    MCUBE_MAG_DATA_NOT_READY,
    MCUBE_MAG_UNAVAILABLE,
    MCUBE_MAG_UNINITIALIZED
}   mCubeResult_t;

/**************************************************************
 *** DATA STRUCTURE & ENUM
 **************************************************************/
typedef enum
{
    E_MCMAG_INIT_STATUS_UNINITIALIZED = 0,
    E_MCMAG_INIT_STATUS_INITIALIZED,
    E_MCMAG_INIT_STATUS_DUMMY_END = 0xFFFFFFFF
}   e_McmagInitStaus;

typedef enum
{
    E_MCMAG_STATE_INVALID,
    E_MCMAG_STATE_WAKE,
    E_MCMAG_STATE_SINGLE,
    E_MCMAG_STATE_STANDBY,
    E_MCMAG_STATE_DUMMY_END = 0xFFFFFFFF
}   e_McmagSetup2State;

typedef enum
{
    E_MCMAG_MEAS_NORMAL,
    E_MCMAG_MEAS_SELFTEST_POSITIVE,
    E_MCMAG_MEAS_SELFTEST_NEGATIVE,
    E_MCMAG_MEAS_DUMMY_END = 0xFFFFFFFF
}   e_McmagMeasCfg;

typedef enum
{
    E_MCMAG_RATE_10Hz,
    E_MCMAG_RATE_25Hz,
    E_MCMAG_RATE_100Hz,
    E_MCMAG_RATE_200Hz,
    E_MCMAG_RATE_DUMMY_END = 0xFFFFFFFF
}   e_McmagRateCfg;

typedef struct
{
    e_McmagRateCfg    eRateCfg;
    bool              bIsHingFreqON;
    u8                bSampleRateDivider;
    u8                baPadding[2];
}   s_McmagSampleRateCfg;

typedef enum
{
    E_MCMAG_FIELD_RANGE_1,
    E_MCMAG_FIELD_RANGE_2,
    E_MCMAG_FIELD_RANGE_3,
    E_MCMAG_FIELD_RANGE_4,
    E_MCMAG_FIELD_RANGE_5,
    E_MCMAG_FIELD_RANGE_DUMMY_END = 0xFFFFFFFF
}   e_McmagRangeCfg;

typedef enum
{
    E_MCMAG_IPP_OPEN_DRAIN,
    E_MCMAG_IPP_PUSH_PULL,
    E_MCMAG_IPP_DUMMY_END = 0xFFFFFFFF
}   e_McmagIntPinCfg;

typedef enum
{
    E_MCMAG_IAH_ACTIVE_LOW,
    E_MCMAG_IAH_ACTIVE_HIGH,
    E_MCMAG_IAH_DUMMY_END = 0xFFFFFFFF
}   e_McmagIntLevelCfg;

typedef struct
{
    e_McmagIntPinCfg      eIntPinCfg;
    e_McmagIntLevelCfg    eIntPinLevel;
    u16                   wIntEnableFlag;
    u16                   wPadding;
}   s_McmagIntCfg;

typedef struct
{
    e_McmagSetup2State      eActiveState;
    e_McmagMeasCfg          eMeasCfg;
    s_McmagSampleRateCfg    tSampleRateCfg;
    e_McmagRangeCfg         eRangeCfg;
    s_McmagIntCfg           tIntCfg;
    u8                      bEnable1Cfg;
    u8                      baPadding[3];
}   s_McmagConfig;

typedef struct
{
    e_McmagInitStaus      eInitStatus;
    e_McmagSetup2State    ePowerState;
    s_McmagConfig         tMagConfig;
    void                 *pDeviceID;
    bool                  bIsChipIdValid;
    u8                    bChipID;
    u8                    baPadding[2];
}   s_McmagMagControl;

#endif  //END of MC6420_H