⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptp_state.c

📁 mtk 6225平台的usb程序! 对想了解mtk平台usb的朋友会有帮助!
💻 C
📖 第 1 页 / 共 4 页
字号:
	if(g_USBImage.image_cmd.Parameter1 == DREQUEST_DPS)
	{
		PTP_CONTAINER 	*data = (PTP_CONTAINER *)g_USBImage.dps_request_tx_data;
		g_USBImage.state = PTP_RESPONSE;
		data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + g_USBImage.send_xml_size;
		data->ContainerType = USB_IMAGE_DATA_BLOCK;
		data->Code =  PTP_GET_OBJECT;
		data->TransactionID = g_USBImage.current_transactionID;
		g_USBImage.total_tx_bytes = data->ContainerLength;
		USB_Image_BuildTx((void *)g_USBImage.dps_request_tx_data, data->ContainerLength);
	}
	else if(g_USBImage.image_cmd.Parameter1 == DRSPONSE_DPS)
	{
		PTP_CONTAINER 	*data = (PTP_CONTAINER *)g_USBImage.dps_response_tx_data;
		g_USBImage.state = PTP_RESPONSE;
		data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + g_USBImage.send_xml_size;
		data->ContainerType = USB_IMAGE_DATA_BLOCK;
		data->Code =  PTP_GET_OBJECT;
		data->TransactionID = g_USBImage.current_transactionID;
		g_USBImage.total_tx_bytes = data->ContainerLength;
		USB_Image_BuildTx((void *)g_USBImage.dps_response_tx_data, data->ContainerLength);
	}
	else
	{
		PTP_CONTAINER 	*data = (PTP_CONTAINER *)g_USBImage.image_buffer;
		kal_uint8 	*index;
		kal_uint32	receive_file_size;


		
		kal_uint8		element_num;
		kal_uint16	filename[] = {'I','M','G','0','0','0','1','A','.','j','p','g','\0'};
		element_num = sizeof(filename)/sizeof(kal_uint16);

		/* use the handle (g_USBImage.image_cmd.Parameter1) to get file name from mmi */
		//ASSERT(0); if find nothing
		g_USBImage.current_file_handle = FS_Open(L"c:\\photos\\IMG0001A.jpg", FS_READ_ONLY);

		if(g_USBImage.current_file_handle <0)
		{
			USB_Image_Cancel_By_Device(data, PTP_GET_OBJECT);
			return;
		}

		if(FS_GetFileSize(g_USBImage.current_file_handle, &g_USBImage.total_tx_bytes) != FS_NO_ERROR) 
		{
			FS_Close(g_USBImage.current_file_handle);
			g_USBImage.current_file_handle = PTP_NO_HANDLE;
			USB_Image_Cancel_By_Device(data, PTP_GET_OBJECT);
			return;
		}
		
		g_USBImage.total_tx_bytes += USB_IMAGE_CONTAINER_LENGTH;
 		data->ContainerLength = g_USBImage.total_tx_bytes;
		data->ContainerType = USB_IMAGE_DATA_BLOCK;
		data->Code =  PTP_GET_OBJECT;
		data->TransactionID = g_USBImage.current_transactionID;
 		index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;

		if(g_USBImage.total_tx_bytes > USB_IMAGE_MAX_TX_BUFFERSIZE)
		{
			g_USBImage.rw_buffer_index = 0;
			g_USBImage.current_tx_bytes = 0;
			g_USBImage.rw_bytes = USB_IMAGE_MAX_TX_BUFFERSIZE;
					
			if(FS_Read(g_USBImage.current_file_handle, index, 
					USB_IMAGE_MAX_TX_BUFFERSIZE-USB_IMAGE_CONTAINER_LENGTH, &receive_file_size)!= FS_NO_ERROR) 
			{
				FS_Close(g_USBImage.current_file_handle);
				g_USBImage.current_file_handle = PTP_NO_HANDLE;
				USB_Image_Cancel_By_Device(data, PTP_GET_OBJECT);
				return;
			}
			g_USBImage.state = PTP_DATA_TX;
			PTP_Get_Object_Hdlr();
		}
		else
		{
			if(FS_Read(g_USBImage.current_file_handle, index, 
					g_USBImage.total_tx_bytes-USB_IMAGE_CONTAINER_LENGTH, &receive_file_size)!= FS_NO_ERROR) 
			{
				FS_Close(g_USBImage.current_file_handle);
				g_USBImage.current_file_handle = PTP_NO_HANDLE;
				USB_Image_Cancel_By_Device(data, PTP_GET_OBJECT);
				return;			
			}
			g_USBImage.state = PTP_RESPONSE;
			USB_Image_BuildTx((void *)g_USBImage.image_buffer, g_USBImage.total_tx_bytes);
			FS_Close(g_USBImage.current_file_handle);
			g_USBImage.current_file_handle = PTP_NO_HANDLE;			
		}
	}
}

