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