예제 #1
0
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,
								&reg, 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,
									&reg, 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;
}
예제 #2
0
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;
}
예제 #3
0
파일: cm_nuc100.c 프로젝트: GorosVi/vsprog
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;
}
예제 #4
0
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;
}
예제 #5
0
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;
}