blob: e29b26ee6dd51c57848aa877372a344826517c1a [file]
/* 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_PROXIMITY = 4,
CW_PRESSURE = 5,
CW_ORIENTATION = 6,
CW_ROTATIONVECTOR = 7,
CW_LINEARACCELERATION = 8,
CW_GRAVITY = 9,
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_GESTURE_MOTION = 24,
HTC_ANY_MOTION = 28,
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;
typedef enum {
CWSTM32_ENABLE_REG = 0x01,
CWSTM32_INT_ST1 = 0x08,
CWSTM32_INT_ST2 = 0x09,
CWSTM32_INT_ST3 = 0x0A,
CWSTM32_INT_ST4 = 0x0B,
FIRMWARE_VERSION = 0x10,
CW_I2C_REG_MCU_TIME = 0x11,
CW_I2C_REG_FLASH_CHECKSUM = 0x12,
CW_I2C_REG_REBOOT_MODE = 0x13,
TOUCH_SOLUTION_REGISTER = 0x14,
FIRMWARE_INFO = 0x15,
CW_I2C_REG_DISPLAY_STATE = 0x16,
CW_I2C_REG_DOTVIEW_STATUS = 0x17,
HTC_SYSTEM_STATUS_REG = 0x1E,
CWSTM32_ERR_ST = 0x1F,
CWSTM32_READ_Acceleration = 0x20,
CWSTM32_READ_Magnetic = 0x21,
CWSTM32_READ_Gyro = 0x22,
CWSTM32_READ_Light = 0x23,
CWSTM32_READ_Proximity = 0x24,
CWSTM32_READ_Pressure = 0x25,
CWSTM32_READ_Orientation = 0x26,
CWSTM32_READ_RotationVector = 0x27,
CWSTM32_READ_LinearAcceleration = 0x28,
CWSTM32_READ_Gravity = 0x29,
CWSTM32_READ_MAGNETIC_UNCALIBRATED = 0x30,
CWSTM32_READ_GYROSCOPE_UNCALIBRATED = 0x31,
CWSTM32_READ_GAME_ROTATION_VECTOR = 0x32,
CWSTM32_READ_GEOMAGNETIC_ROTATION_VECTOR = 0x33,
CWSTM32_READ_SIGNIFICANT_MOTION = 0x34,
CWSTM32_READ_STEP_DETECTOR = 0x35,
CWSTM32_READ_STEP_COUNTER = 0x36,
CWSTM32_READ_Gesture_Motion = 0x38,
CWSTM32_READ_Any_Motion = 0x3F,
CWSTM32_BATCH_MODE_COMMAND = 0x40,
/* Bit 2: Timeout flag (R/WC), Bit 4: Buffer full flag (R/WC) */
CW_BATCH_ENABLE_REG = 0x41,
CWSTM32_BATCH_MODE_DATA_QUEUE = 0x45,
CWSTM32_BATCH_MODE_TIMEOUT = 0x46,
CWSTM32_BATCH_MODE_DATA_COUNTER = 0x47,
CWSTM32_BATCH_FLUSH = 0x48,
CW_WAKE_UP_BATCH_ENABLE_REG = 0x51,
CWSTM32_WAKE_UP_BATCH_MODE_DATA_QUEUE = 0x55,
CWSTM32_WAKE_UP_BATCH_MODE_TIMEOUT = 0x56,
CWSTM32_WAKE_UP_BATCH_MODE_DATA_COUNTER = 0x57,
CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_ACC = 0x60,
G_SENSORS_STATUS = 0x60,
CW_I2C_REG_GSENSOR_HW_ID = 0x63,
GENSOR_POSITION = 0x65,
ACCE_UPDATE_RATE = 0x66,
ACCE_WAKE_UPDATE_RATE = 0x67,
CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_ACC = 0x68,
CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_ACC = 0x68,
//TODO: remove below two if we don't need g-sensor L/R calibration
CW_I2C_REG_SENSORS_CALIBRATOR_TARGET_ACC = 0x69,
CW_I2C_REG_SENSORS_CALIBRATOR_RESULT_RL_ACC = 0x6A,
CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_MAG = 0x70,
ECOMPASS_SENSORS_STATUS = 0x70,
CW_I2C_REG_COMPASS_HW_ID = 0x73,
COMPASS_POSITION = 0x75,
MAGN_UPDATE_RATE = 0x76,
MAGN_WAKE_UPDATE_RATE = 0x77,
CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_MAG = 0x78,
CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_MAG = 0x78,
CW_I2C_REG_SENSORS_ACCURACY_MAG = 0x79,
CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_GYRO = 0x80,
GYRO_SENSORS_STATUS = 0x80,
CW_I2C_REG_GYRO_HW_ID = 0x83,
GYRO_POSITION = 0x85,
GYRO_UPDATE_RATE = 0x86,
GYRO_WAKE_UPDATE_RATE = 0x87,
CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_GYRO = 0x88,
CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_GYRO = 0x88,
CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_LIGHT = 0x90,
LIGHT_SENSORS_STATUS = 0x90,
LIGHT_UPDATE_PERIOD = 0x96,
CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_LIGHT = 0x98,
CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_LIGHT = 0x98,
LIGHT_SENSORS_CALIBRATION_DATA = 0x98,
CW_I2C_REG_SENSORS_SET_LEVEL_LIGHT = 0x99,
PROXIMITY_SENSORS_STATUS = 0xA0,
PROXIMITY_SENSORS_CALIBRATION_DATA = 0xA8,
CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_PROXIMITY = 0xA8,
CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_PROXIMITY = 0xA8,
CW_I2C_REG_SENSORS_CALIBRATOR_STATUS_PRESSURE = 0xB0,
PRESSURE_UPDATE_RATE = 0xB6,
PRESSURE_WAKE_UPDATE_RATE = 0xB7,
CW_I2C_REG_SENSORS_CALIBRATOR_GET_DATA_PRESSURE = 0xB8,
CW_I2C_REG_SENSORS_CALIBRATOR_SET_DATA_PRESSURE = 0xB8,
ORIE_UPDATE_RATE = 0xC0,
ROTA_UPDATE_RATE = 0xC1,
LINE_UPDATE_RATE = 0xC2,
GRAV_UPDATE_RATE = 0xC3,
MAGN_UNCA_UPDATE_RATE = 0xC4,
GYRO_UNCA_UPDATE_RATE = 0xC5,
GAME_ROTA_UPDATE_RATE = 0xC6,
GEOM_ROTA_UPDATE_RATE = 0xC7,
SIGN_UPDATE_RATE = 0xC8,
ORIE_WAKE_UPDATE_RATE = 0xC9,
ROTA_WAKE_UPDATE_RATE = 0xCA,
LINE_WAKE_UPDATE_RATE = 0xCB,
GRAV_WAKE_UPDATE_RATE = 0xCC,
MAGN_UNCA_WAKE_UPDATE_RATE = 0xCD,
GYRO_UNCA_WAKE_UPDATE_RATE = 0xCE,
GAME_ROTA_WAKE_UPDATE_RATE = 0xCF,
CW_CPU_STATUS_REG = 0xD1,
GEOM_ROTA_WAKE_UPDATE_RATE = 0xD2,
STEP_COUNTER_UPDATE_PERIOD = 0xD3,
GESTURE_MOTION_UPDATE_ATTRIBUTE = 0xDF,
CW_I2C_REG_EVENT_SIZE = 0xE4,
CW_I2C_REG_EVENT_DATA = 0xE5,
CW_I2C_REG_WATCHDOG_STATUS = 0xE6,
CW_I2C_REG_DUMP_BACKUP_REG = 0xE7,
CW_I2C_REG_CAPTURE_RAMDUMP = 0xE8,
CW_I2C_REG_TRIGGER_CRASH = 0xE9,
CW_I2C_REG_LOG_LEVEL = 0xEB,
CW_I2C_REG_LOG_MASK = 0xEC,
CW_I2C_REG_LOG_SIZE = 0xED,
CW_I2C_REG_LOG_DATA = 0xEE,
TOUCH_STATUS_REGISTER = 0xF2,
CW_I2C_REG_WATCH_DOG_ENABLE = 0xF9,
CW_I2C_REG_WARN_MSG_ENABLE = 0xFA,
CW_I2C_REG_WARN_MSG_BUFFER_LEN = 0xFB,
CW_I2C_REG_WARN_MSG_BUFFER = 0xFC,
CW_I2C_REG_EXCEPTION_BUFFER_LEN = 0xFD,
CW_I2C_REG_EXCEPTION_BUFFER = 0xFE,
} CWMCU_I2C_REGISTER;
#define NS_PER_US 1000000LL
int touch_solution(u8 solution);
#if defined(CONFIG_SYNC_TOUCH_STATUS)
int touch_status(u8 status);
#endif
#define TOUCH_STATUS_TURN_HUB_OFF 0
#define TOUCH_STATUS_TURN_HUB_ON 1
#define TOUCH_SOLUTION_MAXIM1187X 0
#define TOUCH_SOLUTION_SYNAPTICS3351 1
typedef struct {
uint32_t calculate_done;
uint32_t check_sum;
} mcu_fw_checksum_t;
#define MCU_SYS_STATUS_DLOAD (0x776655AA)
#define MCU_SYS_STATUS_SHUB (0x77665500)
#define CWMCU_MAX_DELAY 1000
#define CWMCU_NO_POLLING_DELAY 10000
#define CWMCU_LIGHT_POLLING_DELAY 1000
#define GESTURE_MOTION_UPDATE_ATTRIBUTE_LEN (4)
#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))
struct cwmcu_ramdump_param {
u32 start_addr;
u32 size;
};
#define WATCHDOG_STATUS_LEN 12
#define I2C_EVENT_READ_LEN 24
#define I2C_RAMDUMP_READ_LEN 128
#define I2C_LOG_READ_LEN 32
#define EXCEPTION_BUFFER_LEN_SIZE 4
#define EXCEPTION_BLOCK_LEN 16
#define EXCEPTION_LEN_MAX 1024
#define WARN_MSG_BUFFER_LEN_SIZE 8
#define WARN_MSG_BLOCK_LEN 16
#define WARN_MSG_PER_ITEM_LEN 120
#define DEFAULT_DELAY_US 300000
#define UPDATE_RATE_NONE 0
#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 standardbase 0
#define acceleration CW_ACCELERATION
#define magnetic CW_MAGNETIC
#define gyro CW_GYRO
#define light CW_LIGHT
#define proximity CW_PROXIMITY
#define pressure CW_PRESSURE
#define orientation CW_ORIENTATION
#define rotation_vector CW_ROTATIONVECTOR
#define linear_acceleration CW_LINEARACCELERATION
#define gravity CW_GRAVITY
#define magnetic_uncalibrated CW_MAGNETIC_UNCALIBRATED
#define gyroscope_uncalibrated CW_GYROSCOPE_UNCALIBRATED
#define game_rotation_vector CW_GAME_ROTATION_VECTOR
#define geomagnetic_rotation_vector CW_GEOMAGNETIC_ROTATION_VECTOR
#define significant_motion CW_SIGNIFICANT_MOTION
#define step_detector CW_STEP_DETECTOR
#define step_counter CW_STEP_COUNTER
#define num_sensors CW_SENSORS_ID_TOTAL
typedef struct {
uint32_t boot_sec;
uint32_t boot_nsec;
uint16_t year; /* range: 1900~2xxx */
uint8_t month; /* range: 1~12 */
uint8_t day; /* range: 1~31 */
uint8_t hour; /* range: 0~23 */
uint8_t minute; /* range: 0~59 */
uint8_t second; /* range: 0~59 */
uint8_t hour_format_24; /* 0/1 */
} MCU_TIME_SYNC_T;
#define MAX_EVENT_COUNT 5000
/* If queue is empty */
#define CWMCU_NODATA 0xFF
/* INT_ST1 */
#define CW_MCU_INT_BIT_LIGHT (1 << 3)
#define CW_MCU_INT_BIT_PROXIMITY (1 << 4)
/* INT_ST2 */
#define CW_MCU_INT_BIT_SHUB_BOOTUP (1 << 5)
#define CW_MCU_INT_BIT_LOG_AVAILABLE (1 << 6)
/* 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)
/* INT_ST4 */
#define CW_MCU_INT_BIT_HTC_GESTURE_MOTION (1 << 0)
#define CW_MCU_INT_BIT_ANY_MOTION (1 << 4)
/* 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 IIO_SENSORS_MASK ((u64)(~0ULL))
#define CW_MCU_BIT_LIGHT_POLLING (1 << 5)
#define CW_MCU_BIT_PROXIMITY_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 HTC_GESTURE_MOTION_TYPE_SWIPE_UP 2
#define HTC_GESTURE_MOTION_TYPE_SWIPE_DOWN 3
#define HTC_GESTURE_MOTION_TYPE_SWIPE_LEFT 4
#define HTC_GESTURE_MOTION_TYPE_SWIPE_RIGHT 5
#define HTC_GESTURE_MOTION_TYPE_LAUNCH_CAMERA 6
#define HTC_GESTURE_MOTION_TYPE_DOUBLE_TAP 15
#define DOTVIEW_NO_COVER 0
#define DOTVIEW_COVER 1
/* Backlight 2.0 Conversion */
#define ADC_TO_LUX(x) (x*(2))
#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__ */