blob: 6d2dde647e3917cf950daeb19ee5f9605572a4b8 [file] [log] [blame]
/* CwMcuSensor.c - driver file for HTC SensorHUB
*
* Copyright (C) 2014 HTC Ltd.
*
* 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.
*
*/
#ifndef __CWMCUSENSOR_H__
#define __CWMCUSENSOR_H__
#include <linux/ioctl.h>
#define CWMCU_I2C_NAME "CwMcuSensor"
enum ABS_status {
CW_SCAN_ID = 0,
CW_SCAN_X,
CW_SCAN_Y,
CW_SCAN_Z,
CW_SCAN_XX,
CW_SCAN_YY,
CW_SCAN_ZZ,
CW_SCAN_TIMESTAMP,
};
typedef enum {
CW_ACCELERATION = 0,
CW_MAGNETIC = 1,
CW_GYRO = 2,
CW_LIGHT = 3,
CW_PRESSURE = 5,
CW_ORIENTATION = 6,
CW_ROTATIONVECTOR = 7,
CW_LINEARACCELERATION = 8,
CW_GRAVITY = 9,
HTC_MAGIC_COVER = 12,
CW_MAGNETIC_UNCALIBRATED = 16,
CW_GYROSCOPE_UNCALIBRATED = 17,
CW_GAME_ROTATION_VECTOR = 18,
CW_GEOMAGNETIC_ROTATION_VECTOR = 19,
CW_SIGNIFICANT_MOTION = 20,
CW_STEP_DETECTOR = 21,
CW_STEP_COUNTER = 22,
HTC_FACEDOWN_DETECTION = 23,
CW_SENSORS_ID_FW /* Be careful, do not exceed 31, Firmware ID limit */,
CW_ACCELERATION_W = 32,
CW_MAGNETIC_W = 33,
CW_GYRO_W = 34,
CW_PRESSURE_W = 37,
CW_ORIENTATION_W = 38,
CW_ROTATIONVECTOR_W = 39,
CW_LINEARACCELERATION_W = 40,
CW_GRAVITY_W = 41,
CW_MAGNETIC_UNCALIBRATED_W = 48,
CW_GYROSCOPE_UNCALIBRATED_W = 49,
CW_GAME_ROTATION_VECTOR_W = 50,
CW_GEOMAGNETIC_ROTATION_VECTOR_W = 51,
CW_STEP_DETECTOR_W = 53,
CW_STEP_COUNTER_W = 54,
CW_SENSORS_ID_TOTAL = 55, /* Includes Wake up version */
TIME_DIFF_EXHAUSTED = 97,
CW_TIME_BASE = 98,
CW_META_DATA = 99,
CW_MAGNETIC_UNCALIBRATED_BIAS = 100,
CW_GYROSCOPE_UNCALIBRATED_BIAS = 101
} CW_SENSORS_ID;
#define NS_PER_US 1000000LL
#define FIRMWARE_VERSION 0x10
#define HTC_SYSTEM_STATUS_REG 0x1E
#define CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_ACC 0x60
#define CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_ACC 0x68
#define CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_ACC 0x68
#define CW_I2C_REG_SENSORS_CALIBRATOR_TARGET_ACC 0x69
#define CW_I2C_REG_SENSORS_CALIBRATOR_RESULT_RL_ACC 0x6A
#define CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_MAG 0x70
#define CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_MAG 0x78
#define CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_MAG 0x78
#define CW_I2C_REG_SENSORS_ACCURACY_MAG 0x79
#define CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_GYRO 0x80
#define CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_GYRO 0x88
#define CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_GYRO 0x88
#define CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_LIGHT 0x90
#define CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_LIGHT 0x98
#define CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_LIGHT 0x98
#define CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_PRESSURE 0xB0
#define CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_PRESSURE 0xB8
#define CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_PRESSURE 0xB8
#define PRESSURE_UPDATE_RATE 0xB6
#define PRESSURE_WAKE_UPDATE_RATE 0xB7
#define CWMCU_MAX_DELAY 200
#define CWMCU_NO_POLLING_DELAY 10000
#define G_SENSORS_STATUS 0x60
#define ACCE_UPDATE_RATE 0x66
#define ACCE_WAKE_UPDATE_RATE 0x67
#define ECOMPASS_SENSORS_STATUS 0x70
#define MAGN_UPDATE_RATE 0x76
#define MAGN_WAKE_UPDATE_RATE 0x77
#define GYRO_SENSORS_STATUS 0x80
#define GYRO_UPDATE_RATE 0x86
#define GYRO_WAKE_UPDATE_RATE 0x87
#define LIGHT_SENSORS_STATUS 0x90
#define LIGHT_UPDATE_PERIOD 0x96
#define LIGHT_SENSORS_CALIBRATION_DATA 0x98
#define ORIE_UPDATE_RATE 0xC0
#define ROTA_UPDATE_RATE 0xC1
#define LINE_UPDATE_RATE 0xC2
#define GRAV_UPDATE_RATE 0xC3
#define MAGN_UNCA_UPDATE_RATE 0xC4
#define GYRO_UNCA_UPDATE_RATE 0xC5
#define GAME_ROTA_UPDATE_RATE 0xC6
#define GEOM_ROTA_UPDATE_RATE 0xC7
#define SIGN_UPDATE_RATE 0xC8
#define ORIE_WAKE_UPDATE_RATE 0xC9
#define ROTA_WAKE_UPDATE_RATE 0xCA
#define LINE_WAKE_UPDATE_RATE 0xCB
#define GRAV_WAKE_UPDATE_RATE 0xCC
#define MAGN_UNCA_WAKE_UPDATE_RATE 0xCD
#define GYRO_UNCA_WAKE_UPDATE_RATE 0xCE
#define GAME_ROTA_WAKE_UPDATE_RATE 0xCF
#define GEOM_ROTA_WAKE_UPDATE_RATE 0xD2
#define STEP_COUNTER_UPDATE_PERIOD 0xD3
#define STEP_COUNTER_MASK ((1ULL << CW_STEP_COUNTER) | \
(1ULL << CW_STEP_COUNTER_W))
#define IIO_CONTINUOUS_MASK ((1ULL << CW_ACCELERATION) | \
(1ULL << CW_MAGNETIC) | \
(1ULL << CW_GYRO) | \
(1ULL << CW_PRESSURE) | \
(1ULL << CW_ORIENTATION) | \
(1ULL << CW_ROTATIONVECTOR) | \
(1ULL << CW_LINEARACCELERATION) | \
(1ULL << CW_GRAVITY) | \
(1ULL << CW_MAGNETIC_UNCALIBRATED) | \
(1ULL << CW_GYROSCOPE_UNCALIBRATED) | \
(1ULL << CW_GAME_ROTATION_VECTOR) | \
(1ULL << CW_GEOMAGNETIC_ROTATION_VECTOR) | \
(1ULL << CW_STEP_DETECTOR) | \
(1ULL << CW_STEP_COUNTER) | \
(1ULL << CW_ACCELERATION_W) | \
(1ULL << CW_MAGNETIC_W) | \
(1ULL << CW_GYRO_W) | \
(1ULL << CW_PRESSURE_W) | \
(1ULL << CW_ORIENTATION_W) | \
(1ULL << CW_ROTATIONVECTOR_W) | \
(1ULL << CW_LINEARACCELERATION_W) | \
(1ULL << CW_GRAVITY_W) | \
(1ULL << CW_MAGNETIC_UNCALIBRATED_W) | \
(1ULL << CW_GYROSCOPE_UNCALIBRATED_W) | \
(1ULL << CW_GAME_ROTATION_VECTOR_W) | \
(1ULL << CW_GEOMAGNETIC_ROTATION_VECTOR_W) | \
(1ULL << CW_STEP_DETECTOR_W) | \
(1ULL << CW_STEP_COUNTER_W))
#define CW_I2C_REG_WATCHDOG_STATUS 0xE6
#define WATCHDOG_STATUS_LEN 12
#define CW_I2C_REG_EXCEPTION_BUFFER_LEN 0xFD
#define EXCEPTION_BUFFER_LEN_SIZE 4
#define CW_I2C_REG_EXCEPTION_BUFFER 0xFE
#define EXCEPTION_BLOCK_LEN 16
#define CW_I2C_REG_WARN_MSG_ENABLE 0xFA
#define CW_I2C_REG_WARN_MSG_BUFFER_LEN 0xFB
#define WARN_MSG_BUFFER_LEN_SIZE 8
#define CW_I2C_REG_WARN_MSG_BUFFER 0xFC
#define WARN_MSG_BLOCK_LEN 16
#define WARN_MSG_PER_ITEM_LEN 120
#define CW_I2C_REG_WATCH_DOG_ENABLE 0xF9
#define UPDATE_RATE_NORMAL 1
#define UPDATE_RATE_UI 2
#define UPDATE_RATE_GAME 3
#define UPDATE_RATE_FASTEST 4
#define UPDATE_RATE_RATE_10Hz 5
#define UPDATE_RATE_RATE_25Hz 6
#define GENSOR_POSITION 0x65
#define COMPASS_POSITION 0x75
#define GYRO_POSITION 0x85
#define num_sensors CW_SENSORS_ID_TOTAL
#define CWSTM32_BATCH_MODE_COMMAND 0x40 /* R/W 1 Byte
* Bit 2: Timeout flag (R/WC)
* Bit 4: Buffer full flag (R/WC)
*/
#define CWSTM32_BATCH_MODE_DATA_QUEUE 0x45 /* R/W 9 Bytes */
#define CWSTM32_BATCH_MODE_TIMEOUT 0x46 /* R/W 4 Bytes (ms) */
#define CWSTM32_BATCH_MODE_DATA_COUNTER 0x47 /* R/W 4 Bytes
* (4 bytes, from low byte to
* high byte */
#define CWSTM32_BATCH_FLUSH 0x48 /* W 1 Byte (sensors_id) */
#define CWSTM32_WAKE_UP_BATCH_MODE_DATA_QUEUE 0x55 /* R/W 9 Bytes */
#define CWSTM32_WAKE_UP_BATCH_MODE_TIMEOUT 0x56 /* R/W 4 Bytes
* (ms) */
#define CWSTM32_WAKE_UP_BATCH_MODE_DATA_COUNTER 0x57 /* R/W 4 Bytes
* (4 bytes, from low byte
* to high byte) */
#define SYNC_TIMESTAMP_BIT (1 << 1)
#define TIMESTAMP_SYNC_CODE (98)
#define CW_I2C_REG_MCU_TIME 0x11
#define MAX_EVENT_COUNT 2500
/* If queue is empty */
#define CWMCU_NODATA 0xFF
#define CWSTM32_ENABLE_REG 0x01
#define CWSTM32_READ_SEQUENCE_DATA_REG 0x0F
#define CWSTM32_WRITE_POSITION_Acceleration 0x20
#define CWSTM32_WRITE_POSITION_Magnetic 0x21
#define CWSTM32_WRITE_POSITION_Gyro 0x22
#define CWSTM32_WRITE_CLEAN_COUNT_Pedometer 0x30
#define CWSTM32_INT_ST1 0x08
#define CWSTM32_INT_ST2 0x09
#define CWSTM32_INT_ST3 0x0A
#define CWSTM32_INT_ST4 0x0B
#define CWSTM32_ERR_ST 0x1F
#define CW_BATCH_ENABLE_REG 0x41
#define CW_WAKE_UP_BATCH_ENABLE_REG 0x51
#define CW_CPU_STATUS_REG 0xD1
/* INT_ST1 */
#define CW_MCU_INT_BIT_LIGHT (1 << 3)
/* INT_ST2 */
#define CW_MCU_INT_BIT_MAGIC_COVER (1 << 4)
/* INT_ST3 */
#define CW_MCU_INT_BIT_SIGNIFICANT_MOTION (1 << 4)
#define CW_MCU_INT_BIT_STEP_DETECTOR (1 << 5)
#define CW_MCU_INT_BIT_STEP_COUNTER (1 << 6)
#define CW_MCU_INT_BIT_FACEDOWN_DETECTION (1 << 7)
/* ERR_ST */
#define CW_MCU_INT_BIT_ERROR_WARN_MSG (1 << 5)
#define CW_MCU_INT_BIT_ERROR_MCU_EXCEPTION (1 << 6)
#define CW_MCU_INT_BIT_ERROR_WATCHDOG_RESET (1 << 7)
/* batch_st */
#define CW_MCU_INT_BIT_BATCH_TIMEOUT (1 << 2)
#define CW_MCU_INT_BIT_BATCH_BUFFER_FULL (1 << 4)
#define CW_MCU_INT_BIT_BATCH_TRIGGER_READ (CW_MCU_INT_BIT_BATCH_TIMEOUT |\
CW_MCU_INT_BIT_BATCH_BUFFER_FULL)
#define CW_MCU_INT_BIT_BATCH_INT_MASK CW_MCU_INT_BIT_BATCH_TRIGGER_READ
#define IIO_SENSORS_MASK (((u64)(~0ULL)) & ~(1ULL << HTC_MAGIC_COVER) & \
~(1ULL << (HTC_MAGIC_COVER+32)))
#define CW_MCU_BIT_LIGHT_POLLING (1 << 5)
#define FW_DOES_NOT_EXIST (1 << 0)
#define FW_UPDATE_QUEUED (1 << 1)
#define FW_ERASE_FAILED (1 << 2)
#define FW_FLASH_FAILED (1 << 3)
#define CW_MCU_I2C_SENSORS_REG_START (0x20)
#define CWSTM32_READ_Gesture_Flip (CW_MCU_I2C_SENSORS_REG_START + HTC_GESTURE_FLIP)
#define CWSTM32_READ_Acceleration (CW_MCU_I2C_SENSORS_REG_START + CW_ACCELERATION)
#define CWSTM32_READ_Magnetic (CW_MCU_I2C_SENSORS_REG_START + CW_MAGNETIC)
#define CWSTM32_READ_Gyro (CW_MCU_I2C_SENSORS_REG_START + CW_GYRO)
#define CWSTM32_READ_Light (CW_MCU_I2C_SENSORS_REG_START + CW_LIGHT)
#define CWSTM32_READ_Pressure (CW_MCU_I2C_SENSORS_REG_START + CW_PRESSURE)
#define CWSTM32_READ_Orientation (CW_MCU_I2C_SENSORS_REG_START + CW_ORIENTATION)
#define CWSTM32_READ_RotationVector (CW_MCU_I2C_SENSORS_REG_START + CW_ROTATIONVECTOR)
#define CWSTM32_READ_LinearAcceleration (CW_MCU_I2C_SENSORS_REG_START + CW_LINEARACCELERATION)
#define CWSTM32_READ_Gravity (CW_MCU_I2C_SENSORS_REG_START + CW_GRAVITY)
#define CWSTM32_READ_Hall_Sensor 0x2C
#define CWSTM32_READ_MAGNETIC_UNCALIBRATED 0x30
#define CWSTM32_READ_GYROSCOPE_UNCALIBRATED 0x31
#define CWSTM32_READ_GAME_ROTATION_VECTOR 0x32
#define CWSTM32_READ_GEOMAGNETIC_ROTATION_VECTOR 0x33
#define CWSTM32_READ_SIGNIFICANT_MOTION 0x34
#define CWSTM32_READ_STEP_DETECTOR 0x35
#define CWSTM32_READ_STEP_COUNTER 0x36
#define CWSTM32_READ_FACEDOWN_DETECTION 0x3A
#ifdef __KERNEL__
struct cwmcu_platform_data {
unsigned char acceleration_axes;
unsigned char magnetic_axes;
unsigned char gyro_axes;
uint32_t gpio_wake_mcu;
uint32_t gpio_reset;
uint32_t gpio_chip_mode;
uint32_t gpio_mcu_irq;
int gs_chip_layout;
};
#endif /* __KERNEL */
#endif /* __CWMCUSENSOR_H__ */