load the opcodes for the sony from the extended opcode handler

git-svn-id: https://svn.code.sf.net/p/gphoto/code/trunk/libgphoto2@14793 67ed7778-7388-44ab-90cf-0a291f65f57c
This commit is contained in:
Marcus Meissner
2014-02-23 20:45:52 +00:00
parent 8c75c5aea2
commit f61cd0f85f
3 changed files with 106 additions and 1 deletions

View File

@@ -452,6 +452,66 @@ fixup_cached_deviceinfo (Camera *camera, PTPDeviceInfo *di) {
di->OperationsSupported[di->OperationsSupported_len+1] = PTP_OC_NIKON_AfCaptureSDRAM;
di->OperationsSupported_len+=2;
}
#endif
}
/* Sony DSLR also hide its newer opcodes behind another vendor specific query,
* do that and merge it into the generic PTP deviceinfo. */
if (di->VendorExtensionID == PTP_VENDOR_SONY) {
unsigned int i;
if (ptp_operation_issupported(&camera->pl->params, PTP_OC_SONY_GetSDIOGetExtDeviceInfo)) {
int opcodes = 0, propcodes = 0, events = 0, j,k,l;
uint16_t *xprops;
unsigned int xsize;
uint16_t ret;
ret = ptp_sony_get_vendorpropcodes (&camera->pl->params, &xprops, &xsize);
if (ret != PTP_RC_OK) {
gp_log (GP_LOG_ERROR, "ptp2/fixup", "ptp_sony_get_vendorpropcodes() failed with 0x%04x", ret);
return;
}
for (i=0;i<xsize;i++) {
switch (xprops[i] & 0x7000) {
case 0x1000: opcodes++; break;
case 0x4000: events++; break;
case 0x5000: propcodes++; break;
default:
gp_log (GP_LOG_ERROR, "ptp2/fixup", "ptp_sony_get_vendorpropcodes() unknown opcode %x", xprops[i]);
break;
}
}
di->DevicePropertiesSupported = realloc(di->DevicePropertiesSupported,sizeof(di->DevicePropertiesSupported[0])*(di->DevicePropertiesSupported_len + propcodes));
di->OperationsSupported = realloc(di->OperationsSupported, sizeof(di->OperationsSupported[0])*(di->OperationsSupported_len + opcodes));
di->EventsSupported = realloc(di->EventsSupported, sizeof(di->EventsSupported[0])*(di->EventsSupported_len + events));
j = 0; k = 0; l = 0;
for (i=0;i<xsize;i++) {
switch (xprops[i] & 0x7000) {
case 0x1000:
di->OperationsSupported[(k++)+di->OperationsSupported_len] = xprops[i];
break;
case 0x4000:
di->EventsSupported[(l++)+di->EventsSupported_len] = xprops[i];
break;
case 0x5000:
di->DevicePropertiesSupported[(j++)+di->DevicePropertiesSupported_len] = xprops[i];
break;
default:
break;
}
}
di->DevicePropertiesSupported_len += propcodes;
di->EventsSupported_len += events;
di->OperationsSupported_len += opcodes;
free (xprops);
}
#if 0
if (!ptp_operation_issupported(&camera->pl->params, 0x9207)) {
di->OperationsSupported = realloc(di->OperationsSupported,sizeof(di->OperationsSupported[0])*(di->OperationsSupported_len + 2));
di->OperationsSupported[di->OperationsSupported_len+0] = PTP_OC_NIKON_Capture;
di->OperationsSupported[di->OperationsSupported_len+1] = PTP_OC_NIKON_AfCaptureSDRAM;
di->OperationsSupported_len+=2;
}
#endif
}
#if 0 /* Marcus: not regular ptp properties, not queryable via getdevicepropertyvalue */

View File

@@ -2855,7 +2855,39 @@ ptp_nikon_curve_download (PTPParams* params, unsigned char **data, unsigned int
}
/**
* ptp_canon_get_vendorpropcodes:
* ptp_sony_get_vendorpropcodes:
*
* This command downloads the vendor specific property codes.
*
* params: PTPParams*
*
* Return values: Some PTP_RC_* code.
* unsigned char **data - pointer to data pointer
* unsigned int *size - size of data returned
*
**/
uint16_t
ptp_sony_get_vendorpropcodes (PTPParams* params, uint16_t **props, unsigned int *size) {
PTPContainer ptp;
uint16_t ret;
unsigned char *xdata = NULL;
unsigned int xsize;
*props = NULL;
*size = 0;
PTP_CNT_INIT(ptp);
ptp.Code = PTP_OC_SONY_GetSDIOGetExtDeviceInfo;
ptp.Nparam = 1;
ptp.Param1 = 0xc8; /* unclear */
ret = ptp_transaction(params, &ptp, PTP_DP_GETDATA, 0, &xdata, &xsize);
/* first 16 bit is 0xc8 0x00, then an array of 16 bit PTP ids */
if (ret == PTP_RC_OK)
*size = ptp_unpack_uint16_t_array(params,xdata+2,0,props);
free (xdata);
return ret;
}
/**
* ptp_nikon_get_vendorpropcodes:
*
* This command downloads the vendor specific property codes.
*

View File

@@ -497,8 +497,19 @@ typedef struct _PTPIPHeader PTPIPHeader;
#define PTP_OC_CASIO_GET_THUMBNAIL 0x9026
/* Sony stuff */
/* 9201:
* 3 params: 1,0,0 ; IN: data 8 bytes all 0
* or:
* 3 params: 2,0,0 ; IN: data 8 bytes all 0
* or
* 3 params: 3,0,0,: IN: data 8 butes all 0
*/
#define PTP_OC_SONY_SDIOConnect 0x9201
/* 9202: 1 param, 0xc8; IN data:
* 16 bit: 0xc8
* ptp array 32 bit: index, 16 bit values of propcodes */
#define PTP_OC_SONY_GetSDIOGetExtDeviceInfo 0x9202
#define PTP_OC_SONY_GetDevicePropdesc 0x9203
#define PTP_OC_SONY_GetDevicePropertyValue 0x9204
#define PTP_OC_SONY_SetControlDeviceA 0x9205
@@ -2827,6 +2838,8 @@ uint16_t ptp_nikon_curve_download (PTPParams* params,
uint16_t ptp_nikon_getptpipinfo (PTPParams* params, unsigned char **data, unsigned int *size);
uint16_t ptp_nikon_getwifiprofilelist (PTPParams* params);
uint16_t ptp_nikon_writewifiprofile (PTPParams* params, PTPNIKONWifiProfile* profile);
uint16_t ptp_sony_get_vendorpropcodes (PTPParams* params, uint16_t **props, unsigned int *size);
/**
* ptp_nikon_deletewifiprofile:
*