/* * File: libexf1.h * Author: Jens Skovgaard Olsen * * Created on 30. november 2010, 17:33 */ #ifndef LIBEXF1_H #define LIBEXF1_H #include #include #include #define TRUE 1 #define FALSE 0 #define NO_READS 0 #define ONE_READ 1 #define TWO_READS 2 #define MY_VID 0x07CF #define MY_PID 0x1023 #define EP_IN 0x81 #define EP_OUT 0x02 #define EP_INT 0x83 #define BUF_SIZE 512 #define IMG_BUF_SIZE 65536 #define TIME_OUT 3500 #define WORD short unsigned int // 16bits #define DWORD unsigned int // 32bits #define GET_WORD(ptr) ((0xFF & *(ptr)) + ((0xFF & *(ptr+1)) << 8)) #define GET_DWORD(ptr) ((0xFF & *(ptr)) + ((0xFF & *(ptr+1)) << 8) + ((0xFF & *(ptr+2)) << 16) + ((0xFF & *(ptr+3)) << 24)) #define SET_WORD(ptr, val) ({*ptr = (val & 0xFF); *(ptr+1) = (val & 0xFF00) >> 8;}) #define SET_DWORD(ptr, val) ({*ptr = (val & 0xFF); *(ptr+1) = (val & 0xFF00) >> 8; *(ptr+2) = (val & 0xFF0000) >> 16; *(ptr+3) = (val & 0xFF000000) >> 24;}) #define SESSION_ID 0x19760615 #define CMD_GET_DEVICE_INFO 0x1001 #define CMD_OPEN_SESSION 0x1002 #define CMD_CLOSE_SESSION 0x1003 #define CMD_GET_STORAGE_IDS 0x1004 #define CMD_GET_PROP_DESC 0x1014 #define CMD_READ 0x1015 #define CMD_WRITE 0x1016 #define CMD_OK 0x2001 #define CMD_STILL_START 0x9001 #define CMD_STILL_STOP 0x9002 #define CMD_FOCUS 0x9007 #define CMD_CF_PRESS 0x9009 #define CMD_CF_RELEASE 0x900A #define CMD_GET_OBJECT_INFO 0x900C #define CMD_SHUTTER 0x9024 #define CMD_GET_STILL_HANDLES 0x9027 #define CMD_STILL_RESET 0x9028 #define CMD_HALF_PRESS 0x9029 #define CMD_HALF_RELEASE 0x902A #define CMD_CS_PRESS 0x902B #define CMD_CS_RELEASE 0x902C #define CMD_ZOOM 0x902D #define CMD_CZ_PRESS 0x902E #define CMD_CZ_RELEASE 0x902F #define CMD_MOVIE_START 0x9041 #define CMD_MOVIE_STOP 0x9042 #define CMD_MOVIE_PRESS 0x9043 #define CMD_MOVIE_RELEASE 0x9044 #define CMD_GET_MOVIE_HANDLES 0x9045 #define CMD_MOVIE_RESET 0x9046 #define CMD_GET_OBJECT 0x9025 #define CMD_GET_THUMBNAIL 0x9026 #define DATA_CAPTURE 0x0001 #define DATA_MONITOR 0x0002 // shutter usbCmdGen(0x9024, NO_READS, 0, NULL); // movie usbCmdGen(0x9044, NO_READS, 0, NULL); // get mov usbCmdGen(0x9025, NO_READS, 4, (char[]){0x01, 0x00, 0x00, 0x00}); // Camera settings. #define ADDR_BATTERY_LEVEL 0x00005001 #define ADDR_FUNCTIONALITY 0x00005002 #define ADDR_IMAGE_SIZE 0x00005003 #define ADDR_QUALITY 0x00005004 #define ADDR_WHITE_BALANCE 0x00005005 #define ADDR_APERTURE 0x00005007 #define ADDR_FOCUS 0x0000500A #define ADDR_METERING 0x0000500B #define ADDR_FLASH 0x0000500C #define ADDR_SHUTTER_SPEED 0x0000500D #define ADDR_EXPOSURE 0x0000500E #define ADDR_ISO 0x0000500F #define ADDR_EV 0x00005010 #define ADDR_CAPTURE_MODE 0x00005013 #define ADDR_CONTRAST 0x00005014 #define ADDR_SHARPNESS 0x00005015 #define ADDR_METERING_MODE 0x0000501C #define ADDR_MONITOR 0x0000D001 #define ADDR_STORAGE 0x0000D002 //Not reported by DeviceInfo? #define ADDR_UNKNOWN_1 0x0000D004 #define ADDR_UNKNOWN_2 0x0000D005 #define ADDR_UNKNOWN_3 0x0000D007 #define ADDR_RECORD_LIGHT 0x0000D008 #define ADDR_UNKNOWN_4 0x0000D009 #define ADDR_UNKNOWN_5 0x0000D00A #define ADDR_MOVIE_MODE 0x0000D00B #define ADDR_HD_SETTING 0x0000D00C #define ADDR_HS_SETTING 0x0000D00D #define ADDR_CS_HIGH_SPEED 0x0000D00F #define ADDR_CS_UPPER_LIMIT 0x0000D010 #define ADDR_CS_SHOT 0x0000D011 #define ADDR_UNKNOWN_6 0x0000D012 #define ADDR_UNKNOWN_7 0x0000D013 #define ADDR_UNKNOWN_8 0x0000D015 #define ADDR_UNKNOWN_9 0x0000D017 #define ADDR_UNKNOWN_10 0x0000D018 #define ADDR_UNKNOWN_11 0x0000D019 #define ADDR_UNKNOWN_12 0x0000D01A #define ADDR_UNKNOWN_13 0x0000D01B #define ADDR_UNKNOWN_14 0x0000D01C #define ADDR_UNKNOWN_15 0x0000D01D #define ADDR_UNKNOWN_16 0x0000D020 #define ADDR_UNKNOWN_17 0x0000D030 #define ADDR_UNKNOWN_18 0x0000D080 #define DATA_FUNC_BASIC 0x0000 #define DATA_FUNC_EXTENDED 0x8001 #define DATA_CAPTURE_NORMAL 0x0001 #define DATA_CAPTURE_CS 0x8001 #define DATA_CAPTURE_PREREC 0x8002 #define DATA_IS0_AUTO 0xFFFF #define DATA_IS0_100 0x0064 #define DATA_IS0_200 0x00C8 #define DATA_IS0_400 0x0190 #define DATA_IS0_800 0x0320 #define DATA_IS0_1600 0x0640 #define DATA_MOVIE_MODE_STD 0x0000 #define DATA_MOVIE_MODE_HD 0x0001 #define DATA_MOVIE_MODE_HS 0x0002 #define DATA_APERTURE_F2_7 0x0001 #define DATA_APERTURE_F3_0 0x0002 #define DATA_APERTURE_F3_3 0x0003 #define DATA_APERTURE_F3_8 0x0004 #define DATA_APERTURE_F4_2 0x0005 #define DATA_APERTURE_F4_7 0x0006 #define DATA_APERTURE_F5_3 0x0007 #define DATA_APERTURE_F6_0 0x0008 #define DATA_APERTURE_F6_7 0x0009 #define DATA_APERTURE_F7_5 0x000A #define DATA_FOCUS_MANUAL 0x0001 #define DATA_FOCUS_AF 0x0002 #define DATA_FOCUS_MACRO 0x0003 #define DATA_FOCUS_INFINITY 0x8001 #define DATA_EXPOSURE_M 0x0001 #define DATA_EXPOSURE_AUTO 0x0002 #define DATA_EXPOSURE_A 0x0003 #define DATA_EXPOSURE_S 0x0004 #define DATA_ZOOM_OUT 0x0000 #define DATA_ZOOM_IN 0x0001 #define DATA_FOCUS_OUT 0x0000 #define DATA_FOCUS_IN 0x0001 #define TYPE_CMD 0x0001 #define TYPE_DATA 0x0002 #define TYPE_RESPONSE 0x0003 #define TYPE_EVENT 0x0004 #define EVT_DEVICE_INFO_CHANGED 0x4008 #define EVT_ZOOM_CHANGED 0xC011 #define EVT_FOCUS_CHANGED 0xC012 #define EVT_FOCUS_OK 0xC014 #define EVT_UNKNOWN_CHANGED 0xC015 struct _WORD_DATA_SET { DWORD noItems; WORD data[]; }; typedef struct _WORD_DATA_SET WORD_DATA_SET; struct _DWORD_DATA_SET { DWORD noItems; DWORD data[]; }; typedef struct _DWORD_DATA_SET DWORD_DATA_SET; // GCC pack pragmas. #define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__)) // VC++ pack pragmas, //#define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) ) PACK( struct _STRING_DATA_SET { char noItems; WORD data[]; }); typedef struct _STRING_DATA_SET STRING_DATA_SET; struct _PTP_CONTAINER { DWORD length; WORD type; WORD code; DWORD trans_id; union { struct { WORD param1; WORD param2; WORD param3; WORD param4; } word_params; struct { DWORD param1; DWORD param2; } dword_params; unsigned char data[BUF_SIZE-12]; } payload; }; typedef struct _PTP_CONTAINER PTP_CONTAINER; struct _PTP_DEVICE_INFO { WORD standardVersion; DWORD vendorExtensionID; WORD vendorExtensionVersion; STRING_DATA_SET *vendorExtensionDesc; WORD functionalMode; WORD_DATA_SET *operationsSupported; WORD_DATA_SET *eventsSupported; WORD_DATA_SET *devicePropertiesSupported; WORD_DATA_SET *captureFormats; WORD_DATA_SET *imageFormats; STRING_DATA_SET *manufacturer; STRING_DATA_SET *model; STRING_DATA_SET *deviceVersion; STRING_DATA_SET *serialNumber; }; typedef struct _PTP_DEVICE_INFO PTP_DEVICE_INFO; struct _RANGE_FORM { void *minimumValue; void *maximumValue; void *stepSize; }; typedef struct _RANGE_FORM RANGE_FORM; struct _ENUM_FORM { WORD numberOfValues; void **supportedValue; }; typedef struct _ENUM_FORM ENUM_FORM; PACK( struct _PTP_DEVICE_PROPERTY { WORD code; WORD dataType; char getSet; void *defaultValue; void *currentValue; char formFlag; union { ENUM_FORM enumForm; RANGE_FORM rangeForm; } form; }); typedef struct _PTP_DEVICE_PROPERTY PTP_DEVICE_PROPERTY; #define PROPERTY_FORM_NONE 0x00 #define PROPERTY_FORM_RANGE 0x01 #define PROPERTY_FORM_ENUM 0x02 #define DATA_TYPE_CHAR 0x0002 #define DATA_TYPE_WORD 0x0004 #define DATA_TYPE_DWORD 0x0006 #define DATA_TYPE_STRING 0xFFFF #define TO_FILE 1 #define TO_MEM 2 struct _PTP_OBJECT_INFO { DWORD storageId; WORD objectFormat; WORD protectionStatus; DWORD objectCompressedSize; WORD thumbFormat; DWORD thumbCompressedSize; DWORD thumbPixWidth; DWORD thumbPixHeight; DWORD imagePixWidth; DWORD imagePixHeight; DWORD imageBitDepth; DWORD parentObject; WORD associationType; DWORD associationDesc; DWORD sequenceNumber; STRING_DATA_SET *fileName; STRING_DATA_SET *captureDate; STRING_DATA_SET *modificationDate; STRING_DATA_SET *keyWords; }; typedef struct _PTP_OBJECT_INFO PTP_OBJECT_INFO; usb_dev_handle *open_dev(int device_num); void exf1Cmd(WORD cmd, ...); void usbCmdGen(short int cmd, short int postCmdReads, int nCmdParameters, char cmdParameters[]); void usbTx(WORD cmd, WORD cmdType, int nCmdParameterBytes, DWORD cmdParameter1, DWORD cmdParameter2); int usbRx(); int usbRxToFile(char *fileName); int usbRxEvent(); void usbGetStatus(); int usbInit(int device_num); void printStringDataSet(char *pDescrition, STRING_DATA_SET *pDataSet); void printWordDataSet(char *pDescrition, WORD_DATA_SET *pDataSet); void printDwordDataSet(char *pDescrition, DWORD_DATA_SET *pDataSet); void setDeviceInfo(char *pData); void printDeviceInfo(); void printEnumDataSet(char *pDescrition, ENUM_FORM *pDataSet, WORD dataType); void setDeviceProperty(char *pData); void printDeviceProperty(); void setObjectInfo(char *pData); void printObjectInfo(); WORD getStringDataSet(STRING_DATA_SET **dst, char *src); DWORD getWordDataSet(WORD_DATA_SET **dst, char *src); DWORD getDwordDataSet(DWORD_DATA_SET **dst, char *src); void start_config(char enableStillImage, char enablePreRecord); void stop_config(); extern usb_dev_handle *dev; extern char tmp[BUF_SIZE]; extern char img[IMG_BUF_SIZE]; extern PTP_DEVICE_INFO deviceInfo; extern PTP_DEVICE_PROPERTY deviceProperty; extern PTP_OBJECT_INFO objectInfo; extern DWORD_DATA_SET *objectHandles; extern DWORD zoomSetting; extern DWORD focusSetting; extern DWORD USB_CMD_ID; #endif /* LIBEXF1_H */