1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "input_controller.h"
16 #include <stdio.h>
17 #include <unistd.h>
18 #include <malloc.h>
19 #include <securec.h>
20 #include "hdf_io_service_if.h"
21 #include "input_common.h"
22 
23 #define ATTR_SBUF_LEN       1700
24 #define ABILITY_SBUF_LEN    360
25 
26 InputDevManager *GetDevManager(void);
27 
FillSbufData(struct HdfSBuf * data,int32_t cmd,const void * in)28 static bool FillSbufData(struct HdfSBuf *data, int32_t cmd, const void *in)
29 {
30     bool ret = false;
31     switch (cmd) {
32         case SET_PWR_STATUS:
33         case SET_GESTURE_MODE:
34         case RUN_CAPAC_TEST:
35             ret = HdfSbufWriteUint32(data, *(uint32_t *)(in));
36             break;
37         case RUN_EXTRA_CMD:
38             ret = HdfSbufWriteString(data, ((InputExtraCmd *)in)->cmdCode);
39             if (ret) {
40                 ret = HdfSbufWriteString(data, ((InputExtraCmd *)in)->cmdValue);
41             }
42             break;
43         default:
44             HDF_LOGE("%s: unknown cmd", __func__);
45             break;
46     }
47     if (!ret) {
48         HDF_LOGE("%s: cmd = %d sbuf write failed", __func__, cmd);
49     }
50     return ret;
51 }
52 
ReadStrBuf(struct HdfSBuf * reply,void * buf,uint32_t length)53 static bool ReadStrBuf(struct HdfSBuf *reply, void *buf, uint32_t length)
54 {
55     const char *tempStr = NULL;
56     bool ret = false;
57 
58     tempStr = HdfSbufReadString(reply);
59     if (tempStr != NULL) {
60         if (strncpy_s(buf, length, tempStr, strlen(tempStr)) == EOK) {
61             ret = true;
62         } else {
63             HDF_LOGE("%s: strncpy_s fail", __func__);
64         }
65     }
66     return ret;
67 }
68 
ReadAttrBuf(struct HdfSBuf * data,void * attr)69 static bool ReadAttrBuf(struct HdfSBuf *data, void *attr)
70 {
71     uint32_t len = 0;
72     InputDevAttr *tmpAttr = NULL;
73 
74     if (!HdfSbufReadBuffer(data, (const void **)&tmpAttr, &len)) {
75         HDF_LOGE("%s: HdfSbufReadBuffer failed, line: %d", __func__, __LINE__);
76         return false;
77     }
78     if (memcpy_s(attr, sizeof(InputDevAttr), tmpAttr, sizeof(InputDevAttr)) != EOK) {
79         HDF_LOGE("%s: memcpy_s failed, line: %d", __func__, __LINE__);
80         return false;
81     }
82     return true;
83 }
84 
ReadAbilityBuf(struct HdfSBuf * data,void * ability)85 static bool ReadAbilityBuf(struct HdfSBuf *data, void *ability)
86 {
87     uint32_t len = 0;
88     InputDevAbility *tmpAbility = NULL;
89 
90     if (!HdfSbufReadBuffer(data, (const void **)&tmpAbility, &len)) {
91         HDF_LOGE("%s: HdfSbufReadBuffer failed, line: %d", __func__, __LINE__);
92         return false;
93     }
94     if (memcpy_s(ability, sizeof(InputDevAbility), tmpAbility, sizeof(InputDevAbility)) != EOK) {
95         HDF_LOGE("%s: memcpy_s failed, line: %d", __func__, __LINE__);
96         return false;
97     }
98     return true;
99 }
100 
ObtainSbufData(struct HdfSBuf * reply,int32_t cmd,void * out,uint32_t length)101 static bool ObtainSbufData(struct HdfSBuf *reply, int32_t cmd, void *out, uint32_t length)
102 {
103     bool ret = false;
104     uint32_t tempInt = 0;
105     switch (cmd) {
106         case GET_PWR_STATUS:
107         case GET_DEV_TYPE:
108             ret = HdfSbufReadUint32(reply, &tempInt);
109             if (ret) {
110                 *((uint32_t *)out) = tempInt;
111             }
112             break;
113         case GET_CHIP_INFO:
114         case GET_VENDOR_NAME:
115         case GET_CHIP_NAME:
116         case RUN_CAPAC_TEST:
117             ret = ReadStrBuf(reply, out, length);
118             break;
119         case GET_DEV_ATTR:
120             ret = ReadAttrBuf(reply, out);
121             break;
122         case GET_DEV_ABILITY:
123             ret = ReadAbilityBuf(reply, out);
124             break;
125         default:
126             HDF_LOGE("%s: unknown cmd", __func__);
127             break;
128     }
129     if (!ret) {
130         HDF_LOGE("%s: obtain data from sbuf failed", __func__);
131     }
132     return ret;
133 }
134 
InstanceCmdSbuf(struct HdfSBuf ** data,struct HdfSBuf ** reply,int32_t cmd)135 static int32_t InstanceCmdSbuf(struct HdfSBuf **data, struct HdfSBuf **reply, int32_t cmd)
136 {
137     switch (cmd) {
138         case GET_DEV_ATTR:
139             *data = HdfSbufObtainDefaultSize();
140             *reply = HdfSbufTypedObtainCapacity(SBUF_RAW, ATTR_SBUF_LEN);
141             break;
142         case GET_DEV_ABILITY:
143             *data = HdfSbufObtainDefaultSize();
144             *reply = HdfSbufTypedObtainCapacity(SBUF_RAW, ABILITY_SBUF_LEN);
145             break;
146         default:
147             *data = HdfSbufObtainDefaultSize();
148             *reply = HdfSbufObtainDefaultSize();
149             break;
150     }
151 
152     if ((*data == NULL) || (*reply == NULL)) {
153         HDF_LOGE("%s: fail to obtain sbuf", __func__);
154         goto EXIT;
155     }
156     return INPUT_SUCCESS;
157 
158 EXIT:
159     HdfSbufRecycle(*data);
160     HdfSbufRecycle(*reply);
161     *data = NULL;
162     *reply = NULL;
163     return INPUT_FAILURE;
164 }
165 
IoServiceOps(struct HdfIoService * service,int32_t cmd,const void * in,void * out,uint32_t outLen)166 static int32_t IoServiceOps(struct HdfIoService *service, int32_t cmd, const void *in, void *out, uint32_t outLen)
167 {
168     int32_t ret;
169     struct HdfSBuf *data = NULL;
170     struct HdfSBuf *reply = NULL;
171 
172     if (InstanceCmdSbuf(&data, &reply, cmd) != INPUT_SUCCESS) {
173         return INPUT_FAILURE;
174     }
175 
176     if (in != NULL) {
177         if (!FillSbufData(data, cmd, in)) {
178             ret = INPUT_FAILURE;
179             goto EXIT;
180         }
181     }
182     ret = service->dispatcher->Dispatch(&service->object, cmd, data, reply);
183     if (ret != INPUT_SUCCESS) {
184         HDF_LOGE("%s: dispatch fail", __func__);
185         goto EXIT;
186     }
187 
188     if (out != NULL) {
189         if (!ObtainSbufData(reply, cmd, out, outLen)) {
190             ret = INPUT_FAILURE;
191         }
192     }
193 
194 EXIT:
195     HdfSbufRecycle(data);
196     HdfSbufRecycle(reply);
197     return ret;
198 }
199 
SetPowerStatus(uint32_t devIndex,uint32_t status)200 static int32_t SetPowerStatus(uint32_t devIndex, uint32_t status)
201 {
202     DeviceInfoNode *pos = NULL;
203     DeviceInfoNode *next = NULL;
204     InputDevManager *manager = NULL;
205 
206     if ((devIndex >= MAX_INPUT_DEV_NUM) || (status >= INPUT_POWER_STATUS_UNKNOWN)) {
207         HDF_LOGE("%s: invalid param", __func__);
208         return INPUT_INVALID_PARAM;
209     }
210     GET_MANAGER_CHECK_RETURN(manager);
211 
212     pthread_mutex_lock(&manager->mutex);
213     DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) {
214         if (pos->payload.devIndex != devIndex) {
215             continue;
216         }
217         if (IoServiceOps(pos->service, SET_PWR_STATUS, &status, NULL, 0)) {
218             pthread_mutex_unlock(&manager->mutex);
219             HDF_LOGE("%s: set power status failed", __func__);
220             return INPUT_FAILURE;
221         }
222         pthread_mutex_unlock(&manager->mutex);
223         return INPUT_SUCCESS;
224     }
225 
226     pthread_mutex_unlock(&manager->mutex);
227     HDF_LOGE("%s: device%u doesn't exist, can't set power status", __func__, devIndex);
228     return INPUT_FAILURE;
229 }
230 
GetPowerStatus(uint32_t devIndex,uint32_t * status)231 static int32_t GetPowerStatus(uint32_t devIndex, uint32_t *status)
232 {
233     DeviceInfoNode *pos = NULL;
234     DeviceInfoNode *next = NULL;
235     InputDevManager *manager = NULL;
236 
237     if ((devIndex >= MAX_INPUT_DEV_NUM) || (status == NULL)) {
238         HDF_LOGE("%s: invalid param", __func__);
239         return INPUT_INVALID_PARAM;
240     }
241     GET_MANAGER_CHECK_RETURN(manager);
242 
243     pthread_mutex_lock(&manager->mutex);
244     DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) {
245         if (pos->payload.devIndex != devIndex) {
246             continue;
247         }
248         if (IoServiceOps(pos->service, GET_PWR_STATUS, NULL, status, sizeof(uint32_t))) {
249             pthread_mutex_unlock(&manager->mutex);
250             HDF_LOGE("%s: get power status failed", __func__);
251             return INPUT_FAILURE;
252         }
253         if (*status >= INPUT_POWER_STATUS_UNKNOWN) {
254             pthread_mutex_unlock(&manager->mutex);
255             HDF_LOGE("%s: power status is unknown", __func__);
256             return INPUT_FAILURE;
257         }
258         pthread_mutex_unlock(&manager->mutex);
259         return INPUT_SUCCESS;
260     }
261 
262     pthread_mutex_unlock(&manager->mutex);
263     HDF_LOGE("%s: device%u doesn't exist, can't get power status", __func__, devIndex);
264     return INPUT_FAILURE;
265 }
266 
GetDeviceType(uint32_t devIndex,uint32_t * deviceType)267 static int32_t GetDeviceType(uint32_t devIndex, uint32_t *deviceType)
268 {
269     DeviceInfoNode *pos = NULL;
270     DeviceInfoNode *next = NULL;
271     InputDevManager *manager = NULL;
272 
273     if ((devIndex >= MAX_INPUT_DEV_NUM) || (deviceType == NULL)) {
274         HDF_LOGE("%s: invalid param", __func__);
275         return INPUT_INVALID_PARAM;
276     }
277 
278     GET_MANAGER_CHECK_RETURN(manager);
279     pthread_mutex_lock(&manager->mutex);
280     DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) {
281         if (pos->payload.devIndex != devIndex) {
282             continue;
283         }
284         if (IoServiceOps(pos->service, GET_DEV_TYPE, NULL, deviceType, sizeof(uint32_t))) {
285             pthread_mutex_unlock(&manager->mutex);
286             HDF_LOGE("%s: get device type failed", __func__);
287             return INPUT_FAILURE;
288         }
289         if (*deviceType >= INDEV_TYPE_UNKNOWN) {
290             pthread_mutex_unlock(&manager->mutex);
291             HDF_LOGE("%s: device type is unknown", __func__);
292             return INPUT_FAILURE;
293         }
294         pos->payload.devType = *deviceType;
295         pthread_mutex_unlock(&manager->mutex);
296         return INPUT_SUCCESS;
297     }
298 
299     pthread_mutex_unlock(&manager->mutex);
300     HDF_LOGE("%s: device%u doesn't exist, can't get device type", __func__, devIndex);
301     return INPUT_FAILURE;
302 }
303 
GetDevStringInfo(uint32_t devIndex,char * info,uint32_t len,uint32_t lenLimit,int32_t cmd)304 static int32_t GetDevStringInfo(uint32_t devIndex, char *info, uint32_t len, uint32_t lenLimit, int32_t cmd)
305 {
306     DeviceInfoNode *pos = NULL;
307     DeviceInfoNode *next = NULL;
308     InputDevManager *manager = NULL;
309     char *tempInfo = NULL;
310 
311     if ((devIndex >= MAX_INPUT_DEV_NUM) || (info == NULL) || (len < lenLimit)) {
312         HDF_LOGE("%s: invalid param", __func__);
313         return INPUT_INVALID_PARAM;
314     }
315 
316     GET_MANAGER_CHECK_RETURN(manager);
317     pthread_mutex_lock(&manager->mutex);
318     DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) {
319         if (pos->payload.devIndex != devIndex) {
320             continue;
321         }
322         switch (cmd) {
323             case GET_CHIP_NAME:
324                 tempInfo = pos->payload.chipName;
325                 break;
326             case GET_CHIP_INFO:
327                 tempInfo = pos->payload.chipInfo;
328                 break;
329             case GET_VENDOR_NAME:
330                 tempInfo = pos->payload.vendorName;
331                 break;
332             default:
333                 pthread_mutex_unlock(&manager->mutex);
334                 HDF_LOGE("%s: cmd = %d invalid param", __func__, cmd);
335                 return INPUT_FAILURE;
336         }
337 
338         if (IoServiceOps(pos->service, cmd, NULL, tempInfo, lenLimit)) {
339             pthread_mutex_unlock(&manager->mutex);
340             HDF_LOGE("%s: get information fail", __func__);
341             return INPUT_FAILURE;
342         }
343 
344         if (strncpy_s(info, len, tempInfo, lenLimit - 1) != EOK) {
345             pthread_mutex_unlock(&manager->mutex);
346             HDF_LOGE("%s: strncpy_s fail", __func__);
347             return INPUT_FAILURE;
348         }
349 
350         pthread_mutex_unlock(&manager->mutex);
351         HDF_LOGI("%s: device%u get information success", __func__, devIndex);
352         return INPUT_SUCCESS;
353     }
354 
355     pthread_mutex_unlock(&manager->mutex);
356     HDF_LOGE("%s: device%u doesn't exist, can't get information", __func__, devIndex);
357     return INPUT_FAILURE;
358 }
359 
GetChipName(uint32_t devIndex,char * chipName,uint32_t length)360 static int32_t GetChipName(uint32_t devIndex, char *chipName, uint32_t length)
361 {
362     return GetDevStringInfo(devIndex, chipName, length, CHIP_NAME_LEN, GET_CHIP_NAME);
363 }
364 
GetChipInfo(uint32_t devIndex,char * chipInfo,uint32_t length)365 static int32_t GetChipInfo(uint32_t devIndex, char *chipInfo, uint32_t length)
366 {
367     return GetDevStringInfo(devIndex, chipInfo, length, CHIP_INFO_LEN, GET_CHIP_INFO);
368 }
369 
GetVendorName(uint32_t devIndex,char * vendorName,uint32_t length)370 static int32_t GetVendorName(uint32_t devIndex, char *vendorName, uint32_t length)
371 {
372     return GetDevStringInfo(devIndex, vendorName, length, VENDOR_NAME_LEN, GET_VENDOR_NAME);
373 }
374 
SetGestureMode(uint32_t devIndex,uint32_t gestureMode)375 static int32_t SetGestureMode(uint32_t devIndex, uint32_t gestureMode)
376 {
377     DeviceInfoNode *pos = NULL;
378     DeviceInfoNode *next = NULL;
379     InputDevManager *manager = NULL;
380 
381     if (devIndex >= MAX_INPUT_DEV_NUM) {
382         HDF_LOGE("%s: invalid param", __func__);
383         return INPUT_INVALID_PARAM;
384     }
385 
386     GET_MANAGER_CHECK_RETURN(manager);
387     pthread_mutex_lock(&manager->mutex);
388     DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) {
389         if (pos->payload.devIndex != devIndex) {
390             continue;
391         }
392         if (IoServiceOps(pos->service, SET_GESTURE_MODE, &gestureMode, NULL, 0)) {
393             pthread_mutex_unlock(&manager->mutex);
394             HDF_LOGE("%s: set gesture mode failed", __func__);
395             return INPUT_FAILURE;
396         }
397         pthread_mutex_unlock(&manager->mutex);
398         return INPUT_SUCCESS;
399     }
400 
401     pthread_mutex_unlock(&manager->mutex);
402     HDF_LOGE("%s: device%u doesn't exist, can't set gesture mode", __func__, devIndex);
403     return INPUT_FAILURE;
404 }
405 
RunCapacitanceTest(uint32_t devIndex,uint32_t testType,char * result,uint32_t length)406 static int32_t RunCapacitanceTest(uint32_t devIndex, uint32_t testType, char *result, uint32_t length)
407 {
408     DeviceInfoNode *pos = NULL;
409     DeviceInfoNode *next = NULL;
410     InputDevManager *manager = NULL;
411     CapacitanceTestInfo testInfo;
412 
413     if (devIndex >= (MAX_INPUT_DEV_NUM) || (testType >= TEST_TYPE_UNKNOWN) ||
414         (result == NULL) || (length < SELF_TEST_RESULT_LEN)) {
415         HDF_LOGE("%s: invalid param", __func__);
416         return INPUT_INVALID_PARAM;
417     }
418 
419     (void)memset_s(&testInfo, sizeof(CapacitanceTestInfo), 0, sizeof(CapacitanceTestInfo));
420     testInfo.testType = testType;
421     GET_MANAGER_CHECK_RETURN(manager);
422     pthread_mutex_lock(&manager->mutex);
423     DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) {
424         if (pos->payload.devIndex != devIndex) {
425             continue;
426         }
427         if (IoServiceOps(pos->service, RUN_CAPAC_TEST, &testInfo.testType, testInfo.testResult, SELF_TEST_RESULT_LEN)) {
428             pthread_mutex_unlock(&manager->mutex);
429             HDF_LOGE("%s: run capacitance test failed", __func__);
430             return INPUT_FAILURE;
431         }
432 
433         if (strncpy_s(result, length, testInfo.testResult, SELF_TEST_RESULT_LEN - 1) != EOK) {
434             pthread_mutex_unlock(&manager->mutex);
435             HDF_LOGE("%s: strncpy_s fail", __func__);
436             return INPUT_FAILURE;
437         }
438         pthread_mutex_unlock(&manager->mutex);
439         HDF_LOGI("%s: capacitance test result is %s", __func__, result);
440         return INPUT_SUCCESS;
441     }
442 
443     pthread_mutex_unlock(&manager->mutex);
444     HDF_LOGE("%s: device%u doesn't exist, can't run capacitance test", __func__, devIndex);
445     return INPUT_FAILURE;
446 }
447 
RunExtraCommand(uint32_t devIndex,InputExtraCmd * cmdInfo)448 static int32_t RunExtraCommand(uint32_t devIndex, InputExtraCmd *cmdInfo)
449 {
450     DeviceInfoNode *pos = NULL;
451     DeviceInfoNode *next = NULL;
452     InputDevManager *manager = NULL;
453 
454     if ((devIndex >= MAX_INPUT_DEV_NUM) || (cmdInfo == NULL) || (cmdInfo->cmdCode == NULL) ||
455         (cmdInfo->cmdValue == NULL)) {
456         HDF_LOGE("%s: invalid param", __func__);
457         return INPUT_INVALID_PARAM;
458     }
459 
460     GET_MANAGER_CHECK_RETURN(manager);
461     pthread_mutex_lock(&manager->mutex);
462     DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) {
463         if (pos->payload.devIndex != devIndex) {
464             continue;
465         }
466         if (IoServiceOps(pos->service, RUN_EXTRA_CMD, cmdInfo, NULL, 0)) {
467             pthread_mutex_unlock(&manager->mutex);
468             HDF_LOGE("%s: run extra cmd failed", __func__);
469             return INPUT_FAILURE;
470         }
471         pthread_mutex_unlock(&manager->mutex);
472         return INPUT_SUCCESS;
473     }
474 
475     pthread_mutex_unlock(&manager->mutex);
476     HDF_LOGE("%s: device%d doesn't exist, can't run extra cmd", __func__, devIndex);
477     return INPUT_FAILURE;
478 }
479 
GetDeviceAbility(uint32_t devIndex,InputDevAbility * ability)480 static int32_t GetDeviceAbility(uint32_t devIndex, InputDevAbility *ability)
481 {
482     DeviceInfoNode *pos = NULL;
483     DeviceInfoNode *next = NULL;
484     InputDevManager *manager = NULL;
485 
486     if (devIndex >= MAX_INPUT_DEV_NUM) {
487         HDF_LOGE("%s: invalid param", __func__);
488         return INPUT_INVALID_PARAM;
489     }
490     GET_MANAGER_CHECK_RETURN(manager);
491 
492     pthread_mutex_lock(&manager->mutex);
493     DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) {
494         if (pos->payload.devIndex != devIndex) {
495             continue;
496         }
497         if (IoServiceOps(pos->service, GET_DEV_ABILITY, NULL, ability, sizeof(InputDevAbility))) {
498             pthread_mutex_unlock(&manager->mutex);
499             HDF_LOGE("%s: get dev ability failed", __func__);
500             return INPUT_FAILURE;
501         }
502 
503         if (memcpy_s(&pos->payload.abilitySet, sizeof(InputDevAbility), ability, sizeof(InputDevAbility)) != EOK) {
504             HDF_LOGE("%s: memcpy_s failed in getting ability, line: %d", __func__, __LINE__);
505             pthread_mutex_unlock(&manager->mutex);
506             return INPUT_FAILURE;
507         }
508         pthread_mutex_unlock(&manager->mutex);
509         return INPUT_SUCCESS;
510     }
511     pthread_mutex_unlock(&manager->mutex);
512     HDF_LOGE("%s: device%u doesn't exist, can't get dev ability", __func__, devIndex);
513     return INPUT_FAILURE;
514 }
515 
UpdateAbilityInfo(uint32_t devIndex)516 static int32_t UpdateAbilityInfo(uint32_t devIndex)
517 {
518     int32_t ret;
519     DeviceInfoNode node;
520 
521     ret = GetDeviceAbility(devIndex, &node.payload.abilitySet);
522     INPUT_CHECK_RETURN(ret);
523     return INPUT_SUCCESS;
524 }
525 
GetDeviceAttr(uint32_t devIndex,InputDevAttr * attr)526 static int32_t GetDeviceAttr(uint32_t devIndex, InputDevAttr *attr)
527 {
528     DeviceInfoNode *pos = NULL;
529     DeviceInfoNode *next = NULL;
530     InputDevManager *manager = NULL;
531 
532     if (devIndex >= MAX_INPUT_DEV_NUM) {
533         HDF_LOGE("%s: invalid param", __func__);
534         return INPUT_INVALID_PARAM;
535     }
536     GET_MANAGER_CHECK_RETURN(manager);
537     pthread_mutex_lock(&manager->mutex);
538     DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) {
539         if (pos->payload.devIndex != devIndex) {
540             continue;
541         }
542 
543         if (IoServiceOps(pos->service, GET_DEV_ATTR, NULL, attr, sizeof(InputDevAttr))) {
544             pthread_mutex_unlock(&manager->mutex);
545             HDF_LOGE("%s: get dev attr failed", __func__);
546             return INPUT_FAILURE;
547         }
548 
549         if (memcpy_s(&pos->payload.attrSet, sizeof(InputDevAttr), attr, sizeof(InputDevAttr)) != EOK) {
550             HDF_LOGE("%s: memcpy_s failed in getting attr", __func__);
551             pthread_mutex_unlock(&manager->mutex);
552             return INPUT_FAILURE;
553         }
554         pthread_mutex_unlock(&manager->mutex);
555         return INPUT_SUCCESS;
556     }
557     pthread_mutex_unlock(&manager->mutex);
558     HDF_LOGE("%s: device%u doesn't exist, can't get dev attr", __func__, devIndex);
559     return INPUT_FAILURE;
560 }
561 
UpdateAttrInfo(uint32_t devIndex)562 static int32_t UpdateAttrInfo(uint32_t devIndex)
563 {
564     int32_t ret;
565     DeviceInfoNode node;
566 
567     ret = GetDeviceAttr(devIndex, &node.payload.attrSet);
568     INPUT_CHECK_RETURN(ret);
569     return INPUT_SUCCESS;
570 }
571 
UpdateDevBaseInfo(uint32_t devIndex)572 static int32_t UpdateDevBaseInfo(uint32_t devIndex)
573 {
574     int32_t ret;
575     DeviceInfoNode node;
576 
577     ret = GetDeviceType(devIndex, &node.payload.devType);
578     INPUT_CHECK_RETURN(ret);
579     ret = GetChipName(devIndex, &node.payload.chipInfo[0], CHIP_INFO_LEN);
580     INPUT_CHECK_RETURN(ret);
581     ret = GetChipInfo(devIndex, &node.payload.vendorName[0], VENDOR_NAME_LEN);
582     INPUT_CHECK_RETURN(ret);
583     ret = GetVendorName(devIndex, &node.payload.chipName[0], CHIP_NAME_LEN);
584     INPUT_CHECK_RETURN(ret);
585     return INPUT_SUCCESS;
586 }
587 
UpdateDevFullInfo(uint32_t devIndex)588 int32_t UpdateDevFullInfo(uint32_t devIndex)
589 {
590     int32_t ret = UpdateDevBaseInfo(devIndex);
591     INPUT_CHECK_RETURN(ret);
592     ret = UpdateAbilityInfo(devIndex);
593     INPUT_CHECK_RETURN(ret);
594     ret = UpdateAttrInfo(devIndex);
595     INPUT_CHECK_RETURN(ret);
596     return INPUT_SUCCESS;
597 }
598 
InstanceControllerHdi(InputController ** controller)599 int32_t InstanceControllerHdi(InputController **controller)
600 {
601     InputController *controllerHdi = (InputController *)malloc(sizeof(InputController));
602     if (controllerHdi == NULL) {
603         HDF_LOGE("%s: malloc fail", __func__);
604         return INPUT_NOMEM;
605     }
606 
607     (void)memset_s(controllerHdi, sizeof(InputController), 0, sizeof(InputController));
608 
609     controllerHdi->GetDeviceType = GetDeviceType;
610     controllerHdi->SetPowerStatus = SetPowerStatus;
611     controllerHdi->GetPowerStatus = GetPowerStatus;
612     controllerHdi->GetChipInfo = GetChipInfo;
613     controllerHdi->GetVendorName = GetVendorName;
614     controllerHdi->GetChipName = GetChipName;
615     controllerHdi->SetGestureMode = SetGestureMode;
616     controllerHdi->RunCapacitanceTest = RunCapacitanceTest;
617     controllerHdi->RunExtraCommand = RunExtraCommand;
618     *controller = controllerHdi;
619     return INPUT_SUCCESS;
620 }
621