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

📄 ptp_state.c

📁 mtk 6225平台的usb程序! 对想了解mtk平台usb的朋友会有帮助!
💻 C
📖 第 1 页 / 共 4 页
字号:
	kal_mem_cpy(index, &storgae_id, sizeof(storgae_id)/sizeof(kal_uint8));
	g_USBImage.total_tx_bytes = data->ContainerLength;
	USB_Image_BuildTx((void *)g_USBImage.image_buffer, data->ContainerLength);
}

static void PTP_Cmd_Get_Storage_Info(void)
{
	PTP_CONTAINER 	*data = (PTP_CONTAINER *)g_USBImage.image_buffer;
 	kal_uint8 		*index;
	kal_uint16		storage_descriptor[] = {'C', 'E', 'L', 'L','P','H','O','N','E','\0'};
	kal_uint16		volume_label[] = {'K', '\0'};
	kal_uint8			element_num1 = sizeof(PTPStorageInfo_Struct)/sizeof(kal_uint8);
	kal_uint8			element_num2 = sizeof(storage_descriptor)/sizeof(kal_uint16);
	kal_uint8			element_num3 = sizeof(volume_label)/sizeof(kal_uint16);

	g_USBImage.state = PTP_RESPONSE;

	data->ContainerType = USB_IMAGE_DATA_BLOCK;
	data->Code =  PTP_GET_STORAGE_INFO;
	data->TransactionID = g_USBImage.current_transactionID;

	index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;

	if (g_USBImage.image_cmd.Parameter1 == PTP_SCRIPT_STORAGE_ID)	/* fake storage id */
	{
		data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + element_num1 + 2;	
		g_USBImage.image_storageinfo.MaxCapacity[0] = 0xffff;
		g_USBImage.image_storageinfo.MaxCapacity[1] = 0xffff;
		g_USBImage.image_storageinfo.MaxCapacity[2] = 0xffff;
		g_USBImage.image_storageinfo.MaxCapacity[3] = 0xffff;
		g_USBImage.image_storageinfo.FreeSpaceInBytes[0] = 0xffff;
		g_USBImage.image_storageinfo.FreeSpaceInBytes[1] = 0xffff;
		g_USBImage.image_storageinfo.FreeSpaceInBytes[2] = 0xffff;
		g_USBImage.image_storageinfo.FreeSpaceInBytes[3] = 0xffff;

		kal_mem_cpy(index, &g_USBImage.image_storageinfo, element_num1);
		index += element_num1;
		kal_mem_set((void *)index, 0x00, 2);			/* two empty strings  */	
	}
	else
	{
		//data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + element_num1 + 2;	

		data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + element_num1
						+ 2 + (element_num2 + element_num3)*2;	

		g_USBImage.image_storageinfo.MaxCapacity[0] = 0;
		g_USBImage.image_storageinfo.MaxCapacity[1] = 0;
		g_USBImage.image_storageinfo.MaxCapacity[2] = 5;
		g_USBImage.image_storageinfo.MaxCapacity[3] = 5;
		g_USBImage.image_storageinfo.FreeSpaceInBytes[0] = 0;
		g_USBImage.image_storageinfo.FreeSpaceInBytes[1] = 0;
		g_USBImage.image_storageinfo.FreeSpaceInBytes[2] = 2;
		g_USBImage.image_storageinfo.FreeSpaceInBytes[3] = 4;
		
		kal_mem_cpy(index, &g_USBImage.image_storageinfo, element_num1);
		index += element_num1;
		
		//kal_mem_set(index, 0x00, 2); 			/* empty string */	
	
		PTP_Copy_From_PTP_String((void *)index, storage_descriptor, element_num2);
		index += element_num2*2 +1;
	
		PTP_Copy_From_PTP_String((void *)index, volume_label, element_num3);	
	}
	g_USBImage.total_tx_bytes = data->ContainerLength;
	USB_Image_BuildTx((void *)g_USBImage.image_buffer, data->ContainerLength);
}

