Library to allo USB PTP device to be hosted by the mbed platform

Dependents:   class_project_main

Committer:
jakowisp
Date:
Fri Aug 23 23:34:05 2013 +0000
Revision:
3:1fcb46ab18df
Parent:
1:71c0e9dc153d
Child:
4:9c6f5867f050
PIMA15740 Sub Folders documented.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jakowisp 1:71c0e9dc153d 1 /* mbed USBHostPTP Library
jakowisp 1:71c0e9dc153d 2 * Copyright (c) 2013 Dwayne Dilbeck
jakowisp 1:71c0e9dc153d 3 * This software is distributed under the terms of the GNU Lesser General Public License
jakowisp 0:98cf19bcd828 4 */
jakowisp 0:98cf19bcd828 5
jakowisp 0:98cf19bcd828 6 #include "USBHostPTP.h"
jakowisp 0:98cf19bcd828 7
jakowisp 0:98cf19bcd828 8 #if 1
jakowisp 0:98cf19bcd828 9 //USBHOST_PTP
jakowisp 0:98cf19bcd828 10
jakowisp 0:98cf19bcd828 11 #include "dbg.h"
jakowisp 0:98cf19bcd828 12
jakowisp 0:98cf19bcd828 13 #define DEVICE_TO_HOST 0x80
jakowisp 0:98cf19bcd828 14 #define HOST_TO_DEVICE 0x00
jakowisp 0:98cf19bcd828 15
jakowisp 0:98cf19bcd828 16
jakowisp 0:98cf19bcd828 17 USBHostPTP::USBHostPTP( void )
jakowisp 0:98cf19bcd828 18 {
jakowisp 0:98cf19bcd828 19 host = USBHost::getHostInst();
jakowisp 0:98cf19bcd828 20 initializeClassData();
jakowisp 0:98cf19bcd828 21 }
jakowisp 0:98cf19bcd828 22
jakowisp 0:98cf19bcd828 23 void USBHostPTP::initializeClassData() {
jakowisp 0:98cf19bcd828 24 deviceConnected = false;
jakowisp 0:98cf19bcd828 25 pointerToDevice = NULL;
jakowisp 0:98cf19bcd828 26 bulk_in = NULL;
jakowisp 0:98cf19bcd828 27 bulk_out = NULL;
jakowisp 0:98cf19bcd828 28 int_in=NULL;
jakowisp 0:98cf19bcd828 29 deviceFound = false;
jakowisp 0:98cf19bcd828 30 deviceConnected = false;
jakowisp 0:98cf19bcd828 31 ptp_intf = -1;
jakowisp 0:98cf19bcd828 32 numberOfEndpoints = 0;
jakowisp 0:98cf19bcd828 33 transactionCnt=0;
jakowisp 1:71c0e9dc153d 34 commandContainer.type=PIMA_CONTAINER_COMMAND;
jakowisp 0:98cf19bcd828 35 sessionID=1;
jakowisp 0:98cf19bcd828 36 dataLeftToTransfer=0;
jakowisp 0:98cf19bcd828 37 }
jakowisp 0:98cf19bcd828 38
jakowisp 0:98cf19bcd828 39
jakowisp 0:98cf19bcd828 40 bool USBHostPTP::connected()
jakowisp 0:98cf19bcd828 41 {
jakowisp 0:98cf19bcd828 42 return deviceConnected;
jakowisp 0:98cf19bcd828 43 }
jakowisp 0:98cf19bcd828 44
jakowisp 0:98cf19bcd828 45 bool USBHostPTP::connect()
jakowisp 0:98cf19bcd828 46 {
jakowisp 0:98cf19bcd828 47
jakowisp 0:98cf19bcd828 48 if (deviceConnected) {
jakowisp 0:98cf19bcd828 49 return true;
jakowisp 0:98cf19bcd828 50 }
jakowisp 0:98cf19bcd828 51
jakowisp 0:98cf19bcd828 52 for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
jakowisp 0:98cf19bcd828 53 if ((pointerToDevice = host->getDevice(i)) != NULL) {
jakowisp 0:98cf19bcd828 54
jakowisp 0:98cf19bcd828 55 USB_DBG("Trying to connect PTP device\r\n");
jakowisp 0:98cf19bcd828 56
jakowisp 0:98cf19bcd828 57 if(host->enumerate(pointerToDevice, this))
jakowisp 0:98cf19bcd828 58 break;
jakowisp 0:98cf19bcd828 59
jakowisp 0:98cf19bcd828 60 if (deviceFound) {
jakowisp 0:98cf19bcd828 61 bulk_in = pointerToDevice->getEndpoint(ptp_intf, BULK_ENDPOINT, IN);
jakowisp 0:98cf19bcd828 62 bulk_out = pointerToDevice->getEndpoint(ptp_intf, BULK_ENDPOINT, OUT);
jakowisp 0:98cf19bcd828 63 int_in = pointerToDevice->getEndpoint(ptp_intf, INTERRUPT_ENDPOINT, IN);
jakowisp 0:98cf19bcd828 64
jakowisp 0:98cf19bcd828 65 if (!bulk_in || !bulk_out || !int_in)
jakowisp 0:98cf19bcd828 66 continue;
jakowisp 0:98cf19bcd828 67
jakowisp 0:98cf19bcd828 68 USB_INFO("New PTP device: VID:%04x PID:%04x [dev: %p - intf: %d]", pointerToDevice->getVid(),
jakowisp 0:98cf19bcd828 69 pointerToDevice->getPid(),
jakowisp 0:98cf19bcd828 70 pointerToDevice, ptp_intf);
jakowisp 0:98cf19bcd828 71 pointerToDevice->setName("PTP", ptp_intf);
jakowisp 0:98cf19bcd828 72 host->registerDriver(pointerToDevice, ptp_intf, this, &USBHostPTP::initializeClassData);
jakowisp 0:98cf19bcd828 73
jakowisp 0:98cf19bcd828 74 deviceConnected = true;
jakowisp 0:98cf19bcd828 75 return true;
jakowisp 0:98cf19bcd828 76 }
jakowisp 0:98cf19bcd828 77 } //if()
jakowisp 0:98cf19bcd828 78 } //for()
jakowisp 0:98cf19bcd828 79 initializeClassData();
jakowisp 0:98cf19bcd828 80 return false;
jakowisp 0:98cf19bcd828 81 }
jakowisp 0:98cf19bcd828 82
jakowisp 0:98cf19bcd828 83 /*virtual*/ void USBHostPTP::setVidPid(uint16_t vid, uint16_t pid)
jakowisp 0:98cf19bcd828 84 {
jakowisp 0:98cf19bcd828 85 // we don't check VID/PID for PTP driver
jakowisp 0:98cf19bcd828 86 }
jakowisp 0:98cf19bcd828 87
jakowisp 0:98cf19bcd828 88 /*virtual*/ bool USBHostPTP::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed
jakowisp 0:98cf19bcd828 89 {
jakowisp 0:98cf19bcd828 90
jakowisp 0:98cf19bcd828 91 if ((ptp_intf == -1) &&
jakowisp 0:98cf19bcd828 92 (intf_class == USB_PTP_CLASS_CODE) &&
jakowisp 0:98cf19bcd828 93 (intf_subclass == 0x01) &&
jakowisp 0:98cf19bcd828 94 (intf_protocol == 0x01)) {
jakowisp 0:98cf19bcd828 95 ptp_intf = intf_nb;
jakowisp 0:98cf19bcd828 96 return true;
jakowisp 0:98cf19bcd828 97 }
jakowisp 0:98cf19bcd828 98 return false;
jakowisp 0:98cf19bcd828 99 }
jakowisp 0:98cf19bcd828 100
jakowisp 0:98cf19bcd828 101 /*virtual*/ bool USBHostPTP::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
jakowisp 0:98cf19bcd828 102 {
jakowisp 0:98cf19bcd828 103
jakowisp 0:98cf19bcd828 104 if (intf_nb == ptp_intf) {
jakowisp 0:98cf19bcd828 105 if (type == INTERRUPT_ENDPOINT) {
jakowisp 0:98cf19bcd828 106 numberOfEndpoints++;
jakowisp 0:98cf19bcd828 107 }
jakowisp 0:98cf19bcd828 108 if (type == BULK_ENDPOINT) {
jakowisp 0:98cf19bcd828 109 numberOfEndpoints++;
jakowisp 0:98cf19bcd828 110 }
jakowisp 0:98cf19bcd828 111 if (numberOfEndpoints == 3)
jakowisp 0:98cf19bcd828 112 deviceFound = true;
jakowisp 0:98cf19bcd828 113 return true;
jakowisp 0:98cf19bcd828 114 }
jakowisp 0:98cf19bcd828 115 return false;
jakowisp 0:98cf19bcd828 116 }
jakowisp 0:98cf19bcd828 117
jakowisp 0:98cf19bcd828 118
jakowisp 0:98cf19bcd828 119
jakowisp 0:98cf19bcd828 120
jakowisp 0:98cf19bcd828 121
jakowisp 0:98cf19bcd828 122
jakowisp 0:98cf19bcd828 123
jakowisp 0:98cf19bcd828 124
jakowisp 0:98cf19bcd828 125 bool USBHostPTP::CancelRequest(unsigned int TransactionID) {
jakowisp 0:98cf19bcd828 126 unsigned char buffer[6];
jakowisp 0:98cf19bcd828 127 int res = 0;
jakowisp 0:98cf19bcd828 128
jakowisp 0:98cf19bcd828 129 buffer[0] =0x01; //Cancellation Code 0x4001
jakowisp 0:98cf19bcd828 130 buffer[1] =0x40;
jakowisp 0:98cf19bcd828 131 buffer[2]= TransactionID & 0xff;
jakowisp 0:98cf19bcd828 132 buffer[3]= (TransactionID>>8) & 0xff;
jakowisp 0:98cf19bcd828 133 buffer[4]= (TransactionID>>16) & 0xff;;
jakowisp 0:98cf19bcd828 134 buffer[5]= (TransactionID>>24) & 0xff;;
jakowisp 0:98cf19bcd828 135
jakowisp 0:98cf19bcd828 136 res = host->controlWrite( pointerToDevice,
jakowisp 0:98cf19bcd828 137 USB_RECIPIENT_ENDPOINT | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_STANDARD,
jakowisp 0:98cf19bcd828 138 USB_PTP_CLASS_REQUEST_CANCELREQEUST,
jakowisp 0:98cf19bcd828 139 0, 0, buffer, 6);
jakowisp 0:98cf19bcd828 140 return res==0?true:false;
jakowisp 0:98cf19bcd828 141 }
jakowisp 0:98cf19bcd828 142
jakowisp 0:98cf19bcd828 143 bool USBHostPTP::DeviceResetRequest(void) {
jakowisp 0:98cf19bcd828 144
jakowisp 0:98cf19bcd828 145 int res = 0;
jakowisp 0:98cf19bcd828 146
jakowisp 0:98cf19bcd828 147 res = host->controlWrite( pointerToDevice,
jakowisp 0:98cf19bcd828 148 USB_RECIPIENT_ENDPOINT | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_STANDARD,
jakowisp 0:98cf19bcd828 149 USB_PTP_CLASS_REQUEST_DEVICE_RESET,
jakowisp 0:98cf19bcd828 150 0, 0, NULL, 0);
jakowisp 0:98cf19bcd828 151 return res==0?true:false;
jakowisp 0:98cf19bcd828 152 }
jakowisp 0:98cf19bcd828 153
jakowisp 0:98cf19bcd828 154
jakowisp 0:98cf19bcd828 155 bool USBHostPTP::GetDeviceStatus(void) {
jakowisp 0:98cf19bcd828 156 unsigned char buffer[6];
jakowisp 0:98cf19bcd828 157 int res = 0;
jakowisp 0:98cf19bcd828 158
jakowisp 0:98cf19bcd828 159 //TODO: DetermineBuffer size
jakowisp 0:98cf19bcd828 160
jakowisp 0:98cf19bcd828 161 res = host->controlWrite( pointerToDevice,
jakowisp 0:98cf19bcd828 162 USB_RECIPIENT_ENDPOINT | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_STANDARD,
jakowisp 0:98cf19bcd828 163 USB_PTP_CLASS_REQUEST_GET_DEVICE_STATUS,
jakowisp 0:98cf19bcd828 164 0, 0, buffer, sizeof(buffer));
jakowisp 0:98cf19bcd828 165 return res==0?true:false;
jakowisp 0:98cf19bcd828 166 }
jakowisp 0:98cf19bcd828 167
jakowisp 0:98cf19bcd828 168 bool USBHostPTP::GetExtendedEventData(void) {
jakowisp 0:98cf19bcd828 169 unsigned char buffer[6];
jakowisp 0:98cf19bcd828 170 int res = 0;
jakowisp 0:98cf19bcd828 171
jakowisp 0:98cf19bcd828 172 //TODO: DetermineBuffer size
jakowisp 0:98cf19bcd828 173
jakowisp 0:98cf19bcd828 174 res = host->controlWrite( pointerToDevice,
jakowisp 0:98cf19bcd828 175 USB_RECIPIENT_ENDPOINT | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_STANDARD,
jakowisp 0:98cf19bcd828 176 USB_PTP_CLASS_REQUEST_GET_EXTENDED_EVENT_DATA,
jakowisp 0:98cf19bcd828 177 0, 0, buffer, sizeof(buffer));
jakowisp 0:98cf19bcd828 178 return res==0?true:false;
jakowisp 0:98cf19bcd828 179 }
jakowisp 0:98cf19bcd828 180
jakowisp 0:98cf19bcd828 181 bool USBHostPTP::CheckEvent(){
jakowisp 0:98cf19bcd828 182 int res=0;
jakowisp 0:98cf19bcd828 183
jakowisp 0:98cf19bcd828 184 memset(&eventContainer, 0, sizeof(PIMAContainer));
jakowisp 0:98cf19bcd828 185
jakowisp 0:98cf19bcd828 186 res = host->interruptRead(pointerToDevice, int_in,(uint8_t *)&eventContainer, sizeof(PIMAContainer));
jakowisp 0:98cf19bcd828 187
jakowisp 0:98cf19bcd828 188 if(res!=USB_TYPE_OK)
jakowisp 0:98cf19bcd828 189 return false;
jakowisp 0:98cf19bcd828 190
jakowisp 0:98cf19bcd828 191 return true;
jakowisp 0:98cf19bcd828 192 }
jakowisp 0:98cf19bcd828 193
jakowisp 0:98cf19bcd828 194 int USBHostPTP::checkResult(uint8_t res, USBEndpoint * ep) {
jakowisp 0:98cf19bcd828 195 // if ep stalled: send clear feature
jakowisp 0:98cf19bcd828 196 if (res == USB_TYPE_STALL_ERROR) {
jakowisp 0:98cf19bcd828 197 res = host->controlWrite( pointerToDevice,
jakowisp 0:98cf19bcd828 198 USB_RECIPIENT_ENDPOINT | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_STANDARD,
jakowisp 0:98cf19bcd828 199 CLEAR_FEATURE,
jakowisp 0:98cf19bcd828 200 0, ep->getAddress(), NULL, 0);
jakowisp 0:98cf19bcd828 201 // set state to IDLE if clear feature successful
jakowisp 0:98cf19bcd828 202 if (res == USB_TYPE_OK) {
jakowisp 0:98cf19bcd828 203 ep->setState(USB_TYPE_IDLE);
jakowisp 0:98cf19bcd828 204 }
jakowisp 0:98cf19bcd828 205 }
jakowisp 0:98cf19bcd828 206
jakowisp 0:98cf19bcd828 207 if (res != USB_TYPE_OK)
jakowisp 0:98cf19bcd828 208 return -1;
jakowisp 0:98cf19bcd828 209
jakowisp 0:98cf19bcd828 210 return 0;
jakowisp 0:98cf19bcd828 211 }
jakowisp 0:98cf19bcd828 212
jakowisp 0:98cf19bcd828 213
jakowisp 0:98cf19bcd828 214 uint16_t USBHostPTP::Transaction(uint16_t operationCode,
jakowisp 0:98cf19bcd828 215 OperFlags *operationFlags,
jakowisp 0:98cf19bcd828 216 uint32_t *parameters,
jakowisp 0:98cf19bcd828 217 void *dataHandlerFunctionCastToVoid){
jakowisp 0:98cf19bcd828 218
jakowisp 0:98cf19bcd828 219
jakowisp 0:98cf19bcd828 220 int transferResult=0;
jakowisp 0:98cf19bcd828 221 int i=0;
jakowisp 0:98cf19bcd828 222 uint8_t *pointerToUint8tData;
jakowisp 0:98cf19bcd828 223 uint32_t bytesReceived=0;
jakowisp 0:98cf19bcd828 224 uint32_t bytesRemaining=0;
jakowisp 0:98cf19bcd828 225 uint32_t dataToBeHandled=0;
jakowisp 0:98cf19bcd828 226 uint32_t responseLength=0;
jakowisp 0:98cf19bcd828 227 DataHandler dataHandler1 = (DataHandler) dataHandlerFunctionCastToVoid;
jakowisp 0:98cf19bcd828 228 bool firstDataBlockReceived=true;
jakowisp 0:98cf19bcd828 229
jakowisp 0:98cf19bcd828 230 if(IsCommandSupported(operationCode)==false)
jakowisp 1:71c0e9dc153d 231 return PIMA_RETURN_CODE_OperationNotSupported;
jakowisp 0:98cf19bcd828 232
jakowisp 3:1fcb46ab18df 233 commandContainer.length = PIMA_CONTAINER_HEADER_LENGTH + operationFlags->opParams*4;
jakowisp 1:71c0e9dc153d 234 responseLength = PIMA_CONTAINER_HEADER_LENGTH + operationFlags->rsParams*4;
jakowisp 3:1fcb46ab18df 235 responseContainer.length = responseLength;
jakowisp 3:1fcb46ab18df 236 commandContainer.code = operationCode;
jakowisp 3:1fcb46ab18df 237 commandContainer.transactionID = transactionCnt++;
jakowisp 0:98cf19bcd828 238 for (i=0; i<operationFlags->opParams; i++)
jakowisp 3:1fcb46ab18df 239 commandContainer.payload[i]=parameters[i];
jakowisp 0:98cf19bcd828 240
jakowisp 0:98cf19bcd828 241 #ifdef USDBPTPDEBUG
jakowisp 0:98cf19bcd828 242 printf("PTPCommandContainer:\r\n");
jakowisp 3:1fcb46ab18df 243 DumpBuffer((uint8_t *)&commandContainer,commandContainer.length);
jakowisp 0:98cf19bcd828 244 #endif
jakowisp 0:98cf19bcd828 245
jakowisp 3:1fcb46ab18df 246 transferResult = host->bulkWrite(pointerToDevice, bulk_out,(uint8_t *)&commandContainer, commandContainer.length);
jakowisp 0:98cf19bcd828 247 if (checkResult(transferResult, bulk_out))
jakowisp 1:71c0e9dc153d 248 return PIMA_RETURN_CODE_IncompleteTransfer;
jakowisp 0:98cf19bcd828 249 #ifdef USDBPTPDEBUG
jakowisp 0:98cf19bcd828 250 printf("Command bulkWrite result: %d\r\n",transferResult);
jakowisp 0:98cf19bcd828 251 #endif
jakowisp 0:98cf19bcd828 252 if(operationFlags->dataStage==1) {
jakowisp 0:98cf19bcd828 253 if(operationFlags->txOperation==0) {
jakowisp 0:98cf19bcd828 254 do {
jakowisp 0:98cf19bcd828 255 transferResult = host->bulkRead(pointerToDevice, bulk_in, buffer, 1024);
jakowisp 0:98cf19bcd828 256 #ifdef USDBPTPDEBUG
jakowisp 0:98cf19bcd828 257 printf("Data stage bulkRead result: %d\r\n",transferResult);
jakowisp 0:98cf19bcd828 258 #endif
jakowisp 0:98cf19bcd828 259 if ( checkResult(transferResult, bulk_in))
jakowisp 1:71c0e9dc153d 260 return PIMA_RETURN_CODE_IncompleteTransfer;
jakowisp 0:98cf19bcd828 261 bytesReceived = bulk_in->getLengthTransferred();
jakowisp 0:98cf19bcd828 262 if(firstDataBlockReceived==true) {
jakowisp 0:98cf19bcd828 263 pointerToUint8tData=(uint8_t *)&dataContainer;
jakowisp 1:71c0e9dc153d 264 for(i=0; i<PIMA_CONTAINER_HEADER_LENGTH; i++){
jakowisp 0:98cf19bcd828 265 pointerToUint8tData[i]=buffer[i];
jakowisp 0:98cf19bcd828 266 }
jakowisp 0:98cf19bcd828 267 #ifdef USDBPTPDEBUG
jakowisp 1:71c0e9dc153d 268 DumpBuffer(pointerToUint8tData,PIMA_CONTAINER_HEADER_LENGTH);
jakowisp 0:98cf19bcd828 269 #endif
jakowisp 0:98cf19bcd828 270 firstDataBlockReceived = false;
jakowisp 1:71c0e9dc153d 271 pointerToUint8tData = buffer + PIMA_CONTAINER_HEADER_LENGTH;
jakowisp 3:1fcb46ab18df 272 bytesRemaining = dataContainer.length - PIMA_CONTAINER_HEADER_LENGTH;
jakowisp 0:98cf19bcd828 273 this->totalDataToTransfer = bytesRemaining;
jakowisp 1:71c0e9dc153d 274 if(dataContainer.type==PIMA_CONTAINER_DATA)
jakowisp 1:71c0e9dc153d 275 bytesReceived -= PIMA_CONTAINER_HEADER_LENGTH;
jakowisp 0:98cf19bcd828 276 #ifdef USDBPTPDEBUG
jakowisp 0:98cf19bcd828 277 DumpBuffer(pointerToUint8tData,bytesReceived);
jakowisp 0:98cf19bcd828 278 #endif
jakowisp 0:98cf19bcd828 279 } else {
jakowisp 0:98cf19bcd828 280 pointerToUint8tData=buffer;
jakowisp 0:98cf19bcd828 281 }
jakowisp 0:98cf19bcd828 282
jakowisp 0:98cf19bcd828 283 if(bytesReceived<=bytesRemaining)
jakowisp 0:98cf19bcd828 284 dataToBeHandled=bytesReceived;
jakowisp 0:98cf19bcd828 285 else {
jakowisp 0:98cf19bcd828 286 dataToBeHandled=bytesRemaining;
jakowisp 0:98cf19bcd828 287 }
jakowisp 0:98cf19bcd828 288
jakowisp 0:98cf19bcd828 289 #ifdef USDBPTPDEBUG
jakowisp 0:98cf19bcd828 290 printf("Calling Datahandler\r\n");
jakowisp 0:98cf19bcd828 291 printf("DataToBeHandled: %ld\r\n",dataToBeHandled);
jakowisp 0:98cf19bcd828 292 #endif
jakowisp 0:98cf19bcd828 293 if( dataHandler1!=NULL && dataToBeHandled !=0 )
jakowisp 0:98cf19bcd828 294 (*dataHandler1)(this,pointerToUint8tData,dataToBeHandled);
jakowisp 0:98cf19bcd828 295
jakowisp 0:98cf19bcd828 296 #ifdef USDBPTPDEBUG
jakowisp 0:98cf19bcd828 297 DumpBuffer(buffer,bytesReceived);
jakowisp 0:98cf19bcd828 298 #endif
jakowisp 0:98cf19bcd828 299
jakowisp 0:98cf19bcd828 300 //IF the Response got appended to Data block
jakowisp 0:98cf19bcd828 301 if(bytesReceived<=bytesRemaining) {
jakowisp 0:98cf19bcd828 302 bytesRemaining-=bytesReceived;
jakowisp 0:98cf19bcd828 303 } else {
jakowisp 0:98cf19bcd828 304 #ifdef USDBPTPDEBUG
jakowisp 0:98cf19bcd828 305 printf("Handling Response Packet in data container\r\n");
jakowisp 0:98cf19bcd828 306 #endif
jakowisp 0:98cf19bcd828 307 if(bytesReceived-bytesRemaining==responseLength) {
jakowisp 0:98cf19bcd828 308 pointerToUint8tData=(uint8_t *)&responseContainer;
jakowisp 0:98cf19bcd828 309 for(i=0;i<responseLength;i++){
jakowisp 0:98cf19bcd828 310 pointerToUint8tData[i]=buffer[bytesRemaining+i];
jakowisp 0:98cf19bcd828 311 }
jakowisp 0:98cf19bcd828 312
jakowisp 3:1fcb46ab18df 313 return responseContainer.code;
jakowisp 0:98cf19bcd828 314 } else {
jakowisp 0:98cf19bcd828 315
jakowisp 1:71c0e9dc153d 316 return PIMA_RETURN_CODE_IncompleteTransfer;
jakowisp 0:98cf19bcd828 317 }
jakowisp 0:98cf19bcd828 318 }
jakowisp 0:98cf19bcd828 319 this->dataLeftToTransfer = bytesRemaining;
jakowisp 0:98cf19bcd828 320 #ifdef USDBPTPDEBUG
jakowisp 0:98cf19bcd828 321 printf("Loopcheck: %ld\r\n",bytesRemaining);
jakowisp 0:98cf19bcd828 322 #endif
jakowisp 0:98cf19bcd828 323 } while( bytesRemaining>0 );
jakowisp 0:98cf19bcd828 324 } else {
jakowisp 0:98cf19bcd828 325 printf("DataOut not coded\r\n");
jakowisp 0:98cf19bcd828 326 }
jakowisp 0:98cf19bcd828 327 }
jakowisp 0:98cf19bcd828 328 transferResult = host->bulkRead(pointerToDevice, bulk_in,(uint8_t *)&responseContainer, sizeof(responseContainer));
jakowisp 0:98cf19bcd828 329 if (checkResult(transferResult, bulk_in))
jakowisp 1:71c0e9dc153d 330 return PIMA_RETURN_CODE_IncompleteTransfer;
jakowisp 0:98cf19bcd828 331 #ifdef USDBPTPDEBUG
jakowisp 0:98cf19bcd828 332 printf("Response bulkRead result: %d\r\n",transferResult);
jakowisp 0:98cf19bcd828 333 printf("PTPResponseContainer:\r\n");
jakowisp 0:98cf19bcd828 334 DumpBuffer((uint8_t *)&responseContainer,responseContainer.len);
jakowisp 1:71c0e9dc153d 335 if(responseContainer.opcode==PIMA_RETURN_CODE_OK) {
jakowisp 1:71c0e9dc153d 336 printf("PIMA_RETURN_CODE_OK\r\n");
jakowisp 0:98cf19bcd828 337 } else {
jakowisp 0:98cf19bcd828 338 printf("Response Length: %x\r\n",responseContainer.len);
jakowisp 0:98cf19bcd828 339 printf("Response type: %x\r\n",responseContainer.type);
jakowisp 0:98cf19bcd828 340 printf("Response code: %x\r\n",responseContainer.opcode);
jakowisp 0:98cf19bcd828 341 printf("Response ID: %d\r\n",responseContainer.TransactionID);
jakowisp 0:98cf19bcd828 342 }
jakowisp 0:98cf19bcd828 343 #endif
jakowisp 0:98cf19bcd828 344
jakowisp 3:1fcb46ab18df 345 return responseContainer.code;
jakowisp 0:98cf19bcd828 346 }
jakowisp 0:98cf19bcd828 347
jakowisp 0:98cf19bcd828 348
jakowisp 0:98cf19bcd828 349
jakowisp 0:98cf19bcd828 350
jakowisp 0:98cf19bcd828 351
jakowisp 0:98cf19bcd828 352 uint16_t USBHostPTP::Operation(uint16_t opcode, uint8_t nparams, uint32_t *params){
jakowisp 0:98cf19bcd828 353 OperFlags flags = {0,0,0,0,0,0};
jakowisp 0:98cf19bcd828 354 flags.opParams = nparams;
jakowisp 0:98cf19bcd828 355
jakowisp 0:98cf19bcd828 356 return Transaction(opcode,&flags,params);
jakowisp 0:98cf19bcd828 357 }
jakowisp 0:98cf19bcd828 358
jakowisp 0:98cf19bcd828 359 uint16_t USBHostPTP::OpenSession(void) {
jakowisp 0:98cf19bcd828 360 OperFlags flags = {1,0,0,0,0,0};
jakowisp 0:98cf19bcd828 361
jakowisp 1:71c0e9dc153d 362 return Transaction(PIMA_OPERATION_CODE_OpenSession,&flags,&sessionID);
jakowisp 0:98cf19bcd828 363 }
jakowisp 0:98cf19bcd828 364
jakowisp 0:98cf19bcd828 365 uint16_t USBHostPTP::CloseSession(void) {
jakowisp 0:98cf19bcd828 366 OperFlags flags = {1,0,0,0,0,0};
jakowisp 0:98cf19bcd828 367
jakowisp 1:71c0e9dc153d 368 return Transaction(PIMA_OPERATION_CODE_CloseSession,&flags,&sessionID);
jakowisp 0:98cf19bcd828 369 }
jakowisp 0:98cf19bcd828 370
jakowisp 0:98cf19bcd828 371 uint16_t USBHostPTP::GetDeviceInfo(void)
jakowisp 0:98cf19bcd828 372 {
jakowisp 0:98cf19bcd828 373 OperFlags flags = { 0, 0, 0, 1, 1, 0 };
jakowisp 1:71c0e9dc153d 374 return Transaction(PIMA_OPERATION_CODE_GetDeviceInfo, &flags,NULL,(void*)&USBHostPTP::ParseDeviceInfoDataBlock);
jakowisp 0:98cf19bcd828 375 }
jakowisp 0:98cf19bcd828 376
jakowisp 0:98cf19bcd828 377
jakowisp 0:98cf19bcd828 378 uint16_t USBHostPTP::PowerDown()
jakowisp 0:98cf19bcd828 379 {
jakowisp 0:98cf19bcd828 380 OperFlags flags = { 0, 0, 0, 0, 0, 0 };
jakowisp 1:71c0e9dc153d 381 return Transaction(PIMA_OPERATION_CODE_PowerDown, &flags);
jakowisp 0:98cf19bcd828 382 }
jakowisp 0:98cf19bcd828 383
jakowisp 0:98cf19bcd828 384 uint16_t USBHostPTP::SelfTest(uint16_t type)
jakowisp 0:98cf19bcd828 385 {
jakowisp 0:98cf19bcd828 386 OperFlags flags = { 1, 0, 0, 0, 0, 0 };
jakowisp 0:98cf19bcd828 387 uint32_t params[1];
jakowisp 0:98cf19bcd828 388 params[0] = type;
jakowisp 0:98cf19bcd828 389
jakowisp 1:71c0e9dc153d 390 return Transaction(PIMA_OPERATION_CODE_SelfTest, &flags, params);
jakowisp 0:98cf19bcd828 391 }
jakowisp 0:98cf19bcd828 392
jakowisp 0:98cf19bcd828 393 uint16_t USBHostPTP::GetObjectHandles(uint32_t storage_id, uint16_t format, uint16_t assoc, void *parser)
jakowisp 0:98cf19bcd828 394 {
jakowisp 0:98cf19bcd828 395 OperFlags flags = { 3, 0, 0, 1, 1, 0 };
jakowisp 0:98cf19bcd828 396 uint32_t params[3];
jakowisp 0:98cf19bcd828 397
jakowisp 0:98cf19bcd828 398 params[0] = storage_id;
jakowisp 0:98cf19bcd828 399 params[1] = (uint32_t)format;
jakowisp 0:98cf19bcd828 400 params[2] = (uint32_t)assoc;
jakowisp 0:98cf19bcd828 401
jakowisp 1:71c0e9dc153d 402 return Transaction(PIMA_OPERATION_CODE_GetObjectHandles, &flags, params, parser);
jakowisp 0:98cf19bcd828 403 }
jakowisp 0:98cf19bcd828 404
jakowisp 0:98cf19bcd828 405 uint16_t USBHostPTP::GetNumObjects(uint32_t *retval, uint32_t storage_id, uint16_t format, uint32_t assoc)
jakowisp 0:98cf19bcd828 406 {
jakowisp 1:71c0e9dc153d 407 uint16_t ptp_error = PIMA_RETURN_CODE_GeneralError;
jakowisp 0:98cf19bcd828 408 OperFlags flags = { 3, 1, 0, 0, 0, 0 };
jakowisp 0:98cf19bcd828 409 uint32_t params[3];
jakowisp 0:98cf19bcd828 410
jakowisp 0:98cf19bcd828 411 params[0] = storage_id;
jakowisp 0:98cf19bcd828 412 params[1] = (uint32_t)format;
jakowisp 0:98cf19bcd828 413 params[2] = (uint32_t)assoc;
jakowisp 0:98cf19bcd828 414
jakowisp 1:71c0e9dc153d 415 if ( (ptp_error = Transaction(PIMA_OPERATION_CODE_GetNumObjects, &flags, params)) == PIMA_RETURN_CODE_OK)
jakowisp 3:1fcb46ab18df 416 *retval = responseContainer.payload[0];
jakowisp 0:98cf19bcd828 417
jakowisp 0:98cf19bcd828 418 return ptp_error;
jakowisp 0:98cf19bcd828 419 }
jakowisp 0:98cf19bcd828 420
jakowisp 0:98cf19bcd828 421 uint16_t USBHostPTP::GetObjectInfo(uint32_t handle)
jakowisp 0:98cf19bcd828 422 {
jakowisp 0:98cf19bcd828 423 OperFlags flags = { 1, 0, 0, 1, 1, 0 };
jakowisp 0:98cf19bcd828 424 uint32_t params[1];
jakowisp 0:98cf19bcd828 425 params[0] = handle;
jakowisp 0:98cf19bcd828 426
jakowisp 0:98cf19bcd828 427 //Clear any previous data, incase a Reponse packet is returned instead of a data packet
jakowisp 0:98cf19bcd828 428 memset((uint8_t *)&objectInfo,0,0x34);
jakowisp 0:98cf19bcd828 429
jakowisp 1:71c0e9dc153d 430 return Transaction(PIMA_OPERATION_CODE_GetObjectInfo, &flags, params, (void*)&USBHostPTP::ParseObjectInfoDataBlock);
jakowisp 0:98cf19bcd828 431 }
jakowisp 0:98cf19bcd828 432
jakowisp 0:98cf19bcd828 433 uint16_t USBHostPTP::GetThumb(uint32_t handle, void *parser)
jakowisp 0:98cf19bcd828 434 {
jakowisp 0:98cf19bcd828 435 OperFlags flags = { 1, 0, 0, 1, 1, 0 };
jakowisp 0:98cf19bcd828 436 uint32_t params[1];
jakowisp 0:98cf19bcd828 437
jakowisp 0:98cf19bcd828 438 params[0] = handle;
jakowisp 0:98cf19bcd828 439
jakowisp 1:71c0e9dc153d 440 return Transaction(PIMA_OPERATION_CODE_GetThumb, &flags, params, parser);
jakowisp 0:98cf19bcd828 441 }
jakowisp 0:98cf19bcd828 442
jakowisp 0:98cf19bcd828 443
jakowisp 0:98cf19bcd828 444 uint16_t USBHostPTP::GetObject(uint32_t handle, void *parser)
jakowisp 0:98cf19bcd828 445 {
jakowisp 0:98cf19bcd828 446 OperFlags flags = { 1, 0, 0, 1, 1, 0 };
jakowisp 0:98cf19bcd828 447 uint32_t params[1];
jakowisp 0:98cf19bcd828 448
jakowisp 0:98cf19bcd828 449 params[0] = handle;
jakowisp 0:98cf19bcd828 450
jakowisp 1:71c0e9dc153d 451 return Transaction(PIMA_OPERATION_CODE_GetObject, &flags, params, parser);
jakowisp 0:98cf19bcd828 452 }
jakowisp 0:98cf19bcd828 453
jakowisp 0:98cf19bcd828 454 uint16_t USBHostPTP::GetStorageIDs(void *parser)
jakowisp 0:98cf19bcd828 455 {
jakowisp 0:98cf19bcd828 456 OperFlags flags = { 0, 0, 0, 1, 1, 0 };
jakowisp 1:71c0e9dc153d 457 return Transaction(PIMA_OPERATION_CODE_GetStorageIDs, &flags, NULL, parser);
jakowisp 0:98cf19bcd828 458 }
jakowisp 0:98cf19bcd828 459
jakowisp 0:98cf19bcd828 460 uint16_t USBHostPTP::GetStorageInfo(uint32_t storage_id, void *parser)
jakowisp 0:98cf19bcd828 461 {
jakowisp 0:98cf19bcd828 462 OperFlags flags = { 1, 0, 0, 1, 1, 0 };
jakowisp 0:98cf19bcd828 463
jakowisp 0:98cf19bcd828 464 uint32_t params[1];
jakowisp 0:98cf19bcd828 465 params[0] = storage_id;
jakowisp 0:98cf19bcd828 466
jakowisp 1:71c0e9dc153d 467 return Transaction(PIMA_OPERATION_CODE_GetStorageInfo, &flags, params, parser);
jakowisp 0:98cf19bcd828 468 }
jakowisp 0:98cf19bcd828 469
jakowisp 0:98cf19bcd828 470 uint16_t USBHostPTP::CopyObject(uint32_t handle, uint32_t storage_id, uint32_t parent, uint32_t *new_handle)
jakowisp 0:98cf19bcd828 471 {
jakowisp 1:71c0e9dc153d 472 uint16_t ptp_error = PIMA_RETURN_CODE_GeneralError;
jakowisp 0:98cf19bcd828 473 OperFlags flags = { 3, 1, 0, 0, 0, 0 };
jakowisp 0:98cf19bcd828 474 uint32_t params[3];
jakowisp 0:98cf19bcd828 475
jakowisp 0:98cf19bcd828 476 params[0] = handle;
jakowisp 0:98cf19bcd828 477 params[1] = storage_id;
jakowisp 0:98cf19bcd828 478 params[2] = parent;
jakowisp 0:98cf19bcd828 479
jakowisp 1:71c0e9dc153d 480 if ( (ptp_error = Transaction(PIMA_OPERATION_CODE_CopyObject, &flags, params)) == PIMA_RETURN_CODE_OK)
jakowisp 3:1fcb46ab18df 481 *new_handle = responseContainer.payload[0];
jakowisp 0:98cf19bcd828 482
jakowisp 0:98cf19bcd828 483 return ptp_error;
jakowisp 0:98cf19bcd828 484 }
jakowisp 0:98cf19bcd828 485
jakowisp 0:98cf19bcd828 486
jakowisp 0:98cf19bcd828 487 uint16_t USBHostPTP::DeleteObject(uint32_t handle, uint16_t format)
jakowisp 0:98cf19bcd828 488 {
jakowisp 0:98cf19bcd828 489 OperFlags flags = { 2, 0, 0, 0, 0, 0 };
jakowisp 0:98cf19bcd828 490 uint32_t params[2];
jakowisp 0:98cf19bcd828 491
jakowisp 0:98cf19bcd828 492 params[0] = handle;
jakowisp 0:98cf19bcd828 493 params[1] = (uint32_t)format;
jakowisp 0:98cf19bcd828 494
jakowisp 1:71c0e9dc153d 495 return Transaction(PIMA_OPERATION_CODE_DeleteObject, &flags, params);
jakowisp 0:98cf19bcd828 496 }
jakowisp 0:98cf19bcd828 497
jakowisp 0:98cf19bcd828 498
jakowisp 0:98cf19bcd828 499 uint16_t USBHostPTP::SetObjectProtection(uint32_t handle, uint16_t attrib)
jakowisp 0:98cf19bcd828 500 {
jakowisp 0:98cf19bcd828 501 OperFlags flags = { 2, 0, 0, 0, 0, 0 };
jakowisp 0:98cf19bcd828 502 uint32_t params[2];
jakowisp 0:98cf19bcd828 503
jakowisp 0:98cf19bcd828 504 params[0] = handle;
jakowisp 0:98cf19bcd828 505 params[1] = (uint32_t)attrib;
jakowisp 0:98cf19bcd828 506
jakowisp 1:71c0e9dc153d 507 return Transaction(PIMA_OPERATION_CODE_SetObjectProtection, &flags, params);
jakowisp 0:98cf19bcd828 508 }
jakowisp 0:98cf19bcd828 509
jakowisp 0:98cf19bcd828 510
jakowisp 0:98cf19bcd828 511 uint16_t USBHostPTP::MoveObject(uint32_t handle, uint32_t storage_id, uint32_t parent)
jakowisp 0:98cf19bcd828 512 {
jakowisp 0:98cf19bcd828 513 OperFlags flags = { 3, 0, 0, 0, 0, 0 };
jakowisp 0:98cf19bcd828 514 uint32_t params[3];
jakowisp 0:98cf19bcd828 515
jakowisp 0:98cf19bcd828 516 params[0] = handle;
jakowisp 0:98cf19bcd828 517 params[1] = storage_id;
jakowisp 0:98cf19bcd828 518 params[2] = parent;
jakowisp 0:98cf19bcd828 519
jakowisp 1:71c0e9dc153d 520 return Transaction(PIMA_OPERATION_CODE_MoveObject, &flags, params);
jakowisp 0:98cf19bcd828 521 }
jakowisp 0:98cf19bcd828 522
jakowisp 0:98cf19bcd828 523
jakowisp 0:98cf19bcd828 524 uint16_t USBHostPTP::GetDevicePropDesc(const uint16_t pcode, void *parser)
jakowisp 0:98cf19bcd828 525 {
jakowisp 0:98cf19bcd828 526 OperFlags flags = { 1, 0, 0, 1, 1, 0 };
jakowisp 0:98cf19bcd828 527 uint32_t params[1];
jakowisp 0:98cf19bcd828 528
jakowisp 0:98cf19bcd828 529 params[0] = (uint32_t)pcode;
jakowisp 0:98cf19bcd828 530
jakowisp 0:98cf19bcd828 531 if(IsPropertySupported(pcode)==false)
jakowisp 1:71c0e9dc153d 532 return PIMA_RETURN_CODE_DevicePropertyNotSupported;
jakowisp 0:98cf19bcd828 533
jakowisp 1:71c0e9dc153d 534 return Transaction(PIMA_OPERATION_CODE_GetDevicePropDesc, &flags, params, parser);
jakowisp 0:98cf19bcd828 535 }
jakowisp 0:98cf19bcd828 536
jakowisp 0:98cf19bcd828 537
jakowisp 0:98cf19bcd828 538 uint16_t USBHostPTP::GetDevicePropValue(const uint16_t pcode, void *parser)
jakowisp 0:98cf19bcd828 539 {
jakowisp 0:98cf19bcd828 540 OperFlags flags = { 1, 0, 0, 1, 1, 0 };
jakowisp 0:98cf19bcd828 541 uint32_t params[1];
jakowisp 0:98cf19bcd828 542
jakowisp 0:98cf19bcd828 543 params[0] = (uint32_t)pcode;
jakowisp 0:98cf19bcd828 544 if(IsPropertySupported(pcode)==false)
jakowisp 1:71c0e9dc153d 545 return PIMA_RETURN_CODE_DevicePropertyNotSupported;
jakowisp 0:98cf19bcd828 546
jakowisp 1:71c0e9dc153d 547 return Transaction(PIMA_OPERATION_CODE_GetDevicePropValue, &flags, params, parser);
jakowisp 0:98cf19bcd828 548 }
jakowisp 0:98cf19bcd828 549
jakowisp 0:98cf19bcd828 550
jakowisp 0:98cf19bcd828 551 uint16_t USBHostPTP::SetDevicePropValue(uint16_t pcode, uint32_t val)
jakowisp 0:98cf19bcd828 552 {
jakowisp 0:98cf19bcd828 553 OperFlags flags = { 1, 0, 1, 1, 3, 4 };
jakowisp 0:98cf19bcd828 554 uint32_t params[1];
jakowisp 0:98cf19bcd828 555 uint32_t value;
jakowisp 0:98cf19bcd828 556
jakowisp 0:98cf19bcd828 557 params[0] = (uint32_t)pcode;
jakowisp 0:98cf19bcd828 558 value = val;
jakowisp 0:98cf19bcd828 559
jakowisp 0:98cf19bcd828 560 if(IsPropertySupported(pcode)==false)
jakowisp 1:71c0e9dc153d 561 return PIMA_RETURN_CODE_DevicePropertyNotSupported;
jakowisp 0:98cf19bcd828 562
jakowisp 1:71c0e9dc153d 563 return Transaction(PIMA_OPERATION_CODE_SetDevicePropValue, &flags, params, (void*)&value);
jakowisp 0:98cf19bcd828 564 }
jakowisp 0:98cf19bcd828 565
jakowisp 0:98cf19bcd828 566
jakowisp 0:98cf19bcd828 567 uint16_t USBHostPTP::ResetDevicePropValue(const uint16_t pcode)
jakowisp 0:98cf19bcd828 568 {
jakowisp 0:98cf19bcd828 569 OperFlags flags = { 1, 0, 0, 0 };
jakowisp 0:98cf19bcd828 570 uint32_t params[1];
jakowisp 0:98cf19bcd828 571
jakowisp 0:98cf19bcd828 572 params[0] = (uint32_t)pcode;
jakowisp 0:98cf19bcd828 573
jakowisp 0:98cf19bcd828 574 if(IsPropertySupported(pcode)==false)
jakowisp 1:71c0e9dc153d 575 return PIMA_RETURN_CODE_DevicePropertyNotSupported;
jakowisp 0:98cf19bcd828 576
jakowisp 1:71c0e9dc153d 577 return Transaction(PIMA_OPERATION_CODE_ResetDevicePropValue, &flags, params);
jakowisp 0:98cf19bcd828 578 }
jakowisp 0:98cf19bcd828 579
jakowisp 0:98cf19bcd828 580
jakowisp 0:98cf19bcd828 581 uint16_t USBHostPTP::FormatStore(uint32_t storage_id, uint32_t fsformat)
jakowisp 0:98cf19bcd828 582 {
jakowisp 0:98cf19bcd828 583 OperFlags flags = { 2, 0, 0, 0, 0, 0 };
jakowisp 0:98cf19bcd828 584
jakowisp 0:98cf19bcd828 585 uint32_t params[2];
jakowisp 0:98cf19bcd828 586 params[0] = storage_id;
jakowisp 0:98cf19bcd828 587 params[1] = fsformat;
jakowisp 0:98cf19bcd828 588
jakowisp 1:71c0e9dc153d 589 return Transaction(PIMA_OPERATION_CODE_FormatStore, &flags, params);
jakowisp 0:98cf19bcd828 590 }
jakowisp 0:98cf19bcd828 591
jakowisp 0:98cf19bcd828 592 uint16_t USBHostPTP::InitiateCapture(uint32_t storage_id, uint16_t format)
jakowisp 0:98cf19bcd828 593 {
jakowisp 1:71c0e9dc153d 594 uint16_t ptp_error = PIMA_RETURN_CODE_GeneralError;
jakowisp 0:98cf19bcd828 595 OperFlags flags = { 2, 0, 0, 0, 0, 0 };
jakowisp 0:98cf19bcd828 596 uint32_t params[2];
jakowisp 0:98cf19bcd828 597
jakowisp 0:98cf19bcd828 598 params[0] = storage_id;
jakowisp 0:98cf19bcd828 599 params[1] = (uint32_t)format;
jakowisp 0:98cf19bcd828 600
jakowisp 1:71c0e9dc153d 601 if ( (ptp_error = Transaction(PIMA_OPERATION_CODE_InitiateCapture, &flags, params)) == PIMA_RETURN_CODE_OK){
jakowisp 0:98cf19bcd828 602 }
jakowisp 0:98cf19bcd828 603
jakowisp 0:98cf19bcd828 604 return ptp_error;
jakowisp 0:98cf19bcd828 605 }
jakowisp 0:98cf19bcd828 606
jakowisp 0:98cf19bcd828 607 uint16_t USBHostPTP::InitiateOpenCapture(uint32_t storage_id, uint16_t format)
jakowisp 0:98cf19bcd828 608 {
jakowisp 1:71c0e9dc153d 609 uint16_t ptp_error = PIMA_RETURN_CODE_GeneralError;
jakowisp 0:98cf19bcd828 610 OperFlags flags = { 2, 0, 0, 0, 0, 0 };
jakowisp 0:98cf19bcd828 611 uint32_t params[2];
jakowisp 0:98cf19bcd828 612
jakowisp 0:98cf19bcd828 613 params[0] = storage_id;
jakowisp 0:98cf19bcd828 614 params[1] = (uint32_t)format;
jakowisp 0:98cf19bcd828 615
jakowisp 1:71c0e9dc153d 616 if ( (ptp_error = Transaction(PIMA_OPERATION_CODE_InitiateOpenCapture, &flags, params)) == PIMA_RETURN_CODE_OK){
jakowisp 0:98cf19bcd828 617 }
jakowisp 0:98cf19bcd828 618
jakowisp 0:98cf19bcd828 619 return ptp_error;
jakowisp 0:98cf19bcd828 620 }
jakowisp 0:98cf19bcd828 621
jakowisp 0:98cf19bcd828 622 uint16_t USBHostPTP::TerminateOpenCapture(uint32_t trans_id)
jakowisp 0:98cf19bcd828 623 {
jakowisp 0:98cf19bcd828 624 OperFlags flags = { 1, 0, 0, 0, 0, 0 };
jakowisp 0:98cf19bcd828 625 uint32_t params[1];
jakowisp 0:98cf19bcd828 626
jakowisp 0:98cf19bcd828 627 params[0] = trans_id;
jakowisp 0:98cf19bcd828 628
jakowisp 1:71c0e9dc153d 629 return Transaction(PIMA_OPERATION_CODE_TerminateOpenCapture, &flags, params);
jakowisp 0:98cf19bcd828 630 }
jakowisp 0:98cf19bcd828 631
jakowisp 0:98cf19bcd828 632
jakowisp 0:98cf19bcd828 633
jakowisp 0:98cf19bcd828 634 void USBHostPTP::ParseDeviceInfoDataBlock(void *ptp,uint8_t *buffer,uint16_t length){
jakowisp 0:98cf19bcd828 635 uint8_t *currentPtr;
jakowisp 0:98cf19bcd828 636 USBHostPTP *dev=(USBHostPTP *)ptp;
jakowisp 0:98cf19bcd828 637
jakowisp 0:98cf19bcd828 638 currentPtr=buffer;
jakowisp 0:98cf19bcd828 639 dev->deviceInfo.standardVersion=*((uint16_t *)currentPtr);
jakowisp 0:98cf19bcd828 640 currentPtr+=2;
jakowisp 0:98cf19bcd828 641 dev->deviceInfo.vendorExtensionID=*((uint32_t *)currentPtr);
jakowisp 0:98cf19bcd828 642 currentPtr+=4;
jakowisp 0:98cf19bcd828 643 dev->deviceInfo.vendorExtensionVersion=*((uint16_t *)currentPtr);
jakowisp 0:98cf19bcd828 644 currentPtr+=2;
jakowisp 0:98cf19bcd828 645
jakowisp 0:98cf19bcd828 646 currentPtr+=dev->deviceInfo.vendorExtensionDesc.FillString(currentPtr);
jakowisp 0:98cf19bcd828 647
jakowisp 0:98cf19bcd828 648 dev->deviceInfo.functionMode=*((uint16_t *)currentPtr);
jakowisp 0:98cf19bcd828 649 currentPtr+=2;
jakowisp 0:98cf19bcd828 650
jakowisp 0:98cf19bcd828 651 currentPtr+=dev->deviceInfo.operationsSupported.FillArray(currentPtr);
jakowisp 0:98cf19bcd828 652 currentPtr+=dev->deviceInfo.eventsSupported.FillArray(currentPtr);
jakowisp 0:98cf19bcd828 653 currentPtr+=dev->deviceInfo.devicePropertiesSupported.FillArray(currentPtr);
jakowisp 0:98cf19bcd828 654 currentPtr+=dev->deviceInfo.captureFormats.FillArray(currentPtr);
jakowisp 0:98cf19bcd828 655 currentPtr+=dev->deviceInfo.imageFormats.FillArray(currentPtr);
jakowisp 0:98cf19bcd828 656
jakowisp 0:98cf19bcd828 657 currentPtr+=dev->deviceInfo.manufacturer.FillString(currentPtr);
jakowisp 0:98cf19bcd828 658 currentPtr+=dev->deviceInfo.model.FillString(currentPtr);
jakowisp 0:98cf19bcd828 659 currentPtr+=dev->deviceInfo.deviceVersion.FillString(currentPtr);
jakowisp 0:98cf19bcd828 660 currentPtr+=dev->deviceInfo.serialNumber.FillString(currentPtr);
jakowisp 0:98cf19bcd828 661
jakowisp 0:98cf19bcd828 662 }
jakowisp 0:98cf19bcd828 663
jakowisp 0:98cf19bcd828 664 void USBHostPTP::ParseObjectInfoDataBlock(void *ptp,uint8_t *buffer,uint16_t length){
jakowisp 0:98cf19bcd828 665 uint8_t *ptr,*structptr;
jakowisp 0:98cf19bcd828 666 USBHostPTP *obj=(USBHostPTP *)ptp;
jakowisp 0:98cf19bcd828 667
jakowisp 0:98cf19bcd828 668 structptr=(uint8_t *) &(obj->objectInfo);
jakowisp 0:98cf19bcd828 669 ptr=buffer;
jakowisp 0:98cf19bcd828 670 for(int i=0;i<0x34;i++)
jakowisp 0:98cf19bcd828 671 structptr[i]=ptr[i];
jakowisp 0:98cf19bcd828 672 ptr+=0x34;
jakowisp 0:98cf19bcd828 673 ptr+=obj->objectInfo.filename.FillString(ptr);
jakowisp 0:98cf19bcd828 674 ptr+=obj->objectInfo.captureDate.FillString(ptr);
jakowisp 0:98cf19bcd828 675 ptr+=obj->objectInfo.modificationDate.FillString(ptr);
jakowisp 0:98cf19bcd828 676 ptr+=obj->objectInfo.keywords.FillString(ptr);
jakowisp 0:98cf19bcd828 677 #ifdef USDBPTPDEBUG
jakowisp 0:98cf19bcd828 678 obj->DumpObjectInfo();
jakowisp 0:98cf19bcd828 679 #endif
jakowisp 0:98cf19bcd828 680 }
jakowisp 0:98cf19bcd828 681
jakowisp 0:98cf19bcd828 682
jakowisp 0:98cf19bcd828 683 bool USBHostPTP::IsCommandSupported(uint16_t opcode){
jakowisp 0:98cf19bcd828 684 bool res=false;
jakowisp 0:98cf19bcd828 685
jakowisp 1:71c0e9dc153d 686 if(opcode==PIMA_OPERATION_CODE_OpenSession || opcode==PIMA_OPERATION_CODE_GetDeviceInfo)
jakowisp 0:98cf19bcd828 687 res=true;
jakowisp 0:98cf19bcd828 688 else
jakowisp 0:98cf19bcd828 689 res = CheckValueInArray(&deviceInfo.operationsSupported,opcode);
jakowisp 0:98cf19bcd828 690 return res;
jakowisp 0:98cf19bcd828 691 }
jakowisp 0:98cf19bcd828 692
jakowisp 0:98cf19bcd828 693 bool USBHostPTP::IsPropertySupported(uint16_t code){
jakowisp 0:98cf19bcd828 694
jakowisp 0:98cf19bcd828 695 return CheckValueInArray(&deviceInfo.devicePropertiesSupported, code);
jakowisp 0:98cf19bcd828 696
jakowisp 0:98cf19bcd828 697 }
jakowisp 0:98cf19bcd828 698
jakowisp 0:98cf19bcd828 699 bool USBHostPTP::CheckValueInArray(PIMAArray *array, uint16_t code) {
jakowisp 0:98cf19bcd828 700 bool res=false;
jakowisp 0:98cf19bcd828 701 for(int i=0; i<array->numberOfElements;i++)
jakowisp 0:98cf19bcd828 702 if(code == array->codes[i])
jakowisp 0:98cf19bcd828 703 res=true;
jakowisp 0:98cf19bcd828 704 return res;
jakowisp 0:98cf19bcd828 705 }
jakowisp 0:98cf19bcd828 706
jakowisp 0:98cf19bcd828 707
jakowisp 0:98cf19bcd828 708 void USBHostPTP::DumpBuffer(uint8_t *buffer,uint32_t length){
jakowisp 0:98cf19bcd828 709 for(int i=0;i<length;i++) {
jakowisp 0:98cf19bcd828 710 printf("%02x ",buffer[i]);
jakowisp 0:98cf19bcd828 711 if(i % 16 == 15 )
jakowisp 0:98cf19bcd828 712 printf("\r\n");
jakowisp 0:98cf19bcd828 713 }
jakowisp 0:98cf19bcd828 714 printf("\r\n");
jakowisp 0:98cf19bcd828 715 }
jakowisp 0:98cf19bcd828 716
jakowisp 0:98cf19bcd828 717
jakowisp 0:98cf19bcd828 718 void USBHostPTP::DumpDeviceInfo(){
jakowisp 0:98cf19bcd828 719 int i;
jakowisp 0:98cf19bcd828 720
jakowisp 0:98cf19bcd828 721 printf("PIMA standard version: %x\r\n",deviceInfo.standardVersion);
jakowisp 0:98cf19bcd828 722 printf("Vendor Extension ID: %x\r\n",deviceInfo.vendorExtensionID);
jakowisp 0:98cf19bcd828 723 printf("Vendor Extension Version: %x\r\n",deviceInfo.vendorExtensionVersion);
jakowisp 0:98cf19bcd828 724 printf("Vendor Extension Description: \r\n");
jakowisp 0:98cf19bcd828 725 printf("%s\r\n",(deviceInfo.vendorExtensionDesc.getString()));
jakowisp 0:98cf19bcd828 726 printf("Functional Mode: %x\r\n",deviceInfo.functionMode);
jakowisp 0:98cf19bcd828 727 printf("Supported Operations: \r\n");
jakowisp 0:98cf19bcd828 728 for(i=0;i<deviceInfo.operationsSupported.numberOfElements;i++) {
jakowisp 0:98cf19bcd828 729 printf("0x%04x\r\n",deviceInfo.operationsSupported.codes[i]);
jakowisp 0:98cf19bcd828 730 }
jakowisp 0:98cf19bcd828 731 printf("Supported Events: \r\n");
jakowisp 0:98cf19bcd828 732 for(i=0;i<deviceInfo.eventsSupported.numberOfElements;i++) {
jakowisp 0:98cf19bcd828 733 printf("0x%04x\r\n",deviceInfo.eventsSupported.codes[i]);
jakowisp 0:98cf19bcd828 734 }
jakowisp 0:98cf19bcd828 735 printf("Supported Device Properties: \r\n");
jakowisp 0:98cf19bcd828 736 for(i=0;i<deviceInfo.devicePropertiesSupported.numberOfElements;i++) {
jakowisp 0:98cf19bcd828 737 printf("0x%04x\r\n",deviceInfo.devicePropertiesSupported.codes[i]);
jakowisp 0:98cf19bcd828 738 }
jakowisp 0:98cf19bcd828 739 printf("Supported Capture Formats: \r\n");
jakowisp 0:98cf19bcd828 740 for(i=0;i<deviceInfo.captureFormats.numberOfElements;i++) {
jakowisp 0:98cf19bcd828 741 printf("0x%04x\r\n",deviceInfo.captureFormats.codes[i]);
jakowisp 0:98cf19bcd828 742 }
jakowisp 0:98cf19bcd828 743 printf("Supported Image Formats: \r\n");
jakowisp 0:98cf19bcd828 744 for(i=0;i<deviceInfo.imageFormats.numberOfElements;i++) {
jakowisp 0:98cf19bcd828 745 printf("0x%04x\r\n",deviceInfo.imageFormats.codes[i]);
jakowisp 0:98cf19bcd828 746 }
jakowisp 0:98cf19bcd828 747
jakowisp 0:98cf19bcd828 748 printf("Manufacturer: \r\n");
jakowisp 0:98cf19bcd828 749 printf("%s\r\n",deviceInfo.manufacturer.getString());
jakowisp 0:98cf19bcd828 750 printf("Model: \r\n");
jakowisp 0:98cf19bcd828 751 printf("%s\r\n",deviceInfo.model.getString());
jakowisp 0:98cf19bcd828 752 printf("Device Version: \r\n");
jakowisp 0:98cf19bcd828 753 printf("%s\r\n",deviceInfo.deviceVersion.getString());
jakowisp 0:98cf19bcd828 754 printf("Serial Number: \r\n");
jakowisp 0:98cf19bcd828 755 printf("%s\r\n",deviceInfo.serialNumber.getString());
jakowisp 0:98cf19bcd828 756
jakowisp 0:98cf19bcd828 757 }
jakowisp 0:98cf19bcd828 758
jakowisp 0:98cf19bcd828 759 void USBHostPTP::DumpObjectInfo(){
jakowisp 0:98cf19bcd828 760
jakowisp 0:98cf19bcd828 761
jakowisp 0:98cf19bcd828 762 printf("-----------------------ObjectInfo--------------\r\n");
jakowisp 0:98cf19bcd828 763 printf("Storage ID: %08x\r\n",objectInfo.storageID);
jakowisp 0:98cf19bcd828 764 printf("Object Format: %04x\r\n",objectInfo.objectFormat);
jakowisp 0:98cf19bcd828 765 printf("Protection Status: %04x\r\n",objectInfo.protectionStatus);
jakowisp 0:98cf19bcd828 766 printf("Compressed Size: %ld\r\n",objectInfo.objectCompressSize);
jakowisp 0:98cf19bcd828 767 printf("Thumbnail format: %04x\r\n",objectInfo.thumbFormat);
jakowisp 0:98cf19bcd828 768 printf("Thumbnail Compressed size: %04x\r\n",objectInfo.thumbCompressedSize);
jakowisp 0:98cf19bcd828 769 printf("Thumbnail Width %ld\r\n",objectInfo.thumbPixWidth);
jakowisp 0:98cf19bcd828 770 printf("Thumbnail Height: %ld\r\n",objectInfo.thumbPixHeight);
jakowisp 0:98cf19bcd828 771 printf("Image Width: %ld\r\n",objectInfo.imagePixWidth);
jakowisp 0:98cf19bcd828 772 printf("Image Height: %ld\r\n",objectInfo.imagePixHeight);
jakowisp 0:98cf19bcd828 773 printf("Image BitDepth: %ld\r\n",objectInfo.imageBitDepth);
jakowisp 0:98cf19bcd828 774 printf("Parent Object: %04x\r\n",objectInfo.parentObject);
jakowisp 0:98cf19bcd828 775 printf("Assosiaction Type: %02x\r\n",objectInfo.associationType);
jakowisp 0:98cf19bcd828 776 printf("Assosiaction Description: %04x\r\n",objectInfo.associationDesc);
jakowisp 0:98cf19bcd828 777 printf("Sequence Number: %ld\r\n",objectInfo.sequenceNumber);
jakowisp 0:98cf19bcd828 778
jakowisp 0:98cf19bcd828 779 printf("Filename: \r\n");
jakowisp 0:98cf19bcd828 780 printf("%s\r\n",objectInfo.filename.getString());
jakowisp 0:98cf19bcd828 781 printf("Capture Date: \r\n");
jakowisp 0:98cf19bcd828 782 printf("%s\r\n",objectInfo.captureDate.getString());
jakowisp 0:98cf19bcd828 783 printf("Modification Date: \r\n");
jakowisp 0:98cf19bcd828 784 printf("%s\r\n",objectInfo.modificationDate.getString());
jakowisp 0:98cf19bcd828 785 printf("Keywords: \r\n");
jakowisp 0:98cf19bcd828 786 printf("%s\r\n",objectInfo.keywords.getString());
jakowisp 0:98cf19bcd828 787 }
jakowisp 0:98cf19bcd828 788
jakowisp 0:98cf19bcd828 789
jakowisp 0:98cf19bcd828 790
jakowisp 0:98cf19bcd828 791 #endif
jakowisp 0:98cf19bcd828 792