You've already forked ESP32-DAPLink
mirror of
https://github.com/m5stack/ESP32-DAPLink.git
synced 2026-05-20 11:37:17 -07:00
265 lines
7.4 KiB
C
265 lines
7.4 KiB
C
/**
|
|
* @file error.c
|
|
* @brief Implementation of error.h
|
|
*
|
|
* DAPLink Interface Firmware
|
|
* Copyright (c) 2009-2020, ARM Limited, All Rights Reserved
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
* not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include "error.h"
|
|
|
|
#if !DAPLINK_NO_ERROR_MESSAGES
|
|
static const char *const error_message[] = {
|
|
|
|
/* Shared errors */
|
|
|
|
// ERROR_SUCCESS
|
|
"Operation was successful",
|
|
// ERROR_FAILURE
|
|
"An error has occurred",
|
|
// ERROR_INTERNAL
|
|
"An internal error has occurred",
|
|
|
|
/* VFS user errors */
|
|
|
|
// ERROR_ERROR_DURING_TRANSFER
|
|
"An error occurred during the transfer",
|
|
// ERROR_TRANSFER_TIMEOUT
|
|
"The transfer timed out.",
|
|
// ERROR_FILE_BOUNDS
|
|
"Possible mismatch between file size and size programmed",
|
|
// ERROR_OOO_SECTOR
|
|
"File sent out of order by PC. Target might not be programmed correctly.",
|
|
|
|
/* Target flash errors */
|
|
|
|
// ERROR_RESET
|
|
"Failed to reset/halt the target MCU",
|
|
// ERROR_ALGO_DL
|
|
"Failed to download flash algorithm to target MCU",
|
|
//ERROR_ALGO_MISSING
|
|
"Flash algorithm missing for a region",
|
|
// ERROR_ALGO_DATA_SEQ
|
|
"Failed to download the flash data contents to be programmed",
|
|
// ERROR_INIT
|
|
"Failed to initialize the target MCU",
|
|
// ERROR_UNINIT
|
|
"Failed to uninitialize the target MCU",
|
|
// ERROR_SECURITY_BITS
|
|
"Programming aborted: image would lock target MCU",
|
|
// ERROR_UNLOCK
|
|
"Failed to unlock target MCU for programming",
|
|
// ERROR_ERASE_SECTOR
|
|
"Flash algorithm erase sector command FAILURE",
|
|
// ERROR_ERASE_ALL
|
|
"Flash algorithm erase all command FAILURE",
|
|
// ERROR_WRITE
|
|
"Flash algorithm write command FAILURE",
|
|
// ERROR_WRITE_VERIFY
|
|
"Flash algorithm write verify command FAILURE",
|
|
|
|
/* File stream errors */
|
|
|
|
// ERROR_SUCCESS_DONE
|
|
"End of stream has been reached",
|
|
// ERROR_SUCCESS_DONE_OR_CONTINUE
|
|
"End of stream is unknown",
|
|
// ERROR_HEX_CKSUM
|
|
"The hex file cannot be decoded. Checksum calculation failure occurred.",
|
|
// ERROR_HEX_PARSER
|
|
"The hex file cannot be decoded. Parser logic failure occurred.",
|
|
// ERROR_HEX_PROGRAM
|
|
"The hex file cannot be programmed. Logic failure occurred.",
|
|
// ERROR_HEX_INVALID_ADDRESS
|
|
"The hex file you dropped isn't compatible with this mode or device. Are you in MAINTENANCE mode? See HELP FAQ.HTM",
|
|
// ERROR_HEX_INVALID_APP_OFFSET
|
|
"The hex file offset load address is not correct.",
|
|
|
|
/* Flash decoder errors */
|
|
|
|
// ERROR_FD_BL_UPDT_ADDR_WRONG
|
|
"The starting address for the bootloader update is wrong.",
|
|
// ERROR_FD_INTF_UPDT_ADDR_WRONG
|
|
"The starting address for the interface update is wrong.",
|
|
// ERROR_FD_UNSUPPORTED_UPDATE
|
|
"The application file format is unknown and cannot be parsed and/or processed.",
|
|
// ERROR_FD_INCOMPATIBLE_IMAGE
|
|
"The application image is not compatible with the target.",
|
|
|
|
/* Flash IAP interface */
|
|
|
|
// ERROR_IAP_INIT
|
|
"In application programming initialization failed.",
|
|
// ERROR_IAP_UNINIT
|
|
"In application programming uninit failed.",
|
|
// ERROR_IAP_WRITE
|
|
"In application programming write failed.",
|
|
// ERROR_IAP_ERASE_SECTOR
|
|
"In application programming sector erase failed.",
|
|
// ERROR_IAP_ERASE_ALL
|
|
"In application programming mass erase failed.",
|
|
// ERROR_IAP_OUT_OF_BOUNDS
|
|
"In application programming aborted due to an out of bounds address.",
|
|
// ERROR_IAP_UPDT_NOT_SUPPORTED
|
|
"In application programming not supported on this device.",
|
|
// ERROR_IAP_UPDT_INCOMPLETE
|
|
"In application programming failed because the update sent was incomplete.",
|
|
// ERROR_IAP_NO_INTERCEPT
|
|
"",
|
|
// ERROR_BL_UPDT_BAD_CRC
|
|
"The bootloader CRC did not pass.",
|
|
|
|
};
|
|
|
|
#endif // DAPLINK_NO_ERROR_MESSAGES
|
|
|
|
static dap_err_type_t error_type[] = {
|
|
|
|
/* These should always stay the same for each error type. */
|
|
|
|
// ERROR_SUCCESS
|
|
0,
|
|
// ERROR_FAILURE
|
|
ERROR_TYPE_INTERNAL,
|
|
// ERROR_INTERNAL
|
|
ERROR_TYPE_INTERNAL,
|
|
|
|
/* VFS user errors */
|
|
|
|
// ERROR_ERROR_DURING_TRANSFER
|
|
ERROR_TYPE_TRANSIENT,
|
|
// ERROR_TRANSFER_TIMEOUT
|
|
ERROR_TYPE_USER | ERROR_TYPE_TRANSIENT,
|
|
// ERROR_FILE_BOUNDS
|
|
ERROR_TYPE_TRANSIENT,
|
|
// ERROR_OOO_SECTOR
|
|
ERROR_TYPE_TRANSIENT,
|
|
|
|
/* Target flash errors */
|
|
|
|
// ERROR_RESET
|
|
ERROR_TYPE_TARGET,
|
|
// ERROR_ALGO_DL
|
|
ERROR_TYPE_TARGET,
|
|
//ERROR_ALGO_MISSING
|
|
ERROR_TYPE_TARGET,
|
|
// ERROR_ALGO_DATA_SEQ
|
|
ERROR_TYPE_TARGET,
|
|
// ERROR_INIT
|
|
ERROR_TYPE_TARGET,
|
|
// ERROR_UNINIT
|
|
ERROR_TYPE_TARGET,
|
|
// ERROR_SECURITY_BITS
|
|
ERROR_TYPE_USER,
|
|
// ERROR_UNLOCK
|
|
ERROR_TYPE_TARGET,
|
|
// ERROR_ERASE_SECTOR
|
|
ERROR_TYPE_TARGET,
|
|
// ERROR_ERASE_ALL
|
|
ERROR_TYPE_TARGET,
|
|
// ERROR_WRITE
|
|
ERROR_TYPE_TARGET,
|
|
// ERROR_WRITE_VERIFY
|
|
ERROR_TYPE_TARGET,
|
|
|
|
/* File stream errors */
|
|
|
|
// ERROR_SUCCESS_DONE
|
|
ERROR_TYPE_INTERNAL,
|
|
// ERROR_SUCCESS_DONE_OR_CONTINUE
|
|
ERROR_TYPE_INTERNAL,
|
|
// ERROR_HEX_CKSUM
|
|
ERROR_TYPE_USER | ERROR_TYPE_TRANSIENT,
|
|
// ERROR_HEX_PARSER
|
|
ERROR_TYPE_USER | ERROR_TYPE_TRANSIENT,
|
|
// ERROR_HEX_PROGRAM
|
|
ERROR_TYPE_USER | ERROR_TYPE_TRANSIENT,
|
|
// ERROR_HEX_INVALID_ADDRESS
|
|
ERROR_TYPE_USER,
|
|
// ERROR_HEX_INVALID_APP_OFFSET
|
|
ERROR_TYPE_USER,
|
|
|
|
/* Flash decoder errors */
|
|
|
|
// ERROR_FD_BL_UPDT_ADDR_WRONG
|
|
ERROR_TYPE_USER,
|
|
// ERROR_FD_INTF_UPDT_ADDR_WRONG
|
|
ERROR_TYPE_USER,
|
|
// ERROR_FD_UNSUPPORTED_UPDATE
|
|
ERROR_TYPE_USER,
|
|
// ERROR_FD_INCOMPATIBLE_IMAGE
|
|
ERROR_TYPE_USER,
|
|
|
|
/* Flash IAP interface */
|
|
|
|
// ERROR_IAP_INIT
|
|
ERROR_TYPE_INTERFACE,
|
|
// ERROR_IAP_UNINIT
|
|
ERROR_TYPE_INTERFACE,
|
|
// ERROR_IAP_WRITE
|
|
ERROR_TYPE_INTERFACE,
|
|
// ERROR_IAP_ERASE_SECTOR
|
|
ERROR_TYPE_INTERFACE,
|
|
// ERROR_IAP_ERASE_ALL
|
|
ERROR_TYPE_INTERFACE,
|
|
// ERROR_IAP_OUT_OF_BOUNDS
|
|
ERROR_TYPE_INTERFACE,
|
|
// ERROR_IAP_UPDT_NOT_SUPPORTED
|
|
ERROR_TYPE_INTERFACE,
|
|
// ERROR_IAP_UPDT_INCOMPLETE
|
|
ERROR_TYPE_INTERFACE,
|
|
// ERROR_IAP_NO_INTERCEPT
|
|
ERROR_TYPE_INTERFACE,
|
|
// ERROR_BL_UPDT_BAD_CRC
|
|
ERROR_TYPE_INTERFACE,
|
|
};
|
|
|
|
const char *error_get_string(dap_err_t error)
|
|
{
|
|
#if !DAPLINK_NO_ERROR_MESSAGES
|
|
const char *msg = NULL;
|
|
|
|
if (error < ERROR_COUNT) {
|
|
msg = error_message[error];
|
|
}
|
|
|
|
if (0 == msg) {
|
|
msg = "";
|
|
}
|
|
|
|
return msg;
|
|
#else // DAPLINK_NO_ERROR_MESSAGES
|
|
static char error_num_str[10] = "Error 00";
|
|
#define ERROR_NUM_CHAR_INDEX (6) // offset of first '0' in error_num_str[]
|
|
|
|
error_num_str[ERROR_NUM_CHAR_INDEX+0] = '0' + ((int)error / 1000) % 10;
|
|
error_num_str[ERROR_NUM_CHAR_INDEX+1] = '0' + ((int)error / 100) % 10;
|
|
error_num_str[ERROR_NUM_CHAR_INDEX+2] = 0;
|
|
#endif // DAPLINK_NO_ERROR_MESSAGES
|
|
}
|
|
|
|
dap_err_type_t error_get_type(dap_err_t error)
|
|
{
|
|
dap_err_type_t type = ERROR_TYPE_INTERNAL;
|
|
|
|
if (error < ERROR_COUNT) {
|
|
type = error_type[error];
|
|
}
|
|
|
|
return type;
|
|
}
|