Example

Dependencies:   FXAS21002 FXOS8700Q

Committer:
maygup01
Date:
Tue Nov 19 09:49:38 2019 +0000
Revision:
0:11cc2b7889af
Example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maygup01 0:11cc2b7889af 1 // ----------------------------------------------------------------------------
maygup01 0:11cc2b7889af 2 // Copyright 2016-2017 ARM Ltd.
maygup01 0:11cc2b7889af 3 //
maygup01 0:11cc2b7889af 4 // SPDX-License-Identifier: Apache-2.0
maygup01 0:11cc2b7889af 5 //
maygup01 0:11cc2b7889af 6 // Licensed under the Apache License, Version 2.0 (the "License");
maygup01 0:11cc2b7889af 7 // you may not use this file except in compliance with the License.
maygup01 0:11cc2b7889af 8 // You may obtain a copy of the License at
maygup01 0:11cc2b7889af 9 //
maygup01 0:11cc2b7889af 10 // http://www.apache.org/licenses/LICENSE-2.0
maygup01 0:11cc2b7889af 11 //
maygup01 0:11cc2b7889af 12 // Unless required by applicable law or agreed to in writing, software
maygup01 0:11cc2b7889af 13 // distributed under the License is distributed on an "AS IS" BASIS,
maygup01 0:11cc2b7889af 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
maygup01 0:11cc2b7889af 15 // See the License for the specific language governing permissions and
maygup01 0:11cc2b7889af 16 // limitations under the License.
maygup01 0:11cc2b7889af 17 // ----------------------------------------------------------------------------
maygup01 0:11cc2b7889af 18
maygup01 0:11cc2b7889af 19 #include "update-client-hub/update_client_hub.h"
maygup01 0:11cc2b7889af 20
maygup01 0:11cc2b7889af 21 #include "update-client-common/arm_uc_common.h"
maygup01 0:11cc2b7889af 22 #include "update-client-control-center/arm_uc_control_center.h"
maygup01 0:11cc2b7889af 23 #include "update-client-control-center/arm_uc_pre_shared_key.h"
maygup01 0:11cc2b7889af 24 #include "update-client-control-center/arm_uc_certificate.h"
maygup01 0:11cc2b7889af 25 #include "update-client-source-manager/arm_uc_source_manager.h"
maygup01 0:11cc2b7889af 26 #include "update-client-firmware-manager/arm_uc_firmware_manager.h"
maygup01 0:11cc2b7889af 27 #include "update-client-manifest-manager/update-client-manifest-manager.h"
maygup01 0:11cc2b7889af 28
maygup01 0:11cc2b7889af 29 #include "update_client_hub_state_machine.h"
maygup01 0:11cc2b7889af 30 #include "update_client_hub_event_handlers.h"
maygup01 0:11cc2b7889af 31 #include "update_client_hub_error_handler.h"
maygup01 0:11cc2b7889af 32
maygup01 0:11cc2b7889af 33 #include "pal4life-device-identity/pal_device_identity.h"
maygup01 0:11cc2b7889af 34
maygup01 0:11cc2b7889af 35 #define HANDLE_INIT_ERROR(retval, msg, ...)\
maygup01 0:11cc2b7889af 36 if (retval.error != ERR_NONE)\
maygup01 0:11cc2b7889af 37 {\
maygup01 0:11cc2b7889af 38 ARM_UC_HUB_setState(ARM_UC_HUB_STATE_UNINITIALIZED);\
maygup01 0:11cc2b7889af 39 UC_HUB_ERR_MSG(msg " error code %s", ##__VA_ARGS__, ARM_UC_err2Str(retval));\
maygup01 0:11cc2b7889af 40 return retval;\
maygup01 0:11cc2b7889af 41 }
maygup01 0:11cc2b7889af 42
maygup01 0:11cc2b7889af 43 static const ARM_UPDATE_SOURCE **arm_uc_sources = NULL;
maygup01 0:11cc2b7889af 44 static uint8_t arm_uc_sources_size = 0;
maygup01 0:11cc2b7889af 45 extern arm_uc_mmContext_t *pManifestManagerContext;
maygup01 0:11cc2b7889af 46
maygup01 0:11cc2b7889af 47 /**
maygup01 0:11cc2b7889af 48 * @brief Handle any errors posted by the scheduler.
maygup01 0:11cc2b7889af 49 * @details This explicitly runs *not* in interrupt context, the scheduler has a dedicated
maygup01 0:11cc2b7889af 50 * callback structure to ensure it can post at least this event.
maygup01 0:11cc2b7889af 51 * ARM_UC_HUB_ErrorHandler() will invoke the HUB callback that was set up.
maygup01 0:11cc2b7889af 52 * It is up to the external application to go about inducing a reset etc,
maygup01 0:11cc2b7889af 53 * if that is what it decides. Note that the HUB is no longer operable
maygup01 0:11cc2b7889af 54 * and the app should probably Uninitialize it and report an error.
maygup01 0:11cc2b7889af 55 * However, the HUB will attempt some cleanup after it returns.
maygup01 0:11cc2b7889af 56 * @param an_event the type of the event causing the error callback.
maygup01 0:11cc2b7889af 57 * The only possible errors from the scheduler are currently:
maygup01 0:11cc2b7889af 58 * ARM_UC_EQ_ERR_POOL_EXHAUSTED
maygup01 0:11cc2b7889af 59 * ARM_UC_EQ_ERR_FAILED_TAKE
maygup01 0:11cc2b7889af 60 * These are passed on to the Hub error handler as an internal error,
maygup01 0:11cc2b7889af 61 * and the hub state is now considered unknown from this perspective.
maygup01 0:11cc2b7889af 62 * (An internal error is considered fatal by the hub.)
maygup01 0:11cc2b7889af 63 */
maygup01 0:11cc2b7889af 64 void UC_HUB_scheduler_error_handler(uint32_t an_event)
maygup01 0:11cc2b7889af 65 {
maygup01 0:11cc2b7889af 66 UC_HUB_ERR_MSG("scheduler error: %" PRIu32, an_event);
maygup01 0:11cc2b7889af 67 ARM_UC_HUB_ErrorHandler(HUB_ERR_INTERNAL_ERROR, ARM_UC_HUB_getState());
maygup01 0:11cc2b7889af 68 }
maygup01 0:11cc2b7889af 69
maygup01 0:11cc2b7889af 70 /**
maygup01 0:11cc2b7889af 71 * @brief Call initialiser of all components of the client.
maygup01 0:11cc2b7889af 72 * finish asynchronously, will invoke callback when initialization is done.
maygup01 0:11cc2b7889af 73 * @param init_cb the callback to be invoked at the end of initialization.
maygup01 0:11cc2b7889af 74 */
maygup01 0:11cc2b7889af 75 arm_uc_error_t ARM_UC_HUB_Initialize(void (*init_cb)(uintptr_t))
maygup01 0:11cc2b7889af 76 {
maygup01 0:11cc2b7889af 77 arm_uc_error_t retval;
maygup01 0:11cc2b7889af 78
maygup01 0:11cc2b7889af 79 if (ARM_UC_HUB_getState() != ARM_UC_HUB_STATE_UNINITIALIZED) {
maygup01 0:11cc2b7889af 80 UC_HUB_ERR_MSG("Already Initialized/Initializing");
maygup01 0:11cc2b7889af 81 return (arm_uc_error_t) { ERR_INVALID_STATE };
maygup01 0:11cc2b7889af 82 }
maygup01 0:11cc2b7889af 83 ARM_UC_HUB_setState(ARM_UC_HUB_STATE_INITIALIZING);
maygup01 0:11cc2b7889af 84
maygup01 0:11cc2b7889af 85 ARM_UC_SchedulerInit();
maygup01 0:11cc2b7889af 86 ARM_UC_HUB_setInitializationCallback(init_cb);
maygup01 0:11cc2b7889af 87 ARM_UC_SetSchedulerErrorHandler(UC_HUB_scheduler_error_handler);
maygup01 0:11cc2b7889af 88
maygup01 0:11cc2b7889af 89 /* Register event handler with Control Center. */
maygup01 0:11cc2b7889af 90 retval = ARM_UC_ControlCenter_Initialize(ARM_UC_HUB_ControlCenterEventHandler);
maygup01 0:11cc2b7889af 91 HANDLE_INIT_ERROR(retval, "Control Center init failed")
maygup01 0:11cc2b7889af 92
maygup01 0:11cc2b7889af 93 /* Register event handler with Firmware Manager */
maygup01 0:11cc2b7889af 94 retval = ARM_UC_FirmwareManager.Initialize(ARM_UC_HUB_FirmwareManagerEventHandler);
maygup01 0:11cc2b7889af 95 HANDLE_INIT_ERROR(retval, "Firmware Manager init failed")
maygup01 0:11cc2b7889af 96
maygup01 0:11cc2b7889af 97 /* Register event handler with Source Manager */
maygup01 0:11cc2b7889af 98 retval = ARM_UC_SourceManager.Initialize(ARM_UC_HUB_SourceManagerEventHandler);
maygup01 0:11cc2b7889af 99 HANDLE_INIT_ERROR(retval, "Source Manager init failed")
maygup01 0:11cc2b7889af 100
maygup01 0:11cc2b7889af 101 for (uint8_t index = 0; index < arm_uc_sources_size; index++) {
maygup01 0:11cc2b7889af 102 ARM_UC_SourceManager.AddSource(arm_uc_sources[index]);
maygup01 0:11cc2b7889af 103 }
maygup01 0:11cc2b7889af 104
maygup01 0:11cc2b7889af 105 /* Register event handler and add config store implementation to manifest
maygup01 0:11cc2b7889af 106 manager.
maygup01 0:11cc2b7889af 107 */
maygup01 0:11cc2b7889af 108 retval = ARM_UC_mmInit(&pManifestManagerContext,
maygup01 0:11cc2b7889af 109 ARM_UC_HUB_ManifestManagerEventHandler,
maygup01 0:11cc2b7889af 110 NULL);
maygup01 0:11cc2b7889af 111 HANDLE_INIT_ERROR(retval, "Manifest manager init failed")
maygup01 0:11cc2b7889af 112
maygup01 0:11cc2b7889af 113 /* add hard coded certificates to the manifest manager */
maygup01 0:11cc2b7889af 114 // retval = ARM_UC_mmStoreCertificate(CA_PATH, cert, CERT_SIZE);
maygup01 0:11cc2b7889af 115 // if ((retval.error != ERR_NONE) && (retval.code != MFST_ERR_PENDING))
maygup01 0:11cc2b7889af 116 // {
maygup01 0:11cc2b7889af 117 // HANDLE_INIT_ERROR(retval, "Manifest manager StoreCertificate failed")
maygup01 0:11cc2b7889af 118 // }
maygup01 0:11cc2b7889af 119
maygup01 0:11cc2b7889af 120 return (arm_uc_error_t) { ERR_NONE };
maygup01 0:11cc2b7889af 121 }
maygup01 0:11cc2b7889af 122
maygup01 0:11cc2b7889af 123 /**
maygup01 0:11cc2b7889af 124 * @brief Process events in the event queue.
maygup01 0:11cc2b7889af 125 */
maygup01 0:11cc2b7889af 126 arm_uc_error_t ARM_UC_HUB_ProcessEvents()
maygup01 0:11cc2b7889af 127 {
maygup01 0:11cc2b7889af 128 ARM_UC_ProcessQueue();
maygup01 0:11cc2b7889af 129
maygup01 0:11cc2b7889af 130 return (arm_uc_error_t) { ERR_NONE };
maygup01 0:11cc2b7889af 131 }
maygup01 0:11cc2b7889af 132
maygup01 0:11cc2b7889af 133 /**
maygup01 0:11cc2b7889af 134 * @brief Register callback function for when callbacks are added to an empty queue.
maygup01 0:11cc2b7889af 135 */
maygup01 0:11cc2b7889af 136 arm_uc_error_t ARM_UC_HUB_AddNotificationHandler(void (*handler)(void))
maygup01 0:11cc2b7889af 137 {
maygup01 0:11cc2b7889af 138 ARM_UC_AddNotificationHandler(handler);
maygup01 0:11cc2b7889af 139
maygup01 0:11cc2b7889af 140 return (arm_uc_error_t) { ERR_NONE };
maygup01 0:11cc2b7889af 141 }
maygup01 0:11cc2b7889af 142
maygup01 0:11cc2b7889af 143 /**
maygup01 0:11cc2b7889af 144 * @brief Add source to the Update Client.
maygup01 0:11cc2b7889af 145 */
maygup01 0:11cc2b7889af 146 arm_uc_error_t ARM_UC_HUB_SetSources(const ARM_UPDATE_SOURCE *sources[],
maygup01 0:11cc2b7889af 147 uint8_t size)
maygup01 0:11cc2b7889af 148 {
maygup01 0:11cc2b7889af 149 arm_uc_sources = sources;
maygup01 0:11cc2b7889af 150 arm_uc_sources_size = size;
maygup01 0:11cc2b7889af 151
maygup01 0:11cc2b7889af 152 return (arm_uc_error_t) { ERR_NONE };
maygup01 0:11cc2b7889af 153 }
maygup01 0:11cc2b7889af 154
maygup01 0:11cc2b7889af 155 /**
maygup01 0:11cc2b7889af 156 * Set PAAL Update implementation
maygup01 0:11cc2b7889af 157 */
maygup01 0:11cc2b7889af 158 arm_uc_error_t ARM_UC_HUB_SetStorage(const ARM_UC_PAAL_UPDATE *implementation)
maygup01 0:11cc2b7889af 159 {
maygup01 0:11cc2b7889af 160 return ARM_UCP_SetPAALUpdate(implementation);
maygup01 0:11cc2b7889af 161 }
maygup01 0:11cc2b7889af 162
maygup01 0:11cc2b7889af 163 /**
maygup01 0:11cc2b7889af 164 * @brief Add monitor to the control center.
maygup01 0:11cc2b7889af 165 */
maygup01 0:11cc2b7889af 166 arm_uc_error_t ARM_UC_HUB_AddMonitor(const ARM_UPDATE_MONITOR *monitor)
maygup01 0:11cc2b7889af 167 {
maygup01 0:11cc2b7889af 168 return ARM_UC_ControlCenter_AddMonitor(monitor);
maygup01 0:11cc2b7889af 169 }
maygup01 0:11cc2b7889af 170
maygup01 0:11cc2b7889af 171 /**
maygup01 0:11cc2b7889af 172 * @brief Temporary error reporting function.
maygup01 0:11cc2b7889af 173 */
maygup01 0:11cc2b7889af 174 void ARM_UC_HUB_AddErrorCallback(void (*callback)(int32_t error))
maygup01 0:11cc2b7889af 175 {
maygup01 0:11cc2b7889af 176 ARM_UC_HUB_AddErrorCallbackInternal(callback);
maygup01 0:11cc2b7889af 177 }
maygup01 0:11cc2b7889af 178
maygup01 0:11cc2b7889af 179 /**
maygup01 0:11cc2b7889af 180 * @brief Authorize request.
maygup01 0:11cc2b7889af 181 */
maygup01 0:11cc2b7889af 182 arm_uc_error_t ARM_UC_Authorize(arm_uc_request_t request)
maygup01 0:11cc2b7889af 183 {
maygup01 0:11cc2b7889af 184 return ARM_UC_ControlCenter_Authorize(request);
maygup01 0:11cc2b7889af 185 }
maygup01 0:11cc2b7889af 186
maygup01 0:11cc2b7889af 187 /**
maygup01 0:11cc2b7889af 188 * @brief Set callback for receiving download progress.
maygup01 0:11cc2b7889af 189 * @details User application call for setting callback handler.
maygup01 0:11cc2b7889af 190 * The callback function takes the progreess in percent as argument.
maygup01 0:11cc2b7889af 191 *
maygup01 0:11cc2b7889af 192 * @param callback Function pointer to the progress function.
maygup01 0:11cc2b7889af 193 * @return Error code.
maygup01 0:11cc2b7889af 194 */
maygup01 0:11cc2b7889af 195 arm_uc_error_t ARM_UC_SetProgressHandler(void (*callback)(uint32_t progress, uint32_t total))
maygup01 0:11cc2b7889af 196 {
maygup01 0:11cc2b7889af 197 return ARM_UC_ControlCenter_SetProgressHandler(callback);
maygup01 0:11cc2b7889af 198 }
maygup01 0:11cc2b7889af 199
maygup01 0:11cc2b7889af 200 /**
maygup01 0:11cc2b7889af 201 * @brief Set callback function for authorizing requests.
maygup01 0:11cc2b7889af 202 * @details User application call for setting callback handler.
maygup01 0:11cc2b7889af 203 * The callback function takes an enum request and an authorization
maygup01 0:11cc2b7889af 204 * function pointer. To authorize the given request, the caller
maygup01 0:11cc2b7889af 205 * invokes the authorization function.
maygup01 0:11cc2b7889af 206 *
maygup01 0:11cc2b7889af 207 * @param callback Function pointer to the authorization function.
maygup01 0:11cc2b7889af 208 * @return Error code.
maygup01 0:11cc2b7889af 209 */
maygup01 0:11cc2b7889af 210 arm_uc_error_t ARM_UC_SetAuthorizeHandler(void (*callback)(int32_t))
maygup01 0:11cc2b7889af 211 {
maygup01 0:11cc2b7889af 212 return ARM_UC_ControlCenter_SetAuthorityHandler(callback);
maygup01 0:11cc2b7889af 213 }
maygup01 0:11cc2b7889af 214
maygup01 0:11cc2b7889af 215 /**
maygup01 0:11cc2b7889af 216 * @brief Override update authorization handler.
maygup01 0:11cc2b7889af 217 * @details Force download and update to progress regardless of authorization
maygup01 0:11cc2b7889af 218 * handler. This function is used for unblocking an update in a buggy
maygup01 0:11cc2b7889af 219 * application.
maygup01 0:11cc2b7889af 220 */
maygup01 0:11cc2b7889af 221 void ARM_UC_OverrideAuthorization(void)
maygup01 0:11cc2b7889af 222 {
maygup01 0:11cc2b7889af 223 ARM_UC_ControlCenter_OverrideAuthorization();
maygup01 0:11cc2b7889af 224 }
maygup01 0:11cc2b7889af 225
maygup01 0:11cc2b7889af 226 #if defined(ARM_UC_FEATURE_MANIFEST_PUBKEY) && (ARM_UC_FEATURE_MANIFEST_PUBKEY == 1)
maygup01 0:11cc2b7889af 227 /**
maygup01 0:11cc2b7889af 228 * @brief Add certificate.
maygup01 0:11cc2b7889af 229 * @details [long description]
maygup01 0:11cc2b7889af 230 *
maygup01 0:11cc2b7889af 231 * @param certificate Pointer to certiface being added.
maygup01 0:11cc2b7889af 232 * @param certificate_length Certificate length.
maygup01 0:11cc2b7889af 233 * @param fingerprint Pointer to the fingerprint of the certificate being added.
maygup01 0:11cc2b7889af 234 * @param fingerprint_length Fingerprint length.
maygup01 0:11cc2b7889af 235 * @return Error code.
maygup01 0:11cc2b7889af 236 */
maygup01 0:11cc2b7889af 237 arm_uc_error_t ARM_UC_AddCertificate(const uint8_t *certificate,
maygup01 0:11cc2b7889af 238 uint16_t certificate_length,
maygup01 0:11cc2b7889af 239 const uint8_t *fingerprint,
maygup01 0:11cc2b7889af 240 uint16_t fingerprint_length,
maygup01 0:11cc2b7889af 241 void (*callback)(arm_uc_error_t, const arm_uc_buffer_t *))
maygup01 0:11cc2b7889af 242 {
maygup01 0:11cc2b7889af 243 return ARM_UC_Certificate_Add(certificate,
maygup01 0:11cc2b7889af 244 certificate_length,
maygup01 0:11cc2b7889af 245 fingerprint,
maygup01 0:11cc2b7889af 246 fingerprint_length,
maygup01 0:11cc2b7889af 247 callback);
maygup01 0:11cc2b7889af 248 }
maygup01 0:11cc2b7889af 249 #endif /* ARM_UC_FEATURE_MANIFEST_PUBKEY */
maygup01 0:11cc2b7889af 250
maygup01 0:11cc2b7889af 251 #if defined(ARM_UC_FEATURE_MANIFEST_PSK) && (ARM_UC_FEATURE_MANIFEST_PSK == 1)
maygup01 0:11cc2b7889af 252 /**
maygup01 0:11cc2b7889af 253 * @brief Set pointer to pre-shared-key with the given size.
maygup01 0:11cc2b7889af 254 *
maygup01 0:11cc2b7889af 255 * @param key Pointer to pre-shared-key.
maygup01 0:11cc2b7889af 256 * @param bits Key size in bits.
maygup01 0:11cc2b7889af 257 *
maygup01 0:11cc2b7889af 258 * @return Error code.
maygup01 0:11cc2b7889af 259 */
maygup01 0:11cc2b7889af 260 arm_uc_error_t ARM_UC_AddPreSharedKey(const uint8_t *key, uint16_t bits)
maygup01 0:11cc2b7889af 261 {
maygup01 0:11cc2b7889af 262 return ARM_UC_PreSharedKey_SetSecret(key, bits);
maygup01 0:11cc2b7889af 263 }
maygup01 0:11cc2b7889af 264 #endif
maygup01 0:11cc2b7889af 265
maygup01 0:11cc2b7889af 266 /**
maygup01 0:11cc2b7889af 267 * @brief Function for setting the vendor ID.
maygup01 0:11cc2b7889af 268 * @details The ID is copied to a 16 byte struct. Any data after the first
maygup01 0:11cc2b7889af 269 * 16 bytes will be ignored.
maygup01 0:11cc2b7889af 270 * @param id Pointer to ID.
maygup01 0:11cc2b7889af 271 * @param length Length of ID.
maygup01 0:11cc2b7889af 272 * @return Error code.
maygup01 0:11cc2b7889af 273 */
maygup01 0:11cc2b7889af 274 arm_uc_error_t ARM_UC_SetVendorId(const uint8_t *id, uint8_t length)
maygup01 0:11cc2b7889af 275 {
maygup01 0:11cc2b7889af 276 arm_uc_guid_t uuid = { 0 };
maygup01 0:11cc2b7889af 277
maygup01 0:11cc2b7889af 278 if (id) {
maygup01 0:11cc2b7889af 279 for (uint8_t index = 0;
maygup01 0:11cc2b7889af 280 (index < sizeof(arm_uc_guid_t) && (index < length));
maygup01 0:11cc2b7889af 281 index++) {
maygup01 0:11cc2b7889af 282 ((uint8_t *) uuid)[index] = id[index];
maygup01 0:11cc2b7889af 283 }
maygup01 0:11cc2b7889af 284 }
maygup01 0:11cc2b7889af 285
maygup01 0:11cc2b7889af 286 return pal_setVendorGuid(&uuid);
maygup01 0:11cc2b7889af 287 }
maygup01 0:11cc2b7889af 288
maygup01 0:11cc2b7889af 289 /**
maygup01 0:11cc2b7889af 290 * @brief Function for setting the class ID.
maygup01 0:11cc2b7889af 291 * @details The ID is copied to a 16 byte struct. Any data after the first
maygup01 0:11cc2b7889af 292 * 16 bytes will be ignored.
maygup01 0:11cc2b7889af 293 * @param id Pointer to ID.
maygup01 0:11cc2b7889af 294 * @param length Length of ID.
maygup01 0:11cc2b7889af 295 * @return Error code.
maygup01 0:11cc2b7889af 296 */
maygup01 0:11cc2b7889af 297 arm_uc_error_t ARM_UC_SetClassId(const uint8_t *id, uint8_t length)
maygup01 0:11cc2b7889af 298 {
maygup01 0:11cc2b7889af 299 arm_uc_guid_t uuid = { 0 };
maygup01 0:11cc2b7889af 300
maygup01 0:11cc2b7889af 301 if (id) {
maygup01 0:11cc2b7889af 302 for (uint8_t index = 0;
maygup01 0:11cc2b7889af 303 (index < sizeof(arm_uc_guid_t) && (index < length));
maygup01 0:11cc2b7889af 304 index++) {
maygup01 0:11cc2b7889af 305 ((uint8_t *) uuid)[index] = id[index];
maygup01 0:11cc2b7889af 306 }
maygup01 0:11cc2b7889af 307 }
maygup01 0:11cc2b7889af 308
maygup01 0:11cc2b7889af 309 return pal_setClassGuid(&uuid);
maygup01 0:11cc2b7889af 310 }
maygup01 0:11cc2b7889af 311
maygup01 0:11cc2b7889af 312 /**
maygup01 0:11cc2b7889af 313 * @brief Function for setting the device ID.
maygup01 0:11cc2b7889af 314 * @details The ID is copied to a 16 byte struct. Any data after the first
maygup01 0:11cc2b7889af 315 * 16 bytes will be ignored.
maygup01 0:11cc2b7889af 316 * @param id Pointer to ID.
maygup01 0:11cc2b7889af 317 * @param length Length of ID.
maygup01 0:11cc2b7889af 318 * @return Error code.
maygup01 0:11cc2b7889af 319 */
maygup01 0:11cc2b7889af 320 arm_uc_error_t ARM_UC_SetDeviceId(const uint8_t *id, uint8_t length)
maygup01 0:11cc2b7889af 321 {
maygup01 0:11cc2b7889af 322 arm_uc_guid_t uuid = { 0 };
maygup01 0:11cc2b7889af 323
maygup01 0:11cc2b7889af 324 if (id) {
maygup01 0:11cc2b7889af 325 for (uint8_t index = 0;
maygup01 0:11cc2b7889af 326 (index < sizeof(arm_uc_guid_t) && (index < length));
maygup01 0:11cc2b7889af 327 index++) {
maygup01 0:11cc2b7889af 328 ((uint8_t *) uuid)[index] = id[index];
maygup01 0:11cc2b7889af 329 }
maygup01 0:11cc2b7889af 330 }
maygup01 0:11cc2b7889af 331
maygup01 0:11cc2b7889af 332 return pal_setDeviceGuid(&uuid);
maygup01 0:11cc2b7889af 333 }
maygup01 0:11cc2b7889af 334
maygup01 0:11cc2b7889af 335 /**
maygup01 0:11cc2b7889af 336 * @brief Function for reporting the vendor ID.
maygup01 0:11cc2b7889af 337 * @details 16 bytes are copied into the supplied buffer.
maygup01 0:11cc2b7889af 338 * @param id Pointer to storage for ID. MUST be at least 16 bytes long.
maygup01 0:11cc2b7889af 339 * @param id_max the size of the ID buffer
maygup01 0:11cc2b7889af 340 * @param id_size pointer to a variable to receive the size of the ID
maygup01 0:11cc2b7889af 341 * written into the buffer (always 16).
maygup01 0:11cc2b7889af 342 * @return Error code.
maygup01 0:11cc2b7889af 343 */
maygup01 0:11cc2b7889af 344 arm_uc_error_t ARM_UC_GetVendorId(uint8_t *id,
maygup01 0:11cc2b7889af 345 const size_t id_max,
maygup01 0:11cc2b7889af 346 size_t *id_size)
maygup01 0:11cc2b7889af 347 {
maygup01 0:11cc2b7889af 348 arm_uc_guid_t guid = {0};
maygup01 0:11cc2b7889af 349 arm_uc_error_t err = {ERR_NONE};
maygup01 0:11cc2b7889af 350 if (id_max < sizeof(arm_uc_guid_t)) {
maygup01 0:11cc2b7889af 351 err.code = ARM_UC_DI_ERR_SIZE;
maygup01 0:11cc2b7889af 352 }
maygup01 0:11cc2b7889af 353 if (err.error == ERR_NONE) {
maygup01 0:11cc2b7889af 354 err = pal_getVendorGuid(&guid);
maygup01 0:11cc2b7889af 355 }
maygup01 0:11cc2b7889af 356 if (err.error == ERR_NONE) {
maygup01 0:11cc2b7889af 357 memcpy(id, guid, sizeof(arm_uc_guid_t));
maygup01 0:11cc2b7889af 358 if (id_size != NULL) {
maygup01 0:11cc2b7889af 359 *id_size = sizeof(arm_uc_guid_t);
maygup01 0:11cc2b7889af 360 }
maygup01 0:11cc2b7889af 361 }
maygup01 0:11cc2b7889af 362 return err;
maygup01 0:11cc2b7889af 363 }
maygup01 0:11cc2b7889af 364
maygup01 0:11cc2b7889af 365 /**
maygup01 0:11cc2b7889af 366 * @brief Function for reporting the class ID.
maygup01 0:11cc2b7889af 367 * @details 16 bytes are copied into the supplied buffer.
maygup01 0:11cc2b7889af 368 * @param id Pointer to storage for ID. MUST be at least 16 bytes long.
maygup01 0:11cc2b7889af 369 * @param id_max the size of the ID buffer
maygup01 0:11cc2b7889af 370 * @param id_size pointer to a variable to receive the size of the ID
maygup01 0:11cc2b7889af 371 * written into the buffer (always 16).
maygup01 0:11cc2b7889af 372 * @return Error code.
maygup01 0:11cc2b7889af 373 */
maygup01 0:11cc2b7889af 374 arm_uc_error_t ARM_UC_GetClassId(uint8_t *id,
maygup01 0:11cc2b7889af 375 const size_t id_max,
maygup01 0:11cc2b7889af 376 size_t *id_size)
maygup01 0:11cc2b7889af 377 {
maygup01 0:11cc2b7889af 378 arm_uc_guid_t guid = {0};
maygup01 0:11cc2b7889af 379 arm_uc_error_t err = {ERR_NONE};
maygup01 0:11cc2b7889af 380 if (id_max < sizeof(arm_uc_guid_t)) {
maygup01 0:11cc2b7889af 381 err.code = ARM_UC_DI_ERR_SIZE;
maygup01 0:11cc2b7889af 382 }
maygup01 0:11cc2b7889af 383 if (err.error == ERR_NONE) {
maygup01 0:11cc2b7889af 384 err = pal_getClassGuid(&guid);
maygup01 0:11cc2b7889af 385 }
maygup01 0:11cc2b7889af 386 if (err.error == ERR_NONE) {
maygup01 0:11cc2b7889af 387 memcpy(id, guid, sizeof(arm_uc_guid_t));
maygup01 0:11cc2b7889af 388 if (id_size != NULL) {
maygup01 0:11cc2b7889af 389 *id_size = sizeof(arm_uc_guid_t);
maygup01 0:11cc2b7889af 390 }
maygup01 0:11cc2b7889af 391 }
maygup01 0:11cc2b7889af 392 return err;
maygup01 0:11cc2b7889af 393 }
maygup01 0:11cc2b7889af 394
maygup01 0:11cc2b7889af 395 /**
maygup01 0:11cc2b7889af 396 * @brief Function for reporting the device ID.
maygup01 0:11cc2b7889af 397 * @details 16 bytes are copied into the supplied buffer.
maygup01 0:11cc2b7889af 398 * @param id Pointer to storage for ID. MUST be at least 16 bytes long.
maygup01 0:11cc2b7889af 399 * @param id_max the size of the ID buffer
maygup01 0:11cc2b7889af 400 * @param id_size pointer to a variable to receive the size of the ID
maygup01 0:11cc2b7889af 401 * written into the buffer (always 16).
maygup01 0:11cc2b7889af 402 * @return Error code.
maygup01 0:11cc2b7889af 403 */
maygup01 0:11cc2b7889af 404 arm_uc_error_t ARM_UC_GetDeviceId(uint8_t *id,
maygup01 0:11cc2b7889af 405 const size_t id_max,
maygup01 0:11cc2b7889af 406 size_t *id_size)
maygup01 0:11cc2b7889af 407 {
maygup01 0:11cc2b7889af 408 arm_uc_guid_t guid = {0};
maygup01 0:11cc2b7889af 409 arm_uc_error_t err = {ERR_NONE};
maygup01 0:11cc2b7889af 410 if (id_max < sizeof(arm_uc_guid_t)) {
maygup01 0:11cc2b7889af 411 err.code = ARM_UC_DI_ERR_SIZE;
maygup01 0:11cc2b7889af 412 }
maygup01 0:11cc2b7889af 413 if (err.error == ERR_NONE) {
maygup01 0:11cc2b7889af 414 err = pal_getDeviceGuid(&guid);
maygup01 0:11cc2b7889af 415 }
maygup01 0:11cc2b7889af 416 if (err.error == ERR_NONE) {
maygup01 0:11cc2b7889af 417 memcpy(id, guid, sizeof(arm_uc_guid_t));
maygup01 0:11cc2b7889af 418 if (id_size != NULL) {
maygup01 0:11cc2b7889af 419 *id_size = sizeof(arm_uc_guid_t);
maygup01 0:11cc2b7889af 420 }
maygup01 0:11cc2b7889af 421 }
maygup01 0:11cc2b7889af 422 return err;
maygup01 0:11cc2b7889af 423 }
maygup01 0:11cc2b7889af 424
maygup01 0:11cc2b7889af 425 arm_uc_error_t ARM_UC_HUB_Uninitialize(void)
maygup01 0:11cc2b7889af 426 {
maygup01 0:11cc2b7889af 427 if (ARM_UC_HUB_getState() <= ARM_UC_HUB_STATE_INITIALIZED) {
maygup01 0:11cc2b7889af 428 UC_HUB_ERR_MSG("Update Client not initialized");
maygup01 0:11cc2b7889af 429 return (arm_uc_error_t) { ERR_INVALID_STATE };
maygup01 0:11cc2b7889af 430 }
maygup01 0:11cc2b7889af 431
maygup01 0:11cc2b7889af 432 arm_uc_error_t err = ARM_UC_SourceManager.Uninitialize();
maygup01 0:11cc2b7889af 433 ARM_UC_HUB_setState(ARM_UC_HUB_STATE_UNINITIALIZED);
maygup01 0:11cc2b7889af 434 return err;
maygup01 0:11cc2b7889af 435 }
maygup01 0:11cc2b7889af 436
maygup01 0:11cc2b7889af 437 /**
maygup01 0:11cc2b7889af 438 * @brief Return the details of the active firmware.
maygup01 0:11cc2b7889af 439 * @param details Pointer to the firmware details structure.
maygup01 0:11cc2b7889af 440 * @return ARM_UC_HUB_ERR_NOT_AVAILABLE if the active firmware details
maygup01 0:11cc2b7889af 441 * are not yet available, ERR_INVALID_PARAMETER if "details" is
maygup01 0:11cc2b7889af 442 * NULL or ERR_NONE for success.
maygup01 0:11cc2b7889af 443 */
maygup01 0:11cc2b7889af 444 arm_uc_error_t ARM_UC_API_GetActiveFirmwareDetails(arm_uc_firmware_details_t *details)
maygup01 0:11cc2b7889af 445 {
maygup01 0:11cc2b7889af 446 arm_uc_error_t err = {ARM_UC_HUB_ERR_NOT_AVAILABLE};
maygup01 0:11cc2b7889af 447
maygup01 0:11cc2b7889af 448 if (details == NULL) {
maygup01 0:11cc2b7889af 449 err.code = ERR_INVALID_PARAMETER;
maygup01 0:11cc2b7889af 450 } else {
maygup01 0:11cc2b7889af 451 arm_uc_firmware_details_t *hub_details = ARM_UC_HUB_getActiveFirmwareDetails();
maygup01 0:11cc2b7889af 452 if (hub_details) {
maygup01 0:11cc2b7889af 453 memcpy(details, hub_details, sizeof(arm_uc_firmware_details_t));
maygup01 0:11cc2b7889af 454 err.code = ERR_NONE;
maygup01 0:11cc2b7889af 455 }
maygup01 0:11cc2b7889af 456 }
maygup01 0:11cc2b7889af 457 return err;
maygup01 0:11cc2b7889af 458 }
maygup01 0:11cc2b7889af 459
maygup01 0:11cc2b7889af 460 /**
maygup01 0:11cc2b7889af 461 * @brief Return whether or not the given state is a valid defined one.
maygup01 0:11cc2b7889af 462 */
maygup01 0:11cc2b7889af 463 bool ARM_UC_IsValidState(arm_uc_update_state_t an_update_state)
maygup01 0:11cc2b7889af 464 {
maygup01 0:11cc2b7889af 465 int val = (int)an_update_state;
maygup01 0:11cc2b7889af 466 bool is_valid = ((val >= (int)ARM_UC_UPDATE_STATE_FIRST)
maygup01 0:11cc2b7889af 467 && (val <= (int)ARM_UC_UPDATE_STATE_LAST));
maygup01 0:11cc2b7889af 468 if (!is_valid) UC_ERROR_ERR_MSG("Invalid UC HUB reported state");
maygup01 0:11cc2b7889af 469 return is_valid;
maygup01 0:11cc2b7889af 470 }
maygup01 0:11cc2b7889af 471
maygup01 0:11cc2b7889af 472 /**
maygup01 0:11cc2b7889af 473 * @brief Return whether or not the given result is a valid defined one.
maygup01 0:11cc2b7889af 474 */
maygup01 0:11cc2b7889af 475 bool ARM_UC_IsValidResult(arm_uc_update_result_t an_update_result)
maygup01 0:11cc2b7889af 476 {
maygup01 0:11cc2b7889af 477 bool is_valid = ((an_update_result >= ARM_UC_UPDATE_RESULT_UPDATE_FIRST)
maygup01 0:11cc2b7889af 478 && (an_update_result <= ARM_UC_UPDATE_RESULT_UPDATE_LAST))
maygup01 0:11cc2b7889af 479 || ((an_update_result >= ARM_UC_UPDATE_RESULT_FETCHER_FIRST)
maygup01 0:11cc2b7889af 480 && (an_update_result <= ARM_UC_UPDATE_RESULT_FETCHER_LAST))
maygup01 0:11cc2b7889af 481 || ((an_update_result >= ARM_UC_UPDATE_RESULT_WRITER_FIRST)
maygup01 0:11cc2b7889af 482 && (an_update_result <= ARM_UC_UPDATE_RESULT_WRITER_LAST))
maygup01 0:11cc2b7889af 483 || ((an_update_result >= ARM_UC_UPDATE_RESULT_PROCESSOR_FIRST)
maygup01 0:11cc2b7889af 484 && (an_update_result <= ARM_UC_UPDATE_RESULT_PROCESSOR_LAST))
maygup01 0:11cc2b7889af 485 || ((an_update_result >= ARM_UC_UPDATE_RESULT_MANIFEST_FIRST)
maygup01 0:11cc2b7889af 486 && (an_update_result <= ARM_UC_UPDATE_RESULT_MANIFEST_LAST));
maygup01 0:11cc2b7889af 487 if (!is_valid) UC_ERROR_ERR_MSG("Invalid UC HUB reported state");
maygup01 0:11cc2b7889af 488 return is_valid;
maygup01 0:11cc2b7889af 489 }