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

Dependents:   class_project_main

Committer:
jakowisp
Date:
Mon Oct 07 04:45:55 2013 +0000
Revision:
11:3b072cf16df8
Parent:
10:fc1cb68fc91e
Add code for Property description download.; Add code decoder logic.

Who changed what in which revision?

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