1 /*
2  * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3  *
4  * HDF is dual licensed: you can use it either under the terms of
5  * the GPL, or the BSD license, at your option.
6  * See the LICENSE file in the root of this repository for complete details.
7  */
8 
9 #ifndef SENSOR_CONFIG_PARSER_H
10 #define SENSOR_CONFIG_PARSER_H
11 
12 #include "device_resource_if.h"
13 #include "hdf_device_desc.h"
14 #include "i2c_if.h"
15 #include "sensor_device_type.h"
16 #include "sensor_platform_if.h"
17 #include "spi_if.h"
18 
19 #define SENSOR_CONFIG_MAX_ITEM 100
20 #define MAX_SENSOR_INDEX_NUM   48
21 #define MAX_SENSOR_AXIS_NUM    3
22 
23 enum SensorRegOpsType {
24     SENSOR_INIT_GROUP = 0,
25     SENSOR_ENABLE_GROUP,
26     SENSOR_DISABLE_GROUP,
27     SENSOR_GROUP_MAX,
28 };
29 
30 struct SensorAttr {
31     const char *chipName;
32     uint16_t chipIdReg;
33     uint16_t chipIdValue;
34 };
35 
36 enum SensorRegCfgIndex {
37     SENSOR_REG_CFG_ADDR_INDEX = 0,
38     SENSOR_REG_CFG_VALUE_INDEX,
39     SENSOR_REG_CFG_MASK_INDEX,
40     SENSOR_REG_CFG_LEN_INDEX,
41     SENSOR_REG_CFG_DELAY_INDEX,
42     SENSOR_REG_CFG_OPS_INDEX,
43     SENSOR_REG_CFG_CAL_INDEX,
44     SENSOR_REG_CFG_SHIFT_INDEX,
45     SENSOR_REG_CFG_DEBUG_INDEX,
46     SENSOR_REG_CFG_SAVE_INDEX,
47     SENSOR_REG_CFG_INDEX_MAX,
48 };
49 
50 struct SensorRegCfg {
51     uint16_t regAddr;
52     union {
53         uint16_t value;
54         uint8_t *buff;
55     };
56     uint16_t mask;
57     uint16_t len;
58     uint32_t delay : 12;
59     uint32_t opsType : 5;
60     uint32_t calType : 3;
61     uint32_t shiftNum : 4;
62     uint32_t debug : 1;
63     uint32_t save : 2;
64 };
65 
66 struct SensorRegCfgGroupNode {
67     uint32_t itemNum;
68     struct SensorRegCfg *regCfgItem;
69 };
70 
71 struct SensorDirection {
72     uint32_t sign[MAX_SENSOR_AXIS_NUM];
73     uint32_t map[MAX_SENSOR_AXIS_NUM];
74 };
75 
76 enum SensorDirectionIndex {
77     SIGN_X_INDEX = 0,
78     SIGN_Y_INDEX,
79     SIGN_Z_INDEX,
80     AXIS_X_INDEX,
81     AXIS_Y_INDEX,
82     AXIS_Z_INDEX,
83     AXIS_INDEX_MAX,
84 };
85 
86 enum AxisNum {
87     AXIS_X = 0,
88     AXIS_Y = 1,
89     AXIS_Z = 2,
90 };
91 
92 struct SensorCfgData {
93     struct SensorBusCfg busCfg;
94     struct SensorBasicInfo sensorInfo;
95     struct SensorAttr sensorAttr;
96     struct SensorRegCfgGroupNode **regCfgGroup;
97     struct SensorRegCfgGroupNode **extendedRegCfgGroup;
98     const struct DeviceResourceNode *root;
99     struct SensorDirection *direction;
100 };
101 
102 int32_t GetSensorBaseConfigData(const struct DeviceResourceNode *node, struct SensorCfgData *config);
103 int32_t ParseSensorRegConfig(struct SensorCfgData *config);
104 void ReleaseSensorAllRegConfig(struct SensorCfgData *config);
105 int32_t GetSensorBusHandle(struct SensorBusCfg *busCfg);
106 int32_t ReleaseSensorBusHandle(struct SensorBusCfg *busCfg);
107 int32_t DetectSensorDevice(struct SensorCfgData *config);
108 int32_t SensorRawDataToRemapData(struct SensorDirection *direction, int32_t *remapData, uint32_t num);
109 void ReleaseSensorDirectionConfig(struct SensorCfgData *config);
110 int32_t ParseSensorDirection(struct SensorCfgData *config);
111 int32_t ParseSensorRegGroup(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regCfgNode,
112     const char *groupName, struct SensorRegCfgGroupNode **groupNode);
113 
114 #endif /* SENSOR_CONFIG_PARSER_H */
115