Simulated product dispenser

Dependencies:   HTS221

Fork of mbed-cloud-workshop-connect-HTS221 by Jim Carver

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers arm_uc_error.h Source File

arm_uc_error.h

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 #ifndef ARM_UPDATE_ERROR_H
00020 #define ARM_UPDATE_ERROR_H
00021 
00022 #include <stdint.h>
00023 
00024 // Use two characters to form the 16bit module code
00025 #define TWO_CC(A,B) (((A) & 0xFF) | (((B) & 0xFF) << 8))
00026 
00027 #define MANIFEST_MANAGER_PREFIX    TWO_CC('M','M')
00028 #define CERTIFICATE_MANAGER_PREFIX TWO_CC('C','M')
00029 #define SOURCE_MANAGER_PREFIX      TWO_CC('S','M')
00030 #define SOURCE_PREFIX              TWO_CC('S','E')
00031 #define FIRMWARE_MANAGER_PREFIX    TWO_CC('F','M')
00032 #define DER_PARSER_PREFIX          TWO_CC('D','P')
00033 #define MBED_TLS_ERROR_PREFIX      TWO_CC('M','T')
00034 #define UPDATE_CRYPTO_PREFIX       TWO_CC('C','U')
00035 #define DEVICE_IDENTITY_PREFIX     TWO_CC('D','I')
00036 #define HUB_PREFIX                 TWO_CC('H','B')
00037 #define EVENT_QUEUE_PREFIX         TWO_CC('E','Q')
00038 
00039 #define ARM_UC_COMMON_ERR_LIST\
00040     ENUM_FIXED(ERR_NONE,0)\
00041     ENUM_AUTO(ERR_UNSPECIFIED)\
00042     ENUM_AUTO(ERR_INVALID_PARAMETER)\
00043     ENUM_AUTO(ERR_NULL_PTR)\
00044     ENUM_AUTO(ERR_NOT_READY)\
00045     ENUM_AUTO(ERR_INVALID_STATE)\
00046 
00047 // Manifest manager
00048 #define ARM_UC_MM_ERR_LIST\
00049     ENUM_FIXED(MFST_ERR_NONE, MANIFEST_MANAGER_PREFIX << 16)\
00050     ENUM_AUTO(MFST_ERR_NULL_PTR)\
00051     ENUM_AUTO(MFST_ERR_PENDING)\
00052     ENUM_AUTO(MFST_ERR_SIZE)\
00053     ENUM_AUTO(MFST_ERR_DER_FORMAT)\
00054     ENUM_AUTO(MFST_ERR_FORMAT)\
00055     ENUM_AUTO(MFST_ERR_VERSION)\
00056     ENUM_AUTO(MFST_ERR_ROLLBACK)\
00057     ENUM_AUTO(MFST_ERR_CRYPTO_MODE)\
00058     ENUM_AUTO(MFST_ERR_HASH)\
00059     ENUM_AUTO(MFST_ERR_GUID_VENDOR)\
00060     ENUM_AUTO(MFST_ERR_GUID_DEVCLASS)\
00061     ENUM_AUTO(MFST_ERR_GUID_DEVICE)\
00062     ENUM_AUTO(MFST_ERR_CFG_CREATE_FAILED)\
00063     ENUM_AUTO(MFST_ERR_KEY_SIZE)\
00064     ENUM_AUTO(MFST_ERR_CERT_INVALID)\
00065     ENUM_AUTO(MFST_ERR_CERT_NOT_FOUND)\
00066     ENUM_AUTO(MFST_ERR_CERT_READ)\
00067     ENUM_AUTO(MFST_ERR_INVALID_SIGNATURE)\
00068     ENUM_AUTO(MFST_ERR_INVALID_STATE)\
00069     ENUM_AUTO(MFST_ERR_BAD_EVENT)\
00070     ENUM_AUTO(MFST_ERR_EMPTY_FIELD)\
00071     ENUM_AUTO(MFST_ERR_NO_MANIFEST)\
00072     ENUM_AUTO(MFST_ERR_SIGNATURE_ALGORITHM)\
00073     ENUM_AUTO(MFST_ERR_UNSUPPORTED_CONDITION)\
00074     ENUM_AUTO(MFST_ERR_CTR_IV_SIZE)\
00075     ENUM_AUTO(MFST_ERR_BAD_KEYTABLE_REF)\
00076     ENUM_AUTO(MFST_ERR_BAD_KEYTABLE)\
00077 
00078 // Certificate Manager
00079 #define ARM_UC_CM_ERR_LIST\
00080     ENUM_FIXED(ARM_UC_CM_ERR_NONE, CERTIFICATE_MANAGER_PREFIX << 16)\
00081     ENUM_AUTO(ARM_UC_CM_ERR_INVALID_PARAMETER)\
00082     ENUM_AUTO(ARM_UC_CM_ERR_NOT_FOUND)\
00083     ENUM_AUTO(ARM_UC_CM_ERR_INVALID_CERT)\
00084     ENUM_AUTO(ARM_UC_CM_ERR_BLACKLISTED)\
00085 
00086 // DER Parser
00087 #define ARM_UC_DP_ERR_LIST\
00088     ENUM_FIXED(ARM_UC_DP_ERR_NONE, DER_PARSER_PREFIX << 16)\
00089     ENUM_AUTO(ARM_UC_DP_ERR_UNKNOWN)\
00090     ENUM_AUTO(ARM_UC_DP_ERR_NOT_FOUND)\
00091     ENUM_AUTO(ARM_UC_DP_ERR_NO_MORE_ELEMENTS)\
00092 
00093 // Source Manager
00094 #define ARM_UC_SM_ERR_LIST\
00095     ENUM_FIXED(SOMA_ERR_NONE, SOURCE_MANAGER_PREFIX << 16)\
00096     ENUM_AUTO(SOMA_ERR_UNSPECIFIED)\
00097     ENUM_AUTO(SOMA_ERR_NO_ROUTE_TO_SOURCE)\
00098     ENUM_AUTO(SOMA_ERR_SOURCE_REGISTRY_FULL)\
00099     ENUM_AUTO(SOMA_ERR_SOURCE_NOT_FOUND)\
00100     ENUM_AUTO(SOMA_ERR_INVALID_URI)\
00101     ENUM_AUTO(SOMA_ERR_INVALID_REQUEST)\
00102     ENUM_AUTO(SOMA_ERR_INVALID_PARAMETER)\
00103     ENUM_AUTO(SOMA_ERR_INVALID_MANIFEST_STATE)\
00104     ENUM_AUTO(SOMA_ERR_INVALID_FW_STATE)\
00105     ENUM_AUTO(SOMA_ERR_INVALID_EVENT)
00106 
00107 // Source
00108 #define ARM_UC_SRC_ERR_LIST\
00109     ENUM_FIXED(SRCE_ERR_NONE, SOURCE_PREFIX << 16)\
00110     ENUM_AUTO(SRCE_ERR_UNINITIALIZED)\
00111     ENUM_AUTO(SRCE_ERR_INVALID_PARAMETER)\
00112     ENUM_AUTO(SRCE_ERR_FAILED)\
00113     ENUM_AUTO(SRCE_ERR_ABORT)\
00114     ENUM_AUTO(SRCE_ERR_BUSY)
00115 
00116 // Firmware Manager
00117 #define ARM_UC_FM_ERR_LIST\
00118     ENUM_FIXED(FIRM_ERR_NONE, FIRMWARE_MANAGER_PREFIX << 16)\
00119     ENUM_AUTO(FIRM_ERR_WRITE)\
00120     ENUM_AUTO(FIRM_ERR_INVALID_PARAMETER)\
00121     ENUM_AUTO(FIRM_ERR_ACTIVATE)\
00122     ENUM_AUTO(FIRM_ERR_UNINITIALIZED)\
00123     ENUM_AUTO(FIRM_ERR_INVALID_HASH)
00124 
00125 #define ARM_UC_CU_ERR_LIST\
00126     ENUM_FIXED(ARM_UC_CU_ERR_NONE, UPDATE_CRYPTO_PREFIX << 16)\
00127     ENUM_AUTO(ARM_UC_CU_ERR_INVALID_PARAMETER)\
00128 
00129 #define ARM_UC_DI_ERR_LIST\
00130     ENUM_FIXED(ARM_UC_DI_ERR_NONE, DEVICE_IDENTITY_PREFIX << 16)\
00131     ENUM_AUTO(ARM_UC_DI_ERR_INVALID_PARAMETER)\
00132     ENUM_AUTO(ARM_UC_DI_ERR_NOT_READY)\
00133     ENUM_AUTO(ARM_UC_DI_ERR_NOT_FOUND)\
00134     ENUM_AUTO(ARM_UC_DI_ERR_SIZE)\
00135 
00136 #define ARM_UC_HB_ERR_LIST\
00137     ENUM_FIXED(HUB_ERR_NONE, HUB_PREFIX << 16)\
00138     ENUM_AUTO(HUB_ERR_INTERNAL_ERROR)\
00139     ENUM_AUTO(HUB_ERR_ROLLBACK_PROTECTION)\
00140     ENUM_AUTO(ARM_UC_HUB_ERR_NOT_AVAILABLE)\
00141     ENUM_AUTO(HUB_ERR_CONNECTION)\
00142 
00143 #define ARM_UC_EQ_ERR_LIST\
00144     ENUM_FIXED(ARM_UC_EQ_ERR_NONE, EVENT_QUEUE_PREFIX)\
00145     ENUM_AUTO(ARM_UC_EQ_ERR_POOL_EXHAUSTED)\
00146     ENUM_AUTO(ARM_UC_EQ_ERR_FAILED_TAKE)\
00147 
00148 #define ARM_UC_ERR_LIST\
00149     ARM_UC_COMMON_ERR_LIST\
00150     ARM_UC_MM_ERR_LIST\
00151     ARM_UC_CM_ERR_LIST\
00152     ARM_UC_DP_ERR_LIST\
00153     ARM_UC_SM_ERR_LIST\
00154     ARM_UC_SRC_ERR_LIST\
00155     ARM_UC_FM_ERR_LIST\
00156     ARM_UC_CU_ERR_LIST\
00157     ARM_UC_DI_ERR_LIST\
00158     ARM_UC_HB_ERR_LIST\
00159     ARM_UC_EQ_ERR_LIST\
00160 
00161 enum arm_uc_error {
00162     #define ENUM_AUTO(name) name,
00163     #define ENUM_FIXED(name, val) name = val,
00164     ARM_UC_ERR_LIST
00165     #undef ENUM_AUTO
00166     #undef ENUM_FIXED
00167 };
00168 union arm_uc_error_code {
00169     int32_t code;
00170     struct {
00171         int16_t error;
00172         union {
00173             uint16_t module;
00174             uint8_t  modulecc[2];
00175         };
00176     };
00177 };
00178 
00179 typedef union arm_uc_error_code arm_uc_error_t;
00180 
00181 
00182 #define ARM_UC_ERROR(CODE)              ((arm_uc_error_t){ CODE })
00183 #define ARM_UC_IS_ERROR(VAR)            ((VAR).error != ERR_NONE)
00184 #define ARM_UC_IS_NOT_ERROR(VAR)        (!ARM_UC_IS_ERROR(VAR))
00185 
00186 #define ARM_UC_CLEAR_ERROR(ERR)\
00187     ((ERR).code = (ERR_NONE))
00188 #define ARM_UC_INIT_ERROR(VAR, CODE)    arm_uc_error_t (VAR) = arm_uc_code_to_error( CODE )
00189 #define ARM_UC_GET_ERROR(VAR)           ((VAR).code)
00190 
00191 #if ARM_UC_ERROR_TRACE_ENABLE
00192 #define ARM_UC_SET_ERROR(VAR, CODE)\
00193     do { (VAR).code = (CODE);\
00194     if ( ARM_UC_IS_ERROR(VAR) ) \
00195         UC_ERROR_TRACE("set error %" PRIx32, (long unsigned int)CODE);\
00196     } while (0)
00197 #else
00198 #define ARM_UC_SET_ERROR(VAR, CODE)                 (VAR).code = (CODE)
00199 #endif
00200 // have a way to set errors without trace for values that are not strictly errors.
00201 #define ARM_UC_SET_ERROR_NEVER_TRACE(VAR, CODE)     (VAR).code = (CODE)
00202 
00203 
00204 #ifdef __cplusplus
00205 extern "C" {
00206 #endif
00207 
00208 const char* ARM_UC_err2Str(arm_uc_error_t err);
00209 static inline arm_uc_error_t arm_uc_code_to_error(uint32_t code) {
00210     arm_uc_error_t err;
00211     err.code = code;
00212     return err;
00213 }
00214 
00215 #ifdef __cplusplus
00216 }
00217 #endif
00218 #endif // ARM_UPDATE_ERROR_H