Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FXAS21002 FXOS8700Q
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 }
Generated on Tue Jul 12 2022 20:20:57 by
