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