Example #1
0
RESULT versaloon_init(void)
{
	uint16_t ret = 0;
	uint8_t retry;
	uint32_t timeout_tmp;

	/* malloc temporary buffer */
	versaloon_buf =
		(uint8_t *)malloc(versaloon_interface.usb_setting.buf_size);
	if (NULL == versaloon_buf) {
		LOG_ERROR(ERRMSG_NOT_ENOUGH_MEMORY);
		return ERRCODE_NOT_ENOUGH_MEMORY;
	}

	/* connect to versaloon */
	timeout_tmp = versaloon_usb_to;
	/* not output error message when connectting */
	/* 100ms delay when connect */
	versaloon_usb_to = 100;
	for (retry = 0; retry < VERSALOON_RETRY_CNT; retry++) {
		versaloon_buf[0] = VERSALOON_GET_INFO;
		if ((ERROR_OK == versaloon_send_command(1, &ret)) && (ret >= 3))
			break;
	}
	versaloon_usb_to = timeout_tmp;
	if (VERSALOON_RETRY_CNT == retry) {
		versaloon_fini();
		LOG_ERROR(ERRMSG_FAILURE_OPERATION, "communicate with versaloon");
		return ERRCODE_FAILURE_OPERATION;
	}

	versaloon_buf[ret] = 0;
	versaloon_buf_size = versaloon_buf[0] + (versaloon_buf[1] << 8);
	versaloon_interface.usb_setting.buf_size = versaloon_buf_size;
	LOG_INFO("%s", versaloon_buf + 2);

	/* free temporary buffer */
	free(versaloon_buf);
	versaloon_buf = NULL;

	versaloon_buf =
		(uint8_t *)malloc(versaloon_interface.usb_setting.buf_size);
	if (NULL == versaloon_buf) {
		versaloon_fini();
		LOG_ERROR(ERRMSG_NOT_ENOUGH_MEMORY);
		return ERRCODE_NOT_ENOUGH_MEMORY;
	}
	versaloon_cmd_buf =
		(uint8_t *)malloc(versaloon_interface.usb_setting.buf_size - 3);
	if (NULL == versaloon_cmd_buf) {
		versaloon_fini();
		LOG_ERROR(ERRMSG_NOT_ENOUGH_MEMORY);
		return ERRCODE_NOT_ENOUGH_MEMORY;
	}
	if (ERROR_OK != usbtoxxx_init()) {
		LOG_ERROR(ERRMSG_FAILURE_OPERATION, "initialize usbtoxxx");
		return ERROR_FAIL;
	}
	return versaloon_get_target_voltage(&ret);
}
Example #2
0
static vsf_err_t versaloon_init(void *p)
{
	struct interfaces_info_t *t = (struct interfaces_info_t *)p;
	uint16_t ret = 0;
	uint8_t retry;
	vsf_err_t err = VSFERR_NONE;
	
	if (t->comm->init())
	{
		return VSFERR_FAIL;
	}
	
	// malloc temporary buffer
	if (!versaloon_usbtoxxx_info.buff_len)
	{
		versaloon_usbtoxxx_info.buff_len = 256;
	}
	versaloon_usbtoxxx_info.buff =
						(uint8_t *)malloc(versaloon_usbtoxxx_info.buff_len);
	if (NULL == versaloon_usbtoxxx_info.buff)
	{
		LOG_ERROR(ERRMSG_NOT_ENOUGH_MEMORY);
		err = VSFERR_NOT_ENOUGH_RESOURCES;
		goto versaloon_init_fail;
	}
	
	sleep_ms(100);
	
	// connect to versaloon
	LOG_PUSH();
	LOG_MUTE();
	// not output error message when connectting
	// 500ms delay when connect
	t->comm->set_timeout(100);
	for (retry = 0; retry < VERSALOON_RETRY_CNT; retry++)
	{
		versaloon_usbtoxxx_info.buff[0] = VERSALOON_GET_INFO;
		ret = versaloon_usbtoxxx_info.buff_len;
		if (!t->comm->transact(versaloon_usbtoxxx_info.buff, 1,
								versaloon_usbtoxxx_info.buff, &ret) &&
			(ret >= 3))
		{
			break;
		}
	}
	LOG_POP();
	t->comm->set_timeout(VERSALOON_TIMEOUT);
	if (VERSALOON_RETRY_CNT == retry)
	{
		LOG_ERROR(ERRMSG_FAILURE_OPERATION, "communicate with versaloon");
		err = ERRCODE_FAILURE_OPERATION;
		goto versaloon_init_fail;
	}
	
	versaloon_usbtoxxx_info.buff[ret] = 0;
	versaloon_usbtoxxx_info.buff_len =
								GET_LE_U16(&versaloon_usbtoxxx_info.buff[0]);
	LOG_INFO("%s", &versaloon_usbtoxxx_info.buff[2]);
	
	// free temporary buffer
	free(versaloon_usbtoxxx_info.buff);
	versaloon_usbtoxxx_info.buff = NULL;
	
	usbtoxxx_info = &versaloon_usbtoxxx_info;
	usbtoxxx_info->comm = t->comm;
	if (usbtoxxx_init())
	{
		err = VSFERR_FAIL;
		goto versaloon_init_fail;
	}
	// fixes programmer abilities
	if (t != NULL)
	{
		if ((t->support_mask & IFS_CLOCK) &&
			!usbtoxxx_interface_supported(USB_TO_CLKO))
		{
			t->support_mask &= ~IFS_CLOCK;
		}
		if ((t->support_mask & IFS_POLL) &&
			!usbtoxxx_interface_supported(USB_TO_POLL))
		{
			t->support_mask &= ~IFS_POLL;
		}
		if ((t->support_mask & IFS_USART) &&
			!usbtoxxx_interface_supported(USB_TO_USART))
		{
			t->support_mask &= ~IFS_USART;
		}
		if ((t->support_mask & IFS_SPI) &&
			!usbtoxxx_interface_supported(USB_TO_SPI))
		{
			t->support_mask &= ~IFS_SPI;
		}
		if ((t->support_mask & IFS_EBI) &&
			!usbtoxxx_interface_supported(USB_TO_EBI))
		{
			t->support_mask &= ~IFS_EBI;
		}
		if ((t->support_mask & IFS_I2C) &&
			!usbtoxxx_interface_supported(USB_TO_I2C))
		{
			t->support_mask &= ~IFS_I2C;
		}
		if ((t->support_mask & IFS_GPIO) &&
			!usbtoxxx_interface_supported(USB_TO_GPIO))
		{
			t->support_mask &= ~IFS_GPIO;
		}
		if ((t->support_mask & IFS_CAN) &&
			!usbtoxxx_interface_supported(USB_TO_CAN))
		{
			t->support_mask &= ~IFS_CAN;
		}
		if ((t->support_mask & IFS_ADC) &&
			!usbtoxxx_interface_supported(USB_TO_ADC))
		{
			t->support_mask &= ~IFS_ADC;
		}
		if ((t->support_mask & IFS_DAC) &&
			!usbtoxxx_interface_supported(USB_TO_DAC))
		{
			t->support_mask &= ~IFS_DAC;
		}
		if ((t->support_mask & IFS_POWER) &&
			!usbtoxxx_interface_supported(USB_TO_POWER))
		{
			t->support_mask &= ~IFS_POWER;
		}
		if ((t->support_mask & IFS_ISSP) &&
			!usbtoxxx_interface_supported(USB_TO_ISSP))
		{
			t->support_mask &= ~IFS_ISSP;
		}
		if ((t->support_mask & IFS_JTAG_HL) &&
			!usbtoxxx_interface_supported(USB_TO_JTAG_HL))
		{
			t->support_mask &= ~IFS_JTAG_HL;
		}
		if ((t->support_mask & IFS_JTAG_LL) &&
			!usbtoxxx_interface_supported(USB_TO_JTAG_LL))
		{
			t->support_mask &= ~IFS_JTAG_LL;
		}
		if ((t->support_mask & IFS_MSP430_JTAG) &&
			!usbtoxxx_interface_supported(USB_TO_MSP430_JTAG))
		{
			t->support_mask &= ~IFS_MSP430_JTAG;
		}
		if ((t->support_mask & IFS_C2) &&
			!usbtoxxx_interface_supported(USB_TO_C2))
		{
			t->support_mask &= ~IFS_C2;
		}
		if ((t->support_mask & IFS_USART) &&
			!usbtoxxx_interface_supported(USB_TO_USART))
		{
			t->support_mask &= ~IFS_USART;
		}
		if ((t->support_mask & IFS_LPC_ICP) &&
			!usbtoxxx_interface_supported(USB_TO_LPCICP))
		{
			t->support_mask &= ~IFS_LPC_ICP;
		}
		if ((t->support_mask & IFS_SWD) &&
			!usbtoxxx_interface_supported(USB_TO_SWD))
		{
			t->support_mask &= ~IFS_SWD;
		}
		if ((t->support_mask & IFS_SWIM) &&
			!usbtoxxx_interface_supported(USB_TO_SWIM))
		{
			t->support_mask &= ~IFS_SWIM;
		}
		if ((t->support_mask & IFS_JTAG_RAW) &&
			!usbtoxxx_interface_supported(USB_TO_JTAG_RAW))
		{
			t->support_mask &= ~IFS_JTAG_RAW;
		}
		if ((t->support_mask & IFS_BDM) &&
			!usbtoxxx_interface_supported(USB_TO_BDM))
		{
			t->support_mask &= ~IFS_BDM;
		}
		if ((t->support_mask & IFS_DUSI) &&
			!usbtoxxx_interface_supported(USB_TO_DUSI))
		{
			t->support_mask &= ~IFS_DUSI;
		}
		if ((t->support_mask & IFS_MICROWIRE) &&
			!usbtoxxx_interface_supported(USB_TO_MICROWIRE))
		{
			t->support_mask &= ~IFS_MICROWIRE;
		}
		if ((t->support_mask & IFS_PWM) &&
			!usbtoxxx_interface_supported(USB_TO_PWM))
		{
			t->support_mask &= ~IFS_PWM;
		}
	}
	
	return VSFERR_NONE;
versaloon_init_fail:
	versaloon_fini(t);
	return err;
}