static void PTP_Cmd_Get_Num_Objects(void)
{
	kal_uint8		count;
	kal_uint32 	num = 0;
	
	/* Send Response */
	g_USBImage.state = PTP_CMD_RX;

	g_USBImage.image_response.ContainerLength = USB_IMAGE_RES_1_PARA;
	g_USBImage.image_response.Code = PTP_OK;
	g_USBImage.image_response.TransactionID = g_USBImage.current_transactionID;

	/* find number of script type */
	if (g_USBImage.image_cmd.Parameter2 == PTP_SCRIPT)
	{
		count = 6;
		do
		{
			if ((g_USBImage.script_flag & (1<<count)) == (1<<count))
				num += 1;
		}
		while(--count != 0);
		
		g_USBImage.image_response.Parameter1 = num;
	}
	else
	{
		/* only for test with PC  */
		g_USBImage.image_response.Parameter1 = 1;
	}
	USB_Image_ReturnTx(&g_USBImage.image_response, USB_IMAGE_RES_1_PARA);
}

static void PTP_Cmd_Get_Object_Handles(void)
{
 	PTP_CONTAINER 	*data = (PTP_CONTAINER *)g_USBImage.image_buffer;
 	kal_uint8 		*index;
  	kal_uint32 		num = 0;
	kal_uint8			count;
	
	g_USBImage.state = PTP_RESPONSE;

	if (g_USBImage.image_cmd.Parameter2 == PTP_SCRIPT)
	{
		count = 6;
		do
		{
			if ((g_USBImage.script_flag & (1<<count)) == (1<<count))
			{
				g_objecthandles[num] = 0xC1000000 + count;
				num += 1;
			}
		}
		while(--count != 0);
		
		data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + (num+1)*4;
		index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;
		PTP_Copy_From_PTP_Handle_Array(index, g_objecthandles, num);
	}
	else
	{	
		/* only for test with PC  */
		g_objecthandles[0] = 0x00000001;
		data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + (1+1)*4;
		index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;
		PTP_Copy_From_PTP_Handle_Array(index, g_objecthandles, 1);
	}

	data->ContainerType = USB_IMAGE_DATA_BLOCK;
	data->Code =  PTP_GET_OBJECT_HANDLES;
	data->TransactionID = g_USBImage.current_transactionID;
	g_USBImage.total_tx_bytes = data->ContainerLength;	
	USB_Image_BuildTx((void *)g_USBImage.image_buffer, data->ContainerLength);
}

