19dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* 29dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * itg3200.h -- support InvenSense ITG3200 39dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * Digital 3-Axis Gyroscope driver 49dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * 59dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * Copyright (c) 2011 Christian Strobel <christian.strobel@iis.fraunhofer.de> 69dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * Copyright (c) 2011 Manuel Stahl <manuel.stahl@iis.fraunhofer.de> 79dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * Copyright (c) 2012 Thorsten Nowak <thorsten.nowak@iis.fraunhofer.de> 89dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * 99dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * This program is free software; you can redistribute it and/or modify 109dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * it under the terms of the GNU General Public License version 2 as 119dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * published by the Free Software Foundation. 129dbf091da080508e9f632d307f357beb79a0766bManuel Stahl */ 139dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 149dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#ifndef I2C_ITG3200_H_ 159dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define I2C_ITG3200_H_ 169dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 179dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#include <linux/iio/iio.h> 189dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 199dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Register with I2C address (34h) */ 209dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_ADDRESS 0x00 219dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 229dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Sample rate divider 239dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * Range: 0 to 255 249dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * Default value: 0x00 */ 259dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_SAMPLE_RATE_DIV 0x15 269dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 279dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Digital low pass filter settings */ 289dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_DLPF 0x16 299dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* DLPF full scale range */ 309dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_FS_SEL_2000 0x18 319dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Bandwidth (Hz) and internal sample rate 329dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * (kHz) of DLPF */ 339dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_256_8 0x00 349dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_188_1 0x01 359dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_98_1 0x02 369dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_42_1 0x03 379dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_20_1 0x04 389dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_10_1 0x05 399dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_5_1 0x06 409dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 419dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_CFG_MASK 0x07 429dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 439dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Configuration for interrupt operations */ 449dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_IRQ_CONFIG 0x17 459dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Logic level */ 469dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_ACTIVE_LOW 0x80 479dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_ACTIVE_HIGH 0x00 489dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Drive type */ 499dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_OPEN_DRAIN 0x40 509dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_PUSH_PULL 0x00 519dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Latch mode */ 529dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_LATCH_UNTIL_CLEARED 0x20 539dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_LATCH_50US_PULSE 0x00 549dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Latch clear method */ 559dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_LATCH_CLEAR_ANY 0x10 569dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_LATCH_CLEAR_STATUS 0x00 579dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Enable interrupt when device is ready */ 589dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_DEVICE_RDY_ENABLE 0x04 599dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Enable interrupt when data is available */ 609dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_DATA_RDY_ENABLE 0x01 619dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 629dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Determine the status of ITG-3200 interrupts */ 639dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_IRQ_STATUS 0x1A 649dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Status of 'device is ready'-interrupt */ 659dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_DEVICE_RDY_STATUS 0x04 669dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Status of 'data is available'-interrupt */ 679dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_DATA_RDY_STATUS 0x01 689dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 699dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Sensor registers */ 709dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_TEMP_OUT_H 0x1B 719dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_TEMP_OUT_L 0x1C 729dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_GYRO_XOUT_H 0x1D 739dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_GYRO_XOUT_L 0x1E 749dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_GYRO_YOUT_H 0x1F 759dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_GYRO_YOUT_L 0x20 769dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_GYRO_ZOUT_H 0x21 779dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_GYRO_ZOUT_L 0x22 789dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 799dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Power management */ 809dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_POWER_MANAGEMENT 0x3E 819dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Reset device and internal registers to the 829dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * power-up-default settings */ 839dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_RESET 0x80 849dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Enable low power sleep mode */ 859dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_SLEEP 0x40 869dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Put according gyroscope in standby mode */ 879dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_STANDBY_GYRO_X 0x20 889dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_STANDBY_GYRO_Y 0x10 899dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_STANDBY_GYRO_Z 0x08 909dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Determine the device clock source */ 919dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_CLK_INTERNAL 0x00 929dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_CLK_GYRO_X 0x01 939dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_CLK_GYRO_Y 0x02 949dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_CLK_GYRO_Z 0x03 959dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_CLK_EXT_32K 0x04 969dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_CLK_EXT_19M 0x05 979dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 989dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 999dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/** 1009dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * struct itg3200 - device instance specific data 1019dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * @i2c: actual i2c_client 1029dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * @trig: data ready trigger from itg3200 pin 1039dbf091da080508e9f632d307f357beb79a0766bManuel Stahl **/ 1049dbf091da080508e9f632d307f357beb79a0766bManuel Stahlstruct itg3200 { 1059dbf091da080508e9f632d307f357beb79a0766bManuel Stahl struct i2c_client *i2c; 1069dbf091da080508e9f632d307f357beb79a0766bManuel Stahl struct iio_trigger *trig; 1079dbf091da080508e9f632d307f357beb79a0766bManuel Stahl}; 1089dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1099dbf091da080508e9f632d307f357beb79a0766bManuel Stahlenum ITG3200_SCAN_INDEX { 1109dbf091da080508e9f632d307f357beb79a0766bManuel Stahl ITG3200_SCAN_TEMP, 1119dbf091da080508e9f632d307f357beb79a0766bManuel Stahl ITG3200_SCAN_GYRO_X, 1129dbf091da080508e9f632d307f357beb79a0766bManuel Stahl ITG3200_SCAN_GYRO_Y, 1139dbf091da080508e9f632d307f357beb79a0766bManuel Stahl ITG3200_SCAN_GYRO_Z, 1149dbf091da080508e9f632d307f357beb79a0766bManuel Stahl ITG3200_SCAN_ELEMENTS, 1159dbf091da080508e9f632d307f357beb79a0766bManuel Stahl}; 1169dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1179dbf091da080508e9f632d307f357beb79a0766bManuel Stahlint itg3200_write_reg_8(struct iio_dev *indio_dev, 1189dbf091da080508e9f632d307f357beb79a0766bManuel Stahl u8 reg_address, u8 val); 1199dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1209dbf091da080508e9f632d307f357beb79a0766bManuel Stahlint itg3200_read_reg_8(struct iio_dev *indio_dev, 1219dbf091da080508e9f632d307f357beb79a0766bManuel Stahl u8 reg_address, u8 *val); 1229dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1239dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1249dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#ifdef CONFIG_IIO_BUFFER 1259dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1269dbf091da080508e9f632d307f357beb79a0766bManuel Stahlvoid itg3200_remove_trigger(struct iio_dev *indio_dev); 1279dbf091da080508e9f632d307f357beb79a0766bManuel Stahlint itg3200_probe_trigger(struct iio_dev *indio_dev); 1289dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1299dbf091da080508e9f632d307f357beb79a0766bManuel Stahlint itg3200_buffer_configure(struct iio_dev *indio_dev); 1309dbf091da080508e9f632d307f357beb79a0766bManuel Stahlvoid itg3200_buffer_unconfigure(struct iio_dev *indio_dev); 1319dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1329dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#else /* CONFIG_IIO_BUFFER */ 1339dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1349dbf091da080508e9f632d307f357beb79a0766bManuel Stahlstatic inline void itg3200_remove_trigger(struct iio_dev *indio_dev) 1359dbf091da080508e9f632d307f357beb79a0766bManuel Stahl{ 1369dbf091da080508e9f632d307f357beb79a0766bManuel Stahl} 1379dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1389dbf091da080508e9f632d307f357beb79a0766bManuel Stahlstatic inline int itg3200_probe_trigger(struct iio_dev *indio_dev) 1399dbf091da080508e9f632d307f357beb79a0766bManuel Stahl{ 1409dbf091da080508e9f632d307f357beb79a0766bManuel Stahl return 0; 1419dbf091da080508e9f632d307f357beb79a0766bManuel Stahl} 1429dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1439dbf091da080508e9f632d307f357beb79a0766bManuel Stahlstatic inline int itg3200_buffer_configure(struct iio_dev *indio_dev) 1449dbf091da080508e9f632d307f357beb79a0766bManuel Stahl{ 1459dbf091da080508e9f632d307f357beb79a0766bManuel Stahl return 0; 1469dbf091da080508e9f632d307f357beb79a0766bManuel Stahl} 1479dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1489dbf091da080508e9f632d307f357beb79a0766bManuel Stahlstatic inline void itg3200_buffer_unconfigure(struct iio_dev *indio_dev) 1499dbf091da080508e9f632d307f357beb79a0766bManuel Stahl{ 1509dbf091da080508e9f632d307f357beb79a0766bManuel Stahl} 1519dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 152e6251fc244a18a53830f38de84e4fcaee2f58662Paul Bolle#endif /* CONFIG_IIO_BUFFER */ 1539dbf091da080508e9f632d307f357beb79a0766bManuel Stahl 1549dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#endif /* ITG3200_H_ */ 155