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