/* 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 #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__ */