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 #include <securec.h>
10 #include "osal_mem.h"
11 #include "hdf_log.h"
12 #include "input_config.h"
13
14 #define CHECK_PARSER_RET(ret, str) do { \
15 if ((ret) != HDF_SUCCESS) { \
16 HDF_LOGE("%s: %s failed, ret = %d", __func__, str, ret); \
17 return HDF_FAILURE; \
18 } \
19 } while (0)
20
21 #define DEFAULT_I2C_SPEED 400
22 #define DEFAULT_SPI_SPEED 10000
23 #define I2C 0
24 #define SPI 1
25
ParseKeyConfig(const struct DeviceResourceNode * node,KeyChipCfg * config)26 int32_t ParseKeyConfig(const struct DeviceResourceNode *node, KeyChipCfg *config)
27 {
28 int32_t ret;
29 struct DeviceResourceIface *parser = NULL;
30 if (node == NULL || config == NULL) {
31 HDF_LOGE("%s: param is null", __func__);
32 return HDF_FAILURE;
33 }
34
35 parser = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
36 if (parser == NULL) {
37 HDF_LOGE("%s: instance parser failed", __func__);
38 return HDF_FAILURE;
39 }
40
41 const struct DeviceResourceNode *keyNode = node;
42 ret = parser->GetString(keyNode, "keyName", &config->keyName, NULL);
43 CHECK_PARSER_RET(ret, "GetString");
44 ret = parser->GetUint8(keyNode, "inputType", &config->devType, 0);
45 CHECK_PARSER_RET(ret, "GetUint8");
46 ret = parser->GetUint16(keyNode, "gpioNum", &config->gpioNum, 0);
47 CHECK_PARSER_RET(ret, "GetUint16");
48 ret = parser->GetUint16(keyNode, "irqFlag", &config->irqFlag, 0);
49 CHECK_PARSER_RET(ret, "GetUint8");
50 ret = parser->GetUint32(keyNode, "debounceTime", &config->debounceTime, 0);
51 CHECK_PARSER_RET(ret, "GetUint32");
52
53 return HDF_SUCCESS;
54 }
55
ParseEncoderConfig(const struct DeviceResourceNode * node,EncoderCfg * config)56 int32_t ParseEncoderConfig(const struct DeviceResourceNode *node, EncoderCfg *config)
57 {
58 if (node == NULL || config == NULL) {
59 HDF_LOGE("%s: param is null", __func__);
60 return HDF_FAILURE;
61 }
62
63 struct DeviceResourceIface *parser = NULL;
64 parser = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
65 if (parser == NULL) {
66 HDF_LOGE("%s: instance parser failed", __func__);
67 return HDF_FAILURE;
68 }
69
70 const struct DeviceResourceNode *encoderNode = node;
71 int32_t ret = parser->GetUint8(encoderNode, "inputType", &config->devType, 0);
72 CHECK_PARSER_RET(ret, "GetUint8");
73 ret = parser->GetUint16(encoderNode, "gpioClk", &config->gpioClk, 0);
74 CHECK_PARSER_RET(ret, "GetUint16");
75 ret = parser->GetUint16(encoderNode, "gpioDT", &config->gpioData, 0);
76 CHECK_PARSER_RET(ret, "GetUint16");
77 ret = parser->GetUint16(encoderNode, "gpioSW", &config->gpioSW, 0);
78 CHECK_PARSER_RET(ret, "GetUint16");
79
80 return HDF_SUCCESS;
81 }
82
ParseAttr(struct DeviceResourceIface * parser,const struct DeviceResourceNode * attrNode,BoardAttrCfg * attr)83 static int32_t ParseAttr(struct DeviceResourceIface *parser, const struct DeviceResourceNode *attrNode,
84 BoardAttrCfg *attr)
85 {
86 int32_t ret;
87 ret = parser->GetUint8(attrNode, "inputType", &attr->devType, 0);
88 CHECK_PARSER_RET(ret, "GetUint8");
89 ret = parser->GetString(attrNode, "devName", &attr->devName, NULL);
90 CHECK_PARSER_RET(ret, "GetString");
91 ret = parser->GetUint32(attrNode, "solutionX", &attr->resolutionX, 0);
92 CHECK_PARSER_RET(ret, "GetUint32");
93 ret = parser->GetUint32(attrNode, "solutionY", &attr->resolutionY, 0);
94 CHECK_PARSER_RET(ret, "GetUint32");
95 return HDF_SUCCESS;
96 }
97
ParseBus(struct DeviceResourceIface * parser,const struct DeviceResourceNode * busNode,BoardBusCfg * bus)98 static int32_t ParseBus(struct DeviceResourceIface *parser, const struct DeviceResourceNode *busNode, BoardBusCfg *bus)
99 {
100 int32_t ret;
101 ret = parser->GetUint8(busNode, "busType", &bus->busType, 0);
102 CHECK_PARSER_RET(ret, "GetUint8");
103
104 if (bus->busType == I2C) {
105 ret = parser->GetUint8(busNode, "busNum", &bus->i2c.busNum, 0);
106 CHECK_PARSER_RET(ret, "GetUint8");
107 ret = parser->GetUint16(busNode, "clkGpio", &bus->i2c.clkGpio, 0);
108 CHECK_PARSER_RET(ret, "GetUint16");
109 ret = parser->GetUint16(busNode, "dataGpio", &bus->i2c.dataGpio, 0);
110 CHECK_PARSER_RET(ret, "GetUint16");
111 ret = parser->GetUint32Array(busNode, "i2cClkIomux", bus->i2c.i2cClkReg, REG_CONFIG_LEN, 0);
112 CHECK_PARSER_RET(ret, "GetUint32Array");
113 ret = parser->GetUint32Array(busNode, "i2cDataIomux", bus->i2c.i2cDataReg, REG_CONFIG_LEN, 0);
114 CHECK_PARSER_RET(ret, "GetUint32Array");
115 } else if (bus->busType == SPI) {
116 ret = parser->GetUint8(busNode, "busNum", &bus->spi.busNum, 0);
117 CHECK_PARSER_RET(ret, "GetUint8");
118 ret = parser->GetUint16(busNode, "clkGpio", &bus->spi.clkGpio, 0);
119 CHECK_PARSER_RET(ret, "GetUint16");
120 ret = parser->GetUint16(busNode, "csGpio", &bus->spi.csGpio, 0);
121 CHECK_PARSER_RET(ret, "GetUint16");
122 ret = parser->GetUint16(busNode, "misoGpio", &bus->spi.misoGpio, 0);
123 CHECK_PARSER_RET(ret, "GetUint16");
124 ret = parser->GetUint16(busNode, "mosiGpio", &bus->spi.mosiGpio, 0);
125 CHECK_PARSER_RET(ret, "GetUint16");
126 } else {
127 HDF_LOGE("%s: unknown bus type", __func__);
128 }
129 return HDF_SUCCESS;
130 }
131
ParsePins(struct DeviceResourceIface * parser,const struct DeviceResourceNode * pinsNode,BoardPinCfg * pins)132 static int32_t ParsePins(struct DeviceResourceIface *parser, const struct DeviceResourceNode *pinsNode,
133 BoardPinCfg *pins)
134 {
135 int32_t ret;
136 ret = parser->GetUint16(pinsNode, "rstGpio", &pins->rstGpio, 0);
137 CHECK_PARSER_RET(ret, "GetUint16");
138 ret = parser->GetUint16(pinsNode, "intGpio", &pins->intGpio, 0);
139 CHECK_PARSER_RET(ret, "GetUint16");
140 ret = parser->GetUint32Array(pinsNode, "rstRegCfg", pins->rstPinReg, REG_CONFIG_LEN, 0);
141 CHECK_PARSER_RET(ret, "GetUint32Array");
142 ret = parser->GetUint32Array(pinsNode, "intRegCfg", pins->intPinReg, REG_CONFIG_LEN, 0);
143 CHECK_PARSER_RET(ret, "GetUint32Array");
144 return HDF_SUCCESS;
145 }
146
ParsePower(struct DeviceResourceIface * parser,const struct DeviceResourceNode * powerNode,BoardPwrCfg * power)147 static int32_t ParsePower(struct DeviceResourceIface *parser, const struct DeviceResourceNode *powerNode,
148 BoardPwrCfg *power)
149 {
150 int32_t ret;
151 ret = parser->GetUint16(powerNode, "vccType", &power->vcc.pwrType, 0);
152 CHECK_PARSER_RET(ret, "GetUint16");
153 ret = parser->GetUint16(powerNode, "vccNum", &power->vcc.pwrNum, 0);
154 CHECK_PARSER_RET(ret, "GetUint16");
155 ret = parser->GetUint32(powerNode, "vccValue", &power->vcc.pwrValue, 0);
156 CHECK_PARSER_RET(ret, "GetUint32");
157 ret = parser->GetUint16(powerNode, "vciType", &power->vci.pwrType, 0);
158 CHECK_PARSER_RET(ret, "GetUint16");
159 ret = parser->GetUint16(powerNode, "vciNum", &power->vci.pwrNum, 0);
160 CHECK_PARSER_RET(ret, "GetUint16");
161 ret = parser->GetUint32(powerNode, "vciValue", &power->vci.pwrValue, 0);
162 CHECK_PARSER_RET(ret, "GetUint32");
163 return HDF_SUCCESS;
164 }
165
ParseFeature(struct DeviceResourceIface * parser,const struct DeviceResourceNode * featureNode,BoardFeatureCfg * feature)166 static int32_t ParseFeature(struct DeviceResourceIface *parser, const struct DeviceResourceNode *featureNode,
167 BoardFeatureCfg *feature)
168 {
169 int32_t ret;
170 ret = parser->GetUint8(featureNode, "capacitanceTest", &feature->capacitanceTest, 0);
171 CHECK_PARSER_RET(ret, "GetUint8");
172 ret = parser->GetUint8(featureNode, "gestureMode", &feature->gestureMode, 0);
173 CHECK_PARSER_RET(ret, "GetUint8");
174 ret = parser->GetUint8(featureNode, "gloverMOde", &feature->gloverMOde, 0);
175 CHECK_PARSER_RET(ret, "GetUint8");
176 ret = parser->GetUint8(featureNode, "coverMode", &feature->coverMode, 0);
177 CHECK_PARSER_RET(ret, "GetUint8");
178 ret = parser->GetUint8(featureNode, "chargerMode", &feature->chargeMode, 0);
179 CHECK_PARSER_RET(ret, "GetUint8");
180 ret = parser->GetUint8(featureNode, "knuckleMode", &feature->knuckleMode, 0);
181 CHECK_PARSER_RET(ret, "GetUint8");
182 return HDF_SUCCESS;
183 }
184
ParseTouchBoardConfig(const struct DeviceResourceNode * node,TouchBoardCfg * config)185 int32_t ParseTouchBoardConfig(const struct DeviceResourceNode *node, TouchBoardCfg *config)
186 {
187 int32_t ret;
188 struct DeviceResourceIface *parser = NULL;
189
190 if (node == NULL || config == NULL) {
191 HDF_LOGE("%s: input param is null", __func__);
192 return HDF_FAILURE;
193 }
194 parser = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
195 if (parser == NULL) {
196 HDF_LOGE("%s: invalid parser", __func__);
197 return HDF_FAILURE;
198 }
199 config->boardNode = node;
200 const struct DeviceResourceNode *attrNode = parser->GetChildNode(node, "inputAttr");
201 const struct DeviceResourceNode *busNode = parser->GetChildNode(node, "busConfig");
202 const struct DeviceResourceNode *pinsNode = parser->GetChildNode(node, "pinConfig");
203 const struct DeviceResourceNode *powerNode = parser->GetChildNode(node, "powerConfig");
204 const struct DeviceResourceNode *featureNode = parser->GetChildNode(node, "featureConfig");
205 if (attrNode == NULL || busNode == NULL || pinsNode == NULL || powerNode == NULL || featureNode == NULL) {
206 HDF_LOGE("%s: get child node fail!", __func__);
207 return HDF_FAILURE;
208 }
209
210 ret = ParseAttr(parser, attrNode, &config->attr);
211 CHECK_PARSER_RET(ret, "ParseAttr");
212 ret = ParseBus(parser, busNode, &config->bus);
213 CHECK_PARSER_RET(ret, "ParseBus");
214 ret = ParsePins(parser, pinsNode, &config->pins);
215 CHECK_PARSER_RET(ret, "ParsePins");
216 ret = ParsePower(parser, powerNode, &config->power);
217 CHECK_PARSER_RET(ret, "ParsePower");
218 ret = ParseFeature(parser, featureNode, &config->feature);
219 CHECK_PARSER_RET(ret, "ParseFeature");
220 return HDF_SUCCESS;
221 }
222
ParsePowerSequence(struct DeviceResourceIface * parser,const struct DeviceResourceNode * seqNode,ChipPwrSeq * pwrSeq)223 static int32_t ParsePowerSequence(struct DeviceResourceIface *parser, const struct DeviceResourceNode *seqNode,
224 ChipPwrSeq *pwrSeq)
225 {
226 int32_t ret;
227 uint32_t num = parser->GetElemNum(seqNode, "powerOnSeq");
228 pwrSeq->pwrOn.count = num;
229 pwrSeq->pwrOn.buf = (uint32_t *)OsalMemAlloc(sizeof(uint32_t) * num);
230 if (pwrSeq->pwrOn.buf == NULL) {
231 return HDF_FAILURE;
232 }
233 (void)memset_s(pwrSeq->pwrOn.buf, sizeof(uint32_t) * num, 0, sizeof(uint32_t) * num);
234 ret = parser->GetUint32Array(seqNode, "powerOnSeq", pwrSeq->pwrOn.buf, num, 0);
235 CHECK_PARSER_RET(ret, "GetUint32Array");
236
237 pwrSeq->suspend.count = parser->GetElemNum(seqNode, "suspendSeq");
238 num = pwrSeq->suspend.count;
239 pwrSeq->suspend.buf = (uint32_t *)OsalMemAlloc(sizeof(uint32_t) * num);
240 if (pwrSeq->suspend.buf == NULL) {
241 OsalMemFree(pwrSeq->pwrOn.buf);
242 pwrSeq->pwrOn.buf = NULL;
243 return HDF_FAILURE;
244 }
245 (void)memset_s(pwrSeq->suspend.buf, sizeof(uint32_t) * num, 0, sizeof(uint32_t) * num);
246 ret = parser->GetUint32Array(seqNode, "suspendSeq", pwrSeq->suspend.buf, num, 0);
247 CHECK_PARSER_RET(ret, "GetUint32Array");
248
249 pwrSeq->resume.count = parser->GetElemNum(seqNode, "resumeSeq");
250 num = pwrSeq->resume.count;
251 pwrSeq->resume.buf = (uint32_t *)OsalMemAlloc(sizeof(uint32_t) * num);
252 if (pwrSeq->resume.buf == NULL) {
253 OsalMemFree(pwrSeq->pwrOn.buf);
254 pwrSeq->pwrOn.buf = NULL;
255 OsalMemFree(pwrSeq->suspend.buf);
256 pwrSeq->suspend.buf = NULL;
257 return HDF_FAILURE;
258 }
259 (void)memset_s(pwrSeq->resume.buf, sizeof(uint32_t) * num, 0, sizeof(uint32_t) * num);
260 ret = parser->GetUint32Array(seqNode, "resumeSeq", pwrSeq->resume.buf, num, 0);
261 CHECK_PARSER_RET(ret, "GetUint32Array");
262
263 pwrSeq->pwrOff.count = parser->GetElemNum(seqNode, "powerOffSeq");
264 num = pwrSeq->pwrOff.count;
265 pwrSeq->pwrOff.buf = (uint32_t *)OsalMemAlloc(sizeof(uint32_t) * num);
266 if (pwrSeq->pwrOff.buf == NULL) {
267 OsalMemFree(pwrSeq->pwrOn.buf);
268 pwrSeq->pwrOn.buf = NULL;
269 OsalMemFree(pwrSeq->suspend.buf);
270 pwrSeq->suspend.buf = NULL;
271 OsalMemFree(pwrSeq->resume.buf);
272 pwrSeq->resume.buf = NULL;
273 return HDF_FAILURE;
274 }
275 (void)memset_s(pwrSeq->pwrOff.buf, sizeof(uint32_t) * num, 0, sizeof(uint32_t) * num);
276 ret = parser->GetUint32Array(seqNode, "powerOffSeq", pwrSeq->pwrOff.buf, num, 0);
277 CHECK_PARSER_RET(ret, "GetUint32Array");
278
279 return HDF_SUCCESS;
280 }
281
ParseTouchChipConfig(const struct DeviceResourceNode * node,TouchChipCfg * config)282 int32_t ParseTouchChipConfig(const struct DeviceResourceNode *node, TouchChipCfg *config)
283 {
284 int32_t ret;
285 struct DeviceResourceIface *parser = NULL;
286 if (node == NULL || config == NULL) {
287 HDF_LOGE("%s: point is null", __func__);
288 return HDF_FAILURE;
289 }
290 parser = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
291 if (parser == NULL) {
292 HDF_LOGE("%s: instance parser failed", __func__);
293 return HDF_FAILURE;
294 }
295
296 config->chipNode = node;
297 ret = parser->GetString(node, "chipName", &config->chipName, NULL);
298 CHECK_PARSER_RET(ret, "GetString");
299 ret = parser->GetString(node, "vendorName", &config->vendorName, NULL);
300 CHECK_PARSER_RET(ret, "GetString");
301 ret = parser->GetString(node, "chipInfo", &config->chipInfo, NULL);
302 CHECK_PARSER_RET(ret, "GetString");
303 ret = parser->GetUint16(node, "chipVersion", &config->chipVersion, 0);
304 CHECK_PARSER_RET(ret, "GetUint16");
305 ret = parser->GetUint8(node, "busType", &config->bus.busType, 0);
306 CHECK_PARSER_RET(ret, "GetUint8");
307 if (config->bus.busType == I2C) {
308 ret = parser->GetUint16(node, "irqFlag", &config->bus.chipI2c.irqFlag, 0);
309 CHECK_PARSER_RET(ret, "GetUint16");
310 ret = parser->GetUint32(node, "deviceAddr", &config->bus.chipI2c.commAddr, 0);
311 CHECK_PARSER_RET(ret, "GetUint32");
312 ret = parser->GetUint32(node, "maxSpeed", &config->bus.chipI2c.maxSpeed, DEFAULT_I2C_SPEED);
313 CHECK_PARSER_RET(ret, "GetUint32");
314 } else {
315 ret = parser->GetUint16(node, "irqFlag", &config->bus.chipSpi.irqFlag, 0);
316 CHECK_PARSER_RET(ret, "GetUint16");
317 ret = parser->GetUint8(node, "wordMode", &config->bus.chipSpi.wordMode, 0);
318 CHECK_PARSER_RET(ret, "GetUint8");
319 ret = parser->GetUint8(node, "commMode", &config->bus.chipSpi.commMode, 0);
320 CHECK_PARSER_RET(ret, "GetUint8");
321 ret = parser->GetUint32(node, "maxSpeed", &config->bus.chipSpi.maxSpeed, DEFAULT_SPI_SPEED);
322 CHECK_PARSER_RET(ret, "GetUint32");
323 }
324 const struct DeviceResourceNode *pwrSeqNode = parser->GetChildNode(node, "powerSequence");
325 if (pwrSeqNode == NULL) {
326 HDF_LOGE("%s: get powerSequence child node failed", __func__);
327 return HDF_FAILURE;
328 }
329 if (ParsePowerSequence(parser, pwrSeqNode, &config->pwrSeq) != HDF_SUCCESS) {
330 return HDF_FAILURE;
331 }
332 return HDF_SUCCESS;
333 }