1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
|
/* ptp.h
*
* Copyright (C) 2001 Mariusz Woloszyn <emsi@ipartners.pl>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __PTP_H__
#define __PTP_H__
#include <stdarg.h>
#include <time.h>
#include <gphoto2-endian.h>
// PTP datalayer byteorder
#define PTP_DL_BE 0xF0
#define PTP_DL_LE 0x0F
// PTP request/response/data packet structure
#define PTP_REQ_LEN 30
#define PTP_RESP_LEN sizeof(PTPReq)
#define PTP_REQ_HDR_LEN (2*sizeof(uint32_t)+2*sizeof(uint16_t))
#define PTP_REQ_DATALEN 16384
#define PTP_EVENT_LEN sizeof(PTPEvent)
struct _PTPReq {
uint32_t len;
uint16_t type;
uint16_t code;
uint32_t trans_id;
char data[PTP_REQ_DATALEN];
};
typedef struct _PTPReq PTPReq;
// Container types
#define PTP_TYPE_REQ 0x0001
#define PTP_TYPE_DATA 0x0002
#define PTP_TYPE_RESP 0x0003
#define PTP_TYPE_EVENT 0x0004
// Vendor IDs
#define PTP_VENDOR_EASTMAN_KODAK 0x00000001
#define PTP_VENDOR_SEIKO_EPSON 0x00000002
#define PTP_VENDOR_AGILENT 0x00000003
#define PTP_VENDOR_POLAROID 0x00000004
#define PTP_VENDOR_AGFA_GEVAERT 0x00000005
#define PTP_VENDOR_MICROSOFT 0x00000006
#define PTP_VENDOR_EQUINOX 0x00000007
#define PTP_VENDOR_VIEWQUEST 0x00000008
#define PTP_VENDOR_STMICROELECTRONICS 0x00000009
#define PTP_VENDOR_NIKON 0x0000000A
#define PTP_VENDOR_CANON 0x0000000B
// Operation Codes
#define PTP_OC_Undefined 0x1000
#define PTP_OC_GetDeviceInfo 0x1001
#define PTP_OC_OpenSession 0x1002
#define PTP_OC_CloseSession 0x1003
#define PTP_OC_GetStorageIDs 0x1004
#define PTP_OC_GetStorageInfo 0x1005
#define PTP_OC_GetNumObjects 0x1006
#define PTP_OC_GetObjectHandles 0x1007
#define PTP_OC_GetObjectInfo 0x1008
#define PTP_OC_GetObject 0x1009
#define PTP_OC_GetThumb 0x100A
#define PTP_OC_DeleteObject 0x100B
#define PTP_OC_SendObjectInfo 0x100C
#define PTP_OC_SendObject 0x100D
#define PTP_OC_InitiateCapture 0x100E
#define PTP_OC_FormatStore 0x100F
#define PTP_OC_ResetDevice 0x1010
#define PTP_OC_SelfTest 0x1011
#define PTP_OC_SetObjectProtection 0x1012
#define PTP_OC_PowerDown 0x1013
#define PTP_OC_GetDevicePropDesc 0x1014
#define PTP_OC_GetDevicePropValue 0x1015
#define PTP_OC_SetDevicePropValue 0x1016
#define PTP_OC_ResetDevicePropValue 0x1017
#define PTP_OC_TerminateOpenCapture 0x1018
#define PTP_OC_MoveObject 0x1019
#define PTP_OC_CopyObject 0x101A
#define PTP_OC_GetPartialObject 0x101B
#define PTP_OC_InitiateOpenCapture 0x101C
// Eastman Kodak extension Operation Codes
#define PTP_OC_EK_SendFileObjectInfo 0x9005
#define PTP_OC_EK_SendFileObject 0x9006
// Response Codes
#define PTP_RC_Undefined 0x2000
#define PTP_RC_OK 0x2001
#define PTP_RC_GeneralError 0x2002
#define PTP_RC_SessionNotOpen 0x2003
#define PTP_RC_InvalidTransactionID 0x2004
#define PTP_RC_OperationNotSupported 0x2005
#define PTP_RC_ParameterNotSupported 0x2006
#define PTP_RC_IncompleteTransfer 0x2007
#define PTP_RC_InvalidStorageId 0x2008
#define PTP_RC_InvalidObjectHandle 0x2009
#define PTP_RC_DevicePropNotSupported 0x200A
#define PTP_RC_InvalidObjectFormatCode 0x200B
#define PTP_RC_StoreFull 0x200C
#define PTP_RC_ObjectWriteProtected 0x200D
#define PTP_RC_StoreReadOnly 0x200E
#define PTP_RC_AccessDenied 0x200F
#define PTP_RC_NoThumbnailPresent 0x2010
#define PTP_RC_SelfTestFailed 0x2011
#define PTP_RC_PartialDeletion 0x2012
#define PTP_RC_StoreNotAvailable 0x2013
#define PTP_RC_SpecificationByFormatUnsupported 0x2014
#define PTP_RC_NoValidObjectInfo 0x2015
#define PTP_RC_InvalidCodeFormat 0x2016
#define PTP_RC_UnknownVendorCode 0x2017
#define PTP_RC_CaptureAlreadyTerminated 0x2018
#define PTP_RC_DeviceBusy 0x2019
#define PTP_RC_InvalidParentObject 0x201A
#define PTP_RC_InvalidDevicePropFormat 0x201B
#define PTP_RC_InvalidDevicePropValue 0x201C
#define PTP_RC_InvalidParameter 0x201D
#define PTP_RC_SessionAlreadyOpened 0x201E
#define PTP_RC_TransactionCanceled 0x201F
#define PTP_RC_SpecificationOfDestinationUnsupported 0x2020
// Eastman Kodak extension Response Codes
#define PTP_RC_EK_FilenameRequired 0xA001
#define PTP_RC_EK_FilenameConflicts 0xA002
#define PTP_RC_EK_FilenameInvalid 0xA003
// PTP driver extended ERROR codes
#define PTP_ERROR_IO 0x02FF
#define PTP_ERROR_DATA_EXPECTED 0x02FE
#define PTP_ERROR_RESP_EXPECTED 0x02FD
#define PTP_ERROR_BADPARAM 0x02FC
// PTP Event Codes
#define PTP_EC_Undefined 0x4000
#define PTP_EC_CancelTransaction 0x4001
#define PTP_EC_ObjectAdded 0x4002
#define PTP_EC_ObjectRemoved 0x4003
#define PTP_EC_StoreAdded 0x4004
#define PTP_EC_StoreRemoved 0x4005
#define PTP_EC_DevicePropChanged 0x4006
#define PTP_EC_ObjectInfoChanged 0x4007
#define PTP_EC_DeviceInfoChanged 0x4008
#define PTP_EC_RequestObjectTransfer 0x4009
#define PTP_EC_StoreFull 0x400A
#define PTP_EC_DeviceReset 0x400B
#define PTP_EC_StorageInfoChanged 0x400C
#define PTP_EC_CaptureComplete 0x400D
#define PTP_EC_UnreportedStatus 0x400E
// PTP event structre (returned by chceck_event)
struct _PTPEvent {
uint32_t len;
uint16_t type;
uint16_t EventCode;
uint32_t Param1;
uint32_t Param2;
uint32_t Param3;
};
typedef struct _PTPEvent PTPEvent;
// PTP device info structure (returned by GetDevInfo)
struct _PTPDeviceInfo {
uint16_t StaqndardVersion;
uint32_t VendorExtensionID;
uint16_t VendorExtensionVersion;
char *VendorExtensionDesc;
uint16_t FunctionalMode;
uint32_t OperationsSupported_len;
uint16_t *OperationsSupported;
uint32_t EventsSupported_len;
uint16_t *EventsSupported;
uint32_t DevicePropertiesSupported_len;
uint16_t *DevicePropertiesSupported;
uint32_t CaptureFormats_len;
uint16_t *CaptureFormats;
uint32_t ImageFormats_len;
uint16_t *ImageFormats;
char *Manufacturer;
char *Model;
char *DeviceVersion;
char *SerialNumber;
};
typedef struct _PTPDeviceInfo PTPDeviceInfo;
// PTP storageIDs structute (returned by GetStorageIDs)
struct _PTPStorageIDs {
uint32_t n;
uint32_t storage[(PTP_REQ_DATALEN-sizeof(uint32_t))/sizeof(uint32_t)];
};
typedef struct _PTPStorageIDs PTPStorageIDs;
// PTP StorageInfo structure (returned by GetStorageInfo)
struct _PTPStorageInfo {
uint16_t StorageType;
uint16_t FilesystemType;
uint16_t AccessCapability;
uint64_t MaxCapability;
uint64_t FreeSpaceInBytes;
uint32_t FreeSpaceInImages;
char *StorageDescription;
char *VolumeLabel;
};
typedef struct _PTPStorageInfo PTPStorageInfo;
// PTP objecthandles structure (returned by GetObjectHandles)
struct _PTPObjectHandles {
uint32_t n;
uint32_t handler[(PTP_REQ_DATALEN-sizeof(uint32_t))/sizeof(uint32_t)];
};
typedef struct _PTPObjectHandles PTPObjectHandles;
#define PTP_HANDLER_SPECIAL 0xffffffff
#define PTP_HANDLER_ROOT 0x00000000
// PTP objectinfo structure (returned by GetObjectInfo)
struct _PTPObjectInfo {
uint32_t StorageID;
uint16_t ObjectFormat;
uint16_t ProtectionStatus;
uint32_t ObjectCompressedSize;
uint16_t ThumbFormat;
uint32_t ThumbCompressedSize;
uint32_t ThumbPixWidth;
uint32_t ThumbPixHeight;
uint32_t ImagePixWidth;
uint32_t ImagePixHeight;
uint32_t ImageBitDepth;
uint32_t ParentObject;
uint16_t AssociationType;
uint32_t AssociationDesc;
uint32_t SequenceNumber;
char *Filename;
time_t CaptureDate;
time_t ModificationDate;
char *Keywords;
};
typedef struct _PTPObjectInfo PTPObjectInfo;
#define MAXFILENAMELEN 255
// PTP Object Format Codes
// ancillary formats
#define PTP_OFC_Undefined 0x3000
#define PTP_OFC_Association 0x3001
#define PTP_OFC_Script 0x3002
#define PTP_OFC_Executable 0x3003
#define PTP_OFC_Text 0x3004
#define PTP_OFC_HTML 0x3005
#define PTP_OFC_DPOF 0x3006
#define PTP_OFC_AIFF 0x3007
#define PTP_OFC_WAV 0x3008
#define PTP_OFC_MP3 0x3009
#define PTP_OFC_AVI 0x300A
#define PTP_OFC_MPEG 0x300B
#define PTP_OFC_ASF 0x300D
// image formats
#define PTP_OFC_EXIF_JPEG 0x3801
#define PTP_OFC_TIFF_EP 0x3802
#define PTP_OFC_FlashPix 0x3803
#define PTP_OFC_BMP 0x3804
#define PTP_OFC_CIFF 0x3805
#define PTP_OFC_Undefined_0x3806 0x3806
#define PTP_OFC_GIF 0x3807
#define PTP_OFC_JFIF 0x3808
#define PTP_OFC_PCD 0x3809
#define PTP_OFC_PICT 0x380A
#define PTP_OFC_PNG 0x380B
#define PTP_OFC_Undefined_0x380C 0x380C
#define PTP_OFC_TIFF 0x380D
#define PTP_OFC_TIFF_IT 0x380E
#define PTP_OFC_JP2 0x380F
#define PTP_OFC_JPX 0x3810
// Eastman Kodak extension ancillary format
#define PTP_OFC_EK_M3U 0xb002
// PTP Association Types
#define PTP_AT_Undefined 0x0000
#define PTP_AT_GenericFolder 0x0001
#define PTP_AT_Album 0x0002
#define PTP_AT_TimeSequence 0x0003
#define PTP_AT_HorizontalPanoramic 0x0004
#define PTP_AT_VerticalPanoramic 0x0005
#define PTP_AT_2DPanoramic 0x0006
#define PTP_AT_AncillaryData 0x0007
// PTP Protection Status
#define PTP_PS_NoProtection 0x0000
#define PTP_PS_ReadOnly 0x0001
// PTP Storage Types
#define PTP_ST_Undefined 0x0000
#define PTP_ST_FixedROM 0x0001
#define PTP_ST_RemovableROM 0x0002
#define PTP_ST_FixedRAM 0x0003
#define PTP_ST_RemovableRAM 0x0004
// PTP FilesystemType Values
#define PTP_FST_Undefined 0x0000
#define PTP_FST_GenericFlat 0x0001
#define PTP_FST_GenericHierarchical 0x0002
#define PTP_FST_DCF 0x0003
// PTP StorageInfo AccessCapability Values
#define PTP_AC_ReadWrite 0x0000
#define PTP_AC_ReadOnly 0x0001
#define PTP_AC_ReadOnly_with_Object_Deletion 0x0002
// Glue stuff
typedef short (* PTPIOReadFunc) (unsigned char *bytes, unsigned int size,
void *data);
typedef short (* PTPIOWriteFunc) (unsigned char *bytes, unsigned int size,
void *data);
typedef void (* PTPErrorFunc) (void *data, const char *format, va_list args);
typedef void (* PTPDebugFunc) (void *data, const char *format, va_list args);
struct _PTPParams {
/* data layer byteorder */
uint8_t byteorder;
/* Custom IO functions */
PTPIOReadFunc read_func;
PTPIOWriteFunc write_func;
PTPIOReadFunc check_int_func;
PTPIOReadFunc check_int_fast_func;
/* Custom error and debug function */
PTPErrorFunc error_func;
PTPDebugFunc debug_func;
/* Data passed to above functions */
void *data;
/* ptp transaction ID */
uint32_t transaction_id;
/* internal structures used by ptp driver */
PTPObjectHandles handles;
PTPObjectInfo * objectinfo;
PTPDeviceInfo deviceinfo;
};
typedef struct _PTPParams PTPParams;
// ptp functions
uint16_t ptp_event_check (PTPParams* params, PTPEvent* event);
uint16_t ptp_event_wait (PTPParams* params, PTPEvent* event);
uint16_t ptp_getdeviceinfo (PTPParams* params, PTPDeviceInfo* deviceinfo);
uint16_t ptp_opensession (PTPParams *params, uint32_t session);
uint16_t ptp_closesession (PTPParams *params);
uint16_t ptp_getstorageids (PTPParams* params, PTPStorageIDs* storageids);
uint16_t ptp_getstorageinfo (PTPParams* params, uint32_t storageid,
PTPStorageInfo* storageinfo);
uint16_t ptp_getobjecthandles (PTPParams* params, uint32_t storage,
uint32_t objectformatcode,
uint32_t associationOH,
PTPObjectHandles* objecthandles);
uint16_t ptp_getobjectinfo (PTPParams *params, uint32_t handle,
PTPObjectInfo* objectinfo);
uint16_t ptp_getobject (PTPParams *params, uint32_t handle,
uint32_t size, PTPReq* object);
uint16_t ptp_getthumb (PTPParams *params, uint32_t handle,
uint32_t size, PTPReq* object);
uint16_t ptp_deleteobject (PTPParams* params, uint32_t handle,
uint32_t ofc);
uint16_t ptp_initiatecapture (PTPParams* params, uint32_t storageid,
uint32_t ofc);
uint16_t ptp_ek_sendfileobjectinfo (PTPParams* params, uint32_t* store,
uint32_t* parenthandle, uint32_t* handle,
PTPObjectInfo* objectinfo);
uint16_t ptp_ek_sendfileobject (PTPParams* params, PTPReq* object,
uint32_t size);
int ptp_operation_issupported (PTPParams* params, uint16_t operation);
int ptp_property_issupported (PTPParams* params, uint16_t property);
#endif /* __PTP_H__ */
|