Simple interface for Mbed Cloud Client
Embed:
(wiki syntax)
Show/hide line numbers
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){MFST_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(uint32_t event) 00059 { 00060 ARM_UC_MM_DEBUG_LOG(ARM_UC_MM_DEBUG_LOG_LEVEL_STATES, "> %s (%u)\n", __PRETTY_FUNCTION__, (unsigned)event); 00061 00062 arm_uc_error_t err = {MFST_ERR_NONE}; 00063 enum arm_uc_mmState_t oldState; 00064 do { 00065 oldState = arm_uc_mmPersistentContext.state; 00066 switch(arm_uc_mmPersistentContext.state) 00067 { 00068 case ARM_UC_MM_STATE_IDLE: 00069 err = (arm_uc_error_t){MFST_ERR_NONE}; 00070 break; 00071 // Placeholder for init 00072 #if 0 00073 case ARM_UC_MM_STATE_INIT: 00074 err = arm_uc_mmInitFSM(event); 00075 if (err.code == MFST_ERR_NONE) 00076 { 00077 err = ARM_UC_mmSetState(ARM_UC_MM_STATE_IDLE); 00078 ARM_UC_PostCallback(&arm_uc_mmContext.cfstore_callback_storage, arm_uc_mmPersistentContext.applicationEventHandler, ARM_UC_MM_RC_DONE); 00079 } 00080 break; 00081 #endif 00082 case ARM_UC_MM_STATE_INSERTING: 00083 err = ARM_UC_mmInsertFSM(event); 00084 if (err.code == MFST_ERR_NONE) 00085 { 00086 err = ARM_UC_mmSetState(ARM_UC_MM_STATE_IDLE); 00087 ARM_UC_PostCallback(&arm_uc_mmPersistentContext.applicationCallbackStorage, arm_uc_mmPersistentContext.applicationEventHandler, ARM_UC_MM_RC_DONE); 00088 } 00089 break; 00090 case ARM_UC_MM_STATE_FWINFO: 00091 err = ARM_UC_mmFetchFirmwareInfoFSM(event); 00092 if (err.code == MFST_ERR_NONE) 00093 { 00094 err = ARM_UC_mmSetState(ARM_UC_MM_STATE_IDLE); 00095 ARM_UC_PostCallback(&arm_uc_mmPersistentContext.applicationCallbackStorage, arm_uc_mmPersistentContext.applicationEventHandler, ARM_UC_MM_RC_DONE); 00096 } 00097 break; 00098 case ARM_UC_MM_STATE_TEST: 00099 if (arm_uc_mmPersistentContext.testFSM != NULL) { 00100 err = arm_uc_mmPersistentContext.testFSM(event); 00101 if (err.code == MFST_ERR_NONE) 00102 { 00103 err = ARM_UC_mmSetState(ARM_UC_MM_STATE_IDLE); 00104 ARM_UC_PostCallback(&arm_uc_mmPersistentContext.applicationCallbackStorage, arm_uc_mmPersistentContext.applicationEventHandler, ARM_UC_MM_RC_DONE); 00105 } 00106 break; 00107 } 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 == MFST_ERR_NONE && oldState != arm_uc_mmPersistentContext.state); 00114 ARM_UC_MM_DEBUG_LOG(ARM_UC_MM_DEBUG_LOG_LEVEL_STATES, "< %s %c%c:%hu (%s)\n", __PRETTY_FUNCTION__, err.modulecc[0], err.modulecc[1], err.error, ARM_UC_err2Str(err)); 00115 return err; 00116 } 00117 00118 void ARM_UC_mmCallbackFSMEntry(uint32_t event) 00119 { 00120 ARM_UC_MM_DEBUG_LOG(ARM_UC_MM_DEBUG_LOG_LEVEL_STATES,"> %s (%u)\n", __PRETTY_FUNCTION__, (unsigned)event); 00121 arm_uc_error_t err = ARM_UC_mmFSM(event); 00122 if (err.code != MFST_ERR_NONE && err.code != MFST_ERR_PENDING) 00123 { 00124 arm_uc_mmPersistentContext.reportedError = err; 00125 arm_uc_mmPersistentContext.applicationEventHandler((uint32_t)ARM_UC_MM_RC_ERROR); 00126 } 00127 ARM_UC_MM_DEBUG_LOG(ARM_UC_MM_DEBUG_LOG_LEVEL_STATES,"< %s %c%c:%hu (%s)\n", __PRETTY_FUNCTION__, err.modulecc[0], err.modulecc[1], err.error, ARM_UC_err2Str(err)); 00128 }
Generated on Tue Jul 12 2022 19:01:32 by 1.7.2