static vsf_err_t at91sam3swj_iap_call(struct at91sam3swj_iap_command_t *cmd, struct at91sam3swj_iap_reply_t *reply) { uint32_t reg; uint32_t start, end; uint32_t i; reg = cmd->iap_command | AT91SAM3_EEFC_FKEY; if (adi_memap_write_reg32(cmd->eefc_base + AT91SAM3_EEFC_FCR_OFFSET, ®, 1)) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "write fcr"); return ERRCODE_FAILURE_OPERATION; } start = (uint32_t)(clock() / (CLOCKS_PER_SEC / 1000)); do { reg = 0; if (adi_memap_read_reg32(cmd->eefc_base + AT91SAM3_EEFC_FSR_OFFSET, ®, 1)) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read fsr"); return ERRCODE_FAILURE_OPERATION; } reg = LE_TO_SYS_U32(reg); end = (uint32_t)(clock() / (CLOCKS_PER_SEC / 1000)); } while (!(reg & 1) && ((end - start) < 500)); if (!(reg & 1) || (reg & 0x60)) { return VSFERR_FAIL; } if ((reply != NULL) && (reply->data != NULL) && (reply->data_num > 0)) { for (i = 0; i < reply->data_num; i++) { if (adi_memap_read_reg32(cmd->eefc_base + AT91SAM3_EEFC_FRR_OFFSET, &reply->data[i], 1)) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read frr"); return ERRCODE_FAILURE_OPERATION; } reply->data[i] = LE_TO_SYS_U32(reply->data[i]); } } return VSFERR_NONE; }
vsf_err_t stm32swj_fl_poll_result(struct stm32_fl_t *fl, struct stm32_fl_result_t *result) { uint32_t buff_tmp[2]; uint8_t i; // read result and sync // sync is 4-byte BEFORE result if (adi_memap_read_buf32(fl->base + STM32_FL_SYNC_OFFSET, (uint8_t *)buff_tmp, sizeof(buff_tmp))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read flashloader sync"); return ERRCODE_FAILURE_OPERATION; } for (i = 0; i < dimof(buff_tmp); i++) { buff_tmp[i] = LE_TO_SYS_U32(buff_tmp[i]); } if (0 == buff_tmp[0]) { result->result = buff_tmp[1]; return VSFERR_NONE; } return VSFERR_NOT_READY; }
static vsf_err_t nuc100swj_iap_poll_finish(struct nuc100_fl_t *fl) { uint32_t iap_cnt, iap_fail; // read fail if (adi_memap_read_reg32(NUC100_IAP_FAIL_ADDR, &iap_fail, 1)) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read iap fail"); return ERRCODE_FAILURE_OPERATION; } if (iap_fail) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "run iap"); cm_dump(NUC100_IAP_BASE, sizeof(iap_code)); return VSFERR_FAIL; } // read busy if (adi_memap_read_reg32(NUC100_IAP_CNT_ADDR, &iap_cnt, 1)) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read iap sync"); return ERRCODE_FAILURE_OPERATION; } iap_cnt = LE_TO_SYS_U32(iap_cnt); if (iap_cnt > fl->iap_cnt) { cm_dump(NUC100_IAP_BASE, sizeof(iap_code)); return VSFERR_FAIL; } return (iap_cnt == fl->iap_cnt) ? VSFERR_NONE : VSFERR_NOT_READY; }
static vsf_err_t kinetisswj_iap_poll_result(struct kinetis_fl_t *fl, struct kinetisswj_iap_rpl_t *result) { uint32_t result_buff[4]; REFERENCE_PARAMETER(fl); if (adi_memap_read_buf32(KINETIS_IAP_SYNC_ADDR, (uint8_t *)result_buff, sizeof(result_buff))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read iap sync"); return ERRCODE_FAILURE_OPERATION; } result->sync = LE_TO_SYS_U32(result_buff[0]); result->iap_cnt = LE_TO_SYS_U32(result_buff[1]); result->fail = LE_TO_SYS_U32(result_buff[2]); result->result = LE_TO_SYS_U32(result_buff[3]); return (0 == result->sync) ? VSFERR_NONE : VSFERR_NOT_READY; }
static vsf_err_t nuc400swj_iap_poll_param_taken(struct nuc400_fl_t *fl) { uint32_t sync; REFERENCE_PARAMETER(fl); // read sync if (adi_memap_read_reg32(NUC400_IAP_SYNC_ADDR, &sync, 1)) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read iap sync"); return ERRCODE_FAILURE_OPERATION; } sync = LE_TO_SYS_U32(sync); return (0 == sync) ? VSFERR_NONE : VSFERR_NOT_READY; }