/*! * @section LICENSE * (C) Copyright 2011~2016 Bosch Sensortec GmbH All Rights Reserved * * (C) Modification Copyright 2018 Robert Bosch Kft All Rights Reserved * * This software program is licensed subject to the GNU General * Public License (GPL).Version 2,June 1991, * available at http://www.fsf.org/copyleft/gpl.html * * Special: Description of the Software: * * This software module (hereinafter called "Software") and any * information on application-sheets (hereinafter called "Information") is * provided free of charge for the sole purpose to support your application * work. * * As such, the Software is merely an experimental software, not tested for * safety in the field and only intended for inspiration for further development * and testing. Any usage in a safety-relevant field of use (like automotive, * seafaring, spacefaring, industrial plants etc.) was not intended, so there are * no precautions for such usage incorporated in the Software. * * The Software is specifically designed for the exclusive use for Bosch * Sensortec products by personnel who have special experience and training. Do * not use this Software if you do not have the proper experience or training. * * This Software package is provided as is and without any expressed or * implied warranties, including without limitation, the implied warranties of * merchantability and fitness for a particular purpose. * * Bosch Sensortec and their representatives and agents deny any liability for * the functional impairment of this Software in terms of fitness, performance * and safety. Bosch Sensortec and their representatives and agents shall not be * liable for any direct or indirect damages or injury, except as otherwise * stipulated in mandatory applicable law. * The Information provided is believed to be accurate and reliable. Bosch * Sensortec assumes no responsibility for the consequences of use of such * Information nor for any infringement of patents or other rights of third * parties which may result from its use. * *------------------------------------------------------------------------------ * The following Product Disclaimer does not apply to the BSX4-HAL-4.1NoFusion Software * which is licensed under the Apache License, Version 2.0 as stated above. * http://www.apache.org/licenses/LICENSE-2.0 * * Product Disclaimer * * Common: * * Assessment of Products Returned from Field * * Returned products are considered good if they fulfill the specifications / * test data for 0-mileage and field listed in this document. * * Engineering Samples * * Engineering samples are marked with (e) or (E). Samples may vary from the * valid technical specifications of the series product contained in this * data sheet. Therefore, they are not intended or fit for resale to * third parties or for use in end products. Their sole purpose is internal * client testing. The testing of an engineering sample may in no way replace * the testing of a series product. Bosch assumes no liability for the use * of engineering samples. The purchaser shall indemnify Bosch from all claims * arising from the use of engineering samples. * * Intended use * * Provided that SMI130 is used within the conditions (environment, application, * installation, loads) as described in this TCD and the corresponding * agreed upon documents, Bosch ensures that the product complies with * the agreed properties. Agreements beyond this require * the written approval by Bosch. The product is considered fit for the intended * use when the product successfully has passed the tests * in accordance with the TCD and agreed upon documents. * * It is the responsibility of the customer to ensure the proper application * of the product in the overall system/vehicle. * * Bosch does not assume any responsibility for changes to the environment * of the product that deviate from the TCD and the agreed upon documents * as well as all applications not released by Bosch * * The resale and/or use of products are at the purchaser’s own risk and * responsibility. The examination and testing of the SMI130 * is the sole responsibility of the purchaser. * * The purchaser shall indemnify Bosch from all third party claims * arising from any product use not covered by the parameters of * this product data sheet or not approved by Bosch and reimburse Bosch * for all costs and damages in connection with such claims. * * The purchaser must monitor the market for the purchased products, * particularly with regard to product safety, and inform Bosch without delay * of all security relevant incidents. * * Application Examples and Hints * * With respect to any application examples, advice, normal values * and/or any information regarding the application of the device, * Bosch hereby disclaims any and all warranties and liabilities of any kind, * including without limitation warranties of * non-infringement of intellectual property rights or copyrights * of any third party. * The information given in this document shall in no event be regarded * as a guarantee of conditions or characteristics. They are provided * for illustrative purposes only and no evaluation regarding infringement * of intellectual property rights or copyrights or regarding functionality, * performance or error has been made. * * @filename smi130_driver.h * @date 2015/08/17 14:40 * @Modification Date 2018/08/28 18:20 * @id "e90a329" * @version 1.3 * * @brief * The head file of SMI130 device driver core code */ #ifndef _SMI130_DRIVER_H #define _SMI130_DRIVER_H #ifdef __KERNEL__ #include #include #include #include #else #include #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #ifdef CONFIG_HAS_EARLYSUSPEND #include #endif #include "smi130.h" #if defined(CONFIG_USE_QUALCOMM_HAL) #include #endif /* sensor specific */ #define SENSOR_NAME "smi130" #define SMI130_ENABLE_INT1 1 #define SMI130_ENABLE_INT2 1 /*#define SMI130_MAG_INTERFACE_SUPPORT 1*/ /*#define SMI130_AKM09912_SUPPORT 1*/ #define SMI_USE_BASIC_I2C_FUNC 1 #define SENSOR_CHIP_ID_SMI (0xD0) #define SENSOR_CHIP_ID_SMI_C2 (0xD1) #define SENSOR_CHIP_ID_SMI_C3 (0xD3) #define SENSOR_CHIP_REV_ID_SMI (0x00) #define CHECK_CHIP_ID_TIME_MAX 5 #define SMI_REG_NAME(name) SMI130_##name##__REG #define SMI_VAL_NAME(name) SMI130_##name #define SMI_CALL_API(name) smi130_##name #define SMI_I2C_WRITE_DELAY_TIME (1) /* generic */ #define SMI_MAX_RETRY_I2C_XFER (10) #define SMI_MAX_RETRY_WAKEUP (5) #define SMI_MAX_RETRY_WAIT_DRDY (100) #define SMI_DELAY_MIN (1) #define SMI_DELAY_DEFAULT (200) #define SMI_VALUE_MAX (32767) #define SMI_VALUE_MIN (-32768) #define BYTES_PER_LINE (16) #define BUF_SIZE_PRINT (16) #define SMI_FAST_CALI_TRUE (1) #define SMI_FAST_CALI_ALL_RDY (7) /*! FIFO 1024 byte, max fifo frame count not over 150 */ #define FIFO_FRAME_CNT 170 #define FIFO_DATA_BUFSIZE 1024 #define FRAME_LEN_ACC 6 #define FRAME_LEN_GYRO 6 #define FRAME_LEN_MAG 8 /*! SMI Self test */ #define SMI_SELFTEST_AMP_HIGH 1 /* CMD */ #define CMD_FOC_START 0x03 #define CMD_PMU_ACC_SUSPEND 0x10 #define CMD_PMU_ACC_NORMAL 0x11 #define CMD_PMU_ACC_LP1 0x12 #define CMD_PMU_ACC_LP2 0x13 #define CMD_PMU_GYRO_SUSPEND 0x14 #define CMD_PMU_GYRO_NORMAL 0x15 #define CMD_PMU_GYRO_FASTSTART 0x17 #define CMD_PMU_MAG_SUSPEND 0x18 #define CMD_PMU_MAG_NORMAL 0x19 #define CMD_PMU_MAG_LP1 0x1A #define CMD_PMU_MAG_LP2 0x1B #define CMD_CLR_FIFO_DATA 0xB0 #define CMD_RESET_INT_ENGINE 0xB1 #define CMD_RESET_USER_REG 0xB6 #define USER_DAT_CFG_PAGE 0x00 /*! FIFO Head definition*/ #define FIFO_HEAD_A 0x84 #define FIFO_HEAD_G 0x88 #define FIFO_HEAD_M 0x90 #define FIFO_HEAD_G_A (FIFO_HEAD_G | FIFO_HEAD_A) #define FIFO_HEAD_M_A (FIFO_HEAD_M | FIFO_HEAD_A) #define FIFO_HEAD_M_G (FIFO_HEAD_M | FIFO_HEAD_G) #define FIFO_HEAD_M_G_A (FIFO_HEAD_M | FIFO_HEAD_G | FIFO_HEAD_A) #define FIFO_HEAD_SENSOR_TIME 0x44 #define FIFO_HEAD_SKIP_FRAME 0x40 #define FIFO_HEAD_OVER_READ_LSB 0x80 #define FIFO_HEAD_OVER_READ_MSB 0x00 /*! FIFO head mode Frame bytes number definition */ #define A_BYTES_FRM 6 #define G_BYTES_FRM 6 #define M_BYTES_FRM 8 #define GA_BYTES_FRM 12 #define MG_BYTES_FRM 14 #define MA_BYTES_FRM 14 #define MGA_BYTES_FRM 20 #define ACC_FIFO_HEAD "acc" #define GYRO_FIFO_HEAD "gyro" #define MAG_FIFO_HEAD "mag" /*! Bosch sensor unknown place*/ #define BOSCH_SENSOR_PLACE_UNKNOWN (-1) /*! Bosch sensor remapping table size P0~P7*/ #define MAX_AXIS_REMAP_TAB_SZ 8 #define ENABLE 1 #define DISABLE 0 /* smi sensor HW interrupt pin number */ #define SMI_INT0 0 #define SMI_INT1 1 #define SMI_INT_LEVEL 0 #define SMI_INT_EDGE 1 /*! SMI mag interface */ /* compensated output value returned if sensor had overflow */ #define BMM050_OVERFLOW_OUTPUT -32768 #define BMM050_OVERFLOW_OUTPUT_S32 ((s32)(-2147483647-1)) /* Trim Extended Registers */ #define BMM050_DIG_X1 0x5D #define BMM050_DIG_Y1 0x5E #define BMM050_DIG_Z4_LSB 0x62 #define BMM050_DIG_Z4_MSB 0x63 #define BMM050_DIG_X2 0x64 #define BMM050_DIG_Y2 0x65 #define BMM050_DIG_Z2_LSB 0x68 #define BMM050_DIG_Z2_MSB 0x69 #define BMM050_DIG_Z1_LSB 0x6A #define BMM050_DIG_Z1_MSB 0x6B #define BMM050_DIG_XYZ1_LSB 0x6C #define BMM050_DIG_XYZ1_MSB 0x6D #define BMM050_DIG_Z3_LSB 0x6E #define BMM050_DIG_Z3_MSB 0x6F #define BMM050_DIG_XY2 0x70 #define BMM050_DIG_XY1 0x71 struct smi130mag_compensate_t { signed char dig_x1; signed char dig_y1; signed char dig_x2; signed char dig_y2; u16 dig_z1; s16 dig_z2; s16 dig_z3; s16 dig_z4; unsigned char dig_xy1; signed char dig_xy2; u16 dig_xyz1; }; /*smi fifo sensor type combination*/ enum SMI_FIFO_DATA_SELECT_T { SMI_FIFO_A_SEL = 1, SMI_FIFO_G_SEL, SMI_FIFO_G_A_SEL, SMI_FIFO_M_SEL, SMI_FIFO_M_A_SEL, SMI_FIFO_M_G_SEL, SMI_FIFO_M_G_A_SEL, SMI_FIFO_DATA_SEL_MAX }; /*smi interrupt about step_detector and sgm*/ #define INPUT_EVENT_STEP_DETECTOR 5 #define INPUT_EVENT_SGM 3/*7*/ #define INPUT_EVENT_FAST_ACC_CALIB_DONE 6 #define INPUT_EVENT_FAST_GYRO_CALIB_DONE 4 /*! * Bst sensor common definition, * please give parameters in BSP file. */ struct bosch_sensor_specific { char *name; /* 0 to 7 */ unsigned int place:3; int irq; int (*irq_gpio_cfg)(void); }; /*! smi130 sensor spec of power mode */ struct pw_mode { u8 acc_pm; u8 gyro_pm; u8 mag_pm; }; /*! smi130 sensor spec of odr */ struct odr_t { u8 acc_odr; u8 gyro_odr; u8 mag_odr; }; /*! smi130 sensor spec of range */ struct range_t { u8 acc_range; u8 gyro_range; }; /*! smi130 sensor error status */ struct err_status { u8 fatal_err; u8 err_code; u8 i2c_fail; u8 drop_cmd; u8 mag_drdy_err; u8 err_st_all; }; /*! smi130 fifo frame for all sensors */ struct fifo_frame_t { struct smi130_accel_t *acc_farr; struct smi130_gyro_t *gyro_farr; struct smi130_mag_xyz_s32_t *mag_farr; unsigned char acc_frame_cnt; unsigned char gyro_frame_cnt; unsigned char mag_frame_cnt; u32 acc_lastf_ts; u32 gyro_lastf_ts; u32 mag_lastf_ts; }; /*! smi130 fifo sensor time */ struct fifo_sensor_time_t { u32 acc_ts; u32 gyro_ts; u32 mag_ts; }; struct pedometer_data_t { /*! Fix step detector misinformation for the first time*/ u8 wkar_step_detector_status; u_int32_t last_step_counter_value; }; struct smi_client_data { struct smi130_t device; struct device *dev; struct input_dev *input;/*acc_device*/ struct input_dev *gyro_input; #if defined(CONFIG_USE_QUALCOMM_HAL) struct input_dev *gyro_input; struct sensors_classdev accel_cdev; struct sensors_classdev gyro_cdev; struct delayed_work accel_poll_work; struct delayed_work gyro_poll_work; u32 accel_poll_ms; u32 gyro_poll_ms; u32 accel_latency_ms; u32 gyro_latency_ms; atomic_t accel_en; atomic_t gyro_en; struct workqueue_struct *data_wq; #endif struct delayed_work work; struct work_struct irq_work; u8 chip_id; struct pw_mode pw; struct odr_t odr; struct range_t range; /*TO DO*/ struct err_status err_st; struct pedometer_data_t pedo_data; s8 place; u8 selftest; /*struct wake_lock wakelock;*/ struct delayed_work delay_work_sig; atomic_t in_suspend; atomic_t wkqueue_en; /*TO DO acc gyro mag*/ atomic_t delay; atomic_t selftest_result; u8 fifo_data_sel; u16 fifo_bytecount; u8 fifo_head_en; unsigned char fifo_int_tag_en; struct fifo_frame_t fifo_frame; unsigned char *fifo_data; u64 fifo_time; u8 stc_enable; uint16_t gpio_pin; u8 std; u8 sig_flag; unsigned char calib_status; struct mutex mutex_op_mode; struct mutex mutex_enable; struct bosch_sensor_specific *bosch_pd; int IRQ; int reg_sel; int reg_len; uint64_t timestamp; #ifdef CONFIG_HAS_EARLYSUSPEND struct early_suspend early_suspend_handler; #endif }; /*! * we use a typedef to hide the detail, * because this type might be changed */ struct bosch_sensor_axis_remap { /* src means which source will be mapped to target x, y, z axis */ /* if an target OS axis is remapped from (-)x, * src is 0, sign_* is (-)1 */ /* if an target OS axis is remapped from (-)y, * src is 1, sign_* is (-)1 */ /* if an target OS axis is remapped from (-)z, * src is 2, sign_* is (-)1 */ int src_x:3; int src_y:3; int src_z:3; int sign_x:2; int sign_y:2; int sign_z:2; }; struct bosch_sensor_data { union { int16_t v[3]; struct { int16_t x; int16_t y; int16_t z; }; }; }; s8 smi_burst_read_wrapper(u8 dev_addr, u8 reg_addr, u8 *data, u16 len); int smi_probe(struct smi_client_data *client_data, struct device *dev); int smi_remove(struct device *dev); int smi_suspend(struct device *dev); int smi_resume(struct device *dev); #endif/*_SMI130_DRIVER_H*/ /*@}*/