Example #1
0
/*
************************************************************************************************************
*
*                                             function
*
*    name          :
*
*    parmeters     :
*
*    return        :
*
*    note          :
*
*
************************************************************************************************************
*/
static int sunxi_fastboot_state_loop(void  *buffer)
{
	int ret;
	sunxi_ubuf_t *sunxi_ubuf = (sunxi_ubuf_t *)buffer;
	char  response[68];

	switch(sunxi_usb_fastboot_status)
	{
		case SUNXI_USB_FASTBOOT_IDLE:
			if(sunxi_ubuf->rx_ready_for_data == 1)
			{
				sunxi_usb_fastboot_status = SUNXI_USB_FASTBOOT_SETUP;
			}

			break;

		case SUNXI_USB_FASTBOOT_SETUP:

			tick_printf("SUNXI_USB_FASTBOOT_SETUP\n");

			tick_printf("fastboot command = %s\n", sunxi_ubuf->rx_req_buffer);

			sunxi_usb_fastboot_status = SUNXI_USB_FASTBOOT_IDLE;
			sunxi_ubuf->rx_ready_for_data = 0;
			if(memcmp(sunxi_ubuf->rx_req_buffer, "reboot-bootloader", strlen("reboot-bootloader")) == 0)
			{
				tick_printf("reboot-bootloader\n");
				__fastboot_reboot(PMU_PRE_FASTBOOT_MODE);
			}
            else if(memcmp(sunxi_ubuf->rx_req_buffer, "reboot", 6) == 0)
			{
				tick_printf("reboot\n");
				__fastboot_reboot(0);
			}
			else if(memcmp(sunxi_ubuf->rx_req_buffer, "erase:", 6) == 0)
			{
				tick_printf("erase\n");
				__erase_part((char *)(sunxi_ubuf->rx_req_buffer + 6));
			}
			else if(memcmp(sunxi_ubuf->rx_req_buffer, "flash:", 6) == 0)
			{
				tick_printf("flash\n");
				__flash_to_part((char *)(sunxi_ubuf->rx_req_buffer + 6));
			}
			else if(memcmp(sunxi_ubuf->rx_req_buffer, "download:", 9) == 0)
			{
				tick_printf("download\n");
				ret = __try_to_download((char *)(sunxi_ubuf->rx_req_buffer + 9), response);
				if(ret >= 0)
				{
					fastboot_data_flag = 1;
					sunxi_ubuf->rx_req_buffer  = (uchar *)trans_data.base_recv_buffer;
					sunxi_usb_fastboot_status  = SUNXI_USB_FASTBOOT_RECEIVE_DATA;
				}
				__sunxi_fastboot_send_status(response, strlen(response));
			}
			else if(memcmp(sunxi_ubuf->rx_req_buffer, "boot", 4) == 0)
			{
				tick_printf("boot\n");
				__boot();
			}
			else if(memcmp(sunxi_ubuf->rx_req_buffer, "getvar:", 7) == 0)
			{
				tick_printf("getvar\n");
				__get_var((char *)(sunxi_ubuf->rx_req_buffer + 7));
			}
			else if(memcmp(sunxi_ubuf->rx_req_buffer, "oem", 3) == 0)
			{
				tick_printf("oem operations\n");
				__oem_operation((char *)(sunxi_ubuf->rx_req_buffer + 4));
			}
			else if(memcmp(sunxi_ubuf->rx_req_buffer, "continue", 8) == 0)
			{
				tick_printf("continue\n");
				__continue();
			}
			else
			{
				tick_printf("not supported fastboot cmd\n");
				__unsupported_cmd();
			}

			break;

	  	case SUNXI_USB_FASTBOOT_SEND_DATA:

	  		tick_printf("SUNXI_USB_FASTBOOT_SEND_DATA\n");

	  		break;

	  	case SUNXI_USB_FASTBOOT_RECEIVE_DATA:

	  		//tick_printf("SUNXI_USB_FASTBOOT_RECEIVE_DATA\n");
	  		if((fastboot_data_flag == 1) && ((char *)sunxi_ubuf->rx_req_buffer == all_download_bytes + trans_data.base_recv_buffer))	//传输完毕
	  		{
	  			tick_printf("fastboot transfer finish\n");
	  			fastboot_data_flag = 0;
	  			sunxi_usb_fastboot_status  = SUNXI_USB_FASTBOOT_IDLE;

		  		sunxi_ubuf->rx_req_buffer = sunxi_ubuf->rx_base_buffer;

		  		sprintf(response,"OKAY");
		  		__sunxi_fastboot_send_status(response, strlen(response));
			}

	  		break;

	  	default:
	  		break;
	}

	return 0;
}
Example #2
0
void warm_start (void)
{
        __boot();
}