diff --git a/src/target/lpc_common.c b/src/target/lpc_common.c index b16c22c2..bfb5c8ee 100644 --- a/src/target/lpc_common.c +++ b/src/target/lpc_common.c @@ -33,6 +33,42 @@ struct flash_param { uint32_t result[4]; } __attribute__((aligned(4))); +char *iap_error[] = { + "CMD_SUCCESS", + "Invalid command", + "Unaligned src address", + "Dst address not on boundary", + "Src not mapped", + "Dst not mapped", + "Invalid byte count", + "Invalid sector", + "Sector not blank", + "Sector not prepared", + "Compare error", + "Flash interface busy", + "Invalid or missing parameter", + "Address not on boundary", + "Address not mapped", + "Checksum error", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "FRO not powered", + "Flash not powered", + "25", + "26", + "Flash clock disabled", + "Reinvoke error", + "Invalid image", + "30", + "31", + "Flash erase failed", + "Page is invalid", +}; struct lpc_flash *lpc_add_flash(target *t, target_addr addr, size_t length) { @@ -109,11 +145,17 @@ enum iap_status lpc_iap_call(struct lpc_flash *f, void *result, enum iap_cmd cmd if (result != NULL) memcpy(result, param.result, sizeof(param.result)); +#if defined(ENABLE_DEBUG) if (param.status != IAP_STATUS_CMD_SUCCESS) { - DEBUG_WARN("IAP failure code %d for cmd %d\n", - (enum iap_status)param.status, cmd); + if (param.status > (sizeof(iap_error) / sizeof(char*))) + DEBUG_WARN("IAP cmd %d : %d\n", cmd, param.status); + else + DEBUG_WARN("IAP cmd %d : %s\n", cmd, iap_error[param.status]); + DEBUG_WARN("return parameters: %08" PRIx32 " %08" PRIx32 " %08" PRIx32 + " %08" PRIx32 "\n", param.result[0], + param.result[1], param.result[2], param.result[3]); } - +#endif return param.status; } diff --git a/src/target/lpc_common.h b/src/target/lpc_common.h index 3130e96b..d5a4efc3 100644 --- a/src/target/lpc_common.h +++ b/src/target/lpc_common.h @@ -21,14 +21,23 @@ #define __LPC_COMMON_H enum iap_cmd { + IAP_CMD_READ_FACTORY_SETTINGS = 40, IAP_CMD_INIT = 49, IAP_CMD_PREPARE = 50, IAP_CMD_PROGRAM = 51, IAP_CMD_ERASE = 52, IAP_CMD_BLANKCHECK = 53, IAP_CMD_PARTID = 54, + IAP_CMD_READ_BOOTROM_VERSION = 55, + IAP_CMD_COMPARE = 56, + IAP_CMD_REINVOKE_ISP = 57, IAP_CMD_READUID = 58, + IAP_CMD_ERASE_PAGE = 59, IAP_CMD_SET_ACTIVE_BANK = 60, + IAP_CMD_READ_SIGNATURE = 70, + IAP_CMD_EXTENDED_READ_SIGNATURE = 73, + IAP_CMD_READ_EEPROM_PAGE = 80, + IAP_CMD_WRITE_EEPROM_PAGE = 81, }; enum iap_status { @@ -44,6 +53,16 @@ enum iap_status { IAP_STATUS_SECTOR_NOT_PREPARED = 9, IAP_STATUS_COMPARE_ERROR = 10, IAP_STATUS_BUSY = 11, + IAP_STATUS_MISSING_PARAMETERS = 12, + IAP_STATUS_UNALIGNED_ADDRESS = 13, + IAP_STATUS_ADDRESS_NOT_MAPPED = 14, + IAP_STATUS_FRO_NO_POWER = 23, + IAP_STATUS_FLASH_NO_POWER = 24, + IAP_STATUS_NO_CLOCK = 27, + IAP_STATUS_REINVOKE_CFG_ERR = 28, + IAP_STATUS_NO_VALID_IMAGE = 29, + IAP_STATUS_FLASH_ERASE = 32, + IAP_STATUS_INVALID_PAGE = 33, }; /* CPU Frequency */