9
9
10
10
#ifdef CONFIG_ADXL362_STREAM
11
11
12
+ /* (2^31 / 2^8(shift) */
13
+ #define ADXL362_TEMP_QSCALE 8388608
14
+ #define ADXL362_TEMP_LSB_PER_C 15
15
+
12
16
#define ADXL362_COMPLEMENT 0xf000
13
17
14
18
static const uint32_t accel_period_ns [] = {
@@ -20,11 +24,20 @@ static const uint32_t accel_period_ns[] = {
20
24
[ADXL362_ODR_400_HZ ] = UINT32_C (1000000000 ) / 400 ,
21
25
};
22
26
23
- static const int32_t range_to_scale [] = {
24
- /* See table 1 in specifications section of datasheet */
25
- [ADXL362_RANGE_2G ] = ADXL362_ACCEL_2G_LSB_PER_G ,
26
- [ADXL362_RANGE_4G ] = ADXL362_ACCEL_4G_LSB_PER_G ,
27
- [ADXL362_RANGE_8G ] = ADXL362_ACCEL_8G_LSB_PER_G ,
27
+ static const uint32_t range_to_shift [] = {
28
+ [ADXL362_RANGE_2G ] = 5 ,
29
+ [ADXL362_RANGE_4G ] = 6 ,
30
+ [ADXL362_RANGE_8G ] = 7 ,
31
+ };
32
+
33
+ /* (1 / sensitivity) * (pow(2,31) / pow(2,shift)) * (unit_scaler) */
34
+ static const uint32_t qscale_factor [] = {
35
+ /* (1.0 / ADXL362_ACCEL_2G_LSB_PER_G) * (2^31 / 2^5) * SENSOR_G / 1000000 */
36
+ [ADXL362_RANGE_2G ] = UINT32_C (658338 ),
37
+ /* (1.0 / ADXL362_ACCEL_4G_LSB_PER_G) * (2^31 / 2^6) * SENSOR_G / 1000000 */
38
+ [ADXL362_RANGE_4G ] = UINT32_C (658338 ),
39
+ /* (1.0 / ADXL362_ACCEL_8G_LSB_PER_G) * (2^31 / 2^7) ) * SENSOR_G / 1000000 */
40
+ [ADXL362_RANGE_8G ] = UINT32_C (700360 ),
28
41
};
29
42
30
43
static inline void adxl362_temp_convert_q31 (q31_t * out , int16_t data_in )
@@ -36,10 +49,8 @@ static inline void adxl362_temp_convert_q31(q31_t *out, int16_t data_in)
36
49
data_in |= ADXL362_COMPLEMENT ;
37
50
}
38
51
39
- int64_t milli_c = (data_in - ADXL362_TEMP_BIAS_LSB ) * ADXL362_TEMP_MC_PER_LSB +
40
- (ADXL362_TEMP_BIAS_TEST_CONDITION * 1000 );
41
-
42
- * out = CLAMP (((milli_c * 1000 ) + ((milli_c % 1000 ) * 1000 )), INT32_MIN , INT32_MAX );
52
+ * out = ((data_in - ADXL362_TEMP_BIAS_LSB ) / ADXL362_TEMP_LSB_PER_C
53
+ + ADXL362_TEMP_BIAS_TEST_CONDITION ) * ADXL362_TEMP_QSCALE ;
43
54
}
44
55
45
56
static inline void adxl362_accel_convert_q31 (q31_t * out , int16_t data_in , int32_t range )
@@ -50,9 +61,7 @@ static inline void adxl362_accel_convert_q31(q31_t *out, int16_t data_in, int32_
50
61
data_in |= ADXL362_COMPLEMENT ;
51
62
}
52
63
53
- int64_t micro_ms2 = data_in * SENSOR_G / range_to_scale [range ];
54
-
55
- * out = CLAMP ((micro_ms2 + (micro_ms2 % 1000000 )), INT32_MIN , INT32_MAX );
64
+ * out = data_in * qscale_factor [range ];
56
65
}
57
66
58
67
static int adxl362_decode_stream (const uint8_t * buffer , struct sensor_chan_spec chan_spec ,
@@ -102,6 +111,7 @@ static int adxl362_decode_stream(const uint8_t *buffer, struct sensor_chan_spec
102
111
memset (data , 0 , sizeof (struct sensor_three_axis_data ));
103
112
data -> header .base_timestamp_ns = enc_data -> timestamp ;
104
113
data -> header .reading_count = 1 ;
114
+ data -> shift = 8 ;
105
115
106
116
data -> readings [count ].timestamp_delta =
107
117
period_ns * sample_num ;
@@ -121,6 +131,7 @@ static int adxl362_decode_stream(const uint8_t *buffer, struct sensor_chan_spec
121
131
memset (data , 0 , sizeof (struct sensor_three_axis_data ));
122
132
data -> header .base_timestamp_ns = enc_data -> timestamp ;
123
133
data -> header .reading_count = 1 ;
134
+ data -> shift = range_to_shift [enc_data -> selected_range ];
124
135
125
136
switch (chan_spec .chan_type ) {
126
137
case SENSOR_CHAN_ACCEL_X :
0 commit comments