/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2019 MediaTek Inc. */ #ifndef __HWMSENSOR_H__ #define __HWMSENSOR_H__ #include #include #ifdef CONFIG_COMPAT #include #endif /* follow google default sensor type */ #define SENSOR_TYPE_ACCELEROMETER 1 #define SENSOR_TYPE_MAGNETIC_FIELD 2 #define SENSOR_TYPE_ORIENTATION 3 #define SENSOR_TYPE_GYROSCOPE 4 #define SENSOR_TYPE_LIGHT 5 #define SENSOR_TYPE_PRESSURE 6 #define SENSOR_TYPE_TEMPERATURE 7 #define SENSOR_TYPE_PROXIMITY 8 #define SENSOR_TYPE_GRAVITY 9 #define SENSOR_TYPE_LINEAR_ACCELERATION 10 #define SENSOR_TYPE_ROTATION_VECTOR 11 #define SENSOR_TYPE_RELATIVE_HUMIDITY 12 #define SENSOR_TYPE_AMBIENT_TEMPERATURE 13 #define SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED 14 #define SENSOR_TYPE_GAME_ROTATION_VECTOR 15 #define SENSOR_TYPE_GYROSCOPE_UNCALIBRATED 16 #define SENSOR_TYPE_SIGNIFICANT_MOTION 17 #define SENSOR_TYPE_STEP_DETECTOR 18 #define SENSOR_TYPE_STEP_COUNTER 19 #define SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR 20 #define SENSOR_TYPE_HEART_RATE 21 #define SENSOR_TYPE_TILT_DETECTOR 22 #define SENSOR_TYPE_WAKE_GESTURE 23 #define SENSOR_TYPE_GLANCE_GESTURE 24 #define SENSOR_TYPE_PICK_UP_GESTURE 25 #define SENSOR_TYPE_WRIST_TILT_GESTURE 26 #define SENSOR_TYPE_DEVICE_ORIENTATION 27 #define SENSOR_TYPE_POSE_6DOF 28 #define SENSOR_TYPE_STATIONARY_DETECT 29 #define SENSOR_TYPE_MOTION_DETECT 30 #define SENSOR_TYPE_HEART_BEAT 31 #define SENSOR_TYPE_DYNAMIC_SENSOR_META 32 #define SENSOR_TYPE_ADDITIONAL_INFO 33 #define SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT 34 #define SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED 35 /* follow mtk add sensor type */ #define SENSOR_TYPE_PEDOMETER 55 #define SENSOR_TYPE_IN_POCKET 56 #define SENSOR_TYPE_ACTIVITY 57 #define SENSOR_TYPE_PDR 58 #define SENSOR_TYPE_FREEFALL 59 #define SENSOR_TYPE_FLAT 60 #define SENSOR_TYPE_FACE_DOWN 61 #define SENSOR_TYPE_SHAKE 62 #define SENSOR_TYPE_BRINGTOSEE 63 #define SENSOR_TYPE_ANSWER_CALL 64 #define SENSOR_TYPE_GEOFENCE 65 #define SENSOR_TYPE_FLOOR_COUNTER 66 #define SENSOR_TYPE_EKG 67 #define SENSOR_TYPE_PPG1 68 #define SENSOR_TYPE_PPG2 69 #define SENSOR_TYPE_RGBW 70 #define SENSOR_TYPE_GYRO_TEMPERATURE 71 #define SENSOR_TYPE_SAR 72 /* end sensor type */ #define SENSOR_TYPE_MAX_NUM SENSOR_TYPE_SAR #define SENSOR_TYPE_MAX_NUM_PLUS_ONE (SENSOR_TYPE_MAX_NUM + 1) /*---------------------------------------------------------------------------*/ #define ID_BASE (0) #define ID_OFFSET (1) /* follow google default sensor ID */ #define ID_ACCELEROMETER (ID_BASE + SENSOR_TYPE_ACCELEROMETER - 1) #define ID_MAGNETIC (ID_BASE + SENSOR_TYPE_MAGNETIC_FIELD - 1) #define ID_ORIENTATION (ID_BASE + SENSOR_TYPE_ORIENTATION - 1) #define ID_GYROSCOPE (ID_BASE + SENSOR_TYPE_GYROSCOPE - 1) #define ID_LIGHT (ID_BASE + SENSOR_TYPE_LIGHT - 1) #define ID_PRESSURE (ID_BASE + SENSOR_TYPE_PRESSURE - 1) #define ID_TEMPRERATURE (ID_BASE + SENSOR_TYPE_TEMPERATURE - 1) #define ID_PROXIMITY (ID_BASE + SENSOR_TYPE_PROXIMITY - 1) #define ID_GRAVITY (ID_BASE + SENSOR_TYPE_GRAVITY - 1) #define ID_LINEAR_ACCELERATION (ID_BASE + SENSOR_TYPE_LINEAR_ACCELERATION - 1) #define ID_ROTATION_VECTOR (ID_BASE + SENSOR_TYPE_ROTATION_VECTOR - 1) #define ID_RELATIVE_HUMIDITY (ID_BASE + SENSOR_TYPE_RELATIVE_HUMIDITY - 1) #define ID_AMBIENT_TEMPERATURE (ID_BASE + SENSOR_TYPE_AMBIENT_TEMPERATURE - 1) #define ID_MAGNETIC_UNCALIBRATED \ (ID_BASE + SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED - 1) #define ID_GAME_ROTATION_VECTOR \ (ID_BASE + SENSOR_TYPE_GAME_ROTATION_VECTOR - 1) #define ID_GYROSCOPE_UNCALIBRATED \ (ID_BASE + SENSOR_TYPE_GYROSCOPE_UNCALIBRATED - 1) #define ID_SIGNIFICANT_MOTION \ (ID_BASE + SENSOR_TYPE_SIGNIFICANT_MOTION - 1) #define ID_STEP_DETECTOR \ (ID_BASE + SENSOR_TYPE_STEP_DETECTOR - 1) #define ID_STEP_COUNTER \ (ID_BASE + SENSOR_TYPE_STEP_COUNTER - 1) #define ID_GEOMAGNETIC_ROTATION_VECTOR \ (ID_BASE + SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR - 1) #define ID_HEART_RATE (ID_BASE + SENSOR_TYPE_HEART_RATE - 1) #define ID_TILT_DETECTOR (ID_BASE + SENSOR_TYPE_TILT_DETECTOR - 1) #define ID_WAKE_GESTURE (ID_BASE + SENSOR_TYPE_WAKE_GESTURE - 1) #define ID_GLANCE_GESTURE (ID_BASE + SENSOR_TYPE_GLANCE_GESTURE - 1) #define ID_PICK_UP_GESTURE (ID_BASE + SENSOR_TYPE_PICK_UP_GESTURE - 1) #define ID_WRIST_TITL_GESTURE (ID_BASE + SENSOR_TYPE_WRIST_TILT_GESTURE - 1) #define ID_DEVICE_ORIENTATION (ID_BASE + SENSOR_TYPE_DEVICE_ORIENTATION - 1) #define ID_POSE_6DOF (ID_BASE + SENSOR_TYPE_POSE_6DOF - 1) #define ID_STATIONARY_DETECT (ID_BASE + SENSOR_TYPE_STATIONARY_DETECT - 1) #define ID_MOTION_DETECT (ID_BASE + SENSOR_TYPE_MOTION_DETECT - 1) #define ID_HEART_BEAT (ID_BASE + SENSOR_TYPE_HEART_BEAT - 1) #define ID_DYNAMIC_SENSOR_META (ID_BASE + SENSOR_TYPE_DYNAMIC_SENSOR_META - 1) #define ID_ADDITIONAL_INFO (ID_BASE + SENSOR_TYPE_ADDITIONAL_INFO - 1) #define ID_LOW_LATENCY_OFFBODY_DETECT \ (ID_BASE + SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT - 1) #define ID_ACCELEROMETER_UNCALIBRATED \ (ID_BASE + SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED - 1) /* follow mtk add sensor ID */ #define ID_PEDOMETER (ID_BASE + SENSOR_TYPE_PEDOMETER - 1) #define ID_IN_POCKET (ID_BASE + SENSOR_TYPE_IN_POCKET - 1) #define ID_ACTIVITY (ID_BASE + SENSOR_TYPE_ACTIVITY - 1) #define ID_PDR (ID_BASE + SENSOR_TYPE_PDR - 1) #define ID_FREEFALL (ID_BASE + SENSOR_TYPE_FREEFALL - 1) #define ID_FLAT (ID_BASE + SENSOR_TYPE_FLAT - 1) #define ID_FACE_DOWN (ID_BASE + SENSOR_TYPE_FACE_DOWN - 1) #define ID_SHAKE (ID_BASE + SENSOR_TYPE_SHAKE - 1) #define ID_BRINGTOSEE (ID_BASE + SENSOR_TYPE_BRINGTOSEE - 1) #define ID_ANSWER_CALL (ID_BASE + SENSOR_TYPE_ANSWER_CALL - 1) #define ID_GEOFENCE (ID_BASE + SENSOR_TYPE_GEOFENCE - 1) #define ID_FLOOR_COUNTER (ID_BASE + SENSOR_TYPE_FLOOR_COUNTER - 1) #define ID_EKG (ID_BASE + SENSOR_TYPE_EKG - 1) #define ID_PPG1 (ID_BASE + SENSOR_TYPE_PPG1 - 1) #define ID_PPG2 (ID_BASE + SENSOR_TYPE_PPG2 - 1) #define ID_RGBW (ID_BASE + SENSOR_TYPE_RGBW - 1) #define ID_GYRO_TEMPERATURE (ID_BASE + SENSOR_TYPE_GYRO_TEMPERATURE - 1) #define ID_SAR (ID_BASE + SENSOR_TYPE_SAR - 1) /* end sensor ID */ #define ID_SENSOR_MAX_HANDLE (ID_SAR) #define ID_SENSOR_MAX_HANDLE_PLUS_ONE (ID_SENSOR_MAX_HANDLE + 1) #if (ID_SENSOR_MAX_HANDLE_PLUS_ONE != SENSOR_TYPE_MAX_NUM) #error ID_SENSOR_MAX_HANDLE not match with SENSOR_TYPE_MAX_NUM #endif #define MAX_SENSOR_DATA_UPDATE_ONCE (20) /*----------------------------------------------------------------------------*/ #define HWM_INPUTDEV_NAME "hwmdata" #define HWM_SENSOR_DEV_NAME "hwmsensor" #define HWM_SENSOR_DEV "/dev/hwmsensor" #define C_MAX_HWMSEN_EVENT_NUM 4 /*----------------------------------------------------------------------------*/ #define ACC_PL_DEV_NAME "m_acc_pl" #define ACC_INPUTDEV_NAME "m_acc_input" #define ACC_MISC_DEV_NAME "m_acc_misc" #define MAG_PL_DEV_NAME "m_mag_pl" #define MAG_INPUTDEV_NAME "m_mag_input" #define MAG_MISC_DEV_NAME "m_mag_misc" #define UNCALI_MAG_PL_DEV_NAME "m_uncali_mag_pl" #define UNCALI_MAG_INPUTDEV_NAME "m_uncali_mag_input" #define UNCALI_MAG_MISC_DEV_NAME "m_uncali_mag_misc" #define UNCALI_GYRO_PL_DEV_NAME "m_uncali_gyro_pl" #define UNCALI_GYRO_INPUTDEV_NAME "m_uncali_gyro_input" #define UNCALI_GYRO_MISC_DEV_NAME "m_uncali_gyro_misc" #define GYRO_PL_DEV_NAME "m_gyro_pl" #define GYRO_INPUTDEV_NAME "m_gyro_input" #define GYRO_MISC_DEV_NAME "m_gyro_misc" #define ALSPS_PL_DEV_NAME "m_alsps_pl" #define ALSPS_INPUTDEV_NAME "m_alsps_input" #define ALS_MISC_DEV_NAME "m_als_misc" #define PS_MISC_DEV_NAME "m_ps_misc" #define BARO_PL_DEV_NAME "m_baro_pl" #define BARO_INPUTDEV_NAME "m_baro_input" #define BARO_MISC_DEV_NAME "m_baro_misc" #define HMDY_PL_DEV_NAME "m_hmdy_pl" #define HMDY_INPUTDEV_NAME "m_hmdy_input" #define HMDY_MISC_DEV_NAME "m_hmdy_misc" #define STEP_C_PL_DEV_NAME "m_step_c_pl" #define STEP_C_INPUTDEV_NAME "m_step_c_input" #define STEP_C_MISC_DEV_NAME "m_step_c_misc" #define INPK_PL_DEV_NAME "m_inpk_pl" #define INPK_INPUTDEV_NAME "m_inpk_input" #define INPK_MISC_DEV_NAME "m_inpk_misc" #define SHK_PL_DEV_NAME "m_shk_pl" #define SHK_INPUTDEV_NAME "m_shk_input" #define SHK_MISC_DEV_NAME "m_shk_misc" #define FDN_PL_DEV_NAME "m_fdn_pl" #define FDN_INPUTDEV_NAME "m_fdn_input" #define FDN_MISC_DEV_NAME "m_fdn_misc" #define PKUP_PL_DEV_NAME "m_pkup_pl" #define PKUP_INPUTDEV_NAME "m_pkup_input" #define PKUP_MISC_DEV_NAME "m_pkup_misc" #define ACT_PL_DEV_NAME "m_act_pl" #define ACT_INPUTDEV_NAME "m_act_input" #define ACT_MISC_DEV_NAME "m_act_misc" #define PDR_PL_DEV_NAME "m_pdr_pl" #define PDR_INPUTDEV_NAME "m_pdr_input" #define PDR_MISC_DEV_NAME "m_pdr_misc" #define HRM_PL_DEV_NAME "m_hrm_pl" #define HRM_INPUTDEV_NAME "m_hrm_input" #define HRM_MISC_DEV_NAME "m_hrm_misc" #define TILT_PL_DEV_NAME "m_tilt_pl" #define TILT_INPUTDEV_NAME "m_tilt_input" #define TILT_MISC_DEV_NAME "m_tilt_misc" #define WAG_PL_DEV_NAME "m_wag_pl" #define WAG_INPUTDEV_NAME "m_wag_input" #define WAG_MISC_DEV_NAME "m_wag_misc" #define GLG_PL_DEV_NAME "m_glg_pl" #define GLG_INPUTDEV_NAME "m_glg_input" #define GLG_MISC_DEV_NAME "m_glg_misc" #define ANSWERCALL_PL_DEV_NAME "m_ancall_pl" #define ANSWERCALL_INPUTDEV_NAME "m_ancall_input" #define ANSWERCALL_MISC_DEV_NAME "m_ancall_misc" #define TEMP_PL_DEV_NAME "m_temp_pl" #define TEMP_INPUTDEV_NAME "m_temp_input" #define TEMP_MISC_DEV_NAME "m_temp_misc" #define BATCH_PL_DEV_NAME "m_batch_pl" #define BATCH_INPUTDEV_NAME "m_batch_input" #define BATCH_MISC_DEV_NAME "m_batch_misc" #define BTS_PL_DEV_NAME "m_bts_pl" #define BTS_INPUTDEV_NAME "m_bts_input" #define BTS_MISC_DEV_NAME "m_bts_misc" #define GRV_PL_DEV_NAME "m_grv_pl" #define GRV_INPUTDEV_NAME "m_grv_input" #define GRV_MISC_DEV_NAME "m_grv_misc" #define GMRV_PL_DEV_NAME "m_gmrv_pl" #define GMRV_INPUTDEV_NAME "m_gmrv_input" #define GMRV_MISC_DEV_NAME "m_gmrv_misc" #define GRAV_PL_DEV_NAME "m_grav_pl" #define GRAV_INPUTDEV_NAME "m_grav_input" #define GRAV_MISC_DEV_NAME "m_grav_misc" #define LA_PL_DEV_NAME "m_la_pl" #define LA_INPUTDEV_NAME "m_la_input" #define LA_MISC_DEV_NAME "m_la_misc" #define RV_PL_DEV_NAME "m_rv_pl" #define RV_INPUTDEV_NAME "m_rv_input" #define RV_MISC_DEV_NAME "m_rv_misc" #define FUSION_PL_DEV_NAME "m_fusion_pl" #define FUSION_INPUTDEV_NAME "m_fusion_input" #define FUSION_MISC_DEV_NAME "m_fusion_misc" #define FREEFALL_PL_DEV_NAME "m_frfl_pl" #define FREEFALL_INPUTDEV_NAME "m_frfl_input" #define FREEFALL_MISC_DEV_NAME "m_frfl_misc" #define PEDO_PL_DEV_NAME "m_pedo_pl" #define PEDO_INPUTDEV_NAME "m_pedo_input" #define PEDO_MISC_DEV_NAME "m_pedo_misc" #define SITU_PL_DEV_NAME "m_situ_pl" #define SITU_INPUTDEV_NAME "m_situ_input" #define SITU_MISC_DEV_NAME "m_situ_misc" #define BIO_MISC_DEV_NAME "m_bio_misc" #define EVENT_TYPE_SENSOR 0x01 #define EVENT_TYPE_SENSOR_EXT 0x02 #define EVENT_SENSOR_ACCELERATION SENSOR_ACCELEROMETER #define EVENT_SENSOR_MAGNETIC SENSOR_MAGNETIC #define EVENT_SENSOR_ORIENTATION SENSOR_ORIENTATION #define EVENT_SENSOR_GYROSCOPE SENSOR_GYROSCOPE #define EVENT_SENSOR_LIGHT SENSOR_LIGHT #define EVENT_SENSOR_PRESSURE SENSOR_PRESSURE #define EVENT_SENSOR_TEMPERATURE SENSOR_TEMPRERATURE #define EVENT_SENSOR_PROXIMITY SENSOR_PROXIMITY #define EVENT_SENSOR_GRAVITY SENSOR_PRESSURE #define EVENT_SENSOR_LINEAR_ACCELERATION SENSOR_TEMPRERATURE #define EVENT_SENSOR_ROTATION_VECTOR SENSOR_PROXIMITY #define EVENT_TYPE_INPK_VALUE 0x1 #define EVENT_TYPE_STATIONARY_VALUE 0x2 enum { HWM_MODE_DISABLE = 0, HWM_MODE_ENABLE = 1, }; struct hwm_sensor_data { /* sensor identifier */ int sensor; /* sensor values */ union { int values[6]; uint8_t probability[12]; }; /* sensor values divide */ uint32_t value_divide; /* sensor accuracy */ int8_t status; /* whether updata? */ int update; /* time is in nanosecond */ int64_t time; uint32_t reserved; }; #ifdef CONFIG_COMPAT struct compat_hwm_sensor_data { /* sensor identifier */ compat_int_t sensor; /* sensor values */ union { compat_int_t values[6]; uint8_t probability[12]; }; /* sensor values divide */ compat_uint_t value_divide; /* sensor accuracy */ char status; /* whether updata? */ compat_int_t update; /* time is in nanosecond */ compat_s64 time; compat_uint_t reserved; }; #endif struct hwm_trans_data { struct hwm_sensor_data data[MAX_SENSOR_DATA_UPDATE_ONCE]; uint64_t data_type; }; #ifdef CONFIG_COMPAT struct compat_hwm_trans_data { struct compat_hwm_sensor_data data[MAX_SENSOR_DATA_UPDATE_ONCE]; compat_u64 data_type; }; #endif #define MAX_BATCH_DATA_PER_QUREY 18 struct batch_trans_data { int numOfDataReturn; int numOfDataLeft; struct hwm_sensor_data data[MAX_BATCH_DATA_PER_QUREY]; }; #ifdef CONFIG_COMPAT struct compat_batch_trans_data { compat_int_t numOfDataReturn; compat_int_t numOfDataLeft; struct compat_hwm_sensor_data data[MAX_BATCH_DATA_PER_QUREY]; }; #endif /*----------------------------------------------------------------------------*/ #define HWM_IOC_MAGIC 0x91 /* set delay */ #define HWM_IO_SET_DELAY _IOW(HWM_IOC_MAGIC, 0x01, uint32_t) /* wake up */ #define HWM_IO_SET_WAKE _IO(HWM_IOC_MAGIC, 0x02) /* Enable/Disable sensor */ #define HWM_IO_ENABLE_SENSOR _IOW(HWM_IOC_MAGIC, 0x03, uint32_t) #define HWM_IO_DISABLE_SENSOR _IOW(HWM_IOC_MAGIC, 0x04, uint32_t) /* Enable/Disable sensor */ #define HWM_IO_ENABLE_SENSOR_NODATA _IOW(HWM_IOC_MAGIC, 0x05, uint32_t) #define HWM_IO_DISABLE_SENSOR_NODATA _IOW(HWM_IOC_MAGIC, 0x06, uint32_t) /* Get sensors data */ #define HWM_IO_GET_SENSORS_DATA \ _IOWR(HWM_IOC_MAGIC, 0x07, struct hwm_trans_data) #ifdef CONFIG_COMPAT /* set delay */ #define COMPAT_HWM_IO_SET_DELAY _IOW(HWM_IOC_MAGIC, 0x01, compat_uint_t) /* wake up */ #define COMPAT_HWM_IO_SET_WAKE _IO(HWM_IOC_MAGIC, 0x02) /* Enable/Disable sensor */ #define COMPAT_HWM_IO_ENABLE_SENSOR _IOW(HWM_IOC_MAGIC, 0x03, compat_uint_t) #define COMPAT_HWM_IO_DISABLE_SENSOR _IOW(HWM_IOC_MAGIC, 0x04, compat_uint_t) /* Enable/Disable sensor */ #define COMPAT_HWM_IO_ENABLE_SENSOR_NODATA \ _IOW(HWM_IOC_MAGIC, 0x05, compat_uint_t) #define COMPAT_HWM_IO_DISABLE_SENSOR_NODATA \ _IOW(HWM_IOC_MAGIC, 0x06, compat_uint_t) /* Get sensors data */ #define COMPAT_HWM_IO_GET_SENSORS_DATA \ _IOWR(HWM_IOC_MAGIC, 0x07, struct compat_hwm_trans_data) #endif /*----------------------------------------------------------------------------*/ #define BATCH_IOC_MAGIC 0x92 /* Get sensor data */ #define BATCH_IO_GET_SENSORS_DATA \ _IOWR(BATCH_IOC_MAGIC, 0x01, struct batch_trans_data) #ifdef CONFIG_COMPAT #define COMPAT_BATCH_IO_GET_SENSORS_DATA \ _IOWR(BATCH_IOC_MAGIC, 0x01, struct compat_batch_trans_data) #endif #define SENSOR_DELAY 0X01 #define SENSOR_ENABLE 0X02 #define SENSOR_GET_DATA 0X04 /** * status of each sensor */ #define SENSOR_STATUS_UNRELIABLE 0 #define SENSOR_STATUS_ACCURACY_LOW 1 #define SENSOR_STATUS_ACCURACY_MEDIUM 2 #define SENSOR_STATUS_ACCURACY_HIGH 3 #define GRAVITY_EARTH_1000 9807 /* about (9.80665f)*1000 */ #endif /* __HWMSENSOR_H__ */