static void PTP_Cmd_Get_Thumb(void)
{
	PTP_CONTAINER 	*data = (PTP_CONTAINER *)g_USBImage.image_buffer;
	kal_uint8 	*index;
	kal_uint32	receive_file_size;

	
	kal_uint8		element_num;
	kal_uint16	filename[] = {'I','M','G','0','0','0','1','A','.','j','p','g','\0'};
	element_num = sizeof(filename)/sizeof(kal_uint16);

	/* use the handle (g_USBImage.image_cmd.Parameter1) to get file name from mmi */
	//ASSERT(0); if find nothing
	
	g_USBImage.current_file_handle = FS_Open(L"c:\\photos\\IMG0001A.jpg", FS_READ_ONLY);
	
	if (g_USBImage.current_file_handle <0)
	{
		USB_Image_Cancel_By_Device(data, PTP_GET_THUMB);
		return;
	}
	
	if(FS_GetFileSize(g_USBImage.current_file_handle, &g_USBImage.total_tx_bytes) != FS_NO_ERROR) 
	{
		FS_Close(g_USBImage.current_file_handle);
		g_USBImage.current_file_handle = PTP_NO_HANDLE;
		USB_Image_Cancel_By_Device(data, PTP_GET_THUMB);
		return;		
	}
	g_USBImage.total_tx_bytes += USB_IMAGE_CONTAINER_LENGTH;
 	data->ContainerLength = g_USBImage.total_tx_bytes;
	data->ContainerType = USB_IMAGE_DATA_BLOCK;
	data->Code = PTP_GET_THUMB;
	data->TransactionID = g_USBImage.current_transactionID;
 	index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;

	if(g_USBImage.total_tx_bytes > USB_IMAGE_MAX_TX_BUFFERSIZE)
	{
		g_USBImage.rw_buffer_index = 0;
		g_USBImage.current_tx_bytes = 0;
		g_USBImage.rw_bytes = USB_IMAGE_MAX_TX_BUFFERSIZE;
		
		if(FS_Read(g_USBImage.current_file_handle, index, 
				USB_IMAGE_MAX_TX_BUFFERSIZE-USB_IMAGE_CONTAINER_LENGTH, &receive_file_size)!= FS_NO_ERROR) 
		{
			FS_Close(g_USBImage.current_file_handle);
			g_USBImage.current_file_handle = PTP_NO_HANDLE;
			USB_Image_Cancel_By_Device(data, PTP_GET_THUMB);
			return;				
		}
		g_USBImage.state = PTP_DATA_TX;
		PTP_Get_Object_Hdlr();
	}
	else
	{
		if(FS_Read(g_USBImage.current_file_handle, index, 
				g_USBImage.total_tx_bytes-USB_IMAGE_CONTAINER_LENGTH, &receive_file_size)!= FS_NO_ERROR) 
		{
			FS_Close(g_USBImage.current_file_handle);
			g_USBImage.current_file_handle = PTP_NO_HANDLE;
			USB_Image_Cancel_By_Device(data, PTP_GET_THUMB);
			return;
		}
		g_USBImage.state = PTP_RESPONSE;
		USB_Image_BuildTx((void *)g_USBImage.image_buffer, g_USBImage.total_tx_bytes);
		FS_Close(g_USBImage.current_file_handle);
		g_USBImage.current_file_handle = PTP_NO_HANDLE;
	}
}

