Library to allo USB PTP device to be hosted by the mbed platform
Dependents: class_project_main
USBHostPTP.cpp@11:3b072cf16df8, 2013-10-07 (annotated)
- 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?
User | Revision | Line number | New 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 |