• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }