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