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

📄 ptp_state.c

📁 mtk 6225平台的usb程序! 对想了解mtk平台usb的朋友会有帮助!
💻 C
📖 第 1 页 / 共 4 页
字号:
		
					g_USBImage.script_flag &= ~(1<<DREQUEST);
				}
				else if(g_USBImage.image_cmd.Parameter1 == DRSPONSE_DPS)
				{
					USB_Image_Send_Msg(USB_IMAGE_MSG_MMI_DRESPONSE_CONF, 0, 0);
			
					if(g_USBImage.script_flag & (1<<DRSPONSE) != 1<<DRSPONSE)
						EXT_ASSERT(0, g_USBImage.script_flag, 0, 0);
			
					g_USBImage.script_flag &= ~(1<<DRSPONSE);
				}
				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);
			}
			/*  check if sent out 64N bytes */
			if((g_USBImage.total_tx_bytes%USB_EP_BULK_MAXP) == 0)
				USB_Send_Null_Packet(g_USBImage.txpipe->byEP);

			if(g_USBImage.image_cmd.Code == PTP_GET_PARTIAL_OBJECT)
			{
				g_USBImage.image_response.ContainerLength = USB_IMAGE_RES_1_PARA;
				g_USBImage.image_response.Parameter1 = g_USBImage.total_tx_bytes - USB_IMAGE_CONTAINER_LENGTH;
			}
			else
			{
				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;
			USB_Image_ReturnTx(&g_USBImage.image_response, g_USBImage.image_response.ContainerLength);
		}
		else
		{
			g_USBImage.error = KAL_FALSE;
			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);
		}
		
		break;
	case PTP_DATA_TX:
		PTP_Get_Object_Hdlr();
		break;
	case PTP_CMD_RX:
	case PTP_DATA_RX:
	default:
		EXT_ASSERT(0, (kal_uint32)g_USBImage.state, 0, 0);
		break;
	}
}

/************************************************************
	Utility functions
*************************************************************/
static void PTP_Copy_From_PTP_String(void *pdest, const kal_uint16 *source_string, kal_uint8 string_num)
{
	kal_uint8		*index;
	
	if(string_num == 0)
		EXT_ASSERT(0, 0, 0, 0);

	kal_mem_set(pdest , string_num, 1);
		
	index = (kal_uint8 *)pdest + string_num*2;
	do
	{
		kal_mem_set(index, (source_string[string_num-1]>>8)&0xff, 1);	
		index -= 1;
		kal_mem_set(index, source_string[string_num-1]&0xff, 1);
		index -= 1;
	}
	while(--string_num != 0);
}

static void PTP_Copy_From_PTP_Handle_Array(void *pdest, kal_uint32 *source_array, kal_uint32 array_num)
{
	kal_uint8		*index;
	kal_uint32 	num = array_num;
	
	if(num == 0)
		EXT_ASSERT(0, 0, 0, 0);

	index = (kal_uint8 *)pdest + num*4 +3;
	do
	{
		kal_mem_set(index, (source_array[num-1]>>24)&0xff, 1);	
		index -= 1;
		kal_mem_set(index, (source_array[num-1]>>16)&0xff, 1);
		index -= 1;
		kal_mem_set(index, (source_array[num-1]>>8)&0xff, 1);	
		index -= 1;
		kal_mem_set(index, source_array[num-1]&0xff, 1);
		index -= 1;
	}
	while(--num != 0);
	
	kal_mem_set(index, (array_num>>24)&0xff, 1);
	index -= 1;
	kal_mem_set(index, (array_num>>16)&0xff, 1);
	index -= 1;
	kal_mem_set(index, (array_num>>8)&0xff, 1);
	index -= 1;
	kal_mem_set(index, (array_num)&0xff, 1);
}


static void PTP_Date_to_String(void *pdest, FS_DOSDateTime time)
{
	kal_uint8 *index = (kal_uint8 *)pdest;
	kal_uint8  temp1, temp2, temp3;

	kal_mem_set(index, 16, 1);   /* string element number  */
	index += 1;
	kal_mem_set(index, 0x00, 32);

	if(time.Year1980 < 20)
	{
		kal_mem_set(index, '1', 1);
		index += 2;
		kal_mem_set(index, '9', 1);		
		index += 2;
		temp1 = (time.Year1980+80)/10 + '0';
		temp2 = (time.Year1980+80)%10 + '0';
		kal_mem_set(index, temp1, 1);
		index += 2;
		kal_mem_set(index, temp2, 1);	
		index += 2;
	}
	else if(time.Year1980 < 120)
	{
		kal_mem_set(index, '2', 1);
		index += 2;
		kal_mem_set(index, '0', 1);		
		index += 2;
		temp1 = (time.Year1980-20)/10 + '0';
		temp2 = (time.Year1980-20)%10 + '0';		
		kal_mem_set(index, temp1, 1);
		index += 2;
		kal_mem_set(index, temp2, 1);	
		index += 2;
	}
	else
	{
		kal_mem_set(index, '2', 1);
		index += 2;
		temp1 = (time.Year1980-20)/100 + '0';
		temp2 = ((time.Year1980-20)-(temp1-'0')*100)/10+ '0';
		temp3 = ((time.Year1980-20)-(temp1-'0')*100)%10+ '0';
 		kal_mem_set(index, temp1, 1);
		index += 2;	
		kal_mem_set(index, temp2, 1);
		index += 2;
		kal_mem_set(index, temp3, 1);	
		index += 2;
	}

	temp1 = time.Month/10 + '0';
	temp2 = time.Month%10 + '0';
	kal_mem_set(index, temp1, 1);
	index += 2;
	kal_mem_set(index, temp2, 1);
	index += 2;

	temp1 = time.Day/10 + '0';
	temp2 = time.Day%10 + '0';
	kal_mem_set(index, temp1, 1);
	index += 2;
	kal_mem_set(index, temp2, 1);
	index += 2;

	kal_mem_set(index, 'T', 1);
	index += 2;
	
	temp1 = time.Hour/10 + '0';
	temp2 = time.Hour%10 + '0';	
	kal_mem_set(index, temp1, 1);
	index += 2;
	kal_mem_set(index, temp2, 1);
	index += 2;

	temp1 = time.Minute/10 + '0';
	temp2 = time.Minute%10 + '0';
	kal_mem_set(index, temp1, 1);
	index += 2;
	kal_mem_set(index, temp2, 1);
	index += 2;

	temp1 = (time.Second2*2)/10 + '0';
	temp2 = (time.Second2*2)%10 + '0';		
	kal_mem_set(index, temp1, 1);
	index += 2;
	kal_mem_set(index, temp2, 1);
	index += 2;	
}

/************************************************************
	Parse PTP command functions
*************************************************************/
/* Parse PTP operation */
static void PTP_Image_Operation(void)
{
	if(g_USBImage.image_cmd.ContainerType != USB_IMAGE_COMMAND_BLOCK)
		EXT_ASSERT(0, g_USBImage.image_cmd.ContainerType, 0, 0);

	/* parse command */
	switch(g_USBImage.image_cmd.Code)
	{
	case PTP_GET_DEVICE_INFO:
		PTP_Cmd_Get_Device_Info();
		break;
	case PTP_OPEN_SESSION:
		PTP_Cmd_Open_Session();
		break;
	case PTP_CLOSE_SESSION:
		PTP_Cmd_Close_Session();
		break;
	case PTP_GET_STORAGE_IDS:
		PTP_Cmd_Get_Storage_Ids();
		break;
	case PTP_GET_STORAGE_INFO:
		PTP_Cmd_Get_Storage_Info();
		break;
	case PTP_GET_NUM_OBJECTS:
		PTP_Cmd_Get_Num_Objects();
		break;
	case PTP_GET_OBJECT_HANDLES:
		PTP_Cmd_Get_Object_Handles();
		break;
	case PTP_GET_OBJECT_INFO:
		PTP_Cmd_Get_Object_Info();
		break;
	case PTP_GET_OBJECT:
		PTP_Cmd_Get_Object();
		break;
	case PTP_GET_PARTIAL_OBJECT:
		PTP_Cmd_Get_Partial_Object();
		break;
	case PTP_GET_THUMB:		
		PTP_Cmd_Get_Thumb();
		break;
	case PTP_SEND_OBJECT_INFO:
	case PTP_SEND_OBJECT:
		EXT_ASSERT(0, g_USBImage.image_cmd.Code, 0, 0);
		break;
	default:
		PTP_Cmd_Unknown();
		break;
	}
}

static void PTP_Cmd_Get_Device_Info(void)
{
	PTP_CONTAINER 	*data = (PTP_CONTAINER *)g_USBImage.image_buffer;
	kal_uint8 		*index;
 	kal_uint8			element_num1 = sizeof(PTPDeviceInfo_Struct)/sizeof(kal_uint8) -1; 
 	kal_uint8	 		element_num2 = g_USBImage.image_param->image_manufacturer_size;
 	kal_uint8			element_num3 = g_USBImage.image_param->image_model_size;
  	kal_uint8			element_num4 = g_USBImage.image_param->image_device_version_size;
   	kal_uint8			element_num5 =  g_USBImage.image_param->image_serial_number_size;

	g_USBImage.state = PTP_RESPONSE;
	
	data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + element_num1
		+ 4 + (element_num2 + element_num3 + element_num4 + element_num5)*2;
	data->ContainerType = USB_IMAGE_DATA_BLOCK;
	data->Code = PTP_GET_DEVICE_INFO;
	data->TransactionID = g_USBImage.current_transactionID;
	
	index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;

	kal_mem_cpy(index, &g_USBImage.image_deviceinfo, element_num1);
	index += element_num1;
	
	PTP_Copy_From_PTP_String((void *)index, g_USBImage.image_param->image_manufacturer_string, element_num2);
	index += element_num2*2 + 1;
	
	PTP_Copy_From_PTP_String((void *)index, g_USBImage.image_param->image_model_string, element_num3);
	index += element_num3*2 + 1;
	
	PTP_Copy_From_PTP_String((void *)index, g_USBImage.image_param->image_device_version_string, element_num4);
	index += element_num4*2 + 1;

	PTP_Copy_From_PTP_String((void *)index, g_USBImage.image_param->image_serial_number_string, element_num5);
	g_USBImage.total_tx_bytes = data->ContainerLength;
	USB_Image_BuildTx((void *)g_USBImage.image_buffer, data->ContainerLength);
}

static void PTP_Cmd_Open_Session(void)
{
	/* Only Send Response */
	g_USBImage.state = PTP_CMD_RX;
	
	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;
	USB_Image_ReturnTx(&g_USBImage.image_response, USB_IMAGE_CONTAINER_LENGTH);
}

static void PTP_Cmd_Close_Session(void)
{
	/* Only Send Response */
	g_USBImage.state = PTP_CMD_RX;
	
	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;

	USB_Image_ReturnTx(&g_USBImage.image_response, USB_IMAGE_CONTAINER_LENGTH);
	/* need send a message to mmi?? */
	if(g_USBImage.current_file_handle != PTP_NO_HANDLE)
	{
		FS_Close(g_USBImage.current_file_handle);
		g_USBImage.current_file_handle = PTP_NO_HANDLE;
	}
}

static void PTP_Cmd_Get_Storage_Ids(void)
{
	PTP_CONTAINER 	*data = (PTP_CONTAINER *)g_USBImage.image_buffer;
 	kal_uint8 		*index;
	kal_uint32		storgae_id[3] = {2,  PTP_SCRIPT_STORAGE_ID, PTP_IMAGE_STORAGE_ID};
	
	g_USBImage.state = PTP_RESPONSE;
	
	data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + (sizeof(storgae_id)/sizeof(kal_uint8));
	data->ContainerType = USB_IMAGE_DATA_BLOCK;
	data->Code = PTP_GET_STORAGE_IDS;
	data->TransactionID = g_USBImage.current_transactionID;
	
	index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;

⌨️ 快捷键说明

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