blob: 9f07adfb4077374f851c043dd9bce572b16edd75 [file] [log] [blame]
/******************** (C) COPYRIGHT 2010 STMicroelectronics ********************
*
* File Name : lsm303dlh.h
* Authors : MSH - Motion Mems BU - Application Team
* : Carmine Iascone (carmine.iascone@st.com)
* : Matteo Dameno (matteo.dameno@st.com)
* Version : V 1.6.0
* Date : 2011/02/28
* Description : LSM303DLH 6D module sensor API
*
********************************************************************************
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES
* OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE
* PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
*******************************************************************************/
#ifndef __LSM303DLH_H__
#define __LSM303DLH_H__
#define SAD0L 0x00
#define SAD0H 0x01
#define LSM303DLH_ACC_I2C_SADROOT 0x0C
#define LSM303DLH_ACC_I2C_SAD_L ((LSM303DLH_ACC_I2C_SADROOT<<1)|SAD0L)
#define LSM303DLH_ACC_I2C_SAD_H ((LSM303DLH_ACC_I2C_SADROOT<<1)|SAD0H)
#define LSM303DLH_ACC_DEV_NAME "lsm303dlh_acc_sysfs"
#define LSM303DLH_MAG_I2C_SAD 0x1E
#define LSM303DLH_MAG_DEV_NAME "lsm303dlh_mag_sysfs"
#define LSM303DLH_ACC_MIN_POLL_PERIOD_MS 1
#define LSM303DLH_MAG_MIN_POLL_PERIOD_MS 5
#define LSM303DLH_ACC_DEFAULT_INT1_GPIO (-EINVAL)
#define LSM303DLH_ACC_DEFAULT_INT2_GPIO (-EINVAL)
/************************************************/
/* Accelerometer section defines */
/************************************************/
/* Accelerometer Sensor Full Scale */
#define LSM303DLH_ACC_FS_MASK 0x30
#define LSM303DLH_ACC_G_2G 0x00
#define LSM303DLH_ACC_G_4G 0x10
#define LSM303DLH_ACC_G_8G 0x30
/* Accelerometer Sensor Operating Mode */
#define LSM303DLH_ACC_ENABLE 0x01
#define LSM303DLH_ACC_DISABLE 0x00
#define LSM303DLH_ACC_PM_NORMAL 0x20
#define LSM303DLH_ACC_PM_OFF LSM303DLH_ACC_DISABLE
/* RESUME STATE INDICES */
#define RES_CTRL_REG1 0
#define RES_CTRL_REG2 1
#define RES_CTRL_REG3 2
#define RES_CTRL_REG4 3
#define RES_CTRL_REG5 4
#define RES_REFERENCE 5
#define RES_INT_CFG1 6
#define RES_INT_THS1 7
#define RES_INT_DUR1 8
#define RES_INT_CFG2 9
#define RES_INT_THS2 10
#define RES_INT_DUR2 11
#define RESUME_ENTRIES 12
/* end RESUME STATE INDICES */
/************************************************/
/* Magnetometer section defines */
/************************************************/
/* Magnetometer Sensor Full Scale */
#define LSM303DLH_MAG_H_1_3G 0x20
#define LSM303DLH_MAG_H_1_9G 0x40
#define LSM303DLH_MAG_H_2_5G 0x60
#define LSM303DLH_MAG_H_4_0G 0x80
#define LSM303DLH_MAG_H_4_7G 0xA0
#define LSM303DLH_MAG_H_5_6G 0xC0
#define LSM303DLH_MAG_H_8_1G 0xE0
/* Magnetic Sensor Operating Mode */
#define LSM303DLH_MAG_NORMAL_MODE 0x00
#define LSM303DLH_MAG_POS_BIAS 0x01
#define LSM303DLH_MAG_NEG_BIAS 0x02
#define LSM303DLH_MAG_CC_MODE 0x00
#define LSM303DLH_MAG_SC_MODE 0x01
#define LSM303DLH_MAG_SLEEP_MODE 0x03
#ifdef __KERNEL__
struct lsm303dlh_acc_platform_data {
int poll_interval;
int min_interval;
u8 g_range;
u8 axis_map_x;
u8 axis_map_y;
u8 axis_map_z;
u8 negate_x;
u8 negate_y;
u8 negate_z;
int (*init)(void);
void (*exit)(void);
int (*power_on)(void);
int (*power_off)(void);
/* set gpio_int[1,2] either to the choosen gpio pin number or to -EINVAL
* if leaved unconnected
*/
int gpio_int1;
int gpio_int2;
};
struct lsm303dlh_acc_data {
struct i2c_client *client;
struct lsm303dlh_acc_platform_data *pdata;
struct mutex lock;
struct delayed_work input_work;
struct input_dev *input_dev;
int hw_initialized;
/* hw_working=-1 means not tested yet */
int hw_working;
int selftest_enabled;
atomic_t enabled;
int on_before_suspend;
u8 sensitivity;
u8 resume_state[RESUME_ENTRIES];
int irq1;
struct work_struct irq1_work;
struct workqueue_struct *irq1_work_queue;
int irq2;
struct work_struct irq2_work;
struct workqueue_struct *irq2_work_queue;
u8 reg_addr;
int ext_adap_enabled;
void *ext_handle;
};
struct lsm303dlh_mag_platform_data {
int poll_interval;
int min_interval;
u8 h_range;
u8 axis_map_x;
u8 axis_map_y;
u8 axis_map_z;
u8 negate_x;
u8 negate_y;
u8 negate_z;
int (*init)(void);
void (*exit)(void);
int (*power_on)(void);
int (*power_off)(void);
};
struct lsm303dlh_mag_data {
struct i2c_client *client;
struct lsm303dlh_mag_platform_data *pdata;
struct mutex lock;
struct input_polled_dev *input_poll_dev;
int hw_initialized;
atomic_t enabled;
atomic_t self_test_enabled;
u16 xy_sensitivity;
u16 z_sensitivity;
u8 resume_state[3];
u8 reg_addr;
int on_before_suspend;
int ext_adap_enabled;
void *ext_handle;
};
#endif /* __KERNEL__ */
#endif /* __LSM303DLH_H__ */