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