diff options
| author | Akshay <[email protected]> | 2022-04-10 12:13:40 +0100 |
|---|---|---|
| committer | Akshay <[email protected]> | 2022-04-10 12:13:40 +0100 |
| commit | dc90387ce7d8ba7b607d9c48540bf6d8b560f14d (patch) | |
| tree | 4ccb8fa5886b66fa9d480edef74236c27f035e16 /lib/chibios-contrib/ext/mcux-sdk/devices/MIMX8QX5/utilities/fsl_notifier.c | |
Diffstat (limited to 'lib/chibios-contrib/ext/mcux-sdk/devices/MIMX8QX5/utilities/fsl_notifier.c')
| -rw-r--r-- | lib/chibios-contrib/ext/mcux-sdk/devices/MIMX8QX5/utilities/fsl_notifier.c | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/lib/chibios-contrib/ext/mcux-sdk/devices/MIMX8QX5/utilities/fsl_notifier.c b/lib/chibios-contrib/ext/mcux-sdk/devices/MIMX8QX5/utilities/fsl_notifier.c new file mode 100644 index 000000000..7b7c02dc3 --- /dev/null +++ b/lib/chibios-contrib/ext/mcux-sdk/devices/MIMX8QX5/utilities/fsl_notifier.c | |||
| @@ -0,0 +1,209 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Freescale Semiconductor, Inc. | ||
| 3 | * Copyright 2016-2017 NXP | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * SPDX-License-Identifier: BSD-3-Clause | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include "fsl_notifier.h" | ||
| 10 | |||
| 11 | /******************************************************************************* | ||
| 12 | * Definitions | ||
| 13 | ******************************************************************************/ | ||
| 14 | |||
| 15 | /******************************************************************************* | ||
| 16 | * Prototypes | ||
| 17 | ******************************************************************************/ | ||
| 18 | |||
| 19 | /******************************************************************************* | ||
| 20 | * Variables | ||
| 21 | ******************************************************************************/ | ||
| 22 | |||
| 23 | /******************************************************************************* | ||
| 24 | * Code | ||
| 25 | ******************************************************************************/ | ||
| 26 | |||
| 27 | /*! | ||
| 28 | * brief Creates a Notifier handle. | ||
| 29 | * | ||
| 30 | * param notifierHandle A pointer to the notifier handle. | ||
| 31 | * param configs A pointer to an array with references to all configurations which is handled by the Notifier. | ||
| 32 | * param configsNumber Number of configurations. Size of the configuration array. | ||
| 33 | * param callbacks A pointer to an array of callback configurations. | ||
| 34 | * If there are no callbacks to register during Notifier initialization, use NULL value. | ||
| 35 | * param callbacksNumber Number of registered callbacks. Size of the callbacks array. | ||
| 36 | * param userFunction User function. | ||
| 37 | * param userData User data passed to user function. | ||
| 38 | * return An error Code or kStatus_Success. | ||
| 39 | */ | ||
| 40 | status_t NOTIFIER_CreateHandle(notifier_handle_t *notifierHandle, | ||
| 41 | notifier_user_config_t **configs, | ||
| 42 | uint8_t configsNumber, | ||
| 43 | notifier_callback_config_t *callbacks, | ||
| 44 | uint8_t callbacksNumber, | ||
| 45 | notifier_user_function_t userFunction, | ||
| 46 | void *userData) | ||
| 47 | { | ||
| 48 | /* Check input parameter - at least one configuration is required and userFunction must exist */ | ||
| 49 | if ((configs == NULL) || (configsNumber == 0U) || (userFunction == NULL)) | ||
| 50 | { | ||
| 51 | return kStatus_Fail; | ||
| 52 | } | ||
| 53 | /* Initialize handle structure */ | ||
| 54 | (void)memset(notifierHandle, 0, sizeof(notifier_handle_t)); | ||
| 55 | /* Store references to user-defined configurations */ | ||
| 56 | notifierHandle->configsTable = configs; | ||
| 57 | notifierHandle->configsNumber = configsNumber; | ||
| 58 | /* Store references to user-defined callback configurations */ | ||
| 59 | if (callbacks != NULL) | ||
| 60 | { | ||
| 61 | notifierHandle->callbacksTable = callbacks; | ||
| 62 | notifierHandle->callbacksNumber = callbacksNumber; | ||
| 63 | /* If all callbacks return success, then the errorCallbackIndex is callbacksNumber */ | ||
| 64 | notifierHandle->errorCallbackIndex = callbacksNumber; | ||
| 65 | } | ||
| 66 | notifierHandle->userFunction = userFunction; | ||
| 67 | notifierHandle->userData = userData; | ||
| 68 | |||
| 69 | return kStatus_Success; | ||
| 70 | } | ||
| 71 | |||
| 72 | /*! | ||
| 73 | * brief Switches the configuration according to a pre-defined structure. | ||
| 74 | * | ||
| 75 | * This function sets the system to the target configuration. Before transition, | ||
| 76 | * the Notifier sends notifications to all callbacks registered to the callback table. | ||
| 77 | * Callbacks are invoked in the following order: All registered callbacks are notified | ||
| 78 | * ordered by index in the callbacks array. The same order is used for before and after switch notifications. | ||
| 79 | * The notifications before the configuration switch can be used to obtain confirmation about | ||
| 80 | * the change from registered callbacks. If any registered callback denies the | ||
| 81 | * configuration change, further execution of this function depends on the notifier policy: the | ||
| 82 | * configuration change is either forced (kNOTIFIER_PolicyForcible) or exited (kNOTIFIER_PolicyAgreement). | ||
| 83 | * When configuration change is forced, the result of the before switch notifications are ignored. If an | ||
| 84 | * agreement is required, if any callback returns an error code, further notifications | ||
| 85 | * before switch notifications are cancelled and all already notified callbacks are re-invoked. | ||
| 86 | * The index of the callback which returned error code during pre-switch notifications is stored | ||
| 87 | * (any error codes during callbacks re-invocation are ignored) and NOTIFIER_GetErrorCallback() can be used to get it. | ||
| 88 | * Regardless of the policies, if any callback returns an error code, an error code indicating in which phase | ||
| 89 | * the error occurred is returned when NOTIFIER_SwitchConfig() exits. | ||
| 90 | * param notifierHandle pointer to notifier handle | ||
| 91 | * param configIndex Index of the target configuration. | ||
| 92 | * param policy Transaction policy, kNOTIFIER_PolicyAgreement or kNOTIFIER_PolicyForcible. | ||
| 93 | * | ||
| 94 | * return An error code or kStatus_Success. | ||
| 95 | * | ||
| 96 | */ | ||
| 97 | status_t NOTIFIER_SwitchConfig(notifier_handle_t *notifierHandle, uint8_t configIndex, notifier_policy_t policy) | ||
| 98 | { | ||
| 99 | uint8_t currentStaticCallback = 0U; /* Index to array of statically registered call-backs */ | ||
| 100 | status_t returnCode = kStatus_Success; /* Function return */ | ||
| 101 | |||
| 102 | notifier_notification_block_t notifyBlock; /* Callback notification block */ | ||
| 103 | notifier_callback_config_t *callbackConfig; /* Pointer to callback configuration */ | ||
| 104 | |||
| 105 | /* Set errorcallbackindex as callbacksNumber, which means no callback error now */ | ||
| 106 | notifierHandle->errorCallbackIndex = notifierHandle->callbacksNumber; | ||
| 107 | |||
| 108 | /* Requested configuration availability check */ | ||
| 109 | if (configIndex >= notifierHandle->configsNumber) | ||
| 110 | { | ||
| 111 | return kStatus_OutOfRange; | ||
| 112 | } | ||
| 113 | |||
| 114 | /* Initialization of local variables from the Notifier handle structure */ | ||
| 115 | |||
| 116 | notifyBlock.policy = policy; | ||
| 117 | notifyBlock.targetConfig = notifierHandle->configsTable[configIndex]; | ||
| 118 | notifyBlock.notifyType = kNOTIFIER_NotifyBefore; | ||
| 119 | |||
| 120 | /* From all statically registered call-backs... */ | ||
| 121 | for (currentStaticCallback = 0U; currentStaticCallback < notifierHandle->callbacksNumber; currentStaticCallback++) | ||
| 122 | { | ||
| 123 | callbackConfig = &(notifierHandle->callbacksTable[currentStaticCallback]); | ||
| 124 | /* ...notify only those which asked to be called before the configuration switch */ | ||
| 125 | if (((uint32_t)callbackConfig->callbackType & (uint32_t)kNOTIFIER_CallbackBefore) != 0U) | ||
| 126 | { | ||
| 127 | /* In case that call-back returned error code mark it, store the call-back handle and eventually cancel | ||
| 128 | * the configuration switch */ | ||
| 129 | if (callbackConfig->callback(¬ifyBlock, callbackConfig->callbackData) != kStatus_Success) | ||
| 130 | { | ||
| 131 | returnCode = (status_t)kStatus_NOTIFIER_ErrorNotificationBefore; | ||
| 132 | notifierHandle->errorCallbackIndex = currentStaticCallback; | ||
| 133 | /* If not forcing configuration switch, call all already notified call-backs to revert their state | ||
| 134 | * as the switch is canceled */ | ||
| 135 | if (policy != kNOTIFIER_PolicyForcible) | ||
| 136 | { | ||
| 137 | break; | ||
| 138 | } | ||
| 139 | } | ||
| 140 | } | ||
| 141 | } | ||
| 142 | |||
| 143 | /* Set configuration */ | ||
| 144 | |||
| 145 | /* In case that any call-back returned error code and policy doesn't force the configuration set, go to after | ||
| 146 | * switch call-backs */ | ||
| 147 | if ((policy == kNOTIFIER_PolicyForcible) || (returnCode == kStatus_Success)) | ||
| 148 | { | ||
| 149 | returnCode = notifierHandle->userFunction(notifierHandle->configsTable[configIndex], notifierHandle->userData); | ||
| 150 | if (returnCode != kStatus_Success) | ||
| 151 | { | ||
| 152 | return returnCode; | ||
| 153 | } | ||
| 154 | /* Update current configuration index */ | ||
| 155 | notifierHandle->currentConfigIndex = configIndex; | ||
| 156 | notifyBlock.notifyType = kNOTIFIER_NotifyAfter; | ||
| 157 | /* From all statically registered call-backs... */ | ||
| 158 | for (currentStaticCallback = 0U; currentStaticCallback < notifierHandle->callbacksNumber; | ||
| 159 | currentStaticCallback++) | ||
| 160 | { | ||
| 161 | callbackConfig = &(notifierHandle->callbacksTable[currentStaticCallback]); | ||
| 162 | /* ...notify only those which asked to be called after the configuration switch */ | ||
| 163 | if (((uint32_t)callbackConfig->callbackType & (uint32_t)kNOTIFIER_CallbackAfter) != 0U) | ||
| 164 | { | ||
| 165 | /* In case that call-back returned error code mark it and store the call-back handle */ | ||
| 166 | if (callbackConfig->callback(¬ifyBlock, callbackConfig->callbackData) != kStatus_Success) | ||
| 167 | { | ||
| 168 | returnCode = (status_t)kStatus_NOTIFIER_ErrorNotificationAfter; | ||
| 169 | notifierHandle->errorCallbackIndex = currentStaticCallback; | ||
| 170 | if (policy != kNOTIFIER_PolicyForcible) | ||
| 171 | { | ||
| 172 | break; | ||
| 173 | } | ||
| 174 | } | ||
| 175 | } | ||
| 176 | } | ||
| 177 | } | ||
| 178 | else | ||
| 179 | { | ||
| 180 | /* End of unsuccessful switch */ | ||
| 181 | notifyBlock.notifyType = kNOTIFIER_NotifyRecover; | ||
| 182 | while (currentStaticCallback-- > 0U) | ||
| 183 | { | ||
| 184 | callbackConfig = &(notifierHandle->callbacksTable[currentStaticCallback]); | ||
| 185 | if (((uint32_t)callbackConfig->callbackType & (uint32_t)kNOTIFIER_CallbackBefore) != 0U) | ||
| 186 | { | ||
| 187 | (void)callbackConfig->callback(¬ifyBlock, callbackConfig->callbackData); | ||
| 188 | } | ||
| 189 | } | ||
| 190 | } | ||
| 191 | |||
| 192 | return returnCode; | ||
| 193 | } | ||
| 194 | |||
| 195 | /*! | ||
| 196 | * brief This function returns the last failed notification callback. | ||
| 197 | * | ||
| 198 | * This function returns an index of the last callback that failed during the configuration switch while | ||
| 199 | * the last NOTIFIER_SwitchConfig() was called. If the last NOTIFIER_SwitchConfig() call ended successfully | ||
| 200 | * value equal to callbacks number is returned. The returned value represents an index in the array of | ||
| 201 | * static call-backs. | ||
| 202 | * | ||
| 203 | * param notifierHandle Pointer to the notifier handle | ||
| 204 | * return Callback Index of the last failed callback or value equal to callbacks count. | ||
| 205 | */ | ||
| 206 | uint8_t NOTIFIER_GetErrorCallbackIndex(notifier_handle_t *notifierHandle) | ||
| 207 | { | ||
| 208 | return notifierHandle->errorCallbackIndex; | ||
| 209 | } | ||
