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
length
to18 + (4 * number_of_params)
- Set
type
toPTPIP_COMMAND_REQUEST
(0x6
) - Set the
data_phase
field to 2 if you are sending a data payload. Set to 1 if otherwise. - Set code to a PTP_OC_ opcode.
- Set the
transaction
to 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
length
to20
. - Set
type
toPTPIP_DATA_PACKET_START
(0x9
) - Set
transaction
to the transaction ID for this operation. - Set
data_phase_length
to 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_length
to 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];
};