Mayank Gupta / Mbed OS pelion-example-frdm

Dependencies:   FXAS21002 FXOS8700Q

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers arm_uc_mmStateSelector.c Source File

arm_uc_mmStateSelector.c

00001 // ----------------------------------------------------------------------------
00002 // Copyright 2016-2017 ARM Ltd.
00003 //
00004 // SPDX-License-Identifier: Apache-2.0
00005 //
00006 // Licensed under the Apache License, Version 2.0 (the "License");
00007 // you may not use this file except in compliance with the License.
00008 // You may obtain a copy of the License at
00009 //
00010 //     http://www.apache.org/licenses/LICENSE-2.0
00011 //
00012 // Unless required by applicable law or agreed to in writing, software
00013 // distributed under the License is distributed on an "AS IS" BASIS,
00014 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00015 // See the License for the specific language governing permissions and
00016 // limitations under the License.
00017 // ----------------------------------------------------------------------------
00018 
00019 #include "arm_uc_mmCryptoUtils.h"
00020 #include "arm_uc_mmCommon.h"
00021 #include "arm_uc_mmConfig.h"
00022 #include "arm_uc_mmStateSelector.h"
00023 #include "arm_uc_mmInit.h"
00024 #include "arm_uc_mmFSMHelper.h"
00025 #include "arm_uc_mmFetchFirmwareInfo.h"
00026 #include "arm_uc_mmInsertManifest.h"
00027 
00028 #include "update-client-manifest-manager/update-client-manifest-manager-context.h"
00029 #include "update-client-manifest-manager/update-client-manifest-manager.h"
00030 #include "update-client-manifest-manager/update-client-manifest-types.h"
00031 
00032 #include "update-client-common/arm_uc_scheduler.h"
00033 
00034 #include <stdint.h>
00035 #include <stdio.h>
00036 #include <stddef.h>
00037 #include <string.h>
00038 
00039 arm_uc_error_t ARM_UC_mmSetState(enum arm_uc_mmState_t newState)
00040 {
00041     arm_uc_mmPersistentContext.state = newState;
00042     return (arm_uc_error_t) {ERR_NONE};
00043 }
00044 
00045 #if 0
00046 static void printCryptoFlags(ucmm_crypto_flags_t *flags)
00047 {
00048     printf("ucmm_crypto_flags_t @ %p = {\n", flags);
00049     printf("    .hash = %u,\n", flags->hash);
00050     printf("    .hmac = %u,\n", flags->hmac);
00051     printf("    .rsa  = %u,\n", flags->rsa);
00052     printf("    .ecc  = %u,\n", flags->ecc);
00053     printf("    .aes  = %u,\n", flags->aes);
00054     printf("}\n");
00055 }
00056 #endif
00057 
00058 arm_uc_error_t ARM_UC_mmFSM(uintptr_t event)
00059 {
00060     UC_MMGR_TRACE("> %s (%u)\n", __PRETTY_FUNCTION__, (unsigned)event);
00061 
00062     arm_uc_error_t err = {ERR_NONE};
00063     enum arm_uc_mmState_t oldState;
00064     do {
00065         oldState = arm_uc_mmPersistentContext.state;
00066         switch (arm_uc_mmPersistentContext.state) {
00067             case ARM_UC_MM_STATE_IDLE:
00068                 err = (arm_uc_error_t) {ERR_NONE};
00069                 break;
00070 // Placeholder for init
00071 #if 0
00072             case ARM_UC_MM_STATE_INIT:
00073                 err = arm_uc_mmInitFSM(event);
00074                 if (err.code == ERR_NONE) {
00075                     err = ARM_UC_mmSetState(ARM_UC_MM_STATE_IDLE);
00076                     ARM_UC_PostCallback(&arm_uc_mmContext.cfstore_callback_storage, arm_uc_mmPersistentContext.applicationEventHandler,
00077                                         ARM_UC_MM_RC_DONE);
00078                 }
00079                 break;
00080 #endif
00081             case ARM_UC_MM_STATE_INSERTING:
00082                 err = ARM_UC_mmInsertFSM(event);
00083                 if (err.code == ERR_NONE) {
00084                     err = ARM_UC_mmSetState(ARM_UC_MM_STATE_IDLE);
00085                     ARM_UC_PostCallback(&arm_uc_mmPersistentContext.applicationCallbackStorage,
00086                                         arm_uc_mmPersistentContext.applicationEventHandler, ARM_UC_MM_RC_DONE);
00087                 }
00088                 break;
00089             case ARM_UC_MM_STATE_FWINFO:
00090                 err = ARM_UC_mmFetchFirmwareInfoFSM(event);
00091                 if (err.code == ERR_NONE) {
00092                     err = ARM_UC_mmSetState(ARM_UC_MM_STATE_IDLE);
00093                     ARM_UC_PostCallback(&arm_uc_mmPersistentContext.applicationCallbackStorage,
00094                                         arm_uc_mmPersistentContext.applicationEventHandler, ARM_UC_MM_RC_DONE);
00095                 }
00096                 break;
00097             case ARM_UC_MM_STATE_TEST:
00098                 if (arm_uc_mmPersistentContext.testFSM != NULL) {
00099                     err = arm_uc_mmPersistentContext.testFSM(event);
00100                     if (err.code == ERR_NONE) {
00101                         err = ARM_UC_mmSetState(ARM_UC_MM_STATE_IDLE);
00102                         ARM_UC_PostCallback(&arm_uc_mmPersistentContext.applicationCallbackStorage,
00103                                             arm_uc_mmPersistentContext.applicationEventHandler, ARM_UC_MM_RC_DONE);
00104                     }
00105                     break;
00106                 }
00107             // fall through
00108             case ARM_UC_MM_STATE_INVALID:
00109             default:
00110                 err = (arm_uc_error_t) {MFST_ERR_INVALID_STATE};
00111                 break;
00112         }
00113     } while (err.code == ERR_NONE && oldState != arm_uc_mmPersistentContext.state);
00114     UC_MMGR_TRACE("< %s %c%c:%hu (%s)\n", __PRETTY_FUNCTION__, err.modulecc[0],
00115                         CC_ASCII(err.modulecc[0]), CC_ASCII(err.modulecc[1]), ARM_UC_err2Str(err));
00116     return err;
00117 }
00118 
00119 void ARM_UC_mmCallbackFSMEntry(uintptr_t event)
00120 {
00121     UC_MMGR_TRACE("> %s (%u)\n", __PRETTY_FUNCTION__, (unsigned)event);
00122     arm_uc_error_t err = ARM_UC_mmFSM(event);
00123     if (err.code != ERR_NONE && err.code != MFST_ERR_PENDING) {
00124         arm_uc_mmPersistentContext.reportedError = err;
00125         arm_uc_mmPersistentContext.applicationEventHandler((uint32_t)ARM_UC_MM_RC_ERROR);
00126     }
00127     UC_MMGR_TRACE("< %s %c%c:%hu (%s)\n", __PRETTY_FUNCTION__,
00128                         CC_ASCII(err.modulecc[0]), CC_ASCII(err.modulecc[1]), err.error, ARM_UC_err2Str(err));
00129 }