• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "hdf_reset.h"
10 #include "gpio_if.h"
11 #include "hdf_base.h"
12 
13 struct GpioBasedReset {
14     struct HdfReset base;
15     uint8_t resetHoldTime;
16     uint8_t gpioId;
17     uint8_t activeLevel;
18 };
19 
ResetNoManagableReset(struct HdfReset * reset)20 int32_t ResetNoManagableReset(struct HdfReset *reset) {
21     (void)reset;
22     return HDF_FAILURE;
23 }
24 
ReleaseNoManagableReset(struct HdfReset * reset)25 void ReleaseNoManagableReset(struct HdfReset *reset) {
26     if (reset != NULL) {
27         OsalMemFree(reset);
28     }
29 }
30 
ResetGpioBasedReset(struct HdfReset * reset)31 int32_t ResetGpioBasedReset(struct HdfReset *reset) {
32     int ret;
33     struct GpioBasedReset *gpioBasedReset = (struct GpioBasedReset *)reset;
34     if (reset == NULL) {
35         HDF_LOGE("%s:nullptr", __func__);
36         return HDF_FAILURE;
37     }
38     ret = GpioSetDir(gpioBasedReset->gpioId, GPIO_DIR_OUT);
39     if (ret != HDF_SUCCESS) {
40         HDF_LOGE("%s: set dir fail!", __func__);
41         return ret;
42     }
43     ret = GpioWrite(gpioBasedReset->gpioId, gpioBasedReset->activeLevel);
44     if (ret != HDF_SUCCESS) {
45         HDF_LOGE("%s: write active fail! ret=%d", __func__, ret);
46         return ret;
47     }
48     OsalMSleep(gpioBasedReset->resetHoldTime);
49 
50     ret = GpioWrite(gpioBasedReset->gpioId, !gpioBasedReset->activeLevel);
51     if (ret != HDF_SUCCESS) {
52         HDF_LOGE("%s: write deactivate fail! ret=%d", __func__, ret);
53         return ret;
54     }
55     return ret;
56 }
57 
ReleaseGpioBasedReset(struct HdfReset * reset)58 void ReleaseGpioBasedReset(struct HdfReset *reset) {
59     if (reset != NULL) {
60         OsalMemFree(reset);
61     }
62 }
63 
CreateVirtualReset(const struct HdfResetConfig * resetConfig)64 struct HdfReset *CreateVirtualReset(const struct HdfResetConfig *resetConfig) {
65     struct HdfReset *result = NULL;
66     if (resetConfig == NULL) {
67         HDF_LOGE("%s:nullptr", __func__);
68         return NULL;
69     }
70     if (resetConfig->resetType == RESET_TYPE_NOT_MANAGEABLE) {
71         const static struct HdfResetOps noManagableResetOps = {.Reset = ResetNoManagableReset,
72                                                                .Release = ReleaseNoManagableReset};
73         result = (struct HdfReset *)OsalMemCalloc(sizeof(struct HdfReset));
74         result->ops = &noManagableResetOps;
75     } else if (resetConfig->resetType == RESET_TYPE_GPIO) {
76         const static struct HdfResetOps gpioBasedResetOps = {.Reset = ResetGpioBasedReset,
77                                                              .Release = ReleaseGpioBasedReset};
78         struct GpioBasedReset *reset = (struct GpioBasedReset *)OsalMemCalloc(sizeof(struct GpioBasedReset));
79         reset->resetHoldTime = resetConfig->resetHoldTime;
80         reset->gpioId = resetConfig->gpio.gpioId;
81         reset->activeLevel = resetConfig->gpio.activeLevel;
82         reset->base.ops = &gpioBasedResetOps;
83         result = (struct HdfReset *)reset;
84     }
85     return result;
86 }