1 /* 2 * Copyright (C) 2015-2021 Alibaba Group Holding Limited 3 */ 4 5 #ifndef __QMP6988_H 6 #define __QMP6988_H 7 #include <stdio.h> 8 #include "aos/hal/i2c.h" 9 #include "hal_iomux_haas1000.h" 10 11 #define QMP6988_SLAVE_ADDRESS_L (0x70) 12 #define QMP6988_SLAVE_ADDRESS_H (0x56) 13 14 #define QMP6988_U16_t unsigned short 15 #define QMP6988_S16_t short 16 #define QMP6988_U32_t unsigned int 17 #define QMP6988_S32_t int 18 #define QMP6988_U64_t unsigned long long 19 #define QMP6988_S64_t long long 20 21 22 #define QMP6988_CHIP_ID 0x5C 23 24 #define QMP6988_CHIP_ID_REG 0xD1 25 #define QMP6988_RESET_REG 0xE0 /* Device reset register */ 26 #define QMP6988_DEVICE_STAT_REG 0xF3 /* Device state register */ 27 #define QMP6988_CTRLMEAS_REG 0xF4 /* Measurement Condition Control Register */ 28 /* data */ 29 #define QMP6988_PRESSURE_MSB_REG 0xF7 /* Pressure MSB Register */ 30 #define QMP6988_TEMPERATURE_MSB_REG 0xFA /* Temperature MSB Reg */ 31 32 /* compensation calculation */ 33 #define QMP6988_CALIBRATION_DATA_START 0xA0 /* QMP6988 compensation coefficients */ 34 #define QMP6988_CALIBRATION_DATA_LENGTH 25 35 36 #define SHIFT_RIGHT_4_POSITION 4 37 #define SHIFT_LEFT_2_POSITION 2 38 #define SHIFT_LEFT_4_POSITION 4 39 #define SHIFT_LEFT_5_POSITION 5 40 #define SHIFT_LEFT_8_POSITION 8 41 #define SHIFT_LEFT_12_POSITION 12 42 #define SHIFT_LEFT_16_POSITION 16 43 44 /* power mode */ 45 #define QMP6988_SLEEP_MODE 0x00 46 #define QMP6988_FORCED_MODE 0x01 47 #define QMP6988_NORMAL_MODE 0x03 48 49 #define QMP6988_CTRLMEAS_REG_MODE__POS 0 50 #define QMP6988_CTRLMEAS_REG_MODE__MSK 0x03 51 #define QMP6988_CTRLMEAS_REG_MODE__LEN 2 52 53 /* oversampling */ 54 #define QMP6988_OVERSAMPLING_SKIPPED 0x00 55 #define QMP6988_OVERSAMPLING_1X 0x01 56 #define QMP6988_OVERSAMPLING_2X 0x02 57 #define QMP6988_OVERSAMPLING_4X 0x03 58 #define QMP6988_OVERSAMPLING_8X 0x04 59 #define QMP6988_OVERSAMPLING_16X 0x05 60 #define QMP6988_OVERSAMPLING_32X 0x06 61 #define QMP6988_OVERSAMPLING_64X 0x07 62 63 64 #define QMP6988_CTRLMEAS_REG_OSRST__POS 5 65 #define QMP6988_CTRLMEAS_REG_OSRST__MSK 0xE0 66 #define QMP6988_CTRLMEAS_REG_OSRST__LEN 3 67 68 69 #define QMP6988_CTRLMEAS_REG_OSRSP__POS 2 70 #define QMP6988_CTRLMEAS_REG_OSRSP__MSK 0x1C 71 #define QMP6988_CTRLMEAS_REG_OSRSP__LEN 3 72 73 74 /* filter */ 75 #define QMP6988_FILTERCOEFF_OFF 0x00 76 #define QMP6988_FILTERCOEFF_2 0x01 77 #define QMP6988_FILTERCOEFF_4 0x02 78 #define QMP6988_FILTERCOEFF_8 0x03 79 #define QMP6988_FILTERCOEFF_16 0x04 80 #define QMP6988_FILTERCOEFF_32 0x05 81 82 83 #define QMP6988_CONFIG_REG 0xF1 /*IIR filter co-efficient setting Register*/ 84 85 #define QMP6988_CONFIG_REG_FILTER__POS 0 86 #define QMP6988_CONFIG_REG_FILTER__MSK 0x07 87 #define QMP6988_CONFIG_REG_FILTER__LEN 3 88 89 90 #define SUBTRACTOR 8388608 91 92 #define QMP6988_CALC_INT 93 94 typedef struct qmp6988_cali_data { 95 QMP6988_S32_t COE_a0; 96 QMP6988_S16_t COE_a1; 97 QMP6988_S16_t COE_a2; 98 QMP6988_S32_t COE_b00; 99 QMP6988_S16_t COE_bt1; 100 QMP6988_S16_t COE_bt2; 101 QMP6988_S16_t COE_bp1; 102 QMP6988_S16_t COE_b11; 103 QMP6988_S16_t COE_bp2; 104 QMP6988_S16_t COE_b12; 105 QMP6988_S16_t COE_b21; 106 QMP6988_S16_t COE_bp3; 107 } qmp6988_cali_data; 108 109 typedef struct qmp6988_fk_data { 110 float a0, b00; 111 float a1, a2, bt1, bt2, bp1, b11, bp2, b12, b21, bp3; 112 } qmp6988_fk_data; 113 114 typedef struct qmp6988_ik_data { 115 QMP6988_S32_t a0, b00; 116 QMP6988_S32_t a1, a2; 117 QMP6988_S64_t bt1, bt2, bp1, b11, bp2, b12, b21, bp3; 118 } qmp6988_ik_data; 119 120 typedef struct qmp6988_data { 121 uint8_t slave; 122 uint8_t chip_id; 123 uint8_t power_mode; 124 float temperature; 125 float pressure; 126 float altitude; 127 qmp6988_cali_data qmp6988_cali; 128 #if defined(QMP6988_CALC_INT) 129 qmp6988_ik_data ik; 130 #else 131 qmp6988_fk_data fk; 132 #endif 133 } qmp6988_data; 134 135 136 extern uint8_t qmp6988_init(qmp6988_data *qmp6988); 137 extern float qmp6988_calc_pressure(qmp6988_data *qmp6988); 138 extern void qmp6988_deinit(void); 139 #endif 140