static void PTP_Cmd_Get_Object_Info(void)
{
	PTP_CONTAINER 	*data;
	kal_uint8 	*index;
	kal_uint8		element_num = sizeof(PTPObjectInfo_Struct)/sizeof(kal_uint8);	
	kal_uint8		element_num1;
	kal_uint16	*file_name;
	
	g_USBImage.state = PTP_RESPONSE;

	if((g_USBImage.image_cmd.Parameter1>>24) == 0xC1)		/* script type*/
	{
		if(g_USBImage.image_cmd.Parameter1 == DDISCVRY_DPS)
		{
			kal_uint16	filename[] = {'D','D','I','S','C','V','R','Y','.','D','P','S','\0'};
			element_num1 = sizeof(filename)/sizeof(kal_uint16);
			file_name = (kal_uint16 *)filename;
			g_USBImage.image_objectinfo.ObjectCompressedSize = 0;
		}
		else if(g_USBImage.image_cmd.Parameter1 == DREQUEST_DPS)
		{
			kal_uint16	filename[] = {'D','R','E','Q','U','E','S','T','.','D','P','S','\0'};
			element_num1 = sizeof(filename)/sizeof(kal_uint16);
			file_name = (kal_uint16 *)filename;
			g_USBImage.image_objectinfo.ObjectCompressedSize = g_USBImage.send_xml_size;
		}
		else if(g_USBImage.image_cmd.Parameter1 == DRSPONSE_DPS)
		{
			kal_uint16	filename[] = {'D','R','S','P','O','N','S','E','.','D','P','S','\0'};
			element_num1 = sizeof(filename)/sizeof(kal_uint16);
			file_name = (kal_uint16 *)filename;
			g_USBImage.image_objectinfo.ObjectCompressedSize = g_USBImage.send_xml_size;
		}
		else
			EXT_ASSERT(0, g_USBImage.image_cmd.Parameter1, 0, 0);

		data = (PTP_CONTAINER *)g_USBImage.image_buffer;
		
		data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + element_num + element_num1*2 + 4;
		data->ContainerType = USB_IMAGE_DATA_BLOCK;
		data->Code =  PTP_GET_OBJECT_INFO;
		data->TransactionID = g_USBImage.current_transactionID;
		
		g_USBImage.image_objectinfo.StorageID = PTP_SCRIPT_STORAGE_ID;
		g_USBImage.image_objectinfo.ObjectFormat = PTP_SCRIPT;
		g_USBImage.image_objectinfo.ThumbFormat = 0x3000;			/* undefined*/
		g_USBImage.image_objectinfo.ThumbCompressedSize[0] = 0x0000;
		g_USBImage.image_objectinfo.ThumbCompressedSize[1] = 0x0000;
		g_USBImage.image_objectinfo.ThumbPixWidth[0] = 0x0000;
		g_USBImage.image_objectinfo.ThumbPixWidth[1] = 0x0000;
		g_USBImage.image_objectinfo.ThumbPixHeight[0] = 0x0000;
		g_USBImage.image_objectinfo.ThumbPixHeight[1] = 0x0000;
		g_USBImage.image_objectinfo.ImagePixWidth[0] = 0x0000;
		g_USBImage.image_objectinfo.ImagePixWidth[1] = 0x0000;
		g_USBImage.image_objectinfo.ImagePixHeight[0] = 0x0000;
		g_USBImage.image_objectinfo.ImagePixHeight[1] = 0x0000;

 		index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;
		kal_mem_cpy(index, &g_USBImage.image_objectinfo, element_num);
		index += element_num;
		PTP_Copy_From_PTP_String((void *)index, file_name, element_num1);	
		index += element_num1*2 + 1;
		kal_mem_set(index, 0x00, 3); 			/* three empty string */	
		g_USBImage.total_tx_bytes = data->ContainerLength;
		USB_Image_BuildTx((void *)g_USBImage.image_buffer, data->ContainerLength);
	}
	else		/* image's handle */
	{
		FS_FileInfo	file_info;
		
		kal_uint16	filename[] = {'I','M','G','0','0','0','1','A','.','j','p','g','\0'};
		element_num1 = sizeof(filename)/sizeof(kal_uint16);

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

		data = (PTP_CONTAINER *)g_USBImage.image_buffer;
		data->ContainerType = USB_IMAGE_DATA_BLOCK;
		data->Code =  PTP_GET_OBJECT_INFO;
		data->TransactionID = g_USBImage.current_transactionID;

		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_INFO);
			return;
		}
		
		if(FS_GetFileSize(g_USBImage.current_file_handle, &g_USBImage.image_objectinfo.ObjectCompressedSize) != 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_INFO);
			return;
		}

		g_USBImage.image_objectinfo.StorageID = PTP_IMAGE_STORAGE_ID;
		g_USBImage.image_objectinfo.ObjectFormat = PTP_EXIF_JPEG;
		g_USBImage.image_objectinfo.ThumbFormat = PTP_EXIF_JPEG; 
		g_USBImage.image_objectinfo.ThumbCompressedSize[0] = g_USBImage.image_objectinfo.ObjectCompressedSize&0xffff;
		g_USBImage.image_objectinfo.ThumbCompressedSize[1] = (g_USBImage.image_objectinfo.ObjectCompressedSize>>16)&0xffff;
		g_USBImage.image_objectinfo.ThumbPixWidth[0] = 1600&0xffff;
		g_USBImage.image_objectinfo.ThumbPixWidth[1] = (1600>>16)&0xffff;
		g_USBImage.image_objectinfo.ThumbPixHeight[0] = 1200&0xffff;
		g_USBImage.image_objectinfo.ThumbPixHeight[1] = (1200>>16)&0xffff;
		g_USBImage.image_objectinfo.ImagePixWidth[0] = 1600&0xffff;
		g_USBImage.image_objectinfo.ImagePixWidth[1] = (1600>>16)&0xffff;
		g_USBImage.image_objectinfo.ImagePixHeight[0] = 1200&0xffff;
		g_USBImage.image_objectinfo.ImagePixHeight[1] = (1200>>16)&0xffff;

		index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;
		kal_mem_cpy(index, &g_USBImage.image_objectinfo, element_num);
		index += element_num;
		
		PTP_Copy_From_PTP_String((void *)index, filename, element_num1);	
		index += element_num1*2 + 1;

		if(FS_GetFileInfo(g_USBImage.current_file_handle, &file_info) == FS_NO_ERROR)
		{
			PTP_Date_to_String(index, file_info.DirEntry->CreateDateTime);
			index += 33;   /* 33 == 16*2 +1 */
			PTP_Date_to_String(index, file_info.DirEntry->DateTime);	/* last modification date */
			index += 33;

			kal_mem_set(index, 0x00, 1); 		/* empty string for key word */
			data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + element_num + 
							(element_num1 +32)*2 + 4;
			g_USBImage.total_tx_bytes = data->ContainerLength;
			USB_Image_BuildTx((void *)g_USBImage.image_buffer, data->ContainerLength);
		}
		else
		{
			kal_mem_set(index, 0x00, 3);
			data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + element_num + element_num1*2 + 4 ;	
			g_USBImage.total_tx_bytes = data->ContainerLength;
			USB_Image_BuildTx((void *)g_USBImage.image_buffer, data->ContainerLength);
		}
		FS_Close(g_USBImage.current_file_handle);
		g_USBImage.current_file_handle = PTP_NO_HANDLE;
	}
}

