hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
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
357
/* include/linux/sensor-dev.h - sensor header file
 *
 * Copyright (C) 2012-2015 ROCKCHIP.
 * Author: luowei <lw@rock-chips.com>
 *
 * 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.
 *
 */
 
#include <linux/miscdevice.h>
#ifdef CONFIG_HAS_EARLYSUSPEND
#include <linux/earlysuspend.h>
#endif
 
#include <dt-bindings/sensor-dev.h>
#include <linux/module.h>
 
#define SENSOR_ON        1
#define SENSOR_OFF        0
#define SENSOR_UNKNOW_DATA    -1
 
#define GPIO_HIGH 1
#define GPIO_LOW 0
 
enum sensor_id {
   ID_INVALID = 0,
 
   ANGLE_ID_ALL,
   ANGLE_ID_KXTIK,
   ANGLE_ID_LIS3DH,
 
   ACCEL_ID_ALL,
   ACCEL_ID_LIS331,
   ACCEL_ID_LSM303DLX,
   ACCEL_ID_LIS3DH,
   ACCEL_ID_KXSD9,
   ACCEL_ID_KXTF9,
   ACCEL_ID_KXTIK,
   ACCEL_ID_KXTJ9,
   ACCEL_ID_BMA150,
   ACCEL_ID_BMA222,
   ACCEL_ID_BMA250,
   ACCEL_ID_ADXL34X,
   ACCEL_ID_MMA8450,
   ACCEL_ID_MMA845X,
   ACCEL_ID_MMA7660,
   ACCEL_ID_SC7660,
   ACCEL_ID_SC7A20,
   ACCEL_ID_SC7A30,
   ACCEL_ID_MPU6050,
   ACCEL_ID_MXC6225,
   ACCEL_ID_MXC6655XA,
   ACCEL_ID_DMARD10,
   ACCEL_ID_LSM303D,
   ACCEL_ID_MC3230,
   ACCEL_ID_MPU6880,
   ACCEL_ID_MPU6500,
   ACCEL_ID_LSM330,
   ACCEL_ID_BMA2XX,
   ACCEL_ID_STK8BAXX,
   ACCEL_ID_MIR3DA,
   ACCEL_ID_ICM2060X,
   ACCEL_ID_DA215S,
   ACCEL_ID_DA228E,
   ACCEL_ID_IAM20680,
   COMPASS_ID_ALL,
   COMPASS_ID_AK8975,
   COMPASS_ID_AK8963,
   COMPASS_ID_AK09911,
   COMPASS_ID_AK8972,
   COMPASS_ID_AMI30X,
   COMPASS_ID_AMI306,
   COMPASS_ID_YAS529,
   COMPASS_ID_YAS530,
   COMPASS_ID_HMC5883,
   COMPASS_ID_LSM303DLH,
   COMPASS_ID_LSM303DLM,
   COMPASS_ID_MMC314X,
   COMPASS_ID_HSCDTD002B,
   COMPASS_ID_HSCDTD004A,
   COMPASS_ID_AK09918,
 
   GYRO_ID_ALL,
   GYRO_ID_L3G4200D,
   GYRO_ID_L3G20D,
   GYRO_ID_EWTSA,
   GYRO_ID_K3G,
   GYRO_ID_MPU6500,
   GYRO_ID_MPU6880,
   GYRO_ID_LSM330,
   GYRO_ID_ICM2060X,
   GYRO_ID_IAM20680,
   LIGHT_ID_ALL,
   LIGHT_ID_CM3217,
   LIGHT_ID_CM3218,
   LIGHT_ID_CM3232,
   LIGHT_ID_AL3006,
   LIGHT_ID_STK3171,
   LIGHT_ID_ISL29023,
   LIGHT_ID_AP321XX,
   LIGHT_ID_PHOTORESISTOR,
   LIGHT_ID_US5152,
   LIGHT_ID_STK3332,
   LIGHT_ID_STK3410,
   LIGHT_ID_EM3071X,
   LIGHT_ID_UCS14620,
 
   PROXIMITY_ID_ALL,
   PROXIMITY_ID_AL3006,
   PROXIMITY_ID_STK3171,
   PROXIMITY_ID_AP321XX,
   PROXIMITY_ID_STK3332,
   PROXIMITY_ID_STK3410,
   PROXIMITY_ID_EM3071X,
   PROXIMITY_ID_UCS14620,
 
   TEMPERATURE_ID_ALL,
   TEMPERATURE_ID_MS5607,
 
   PRESSURE_ID_ALL,
   PRESSURE_ID_BMA085,
   PRESSURE_ID_MS5607,
 
   HALL_ID_ALL,
   HALL_ID_OCH165T,
 
   SENSOR_NUM_ID,
};
 
struct sensor_axis {
   int x;
   int y;
   int z;
};
 
struct sensor_flag {
   atomic_t a_flag;
   atomic_t m_flag;
   atomic_t mv_flag;
   atomic_t open_flag;
   atomic_t debug_flag;
   long long delay;
   wait_queue_head_t open_wq;
};
 
 
struct sensor_operate {
   char *name;
   int type;
   int id_i2c;
   int range[2];
   int brightness[2];
   int read_reg;
   int read_len;
   int id_reg;
   int id_data;
   int precision;
   int ctrl_reg;
   int ctrl_data;
   int int_ctrl_reg;
   int int_status_reg;
   int trig;
   int (*active)(struct i2c_client *client, int enable, int rate);
   int (*init)(struct i2c_client *client);
   int (*report)(struct i2c_client *client);
   int (*suspend)(struct i2c_client *client);
   int (*resume)(struct i2c_client *client);
   struct miscdevice *misc_dev;
};
 
/* Platform data for the sensor */
struct sensor_private_data {
   int type;
   struct i2c_client *client;
   struct input_dev *input_dev;
   int stop_work;
   struct delayed_work delaywork;
   struct sensor_axis axis;
   char sensor_data[40];
   atomic_t is_factory;
   wait_queue_head_t is_factory_ok;
   struct mutex data_mutex;
   struct mutex operation_mutex;
   struct mutex sensor_mutex;
   struct mutex i2c_mutex;
   int status_cur;
   int start_count;
   int devid;
   struct sensor_flag flags;
   struct i2c_device_id *i2c_id;
   struct sensor_platform_data *pdata;
   struct sensor_operate *ops;
   struct file_operations fops;
   struct miscdevice miscdev;
#ifdef CONFIG_HAS_EARLYSUSPEND
   struct early_suspend early_suspend;
#endif
};
 
struct sensor_platform_data {
   int type;
   int irq;
   int irq_pin;
   int power_pin;
   int reset_pin;
   int standby_pin;
   int irq_enable;
   int poll_delay_ms;
   int x_min;
   int y_min;
   int z_min;
   int factory;
   int layout;
   unsigned char address;
   unsigned long irq_flags;
   signed char orientation[9];
   short m_layout[4][3][3];
   int *project_name;
   int power_off_in_suspend;
};
 
struct gsensor_platform_data {
   u16 model;
   u16 swap_xy;
   u16 swap_xyz;
   signed char orientation[9];
   int (*get_pendown_state)(void);
   int (*init_platform_hw)(void);
   int (*gsensor_platform_sleep)(void);
   int (*gsensor_platform_wakeup)(void);
   void (*exit_platform_hw)(void);
};
 
struct akm8975_platform_data {
   short m_layout[4][3][3];
   char project_name[64];
   int gpio_DRDY;
};
 
struct akm_platform_data {
   short m_layout[4][3][3];
   char project_name[64];
   char layout;
   char outbit;
   int gpio_DRDY;
   int gpio_RST;
};
 
extern int sensor_register_device(struct i2c_client *client,
           struct sensor_platform_data *slave_pdata,
           const struct i2c_device_id *devid,
           struct sensor_operate *ops);
 
 
extern int sensor_unregister_device(struct i2c_client *client,
           struct sensor_platform_data *slave_pdata,
           struct sensor_operate *ops);
 
extern void sensor_shutdown(struct i2c_client *client);
extern const struct dev_pm_ops sensor_pm_ops;
 
#define DBG(x...)
 
#define GSENSOR_IOCTL_MAGIC            'a'
#define GBUFF_SIZE                12    /* Rx buffer size */
 
/* IOCTLs for MMA8452 library */
#define GSENSOR_IOCTL_INIT                        _IO(GSENSOR_IOCTL_MAGIC, 0x01)
#define GSENSOR_IOCTL_RESET                    _IO(GSENSOR_IOCTL_MAGIC, 0x04)
#define GSENSOR_IOCTL_CLOSE                    _IO(GSENSOR_IOCTL_MAGIC, 0x02)
#define GSENSOR_IOCTL_START                    _IO(GSENSOR_IOCTL_MAGIC, 0x03)
#define GSENSOR_IOCTL_GETDATA                    _IOR(GSENSOR_IOCTL_MAGIC, 0x08, char[GBUFF_SIZE+1])
#define GSENSOR_IOCTL_APP_SET_RATE            _IOW(GSENSOR_IOCTL_MAGIC, 0x10, short)
#define GSENSOR_IOCTL_GET_CALIBRATION        _IOR(GSENSOR_IOCTL_MAGIC, 0x11, int[3])
 
 
#define COMPASS_IOCTL_MAGIC                    'c'
/* IOCTLs for APPs */
#define ECS_IOCTL_APP_SET_MODE                _IOW(COMPASS_IOCTL_MAGIC, 0x10, short)
#define ECS_IOCTL_APP_SET_MFLAG                _IOW(COMPASS_IOCTL_MAGIC, 0x11, short)
#define ECS_IOCTL_APP_GET_MFLAG                _IOW(COMPASS_IOCTL_MAGIC, 0x12, short)
#define ECS_IOCTL_APP_SET_AFLAG                _IOW(COMPASS_IOCTL_MAGIC, 0x13, short)
#define ECS_IOCTL_APP_GET_AFLAG                _IOR(COMPASS_IOCTL_MAGIC, 0x14, short)
#define ECS_IOCTL_APP_SET_TFLAG                _IOR(COMPASS_IOCTL_MAGIC, 0x15, short)/* NOT use */
#define ECS_IOCTL_APP_GET_TFLAG                _IOR(COMPASS_IOCTL_MAGIC, 0x16, short)/* NOT use */
#define ECS_IOCTL_APP_RESET_PEDOMETER        _IOW(COMPASS_IOCTL_MAGIC, 0x17)    /* NOT use */
#define ECS_IOCTL_APP_SET_DELAY                _IOW(COMPASS_IOCTL_MAGIC, 0x18, short)
#define ECS_IOCTL_APP_SET_MVFLAG                _IOW(COMPASS_IOCTL_MAGIC, 0x19, short)
#define ECS_IOCTL_APP_GET_MVFLAG                _IOR(COMPASS_IOCTL_MAGIC, 0x1A, short)
#define ECS_IOCTL_APP_GET_DELAY                _IOR(COMPASS_IOCTL_MAGIC, 0x1B, short)
 
#ifdef CONFIG_COMPAT
#define COMPAT_ECS_IOCTL_APP_SET_MODE            _IOW(COMPASS_IOCTL_MAGIC, 0x10, compat_short_t)
#define COMPAT_ECS_IOCTL_APP_SET_MFLAG            _IOW(COMPASS_IOCTL_MAGIC, 0x11, compat_short_t)
#define COMPAT_ECS_IOCTL_APP_GET_MFLAG            _IOW(COMPASS_IOCTL_MAGIC, 0x12, compat_short_t)
#define COMPAT_ECS_IOCTL_APP_SET_AFLAG            _IOW(COMPASS_IOCTL_MAGIC, 0x13, compat_short_t)
#define COMPAT_ECS_IOCTL_APP_GET_AFLAG            _IOR(COMPASS_IOCTL_MAGIC, 0x14, compat_short_t)
#define COMPAT_ECS_IOCTL_APP_SET_TFLAG            _IOR(COMPASS_IOCTL_MAGIC, 0x15, compat_short_t)/* NOT use */
#define COMPAT_ECS_IOCTL_APP_GET_TFLAG            _IOR(COMPASS_IOCTL_MAGIC, 0x16, compat_short_t)/* NOT use */
#define COMPAT_ECS_IOCTL_APP_RESET_PEDOMETER    _IOW(COMPASS_IOCTL_MAGIC, 0x17) /* NOT use */
#define COMPAT_ECS_IOCTL_APP_SET_DELAY            _IOW(COMPASS_IOCTL_MAGIC, 0x18, compat_short_t)
#define COMPAT_ECS_IOCTL_APP_SET_MVFLAG            _IOW(COMPASS_IOCTL_MAGIC, 0x19, compat_short_t)
#define COMPAT_ECS_IOCTL_APP_GET_MVFLAG            _IOR(COMPASS_IOCTL_MAGIC, 0x1A, compat_short_t)
#define COMPAT_ECS_IOCTL_APP_GET_DELAY            _IOR(COMPASS_IOCTL_MAGIC, 0x1B, compat_short_t)
#endif
 
#define LIGHTSENSOR_IOCTL_MAGIC                    'l'
#define LIGHTSENSOR_IOCTL_GET_ENABLED            _IOR(LIGHTSENSOR_IOCTL_MAGIC, 1, int *)
#define LIGHTSENSOR_IOCTL_ENABLE                    _IOW(LIGHTSENSOR_IOCTL_MAGIC, 2, int *)
#define LIGHTSENSOR_IOCTL_SET_RATE                _IOW(LIGHTSENSOR_IOCTL_MAGIC, 3, short)
 
#ifdef CONFIG_COMPAT
#define COMPAT_LIGHTSENSOR_IOCTL_GET_ENABLED    _IOR(LIGHTSENSOR_IOCTL_MAGIC, 1, compat_uptr_t)
#define COMPAT_LIGHTSENSOR_IOCTL_ENABLE            _IOW(LIGHTSENSOR_IOCTL_MAGIC, 2, compat_uptr_t)
#define COMPAT_LIGHTSENSOR_IOCTL_SET_RATE        _IOW(LIGHTSENSOR_IOCTL_MAGIC, 3, compat_short_t)
#endif
 
#define PSENSOR_IOCTL_MAGIC                'p'
#define PSENSOR_IOCTL_GET_ENABLED        _IOR(PSENSOR_IOCTL_MAGIC, 1, int *)
#define PSENSOR_IOCTL_ENABLE                _IOW(PSENSOR_IOCTL_MAGIC, 2, int *)
#define PSENSOR_IOCTL_DISABLE                _IOW(PSENSOR_IOCTL_MAGIC, 3, int *)
 
#ifdef CONFIG_COMPAT
#define COMPAT_PSENSOR_IOCTL_GET_ENABLED    _IOR(PSENSOR_IOCTL_MAGIC, 1, compat_uptr_t)
#define COMPAT_PSENSOR_IOCTL_ENABLE            _IOW(PSENSOR_IOCTL_MAGIC, 2, compat_uptr_t)
#define COMPAT_PSENSOR_IOCTL_DISABLE            _IOW(PSENSOR_IOCTL_MAGIC, 3, compat_uptr_t)
#endif
 
#define PRESSURE_IOCTL_MAGIC                 'r'
#define PRESSURE_IOCTL_GET_ENABLED        _IOR(PRESSURE_IOCTL_MAGIC, 1, int *)
#define PRESSURE_IOCTL_ENABLE                _IOW(PRESSURE_IOCTL_MAGIC, 2, int *)
#define PRESSURE_IOCTL_DISABLE            _IOW(PRESSURE_IOCTL_MAGIC, 3, int *)
#define PRESSURE_IOCTL_SET_DELAY            _IOW(PRESSURE_IOCTL_MAGIC, 4, int *)
 
 
#define TEMPERATURE_IOCTL_MAGIC            't'
#define TEMPERATURE_IOCTL_GET_ENABLED    _IOR(TEMPERATURE_IOCTL_MAGIC, 1, int *)
#define TEMPERATURE_IOCTL_ENABLE            _IOW(TEMPERATURE_IOCTL_MAGIC, 2, int *)
#define TEMPERATURE_IOCTL_DISABLE        _IOW(TEMPERATURE_IOCTL_MAGIC, 3, int *)
#define TEMPERATURE_IOCTL_SET_DELAY        _IOW(TEMPERATURE_IOCTL_MAGIC, 4, int *)
 
 
extern int sensor_rx_data(struct i2c_client *client, char *rxData, int length);
extern int sensor_tx_data(struct i2c_client *client, char *txData, int length);
extern int sensor_write_reg(struct i2c_client *client, int addr, int value);
extern int sensor_read_reg(struct i2c_client *client, int addr);
extern int sensor_tx_data_normal(struct i2c_client *client, char *buf, int num);
extern int sensor_rx_data_normal(struct i2c_client *client, char *buf, int num);
extern int sensor_write_reg_normal(struct i2c_client *client, char value);
extern int sensor_read_reg_normal(struct i2c_client *client);