PTP/IP
PTP/IP is the variant of PTP designed to be used on TCP.
All packet types start with a length and type field. The layout of the rest of the fields
depends on type.
A standard request to the responder is as follows:
1. Send Command request
struct PtpIpBulkContainer {
uint32_t length;
uint32_t type;
uint32_t data_phase;
uint16_t code;
uint32_t transaction;
uint32_t params[5];
};
Rules:
- Set
lengthto18 + (4 * number_of_params) - Set
typetoPTPIP_COMMAND_REQUEST(0x6) - Set the
data_phasefield to 2 if you are sending a data payload. Set to 1 if otherwise. - Set code to a PTP_OC_ opcode.
- Set the
transactionto the transaction ID for this operation.
2. Send Data Start packet
struct PtpIpStartDataPacket {
uint32_t length;
uint32_t type;
uint32_t transaction;
uint64_t payload_length;
};
Rules:
- Set
lengthto20. - Set
typetoPTPIP_DATA_PACKET_START(0x9) - Set
transactionto the transaction ID for this operation. - Set
data_phase_lengthto the size of the payload in the following data packet.
3. Send Data End Packet
struct PtpIpEndDataPacket {
uint32_t length;
uint32_t type;
uint32_t transaction;
// payload data goes here
};
Rules:
- Set length to
12 + payload_length - Set type to
PTPIP_DATA_PACKET_END(0xc) - Set
data_phase_lengthto the size of the payload in the following data packet. - Copy the payload that will be sent to the device at offset
12.
4. Responses
For an operation, you may get a data payload as a response (R->I)
The response to an operation will either be:
- PTPIP_DATA_PACKET_START packet followed by PTPIP_DATA_PACKET_END, and finally a PTPIP_COMMAND_RESPONSE packet
- Just a PTPIP_COMMAND_RESPONSE packet
Response Container
struct PtpIpResponseContainer {
uint32_t length;
uint32_t type;
uint16_t code;
uint32_t transaction;
uint32_t params[5];
};