You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
512 lines
14 KiB
512 lines
14 KiB
/*!
|
|
* @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 <linux/kernel.h>
|
|
#include <linux/unistd.h>
|
|
#include <linux/types.h>
|
|
#include <linux/string.h>
|
|
#else
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include <string.h>
|
|
#endif
|
|
|
|
#include <linux/version.h>
|
|
#include <linux/module.h>
|
|
#include <linux/init.h>
|
|
#include <linux/i2c.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/input.h>
|
|
#include <linux/workqueue.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/time.h>
|
|
#include <linux/ktime.h>
|
|
|
|
#ifdef CONFIG_HAS_EARLYSUSPEND
|
|
#include <linux/earlysuspend.h>
|
|
#endif
|
|
|
|
#include "smi130.h"
|
|
|
|
#if defined(CONFIG_USE_QUALCOMM_HAL)
|
|
#include <linux/sensors.h>
|
|
#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*/
|
|
/*@}*/
|
|
|
|
|