static void PTP_Cmd_Get_Partial_Object(void)
{
 	PTP_CONTAINER *data = (PTP_CONTAINER *)g_USBImage.image_buffer;
	kal_uint8 	*index;
	kal_uint32	receive_file_size;


	kal_uint8		element_num;
	kal_uint16	filename[] = {'I','M','G','0','0','0','1','A','.','j','p','g','\0'};
	element_num = sizeof(filename)/sizeof(kal_uint16);

	/* use the handle (g_USBImage.image_cmd.Parameter1) to get file name from mmi */
	//ASSERT(0); if find nothing

	g_USBImage.current_file_handle = FS_Open(L"c:\\photos\\IMG0001A.jpg", FS_READ_ONLY);
	
	if(g_USBImage.current_file_handle <0)
	{
		USB_Image_Cancel_By_Device(data, PTP_GET_PARTIAL_OBJECT);
		return;		
	}

	if(g_USBImage.image_cmd.Parameter2 != 0)	/* offset */
	{
		if(FS_Seek(g_USBImage.current_file_handle, g_USBImage.image_cmd.Parameter2, FS_FILE_BEGIN) < 0)
		{
			FS_Close(g_USBImage.current_file_handle);
			g_USBImage.current_file_handle = PTP_NO_HANDLE;
			USB_Image_Cancel_By_Device(data, PTP_GET_PARTIAL_OBJECT);
			return;
		}
	}
	g_USBImage.total_tx_bytes = g_USBImage.image_cmd.Parameter3 + USB_IMAGE_CONTAINER_LENGTH;
	
	data->ContainerLength = g_USBImage.total_tx_bytes;	
	data->ContainerType = USB_IMAGE_DATA_BLOCK;
	data->Code =  PTP_GET_PARTIAL_OBJECT;
	data->TransactionID = g_USBImage.current_transactionID;
 	index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;

	if(g_USBImage.total_tx_bytes > USB_IMAGE_MAX_TX_BUFFERSIZE)
	{
		g_USBImage.rw_buffer_index = 0;
		g_USBImage.current_tx_bytes = 0;
		g_USBImage.rw_bytes = USB_IMAGE_MAX_TX_BUFFERSIZE;
		
		if(FS_Read(g_USBImage.current_file_handle, index, 
				USB_IMAGE_MAX_TX_BUFFERSIZE-USB_IMAGE_CONTAINER_LENGTH, &receive_file_size)!= FS_NO_ERROR) 
		{
			FS_Close(g_USBImage.current_file_handle);
			g_USBImage.current_file_handle = PTP_NO_HANDLE;
			USB_Image_Cancel_By_Device(data, PTP_GET_PARTIAL_OBJECT);
			return;				
		}
		g_USBImage.state = PTP_DATA_TX;
		PTP_Get_Object_Hdlr();
	}
	else
	{
		if(FS_Read(g_USBImage.current_file_handle, index, 
				g_USBImage.total_tx_bytes-USB_IMAGE_CONTAINER_LENGTH, &receive_file_size)!= FS_NO_ERROR) 
		{
			FS_Close(g_USBImage.current_file_handle);
			g_USBImage.current_file_handle = PTP_NO_HANDLE;
			USB_Image_Cancel_By_Device(data, PTP_GET_PARTIAL_OBJECT);
			return;
		}
		g_USBImage.state = PTP_RESPONSE;
		USB_Image_BuildTx((void *)g_USBImage.image_buffer, g_USBImage.total_tx_bytes);
		FS_Close(g_USBImage.current_file_handle);
		g_USBImage.current_file_handle = PTP_NO_HANDLE;
	}
}

