diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /include/linux/mpu.h | |
parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) |
Diffstat (limited to 'include/linux/mpu.h')
-rw-r--r-- | include/linux/mpu.h | 367 |
1 files changed, 367 insertions, 0 deletions
diff --git a/include/linux/mpu.h b/include/linux/mpu.h new file mode 100644 index 00000000000..1977b38b8c1 --- /dev/null +++ b/include/linux/mpu.h | |||
@@ -0,0 +1,367 @@ | |||
1 | /* | ||
2 | $License: | ||
3 | Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. | ||
4 | |||
5 | This program is free software; you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 2 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | $ | ||
18 | */ | ||
19 | |||
20 | #ifndef __MPU_H_ | ||
21 | #define __MPU_H_ | ||
22 | |||
23 | #include <linux/types.h> | ||
24 | #include <linux/ioctl.h> | ||
25 | |||
26 | /* Number of axes on each sensor */ | ||
27 | #define GYRO_NUM_AXES (3) | ||
28 | #define ACCEL_NUM_AXES (3) | ||
29 | #define COMPASS_NUM_AXES (3) | ||
30 | |||
31 | struct mpu_read_write { | ||
32 | /* Memory address or register address depending on ioctl */ | ||
33 | __u16 address; | ||
34 | __u16 length; | ||
35 | __u8 *data; | ||
36 | }; | ||
37 | |||
38 | enum mpuirq_data_type { | ||
39 | MPUIRQ_DATA_TYPE_MPU_IRQ, | ||
40 | MPUIRQ_DATA_TYPE_SLAVE_IRQ, | ||
41 | MPUIRQ_DATA_TYPE_PM_EVENT, | ||
42 | MPUIRQ_DATA_TYPE_NUM_TYPES, | ||
43 | }; | ||
44 | |||
45 | /* User space PM event notification */ | ||
46 | #define MPU_PM_EVENT_SUSPEND_PREPARE (3) | ||
47 | #define MPU_PM_EVENT_POST_SUSPEND (4) | ||
48 | |||
49 | struct mpuirq_data { | ||
50 | __u32 interruptcount; | ||
51 | __u64 irqtime; | ||
52 | __u32 data_type; | ||
53 | __s32 data; | ||
54 | }; | ||
55 | |||
56 | enum ext_slave_config_key { | ||
57 | MPU_SLAVE_CONFIG_ODR_SUSPEND, | ||
58 | MPU_SLAVE_CONFIG_ODR_RESUME, | ||
59 | MPU_SLAVE_CONFIG_FSR_SUSPEND, | ||
60 | MPU_SLAVE_CONFIG_FSR_RESUME, | ||
61 | MPU_SLAVE_CONFIG_MOT_THS, | ||
62 | MPU_SLAVE_CONFIG_NMOT_THS, | ||
63 | MPU_SLAVE_CONFIG_MOT_DUR, | ||
64 | MPU_SLAVE_CONFIG_NMOT_DUR, | ||
65 | MPU_SLAVE_CONFIG_IRQ_SUSPEND, | ||
66 | MPU_SLAVE_CONFIG_IRQ_RESUME, | ||
67 | MPU_SLAVE_WRITE_REGISTERS, | ||
68 | MPU_SLAVE_READ_REGISTERS, | ||
69 | MPU_SLAVE_CONFIG_INTERNAL_REFERENCE, | ||
70 | /* AMI 306 specific config keys */ | ||
71 | MPU_SLAVE_PARAM, | ||
72 | MPU_SLAVE_WINDOW, | ||
73 | MPU_SLAVE_READWINPARAMS, | ||
74 | MPU_SLAVE_SEARCHOFFSET, | ||
75 | /* AKM specific config keys */ | ||
76 | MPU_SLAVE_READ_SCALE, | ||
77 | /* MPU3050 and MPU6050 Keys */ | ||
78 | MPU_SLAVE_INT_CONFIG, | ||
79 | MPU_SLAVE_EXT_SYNC, | ||
80 | MPU_SLAVE_FULL_SCALE, | ||
81 | MPU_SLAVE_LPF, | ||
82 | MPU_SLAVE_CLK_SRC, | ||
83 | MPU_SLAVE_DIVIDER, | ||
84 | MPU_SLAVE_DMP_ENABLE, | ||
85 | MPU_SLAVE_FIFO_ENABLE, | ||
86 | MPU_SLAVE_DMP_CFG1, | ||
87 | MPU_SLAVE_DMP_CFG2, | ||
88 | MPU_SLAVE_TC, | ||
89 | MPU_SLAVE_GYRO, | ||
90 | MPU_SLAVE_ADDR, | ||
91 | MPU_SLAVE_PRODUCT_REVISION, | ||
92 | MPU_SLAVE_SILICON_REVISION, | ||
93 | MPU_SLAVE_PRODUCT_ID, | ||
94 | MPU_SLAVE_GYRO_SENS_TRIM, | ||
95 | MPU_SLAVE_ACCEL_SENS_TRIM, | ||
96 | MPU_SLAVE_RAM, | ||
97 | /* -------------------------- */ | ||
98 | MPU_SLAVE_CONFIG_NUM_CONFIG_KEYS | ||
99 | }; | ||
100 | |||
101 | /* For the MPU_SLAVE_CONFIG_IRQ_SUSPEND and MPU_SLAVE_CONFIG_IRQ_RESUME */ | ||
102 | enum ext_slave_config_irq_type { | ||
103 | MPU_SLAVE_IRQ_TYPE_NONE, | ||
104 | MPU_SLAVE_IRQ_TYPE_MOTION, | ||
105 | MPU_SLAVE_IRQ_TYPE_DATA_READY, | ||
106 | }; | ||
107 | |||
108 | /* Structure for the following IOCTS's | ||
109 | * MPU_CONFIG_GYRO | ||
110 | * MPU_CONFIG_ACCEL | ||
111 | * MPU_CONFIG_COMPASS | ||
112 | * MPU_CONFIG_PRESSURE | ||
113 | * MPU_GET_CONFIG_GYRO | ||
114 | * MPU_GET_CONFIG_ACCEL | ||
115 | * MPU_GET_CONFIG_COMPASS | ||
116 | * MPU_GET_CONFIG_PRESSURE | ||
117 | * | ||
118 | * @key one of enum ext_slave_config_key | ||
119 | * @len length of data pointed to by data | ||
120 | * @apply zero if communication with the chip is not necessary, false otherwise | ||
121 | * This flag can be used to select cached data or to refresh cashed data | ||
122 | * cache data to be pushed later or push immediately. If true and the | ||
123 | * slave is on the secondary bus the MPU will first enger bypass mode | ||
124 | * before calling the slaves .config or .get_config funcion | ||
125 | * @data pointer to the data to confgure or get | ||
126 | */ | ||
127 | struct ext_slave_config { | ||
128 | __u8 key; | ||
129 | __u16 len; | ||
130 | __u8 apply; | ||
131 | void *data; | ||
132 | }; | ||
133 | |||
134 | enum ext_slave_type { | ||
135 | EXT_SLAVE_TYPE_GYROSCOPE, | ||
136 | EXT_SLAVE_TYPE_ACCEL, | ||
137 | EXT_SLAVE_TYPE_COMPASS, | ||
138 | EXT_SLAVE_TYPE_PRESSURE, | ||
139 | /*EXT_SLAVE_TYPE_TEMPERATURE */ | ||
140 | |||
141 | EXT_SLAVE_NUM_TYPES | ||
142 | }; | ||
143 | |||
144 | enum ext_slave_id { | ||
145 | ID_INVALID = 0, | ||
146 | |||
147 | ACCEL_ID_LIS331, | ||
148 | ACCEL_ID_LSM303DLX, | ||
149 | ACCEL_ID_LIS3DH, | ||
150 | ACCEL_ID_KXSD9, | ||
151 | ACCEL_ID_KXTF9, | ||
152 | ACCEL_ID_BMA150, | ||
153 | ACCEL_ID_BMA222, | ||
154 | ACCEL_ID_BMA250, | ||
155 | ACCEL_ID_ADXL34X, | ||
156 | ACCEL_ID_MMA8450, | ||
157 | ACCEL_ID_MMA845X, | ||
158 | ACCEL_ID_MPU6050, | ||
159 | |||
160 | COMPASS_ID_AK8975, | ||
161 | COMPASS_ID_AK8963, | ||
162 | COMPASS_ID_AK8972, | ||
163 | COMPASS_ID_AMI30X, | ||
164 | COMPASS_ID_AMI306, | ||
165 | COMPASS_ID_YAS529, | ||
166 | COMPASS_ID_YAS530, | ||
167 | COMPASS_ID_HMC5883, | ||
168 | COMPASS_ID_LSM303DLH, | ||
169 | COMPASS_ID_LSM303DLM, | ||
170 | COMPASS_ID_MMC314X, | ||
171 | COMPASS_ID_HSCDTD002B, | ||
172 | COMPASS_ID_HSCDTD004A, | ||
173 | |||
174 | PRESSURE_ID_BMA085, | ||
175 | }; | ||
176 | |||
177 | enum ext_slave_endian { | ||
178 | EXT_SLAVE_BIG_ENDIAN, | ||
179 | EXT_SLAVE_LITTLE_ENDIAN, | ||
180 | EXT_SLAVE_FS8_BIG_ENDIAN, | ||
181 | EXT_SLAVE_FS16_BIG_ENDIAN, | ||
182 | }; | ||
183 | |||
184 | enum ext_slave_bus { | ||
185 | EXT_SLAVE_BUS_INVALID = -1, | ||
186 | EXT_SLAVE_BUS_PRIMARY = 0, | ||
187 | EXT_SLAVE_BUS_SECONDARY = 1 | ||
188 | }; | ||
189 | |||
190 | |||
191 | /** | ||
192 | * struct ext_slave_platform_data - Platform data for mpu3050 and mpu6050 | ||
193 | * slave devices | ||
194 | * | ||
195 | * @type: the type of slave device based on the enum ext_slave_type | ||
196 | * definitions. | ||
197 | * @irq: the irq number attached to the slave if any. | ||
198 | * @adapt_num: the I2C adapter number. | ||
199 | * @bus: the bus the slave is attached to: enum ext_slave_bus | ||
200 | * @address: the I2C slave address of the slave device. | ||
201 | * @orientation: the mounting matrix of the device relative to MPU. | ||
202 | * @irq_data: private data for the slave irq handler | ||
203 | * @private_data: additional data, user customizable. Not touched by the MPU | ||
204 | * driver. | ||
205 | * | ||
206 | * The orientation matricies are 3x3 rotation matricies | ||
207 | * that are applied to the data to rotate from the mounting orientation to the | ||
208 | * platform orientation. The values must be one of 0, 1, or -1 and each row and | ||
209 | * column should have exactly 1 non-zero value. | ||
210 | */ | ||
211 | struct ext_slave_platform_data { | ||
212 | __u8 type; | ||
213 | __u32 irq; | ||
214 | __u32 adapt_num; | ||
215 | __u32 bus; | ||
216 | __u8 address; | ||
217 | __s8 orientation[9]; | ||
218 | void *irq_data; | ||
219 | void *private_data; | ||
220 | }; | ||
221 | |||
222 | struct fix_pnt_range { | ||
223 | __s32 mantissa; | ||
224 | __s32 fraction; | ||
225 | }; | ||
226 | |||
227 | static inline long range_fixedpoint_to_long_mg(struct fix_pnt_range rng) | ||
228 | { | ||
229 | return (long)(rng.mantissa * 1000 + rng.fraction / 10); | ||
230 | } | ||
231 | |||
232 | struct ext_slave_read_trigger { | ||
233 | __u8 reg; | ||
234 | __u8 value; | ||
235 | }; | ||
236 | |||
237 | /** | ||
238 | * struct ext_slave_descr - Description of the slave device for programming. | ||
239 | * | ||
240 | * @suspend: function pointer to put the device in suspended state | ||
241 | * @resume: function pointer to put the device in running state | ||
242 | * @read: function that reads the device data | ||
243 | * @init: function used to preallocate memory used by the driver | ||
244 | * @exit: function used to free memory allocated for the driver | ||
245 | * @config: function used to configure the device | ||
246 | * @get_config:function used to get the device's configuration | ||
247 | * | ||
248 | * @name: text name of the device | ||
249 | * @type: device type. enum ext_slave_type | ||
250 | * @id: enum ext_slave_id | ||
251 | * @read_reg: starting register address to retrieve data. | ||
252 | * @read_len: length in bytes of the sensor data. Typically 6. | ||
253 | * @endian: byte order of the data. enum ext_slave_endian | ||
254 | * @range: full scale range of the slave ouput: struct fix_pnt_range | ||
255 | * @trigger: If reading data first requires writing a register this is the | ||
256 | * data to write. | ||
257 | * | ||
258 | * Defines the functions and information about the slave the mpu3050 and | ||
259 | * mpu6050 needs to use the slave device. | ||
260 | */ | ||
261 | struct ext_slave_descr { | ||
262 | int (*init) (void *mlsl_handle, | ||
263 | struct ext_slave_descr *slave, | ||
264 | struct ext_slave_platform_data *pdata); | ||
265 | int (*exit) (void *mlsl_handle, | ||
266 | struct ext_slave_descr *slave, | ||
267 | struct ext_slave_platform_data *pdata); | ||
268 | int (*suspend) (void *mlsl_handle, | ||
269 | struct ext_slave_descr *slave, | ||
270 | struct ext_slave_platform_data *pdata); | ||
271 | int (*resume) (void *mlsl_handle, | ||
272 | struct ext_slave_descr *slave, | ||
273 | struct ext_slave_platform_data *pdata); | ||
274 | int (*read) (void *mlsl_handle, | ||
275 | struct ext_slave_descr *slave, | ||
276 | struct ext_slave_platform_data *pdata, | ||
277 | __u8 *data); | ||
278 | int (*config) (void *mlsl_handle, | ||
279 | struct ext_slave_descr *slave, | ||
280 | struct ext_slave_platform_data *pdata, | ||
281 | struct ext_slave_config *config); | ||
282 | int (*get_config) (void *mlsl_handle, | ||
283 | struct ext_slave_descr *slave, | ||
284 | struct ext_slave_platform_data *pdata, | ||
285 | struct ext_slave_config *config); | ||
286 | |||
287 | char *name; | ||
288 | __u8 type; | ||
289 | __u8 id; | ||
290 | __u8 read_reg; | ||
291 | __u8 read_len; | ||
292 | __u8 endian; | ||
293 | struct fix_pnt_range range; | ||
294 | struct ext_slave_read_trigger *trigger; | ||
295 | }; | ||
296 | |||
297 | /** | ||
298 | * struct mpu_platform_data - Platform data for the mpu driver | ||
299 | * @int_config: Bits [7:3] of the int config register. | ||
300 | * @level_shifter: 0: VLogic, 1: VDD | ||
301 | * @orientation: Orientation matrix of the gyroscope | ||
302 | * | ||
303 | * Contains platform specific information on how to configure the MPU3050 to | ||
304 | * work on this platform. The orientation matricies are 3x3 rotation matricies | ||
305 | * that are applied to the data to rotate from the mounting orientation to the | ||
306 | * platform orientation. The values must be one of 0, 1, or -1 and each row and | ||
307 | * column should have exactly 1 non-zero value. | ||
308 | */ | ||
309 | struct mpu_platform_data { | ||
310 | __u8 int_config; | ||
311 | __u8 level_shifter; | ||
312 | __s8 orientation[GYRO_NUM_AXES * GYRO_NUM_AXES]; | ||
313 | }; | ||
314 | |||
315 | #define MPU_IOCTL (0x81) /* Magic number for MPU Iocts */ | ||
316 | /* IOCTL commands for /dev/mpu */ | ||
317 | |||
318 | /*-------------------------------------------------------------------------- | ||
319 | * Deprecated, debugging only | ||
320 | */ | ||
321 | #define MPU_SET_MPU_PLATFORM_DATA \ | ||
322 | _IOWR(MPU_IOCTL, 0x01, struct mpu_platform_data) | ||
323 | #define MPU_SET_EXT_SLAVE_PLATFORM_DATA \ | ||
324 | _IOWR(MPU_IOCTL, 0x01, struct ext_slave_platform_data) | ||
325 | /*--------------------------------------------------------------------------*/ | ||
326 | #define MPU_GET_EXT_SLAVE_PLATFORM_DATA \ | ||
327 | _IOWR(MPU_IOCTL, 0x02, struct ext_slave_platform_data) | ||
328 | #define MPU_GET_MPU_PLATFORM_DATA \ | ||
329 | _IOWR(MPU_IOCTL, 0x02, struct mpu_platform_data) | ||
330 | #define MPU_GET_EXT_SLAVE_DESCR \ | ||
331 | _IOWR(MPU_IOCTL, 0x02, struct ext_slave_descr) | ||
332 | |||
333 | #define MPU_READ _IOWR(MPU_IOCTL, 0x10, struct mpu_read_write) | ||
334 | #define MPU_WRITE _IOW(MPU_IOCTL, 0x10, struct mpu_read_write) | ||
335 | #define MPU_READ_MEM _IOWR(MPU_IOCTL, 0x11, struct mpu_read_write) | ||
336 | #define MPU_WRITE_MEM _IOW(MPU_IOCTL, 0x11, struct mpu_read_write) | ||
337 | #define MPU_READ_FIFO _IOWR(MPU_IOCTL, 0x12, struct mpu_read_write) | ||
338 | #define MPU_WRITE_FIFO _IOW(MPU_IOCTL, 0x12, struct mpu_read_write) | ||
339 | |||
340 | #define MPU_READ_COMPASS _IOR(MPU_IOCTL, 0x12, __u8) | ||
341 | #define MPU_READ_ACCEL _IOR(MPU_IOCTL, 0x13, __u8) | ||
342 | #define MPU_READ_PRESSURE _IOR(MPU_IOCTL, 0x14, __u8) | ||
343 | |||
344 | #define MPU_CONFIG_GYRO _IOW(MPU_IOCTL, 0x20, struct ext_slave_config) | ||
345 | #define MPU_CONFIG_ACCEL _IOW(MPU_IOCTL, 0x21, struct ext_slave_config) | ||
346 | #define MPU_CONFIG_COMPASS _IOW(MPU_IOCTL, 0x22, struct ext_slave_config) | ||
347 | #define MPU_CONFIG_PRESSURE _IOW(MPU_IOCTL, 0x23, struct ext_slave_config) | ||
348 | |||
349 | #define MPU_GET_CONFIG_GYRO _IOWR(MPU_IOCTL, 0x20, struct ext_slave_config) | ||
350 | #define MPU_GET_CONFIG_ACCEL _IOWR(MPU_IOCTL, 0x21, struct ext_slave_config) | ||
351 | #define MPU_GET_CONFIG_COMPASS _IOWR(MPU_IOCTL, 0x22, struct ext_slave_config) | ||
352 | #define MPU_GET_CONFIG_PRESSURE _IOWR(MPU_IOCTL, 0x23, struct ext_slave_config) | ||
353 | |||
354 | #define MPU_SUSPEND _IOW(MPU_IOCTL, 0x30, __u32) | ||
355 | #define MPU_RESUME _IOW(MPU_IOCTL, 0x31, __u32) | ||
356 | /* Userspace PM Event response */ | ||
357 | #define MPU_PM_EVENT_HANDLED _IO(MPU_IOCTL, 0x32) | ||
358 | |||
359 | #define MPU_GET_REQUESTED_SENSORS _IOR(MPU_IOCTL, 0x40, __u8) | ||
360 | #define MPU_SET_REQUESTED_SENSORS _IOW(MPU_IOCTL, 0x40, __u8) | ||
361 | #define MPU_GET_IGNORE_SYSTEM_SUSPEND _IOR(MPU_IOCTL, 0x41, __u8) | ||
362 | #define MPU_SET_IGNORE_SYSTEM_SUSPEND _IOW(MPU_IOCTL, 0x41, __u8) | ||
363 | #define MPU_GET_MLDL_STATUS _IOR(MPU_IOCTL, 0x42, __u8) | ||
364 | #define MPU_GET_I2C_SLAVES_ENABLED _IOR(MPU_IOCTL, 0x43, __u8) | ||
365 | |||
366 | |||
367 | #endif /* __MPU_H_ */ | ||