1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef __HALINTF_H
18 #define __HALINTF_H
19 #include <stdint.h>
20 #include "toolchain.h"
21 #include "sensType.h"
22 
23 /*
24  * This files contains data structure for HAL and driver / algo to exchange information.
25  */
26 
27 #define APP_TO_SENSOR_HAL_SIZE_MAX      HOSTINTF_SENSOR_DATA_MAX
28 #define APP_TO_SENSOR_HAL_PAYLOAD_MAX \
29         (APP_TO_SENSOR_HAL_DATA_MAX - sizeof(struct AppToSensorHalDataBuffer))
30 #define APP_TO_SENSOR_HAL_TYPE(sensor, subtype) (((sensor) && 0xFF) | (((subtype) & 0x7F) << 8))
31 #define APP_TO_SENSOR_HAL_TYPE_MASK     0x7FFF
32 
33 enum {
34     // gyro sensor calibration:  GyroCalBias
35     HALINTF_TYPE_GYRO_CAL_BIAS = APP_TO_SENSOR_HAL_TYPE(SENS_TYPE_GYRO, 1),
36 
37     // gyro sensor over temperature calibration: GyroOtcData
38     HALINTF_TYPE_GYRO_OTC_DATA = APP_TO_SENSOR_HAL_TYPE(SENS_TYPE_GYRO, 2),
39 
40     // mag sensor calibration: MagCalBias
41     HALINTF_TYPE_MAG_CAL_BIAS = APP_TO_SENSOR_HAL_TYPE(SENS_TYPE_MAG, 1),
42 
43     // mag local field information: MagLocalField
44     HALINTF_TYPE_MAG_LOCAL_FIELD = APP_TO_SENSOR_HAL_TYPE(SENS_TYPE_MAG, 2),
45 
46     // mag sensor spherical calibration: MagSphericalData
47     HALINTF_TYPE_MAG_SPERICAL_DATA = APP_TO_SENSOR_HAL_TYPE(SENS_TYPE_MAG, 3),
48 };
49 
50 SET_PACKED_STRUCT_MODE_ON
51 struct GyroCalBias {
52     int32_t hardwareBias[3];   // unit depending on hardware implementation
53     float softwareBias[3];          // rad/s
54 } ATTRIBUTE_PACKED;
55 SET_PACKED_STRUCT_MODE_OFF
56 
57 SET_PACKED_STRUCT_MODE_ON
58 struct GyroOtcData {
59     float lastOffset[3];    // rad/s
60     float lastTemperature;  // Celsius
61     float sensitivity[3];   // rad/s/K
62     float intercept[3];     // rad/s
63 } ATTRIBUTE_PACKED;
64 SET_PACKED_STRUCT_MODE_OFF
65 
66 SET_PACKED_STRUCT_MODE_ON
67 struct MagCalBias {
68     float bias[3];     // in uT
69 } ATTRIBUTE_PACKED;
70 SET_PACKED_STRUCT_MODE_OFF
71 
72 SET_PACKED_STRUCT_MODE_ON
73 struct MagLocalField {
74     float strength;    // in uT
75     float declination; // in rad
76     float inclination; // in rad
77 } ATTRIBUTE_PACKED;
78 SET_PACKED_STRUCT_MODE_OFF
79 
80 SET_PACKED_STRUCT_MODE_ON
81 struct MagSphericalData {
82     float bias[3];
83     float scale[3];
84     float skew[3];
85 } ATTRIBUTE_PACKED;
86 SET_PACKED_STRUCT_MODE_OFF
87 
88 // data structure for upload bulk data to sensor hal
89 SET_PACKED_STRUCT_MODE_ON
90 struct AppToSensorHalDataPayload {
91     uint8_t size;       // number of bytes in payload data
92     uint8_t reserved;
93     uint16_t type;      // use EVENT_TYPE_BIT_DISCARDABLE to mark discardable update
94     union
95     {
96         uint32_t u[0];
97         int32_t i[0];
98         float f[0];
99         struct GyroCalBias gyroCalBias[0];
100         struct GyroOtcData gyroOtcData[0];
101         struct MagCalBias  magCalBias[0];
102         struct MagLocalField magLocalField[0];
103         struct MagSphericalData magSphericalData[0];
104     };
105 } ATTRIBUTE_PACKED;
106 SET_PACKED_STRUCT_MODE_OFF
107 
108 // buffer data structure with header, header compatible with HostIntfDataBuffer
109 SET_PACKED_STRUCT_MODE_ON
110 struct AppToSensorHalDataBuffer {
111     uint32_t eventType; // placeholder for HostIntfDataBuffer event type field
112     struct AppToSensorHalDataPayload payload;
113 };
114 SET_PACKED_STRUCT_MODE_OFF
115 
116 #endif //__HALINTF_H
117 
118