static void PTP_Send_Object_Hdlr(void)
{
	kal_uint8 *index = (kal_uint8*)g_USBImage.image_buffer + USB_IMAGE_CONTAINER_LENGTH;
	PTPObjectInfo_Struct *data = (PTPObjectInfo_Struct *)index;
	kal_uint8	*fifth_file_letter;
	
	if(g_USBImage.image_cmd.Code == PTP_SEND_OBJECT_INFO)
	{
		g_USBImage.image_response.ContainerLength = USB_IMAGE_RES_3_PARA;
		g_USBImage.image_response.Code = PTP_OK;
		g_USBImage.image_response.TransactionID = g_USBImage.current_transactionID;
		g_USBImage.image_response.Parameter1 = PTP_SCRIPT_STORAGE_ID;
		g_USBImage.image_response.Parameter2 = 0xffffffff;

		fifth_file_letter = index +(sizeof(PTPObjectInfo_Struct)/sizeof(kal_uint8) + 9);
		switch(*fifth_file_letter)	/* the fifth word  */
		{
		case 'C':	
			g_USBImage.image_response.Parameter3 = HDISCVRY_DPS;
			USB_Image_Send_Msg(USB_IMAGE_MSG_MMI_DISCOVERY_IND, 0, 0);

			/* send a remove all storages interrupt packet */
			g_USBImage.image_event.ContainerLength = USB_IMAGE_RES_1_PARA;
			g_USBImage.image_event.Code = PTP_STORE_REMOVED;
			g_USBImage.image_event.TransactionID = 0xffffffff;
			g_USBImage.image_event.Parameter1 = 	PTP_ALL_STORAGE_ID;
			USB_Image_Send_Intr(&g_USBImage.image_event, USB_IMAGE_RES_1_PARA);
			break;
		case 'U':
			g_USBImage.image_response.Parameter3 = HREQUEST_DPS;
			g_USBImage.dps_rx_buffer_index = 1;
			if(g_USBImage.script_flag & (1<<HREQUEST) == 1<<HREQUEST)
				EXT_ASSERT(0, g_USBImage.script_flag, 0, 0);
		
			g_USBImage.script_flag |= 1<<HREQUEST;
			g_USBImage.received_xml_size = data->ObjectCompressedSize;
			break;
		case 'O':
			g_USBImage.image_response.Parameter3 = HRSPONSE_DPS;
			g_USBImage.dps_rx_buffer_index = 0;
			if(g_USBImage.script_flag & (1<<HRSPONSE) == 1<<HRSPONSE)
				EXT_ASSERT(0, g_USBImage.script_flag, 0, 0);
		
			g_USBImage.script_flag |= 1<<HRSPONSE;
			g_USBImage.received_xml_size = data->ObjectCompressedSize;
			break;
		default:
			EXT_ASSERT(0, *fifth_file_letter, 0, 0);
			break;
		}
	}
	else if(g_USBImage.image_cmd.Code == PTP_SEND_OBJECT)
	{
		g_USBImage.image_response.ContainerLength = USB_IMAGE_CONTAINER_LENGTH;
		g_USBImage.image_response.Code = PTP_OK;
		g_USBImage.image_response.TransactionID = g_USBImage.current_transactionID;

		if((g_USBImage.total_rx_bytes-USB_IMAGE_CONTAINER_LENGTH) !=  g_USBImage.received_xml_size)
		{
			EXT_ASSERT(0, g_USBImage.total_rx_bytes-USB_IMAGE_CONTAINER_LENGTH,
							g_USBImage.received_xml_size, 0);
		}
		
		if(g_USBImage.dps_rx_buffer_index == 1)
		{
			USB_Image_Send_Msg(USB_IMAGE_MSG_MMI_HREQUEST_IND, 0, 0);	
		}
		else
			USB_Image_Send_Msg(USB_IMAGE_MSG_MMI_HRESPONSE_IND, 0, 0);	
	}
	/* Clear OutPktRdy */
	USB_EP_Bulk_Out_Ready(g_USBImage.rxpipe->byEP);
	USB_Image_ReturnTx(&g_USBImage.image_response, g_USBImage.image_response.ContainerLength);
}

static void PTP_Cmd_Unknown(void)
{
#ifndef  __PRODUCTION_RELEASE__				
	ASSERT(0);
#endif
	g_USBImage.image_event.ContainerLength = USB_IMAGE_CONTAINER_LENGTH;
	g_USBImage.image_event.Code = PTP_CANCEL_TRANSACTION;
	g_USBImage.image_event.TransactionID = g_USBImage.current_transactionID;
	USB_Image_Send_Intr(&g_USBImage.image_event, USB_IMAGE_CONTAINER_LENGTH);

	/* Send Response */
	g_USBImage.state = PTP_CMD_RX;
	g_USBImage.image_response.ContainerLength = USB_IMAGE_CONTAINER_LENGTH;
	g_USBImage.image_response.Code = PTP_OPERATION_NOT_SUPPORTED;	
	g_USBImage.image_response.TransactionID = g_USBImage.current_transactionID;
	USB_Image_ReturnTx(&g_USBImage.image_response, USB_IMAGE_CONTAINER_LENGTH);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -