📄 ptp_state.c
字号:
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 + -