static void PTP_Get_Object_Hdlr(void)
{
	kal_uint32	receive_file_size;

	USB_Image_BuildTx((void *)g_USBImage.image_buffer->data_buffer[g_USBImage.rw_buffer_index], g_USBImage.rw_bytes);

	g_USBImage.current_tx_bytes += g_USBImage.rw_bytes;

	if (g_USBImage.current_tx_bytes == g_USBImage.total_tx_bytes)
	{	
		g_USBImage.state = PTP_RESPONSE;
		FS_Close(g_USBImage.current_file_handle);
		g_USBImage.current_file_handle = PTP_NO_HANDLE;	
		return;
	}

	if((g_USBImage.total_tx_bytes - g_USBImage.current_tx_bytes) > USB_IMAGE_MAX_TX_BUFFERSIZE)
		g_USBImage.rw_bytes = USB_IMAGE_MAX_TX_BUFFERSIZE;
	else
		g_USBImage.rw_bytes = g_USBImage.total_tx_bytes - g_USBImage.current_tx_bytes;

	g_USBImage.rw_buffer_index ^= 1;
	if(FS_Read(g_USBImage.current_file_handle, g_USBImage.image_buffer->data_buffer[g_USBImage.rw_buffer_index], 
				g_USBImage.rw_bytes, &receive_file_size)!= FS_NO_ERROR) 
	{
		/* object removed interrupt */
		g_USBImage.image_event.ContainerLength = USB_IMAGE_RES_1_PARA;
		g_USBImage.image_event.Code = PTP_OBJECT_REMOVED;
		g_USBImage.image_event.TransactionID = 0xffffffff;
		g_USBImage.image_event.Parameter1 = 	g_USBImage.image_cmd.Parameter1;
		USB_Image_Send_Intr(&g_USBImage.image_event, USB_IMAGE_RES_1_PARA);
		
		FS_Close(g_USBImage.current_file_handle);
		g_USBImage.current_file_handle = PTP_NO_HANDLE;

		USB_Stop_DMA_Channel(g_USBImage.txpipe->byEP);		
		USB_Send_Null_Packet(g_USBImage.txpipe->byEP);

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

static void PTP_Cmd_Get_Object(void)
{

⌨️ 快捷键说明

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