1 /*************************************************************************** 2 * Copyright (c) 2024 Microsoft Corporation 3 * 4 * This program and the accompanying materials are made available under the 5 * terms of the MIT License which is available at 6 * https://opensource.org/licenses/MIT. 7 * 8 * SPDX-License-Identifier: MIT 9 **************************************************************************/ 10 11 12 /**************************************************************************/ 13 /**************************************************************************/ 14 /** */ 15 /** USBX Component */ 16 /** */ 17 /** PIMA Class */ 18 /** */ 19 /**************************************************************************/ 20 /**************************************************************************/ 21 22 23 /**************************************************************************/ 24 /* */ 25 /* COMPONENT DEFINITION RELEASE */ 26 /* */ 27 /* ux_host_class_pima.h PORTABLE C */ 28 /* 6.3.0 */ 29 /* AUTHOR */ 30 /* */ 31 /* Chaoqiong Xiao, Microsoft Corporation */ 32 /* */ 33 /* DESCRIPTION */ 34 /* */ 35 /* This file contains all the header and extern functions used by the */ 36 /* USBX PIMA class. */ 37 /* */ 38 /* RELEASE HISTORY */ 39 /* */ 40 /* DATE NAME DESCRIPTION */ 41 /* */ 42 /* 05-19-2020 Chaoqiong Xiao Initial Version 6.0 */ 43 /* 09-30-2020 Chaoqiong Xiao Modified comment(s), */ 44 /* used UX prefix to refer to */ 45 /* TX symbols instead of using */ 46 /* them directly, */ 47 /* resulting in version 6.1 */ 48 /* 08-02-2021 Wen Wang Modified comment(s), */ 49 /* added extern "C" keyword */ 50 /* for compatibility with C++, */ 51 /* resulting in version 6.1.8 */ 52 /* 07-29-2022 Chaoqiong Xiao Modified comment(s), */ 53 /* improved internal checks, */ 54 /* resulting in version 6.1.12 */ 55 /* 10-31-2023 Chaoqiong Xiao Modified comment(s), */ 56 /* removed unused semaphore, */ 57 /* optimized PIMA data sets, */ 58 /* increased default buffer */ 59 /* length to get device info, */ 60 /* added error checks support, */ 61 /* resulting in version 6.3.0 */ 62 /* */ 63 /**************************************************************************/ 64 65 #ifndef UX_HOST_CLASS_PIMA_H 66 #define UX_HOST_CLASS_PIMA_H 67 68 /* Determine if a C++ compiler is being used. If so, ensure that standard 69 C is used to process the API information. */ 70 71 #ifdef __cplusplus 72 73 /* Yes, C++ compiler is present. Use standard C. */ 74 extern "C" { 75 76 #endif 77 78 /* Internal option: enable the basic USBX error checking. This define is typically used 79 while debugging application. */ 80 #if defined(UX_ENABLE_ERROR_CHECKING) && !defined(UX_HOST_CLASS_PIMA_ENABLE_ERROR_CHECKING) 81 #define UX_HOST_CLASS_PIMA_ENABLE_ERROR_CHECKING 82 #endif 83 84 /* Define PIMA Class constants. */ 85 86 #define UX_HOST_CLASS_PIMA_CLASS_TRANSFER_TIMEOUT 300000 87 #define UX_HOST_CLASS_PIMA_CLASS 0x06 88 #define UX_HOST_CLASS_PIMA_SUBCLASS 0X01 89 #define UX_HOST_CLASS_PIMA_PROTOCOL 0X01 90 #define UX_HOST_CLASS_PIMA_CS_INTERFACE 0x24 91 #define UX_HOST_CLASS_PIMA_MAGIC_NUMBER 0x50494D41 92 #define UX_HOST_CLASS_PIMA_UNICODE_MAX_LENGTH 256 93 #define UX_HOST_CLASS_PIMA_ARRAY_MAX_LENGTH 256 94 #define UX_HOST_CLASS_PIMA_DATE_TIME_STRING_MAX_LENGTH 64 95 #define UX_HOST_CLASS_PIMA_MAX_STORAGE_IDS 64 96 #if (UX_OVERFLOW_CHECK_ADD_ULONG(UX_HOST_CLASS_PIMA_MAX_STORAGE_IDS, 1) || \ 97 UX_OVERFLOW_CHECK_MULC_ULONG(UX_HOST_CLASS_PIMA_MAX_STORAGE_IDS + 1, 4)) 98 #error UX_HOST_CLASS_PIMA_MAX_STORAGE_IDS too large, please decrease 99 #endif 100 #define UX_HOST_CLASS_PIMA_STORAGE_IDS_LENGTH ((UX_HOST_CLASS_PIMA_MAX_STORAGE_IDS + 1) * 4) 101 #define UX_HOST_CLASS_PIMA_MAX_PAYLOAD 1024 102 #define UX_HOST_CLASS_PIMA_ZLP_NONE 0 103 #define UX_HOST_CLASS_PIMA_ZLP_IN 1 104 #define UX_HOST_CLASS_PIMA_ZLP_OUT 2 105 106 /* Define PIMA data phases. */ 107 108 #define UX_HOST_CLASS_PIMA_DATA_PHASE_NONE 0 109 #define UX_HOST_CLASS_PIMA_DATA_PHASE_IN 1 110 #define UX_HOST_CLASS_PIMA_DATA_PHASE_OUT 2 111 112 /* Define PIMA session states. */ 113 114 #define UX_HOST_CLASS_PIMA_SESSION_STATE_CLOSED 0 115 #define UX_HOST_CLASS_PIMA_SESSION_STATE_OPENED 1 116 117 /* Define PIMA object and thumb states. */ 118 119 #define UX_HOST_CLASS_PIMA_OBJECT_STATE_CLOSED 0 120 #define UX_HOST_CLASS_PIMA_OBJECT_STATE_OPENED 1 121 122 /* Define PIMA object and thumb transfer status. */ 123 124 #define UX_HOST_CLASS_PIMA_OBJECT_TRANSFER_STATUS_INACTIVE 0 125 #define UX_HOST_CLASS_PIMA_OBJECT_TRANSFER_STATUS_ACTIVE 1 126 #define UX_HOST_CLASS_PIMA_OBJECT_TRANSFER_STATUS_COMPLETED 2 127 #define UX_HOST_CLASS_PIMA_OBJECT_TRANSFER_STATUS_ABORTED 3 128 129 /* Define PIMA Cancel Request equivalences. */ 130 131 #define UX_HOST_CLASS_PIMA_REQUEST_CANCEL_COMMAND 0x64 132 #define UX_HOST_CLASS_PIMA_REQUEST_CANCEL_DATA_LENGTH 0x06 133 #define UX_HOST_CLASS_PIMA_REQUEST_CANCEL_CODE 0x04001 134 #define UX_HOST_CLASS_PIMA_REQUEST_CANCEL_OFFSET_CODE 0x00 135 #define UX_HOST_CLASS_PIMA_REQUEST_CANCEL_OFFSET_TRANSACTION_ID 0x02 136 137 /* Define PIMA Reset Request equivalences. */ 138 139 #define UX_HOST_CLASS_PIMA_REQUEST_RESET_DEVICE 0x66 140 141 /* Define PIMA Status Request equivalences. */ 142 143 #define UX_HOST_CLASS_PIMA_REQUEST_STATUS_COMMAND 0x67 144 #define UX_HOST_CLASS_PIMA_REQUEST_STATUS_DATA_LENGTH 0x40 145 #define UX_HOST_CLASS_PIMA_REQUEST_STATUS_OFFSET_LENGTH 0x00 146 #define UX_HOST_CLASS_PIMA_REQUEST_STATUS_OFFSET_CODE 0x02 147 #define UX_HOST_CLASS_PIMA_REQUEST_STATUS_COMMAND_COUNTER 16 148 #define UX_HOST_CLASS_PIMA_REQUEST_STATUS_COMMAND_DELAY 1000 149 150 /* Define PIMA command container type. */ 151 152 #define UX_HOST_CLASS_PIMA_CT_UNDEFINED 0x00 153 #define UX_HOST_CLASS_PIMA_CT_COMMAND_BLOCK 0x01 154 #define UX_HOST_CLASS_PIMA_CT_DATA_BLOCK 0x02 155 #define UX_HOST_CLASS_PIMA_CT_RESPONSE_BLOCK 0x03 156 #define UX_HOST_CLASS_PIMA_CT_EVENT_BLOCK 0x04 157 158 /* Define PIMA Extended Event Data Request payload Format. */ 159 160 #define UX_HOST_CLASS_PIMA_EEDR_EVENT_CODE 0x00 161 #define UX_HOST_CLASS_PIMA_EEDR_TRANSACTION_ID 0x02 162 #define UX_HOST_CLASS_PIMA_EEDR_NUMBER_PARAMETERS 0x06 163 #define UX_HOST_CLASS_PIMA_EEDR_SIZE_PARAMETER 0x08 164 165 /* Define PIMA Device Status Data Format. */ 166 167 #define UX_HOST_CLASS_PIMA_DSD_LENGTH 0x00 168 #define UX_HOST_CLASS_PIMA_DSD_CODE 0x02 169 #define UX_HOST_CLASS_PIMA_DSD_PARAMETER 0x04 170 171 /* Define PIMA Command Header Format. */ 172 173 #define UX_HOST_CLASS_PIMA_COMMAND_HEADER_LENGTH 0x00 174 #define UX_HOST_CLASS_PIMA_COMMAND_HEADER_TYPE 0x04 175 #define UX_HOST_CLASS_PIMA_COMMAND_HEADER_CODE 0x06 176 #define UX_HOST_CLASS_PIMA_COMMAND_HEADER_TRANSACTION_ID 0x08 177 #define UX_HOST_CLASS_PIMA_COMMAND_HEADER_PARAMETER_1 0x0C 178 #define UX_HOST_CLASS_PIMA_COMMAND_HEADER_PARAMETER_2 0x10 179 #define UX_HOST_CLASS_PIMA_COMMAND_HEADER_PARAMETER_3 0x14 180 #define UX_HOST_CLASS_PIMA_COMMAND_HEADER_PARAMETER_4 0x18 181 #define UX_HOST_CLASS_PIMA_COMMAND_HEADER_PARAMETER_5 0x1C 182 183 #define UX_HOST_CLASS_PIMA_COMMAND_HEADER_SIZE 0x0C 184 #define UX_HOST_CLASS_PIMA_CONTAINER_SIZE 0x40 185 #define UX_HOST_CLASS_PIMA_ALL_HEADER_SIZE 0x20 186 187 /* Define PIMA Data Header Format. */ 188 189 #define UX_HOST_CLASS_PIMA_DATA_HEADER_LENGTH 0x00 190 #define UX_HOST_CLASS_PIMA_DATA_HEADER_TYPE 0x04 191 #define UX_HOST_CLASS_PIMA_DATA_HEADER_CODE 0x06 192 #define UX_HOST_CLASS_PIMA_DATA_HEADER_TRANSACTION_ID 0x08 193 #define UX_HOST_CLASS_PIMA_DATA_HEADER_SIZE 0x0C 194 195 196 /* Define PIMA Response Header Format. */ 197 198 #define UX_HOST_CLASS_PIMA_RESPONSE_HEADER_LENGTH 0x00 199 #define UX_HOST_CLASS_PIMA_RESPONSE_HEADER_TYPE 0x04 200 #define UX_HOST_CLASS_PIMA_RESPONSE_HEADER_CODE 0x06 201 #define UX_HOST_CLASS_PIMA_RESPONSE_HEADER_TRANSACTION_ID 0x08 202 #define UX_HOST_CLASS_PIMA_RESPONSE_HEADER_PARAMETER_1 0x0C 203 #define UX_HOST_CLASS_PIMA_RESPONSE_HEADER_PARAMETER_2 0x10 204 #define UX_HOST_CLASS_PIMA_RESPONSE_HEADER_PARAMETER_3 0x14 205 #define UX_HOST_CLASS_PIMA_RESPONSE_HEADER_PARAMETER_4 0x18 206 #define UX_HOST_CLASS_PIMA_RESPONSE_HEADER_PARAMETER_5 0x1C 207 208 #define UX_HOST_CLASS_PIMA_RESPONSE_HEADER_SIZE 0x20 209 210 /* Define PIMA Asynchronous Event Interrupt Data Format. */ 211 212 #define UX_HOST_CLASS_PIMA_AEI_DATA_LENGTH 0x00 213 #define UX_HOST_CLASS_PIMA_AEI_TYPE 0x04 214 #define UX_HOST_CLASS_PIMA_AEI_EVENT_CODE 0x06 215 #define UX_HOST_CLASS_PIMA_AEI_TRANSACTION_ID 0x08 216 #define UX_HOST_CLASS_PIMA_AEI_PARAMETER_1 0x0C 217 #define UX_HOST_CLASS_PIMA_AEI_PARAMETER_2 0x10 218 #define UX_HOST_CLASS_PIMA_AEI_PARAMETER_3 0x14 219 #define UX_HOST_CLASS_PIMA_AEI_MAX_LENGTH 0x18 220 221 /* Define PIMA Operation Commands. */ 222 223 #define UX_HOST_CLASS_PIMA_OC_UNDEFINED 0x1000 224 #define UX_HOST_CLASS_PIMA_OC_GET_DEVICE_INFO 0x1001 225 #define UX_HOST_CLASS_PIMA_OC_OPEN_SESSION 0x1002 226 #define UX_HOST_CLASS_PIMA_OC_CLOSE_SESSION 0x1003 227 #define UX_HOST_CLASS_PIMA_OC_GET_STORAGE_IDS 0x1004 228 #define UX_HOST_CLASS_PIMA_OC_GET_STORAGE_INFO 0x1005 229 #define UX_HOST_CLASS_PIMA_OC_GET_NUM_OBJECTS 0x1006 230 #define UX_HOST_CLASS_PIMA_OC_GET_OBJECT_HANDLES 0x1007 231 #define UX_HOST_CLASS_PIMA_OC_GET_OBJECT_INFO 0x1008 232 #define UX_HOST_CLASS_PIMA_OC_GET_OBJECT 0x1009 233 #define UX_HOST_CLASS_PIMA_OC_GET_THUMB 0x100A 234 #define UX_HOST_CLASS_PIMA_OC_DELETE_OBJECT 0x100B 235 #define UX_HOST_CLASS_PIMA_OC_SEND_OBJECT_INFO 0x100C 236 #define UX_HOST_CLASS_PIMA_OC_SEND_OBJECT 0x100D 237 #define UX_HOST_CLASS_PIMA_OC_INITIATE_CAPTURE 0x100E 238 #define UX_HOST_CLASS_PIMA_OC_FORMAT_STORE 0x100F 239 #define UX_HOST_CLASS_PIMA_OC_RESET_DEVICE 0x1010 240 #define UX_HOST_CLASS_PIMA_OC_SELF_TEST 0x1011 241 #define UX_HOST_CLASS_PIMA_OC_SET_OBJECT_PROTECTION 0x1012 242 #define UX_HOST_CLASS_PIMA_OC_POWER_DOWN 0x1013 243 #define UX_HOST_CLASS_PIMA_OC_GET_DEVICE_PROP_DESC 0x1014 244 #define UX_HOST_CLASS_PIMA_OC_GET_DEVICE_PROP_VALUE 0x1015 245 #define UX_HOST_CLASS_PIMA_OC_SET_DEVICE_PROP_VALUE 0x1016 246 #define UX_HOST_CLASS_PIMA_OC_RESET_DEVICE_PROP_VALUE 0x1017 247 #define UX_HOST_CLASS_PIMA_OC_TERMINATE_OPEN_CAPTURE 0x1018 248 #define UX_HOST_CLASS_PIMA_OC_MOVE_OBJECT 0x1019 249 #define UX_HOST_CLASS_PIMA_OC_COPY_OBJECT 0x101A 250 #define UX_HOST_CLASS_PIMA_OC_GET_PARTIAL_OBJECT 0x101B 251 #define UX_HOST_CLASS_PIMA_OC_INITIATE_OPEN_CAPTURE 0x101C 252 253 /* Define PIMA Response Codes. */ 254 255 #define UX_HOST_CLASS_PIMA_RC_UNDEFINED 0x2000 256 #define UX_HOST_CLASS_PIMA_RC_OK 0x2001 257 #define UX_HOST_CLASS_PIMA_RC_GENERAL_ERROR 0x2002 258 #define UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN 0x2003 259 #define UX_HOST_CLASS_PIMA_RC_INVALID_TRANSACTION_ID 0x2004 260 #define UX_HOST_CLASS_PIMA_RC_OPERATION_NOT_SUPPORTED 0x2005 261 #define UX_HOST_CLASS_PIMA_RC_PARAMETER_NOT_SUPPORTED 0x2006 262 #define UX_HOST_CLASS_PIMA_RC_INCOMPLETE_TRANSFER 0x2007 263 #define UX_HOST_CLASS_PIMA_RC_INVALID_STORAGE_ID 0x2008 264 #define UX_HOST_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE 0x2009 265 #define UX_HOST_CLASS_PIMA_RC_DEVICE_PROP_NOT_SUPPORTED 0x200A 266 #define UX_HOST_CLASS_PIMA_RC_INVALID_OBJECT_FORMAT_CODE 0x200B 267 #define UX_HOST_CLASS_PIMA_RC_STORE_FULL 0x200C 268 #define UX_HOST_CLASS_PIMA_RC_OBJECT_WRITE_PROTECTED 0x200D 269 #define UX_HOST_CLASS_PIMA_RC_STORE_READ_ONLY 0x200E 270 #define UX_HOST_CLASS_PIMA_RC_ACCESS_DENIED 0x200F 271 #define UX_HOST_CLASS_PIMA_RC_NO_THUMBNAIL_PRESENT 0x2010 272 #define UX_HOST_CLASS_PIMA_RC_SELF_TEST_FAILED 0x2011 273 #define UX_HOST_CLASS_PIMA_RC_PARTIAL_DELETION 0x2012 274 #define UX_HOST_CLASS_PIMA_RC_STORE_NOT_AVAILABLE 0x2013 275 #define UX_HOST_CLASS_PIMA_RC_FORMAT_UNSUPPORTED 0x2014 276 #define UX_HOST_CLASS_PIMA_RC_NO_VALID_OBJECT_INFO 0x2015 277 #define UX_HOST_CLASS_PIMA_RC_INVALID_CODE_FORMAT 0x2016 278 #define UX_HOST_CLASS_PIMA_RC_UNKNOWN_VENDOR_CODE 0x2017 279 #define UX_HOST_CLASS_PIMA_RC_CAPTURE_ALREADY_TERMINATED 0x2018 280 #define UX_HOST_CLASS_PIMA_RC_DEVICE_BUSY 0x2019 281 #define UX_HOST_CLASS_PIMA_RC_INVALID_PARENT_OBJECT 0x201A 282 #define UX_HOST_CLASS_PIMA_RC_INVALID_DEVICE_PROP_FORMAT 0x201B 283 #define UX_HOST_CLASS_PIMA_RC_INVALID_DEVICE_PROP_VALUE 0x201C 284 #define UX_HOST_CLASS_PIMA_RC_INVALID_PARAMETER 0x201D 285 #define UX_HOST_CLASS_PIMA_RC_SESSION_ALREADY_OPENED 0x201E 286 #define UX_HOST_CLASS_PIMA_RC_TRANSACTION_CANCELED 0x201F 287 #define UX_HOST_CLASS_PIMA_RC_DESTINATION_UNSUPPORTED 0x2020 288 #define UX_HOST_CLASS_PIMA_RC_OBJECT_ALREADY_OPENED 0x2021 289 #define UX_HOST_CLASS_PIMA_RC_OBJECT_ALREADY_CLOSED 0x2022 290 #define UX_HOST_CLASS_PIMA_RC_OBJECT_NOT_OPENED 0x2023 291 292 /* Define PIMA Event Codes. */ 293 294 #define UX_HOST_CLASS_PIMA_EC_UNDEFINED 0x4000 295 #define UX_HOST_CLASS_PIMA_EC_CANCEL_TRANSACTION 0x4001 296 #define UX_HOST_CLASS_PIMA_EC_OBJECT_ADDED 0x4002 297 #define UX_HOST_CLASS_PIMA_EC_OBJECT_REMOVED 0x4003 298 #define UX_HOST_CLASS_PIMA_EC_STORE_ADDED 0x4004 299 #define UX_HOST_CLASS_PIMA_EC_STORE_REMOVED 0x4005 300 #define UX_HOST_CLASS_PIMA_EC_DEVICE_PROP_CHANGED 0x4006 301 #define UX_HOST_CLASS_PIMA_EC_OBJECT_INFO_CHANGED 0x4007 302 #define UX_HOST_CLASS_PIMA_EC_DEVICE_INFO_CHANGED 0x4008 303 #define UX_HOST_CLASS_PIMA_EC_REQUEST_OBJECT_TRANSFER 0x4009 304 #define UX_HOST_CLASS_PIMA_EC_STORE_FULL 0x400A 305 #define UX_HOST_CLASS_PIMA_EC_DEVICE_RESET 0x400B 306 #define UX_HOST_CLASS_PIMA_EC_STORAGE_INFO_CHANGED 0x400C 307 #define UX_HOST_CLASS_PIMA_EC_CAPTURE_COMPLETE 0x400D 308 #define UX_HOST_CLASS_PIMA_EC_UNREPORTED_STATUS 0x400E 309 310 /* Define PIMA Object Format Codes. */ 311 312 #define UX_HOST_CLASS_PIMA_OFC_UNDEFINED 0x3000 313 #define UX_HOST_CLASS_PIMA_OFC_ASSOCIATION 0x3001 314 #define UX_HOST_CLASS_PIMA_OFC_SCRIPT 0x3002 315 #define UX_HOST_CLASS_PIMA_OFC_EXECUTABLE 0x3003 316 #define UX_HOST_CLASS_PIMA_OFC_TEXT 0x3004 317 #define UX_HOST_CLASS_PIMA_OFC_HTML 0x3005 318 #define UX_HOST_CLASS_PIMA_OFC_DPOF 0x3006 319 #define UX_HOST_CLASS_PIMA_OFC_AIFF 0x3007 320 #define UX_HOST_CLASS_PIMA_OFC_WAV 0x3008 321 #define UX_HOST_CLASS_PIMA_OFC_MP3 0x3009 322 #define UX_HOST_CLASS_PIMA_OFC_AVI 0x300A 323 #define UX_HOST_CLASS_PIMA_OFC_MPEG 0x300B 324 #define UX_HOST_CLASS_PIMA_OFC_ASF 0x300C 325 #define UX_HOST_CLASS_PIMA_OFC_QT 0x300D 326 #define UX_HOST_CLASS_PIMA_OFC_EXIF_JPEG 0x3801 327 #define UX_HOST_CLASS_PIMA_OFC_TIFF_EP 0x3802 328 #define UX_HOST_CLASS_PIMA_OFC_FLASHPIX 0x3803 329 #define UX_HOST_CLASS_PIMA_OFC_BMP 0x3804 330 #define UX_HOST_CLASS_PIMA_OFC_CIFF 0x3805 331 #define UX_HOST_CLASS_PIMA_OFC_GIF 0x3807 332 #define UX_HOST_CLASS_PIMA_OFC_JFIF 0x3808 333 #define UX_HOST_CLASS_PIMA_OFC_PCD 0x3809 334 #define UX_HOST_CLASS_PIMA_OFC_PICT 0x380A 335 #define UX_HOST_CLASS_PIMA_OFC_PNG 0x380B 336 #define UX_HOST_CLASS_PIMA_OFC_TIFF 0x380D 337 #define UX_HOST_CLASS_PIMA_OFC_TIFF_IT 0x380E 338 #define UX_HOST_CLASS_PIMA_OFC_JP2 0x380F 339 #define UX_HOST_CLASS_PIMA_OFC_JPX 0x3810 340 341 /* Define PIMA Object Protection Status Values. */ 342 343 #define UX_HOST_CLASS_PIMA_OPS_NO_PROTECTION 0x0000 344 #define UX_HOST_CLASS_PIMA_OPS_READ_ONLY 0x0001 345 346 /* Define PIMA Storage Types Codes. */ 347 348 #define UX_HOST_CLASS_PIMA_STC_UNDEFINED 0x0000 349 #define UX_HOST_CLASS_PIMA_STC_FIXED_ROM 0x0001 350 #define UX_HOST_CLASS_PIMA_STC_REMOVABLE_ROM 0x0002 351 #define UX_HOST_CLASS_PIMA_STC_FIXED_RAM 0x0003 352 #define UX_HOST_CLASS_PIMA_STC_REMOVABLE_RAM 0x0004 353 354 /* Define PIMA File System Types Codes. */ 355 356 #define UX_HOST_CLASS_PIMA_FSTC_UNDEFINED 0x0000 357 #define UX_HOST_CLASS_PIMA_FSTC_GENERIC_FLAT 0x0001 358 #define UX_HOST_CLASS_PIMA_FSTC_GENERIC_HIERARCHICAL 0x0002 359 #define UX_HOST_CLASS_PIMA_FSTC_DCF 0x0003 360 361 /* Define PIMA event info structure. */ 362 363 typedef struct UX_HOST_CLASS_PIMA_EVENT_STRUCT 364 { 365 struct UX_HOST_CLASS_PIMA_SESSION_STRUCT 366 *ux_host_class_pima_event_session; 367 struct UX_HOST_CLASS_PIMA_STRUCT 368 *ux_host_class_pima_event_pima_instance; 369 ULONG ux_host_class_pima_event_code; 370 ULONG ux_host_class_pima_event_session_id; 371 ULONG ux_host_class_pima_event_transaction_id; 372 ULONG ux_host_class_pima_event_parameter_1; 373 ULONG ux_host_class_pima_event_parameter_2; 374 ULONG ux_host_class_pima_event_parameter_3; 375 376 } UX_HOST_CLASS_PIMA_EVENT; 377 378 /* Define PIMA structure. */ 379 380 typedef struct UX_HOST_CLASS_PIMA_STRUCT 381 { 382 383 struct UX_HOST_CLASS_PIMA_STRUCT 384 *ux_host_class_pima_next_instance; 385 UX_HOST_CLASS *ux_host_class_pima_class; 386 UX_DEVICE *ux_host_class_pima_device; 387 UX_INTERFACE *ux_host_class_pima_interface; 388 UX_ENDPOINT *ux_host_class_pima_bulk_out_endpoint; 389 UX_ENDPOINT *ux_host_class_pima_bulk_in_endpoint; 390 UX_ENDPOINT *ux_host_class_pima_interrupt_endpoint; 391 UINT ux_host_class_pima_state; 392 ULONG ux_host_class_pima_transaction_id; 393 ULONG ux_host_class_pima_operation_code; 394 ULONG ux_host_class_pima_event_code; 395 ULONG ux_host_class_pima_event_transaction_id; 396 ULONG ux_host_class_pima_event_session; 397 ULONG ux_host_class_pima_event_parameter_1; 398 ULONG ux_host_class_pima_event_parameter_2; 399 ULONG ux_host_class_pima_event_parameter_3; 400 UCHAR *ux_host_class_pima_event_buffer; 401 UCHAR *ux_host_class_pima_event_buffer_current_offset; 402 ULONG ux_host_class_pima_event_buffer_current_length; 403 ULONG ux_host_class_pima_event_buffer_expected_length; 404 struct UX_HOST_CLASS_PIMA_SESSION_STRUCT 405 *ux_host_class_pima_session; 406 UCHAR *ux_host_class_pima_container; 407 VOID *ux_host_class_pima_application; 408 ULONG ux_host_class_pima_zlp_flag; 409 410 } UX_HOST_CLASS_PIMA; 411 412 /* Define PIMA Session structure. */ 413 414 typedef struct UX_HOST_CLASS_PIMA_SESSION_STRUCT 415 { 416 417 ULONG ux_host_class_pima_session_magic; 418 ALIGN_TYPE ux_host_class_pima_session_id; 419 ULONG ux_host_class_pima_session_state; 420 struct UX_HOST_CLASS_PIMA_STRUCT 421 *ux_host_class_pima_session_pima_instance; 422 ULONG ux_host_class_pima_session_nb_storage_ids; 423 ULONG ux_host_class_pima_session_nb_objects; 424 VOID (*ux_host_class_pima_session_event_callback)(struct UX_HOST_CLASS_PIMA_EVENT_STRUCT *pima_event); 425 426 } UX_HOST_CLASS_PIMA_SESSION; 427 428 429 /* Define PIMA command structure. */ 430 431 typedef struct UX_HOST_CLASS_PIMA_COMMAND_STRUCT 432 { 433 434 ULONG ux_host_class_pima_command_nb_parameters; 435 ULONG ux_host_class_pima_command_operation_code; 436 ULONG ux_host_class_pima_command_parameter_1; 437 ULONG ux_host_class_pima_command_parameter_2; 438 ULONG ux_host_class_pima_command_parameter_3; 439 ULONG ux_host_class_pima_command_parameter_4; 440 ULONG ux_host_class_pima_command_parameter_5; 441 442 } UX_HOST_CLASS_PIMA_COMMAND; 443 444 /* Define PIMA object info structure. */ 445 446 typedef struct UX_HOST_CLASS_PIMA_OBJECT_STRUCT 447 { 448 449 ULONG ux_host_class_pima_object_storage_id; 450 USHORT ux_host_class_pima_object_format; 451 USHORT ux_host_class_pima_object_protection_status; 452 ULONG ux_host_class_pima_object_compressed_size; 453 USHORT ux_host_class_pima_object_thumb_format; 454 USHORT _align_thumb_compressed_size; 455 ULONG ux_host_class_pima_object_thumb_compressed_size; 456 ULONG ux_host_class_pima_object_thumb_pix_width; 457 ULONG ux_host_class_pima_object_thumb_pix_height; 458 ULONG ux_host_class_pima_object_image_pix_width; 459 ULONG ux_host_class_pima_object_image_pix_height; 460 ULONG ux_host_class_pima_object_image_bit_depth; 461 ULONG ux_host_class_pima_object_parent_object; 462 USHORT ux_host_class_pima_object_association_type; 463 USHORT _align_association_desc; 464 ULONG ux_host_class_pima_object_association_desc; 465 ULONG ux_host_class_pima_object_sequence_number; 466 UCHAR ux_host_class_pima_object_filename[UX_HOST_CLASS_PIMA_UNICODE_MAX_LENGTH]; /* Null terminated unicode string. */ 467 UCHAR ux_host_class_pima_object_capture_date[UX_HOST_CLASS_PIMA_DATE_TIME_STRING_MAX_LENGTH]; 468 UCHAR ux_host_class_pima_object_modification_date[UX_HOST_CLASS_PIMA_DATE_TIME_STRING_MAX_LENGTH]; 469 UCHAR ux_host_class_pima_object_keywords[UX_HOST_CLASS_PIMA_UNICODE_MAX_LENGTH]; /* Null terminated unicode string. */ 470 ULONG ux_host_class_pima_object_state; 471 ULONG ux_host_class_pima_object_offset; 472 ULONG ux_host_class_pima_object_transfer_status; 473 ULONG ux_host_class_pima_object_handle_id; 474 ULONG ux_host_class_pima_object_length; 475 UCHAR *ux_host_class_pima_object_buffer; 476 477 } UX_HOST_CLASS_PIMA_OBJECT; 478 479 /* Define PIMA Object decompaction structure. */ 480 481 #define UX_HOST_CLASS_PIMA_OBJECT_MAX_LENGTH 512 482 #define UX_HOST_CLASS_PIMA_OBJECT_VARIABLE_OFFSET 52 483 #define UX_HOST_CLASS_PIMA_OBJECT_ENTRIES 15 484 485 /* Define PIMA device info structure. */ 486 487 typedef struct UX_HOST_CLASS_PIMA_DEVICE_STRUCT 488 { 489 490 ULONG ux_host_class_pima_device_standard_version; 491 ULONG ux_host_class_pima_device_vendor_extension_id; 492 ULONG ux_host_class_pima_device_vendor_extension_version; 493 UCHAR ux_host_class_pima_device_vendor_extension_desc[UX_HOST_CLASS_PIMA_UNICODE_MAX_LENGTH]; /* Null terminated unicode string. */ 494 ULONG ux_host_class_pima_device_functional_mode; 495 UCHAR ux_host_class_pima_device_operations_supported[UX_HOST_CLASS_PIMA_ARRAY_MAX_LENGTH]; 496 UCHAR ux_host_class_pima_device_events_supported[UX_HOST_CLASS_PIMA_ARRAY_MAX_LENGTH]; 497 UCHAR ux_host_class_pima_device_properties_supported[UX_HOST_CLASS_PIMA_ARRAY_MAX_LENGTH]; 498 UCHAR ux_host_class_pima_device_capture_formats[UX_HOST_CLASS_PIMA_ARRAY_MAX_LENGTH]; 499 UCHAR ux_host_class_pima_device_image_formats[UX_HOST_CLASS_PIMA_ARRAY_MAX_LENGTH]; 500 UCHAR ux_host_class_pima_device_manufacturer[UX_HOST_CLASS_PIMA_UNICODE_MAX_LENGTH]; /* Null terminated unicode string. */ 501 UCHAR ux_host_class_pima_device_model[UX_HOST_CLASS_PIMA_DATE_TIME_STRING_MAX_LENGTH]; 502 UCHAR ux_host_class_pima_device_version[UX_HOST_CLASS_PIMA_DATE_TIME_STRING_MAX_LENGTH]; 503 UCHAR ux_host_class_pima_device_serial_number[UX_HOST_CLASS_PIMA_UNICODE_MAX_LENGTH]; /* Null terminated unicode string. */ 504 505 } UX_HOST_CLASS_PIMA_DEVICE; 506 507 /* Define PIMA Device decompaction structure. */ 508 509 #define UX_HOST_CLASS_PIMA_DEVICE_MAX_LENGTH 1024 510 #define UX_HOST_CLASS_PIMA_DEVICE_STANDARD_VERSION 0 511 #define UX_HOST_CLASS_PIMA_DEVICE_VENDOR_EXTENSION_ID 2 512 #define UX_HOST_CLASS_PIMA_DEVICE_VENDOR_EXTENSION_VERSION 6 513 #define UX_HOST_CLASS_PIMA_DEVICE_VENDOR_EXTENSION_DESC 8 514 515 /* Define PIMA storage info structure. */ 516 517 typedef struct UX_HOST_CLASS_PIMA_STORAGE_STRUCT 518 { 519 520 USHORT ux_host_class_pima_storage_type; 521 USHORT ux_host_class_pima_storage_file_system_type; 522 USHORT ux_host_class_pima_storage_access_capability; 523 USHORT _align_max_capacity_low; 524 ULONG ux_host_class_pima_storage_max_capacity_low; 525 ULONG ux_host_class_pima_storage_max_capacity_high; 526 ULONG ux_host_class_pima_storage_free_space_bytes_low; 527 ULONG ux_host_class_pima_storage_free_space_bytes_high; 528 ULONG ux_host_class_pima_storage_free_space_images; 529 UCHAR ux_host_class_pima_storage_description[UX_HOST_CLASS_PIMA_UNICODE_MAX_LENGTH]; /* Null terminated unicode string. */ 530 UCHAR ux_host_class_pima_storage_volume_label[UX_HOST_CLASS_PIMA_UNICODE_MAX_LENGTH]; /* Null terminated unicode string. */ 531 532 } UX_HOST_CLASS_PIMA_STORAGE; 533 534 /* Define PIMA storage decompaction structure. */ 535 536 #define UX_HOST_CLASS_PIMA_STORAGE_MAX_LENGTH 512 537 #define UX_HOST_CLASS_PIMA_STORAGE_VARIABLE_OFFSET 26 538 #define UX_HOST_CLASS_PIMA_STORAGE_ENTRIES 8 539 540 /* Define Pima Class function prototypes. */ 541 542 UINT _ux_host_class_pima_activate(UX_HOST_CLASS_COMMAND *command); 543 UINT _ux_host_class_pima_configure(UX_HOST_CLASS_PIMA *cdc_acm); 544 UINT _ux_host_class_pima_deactivate(UX_HOST_CLASS_COMMAND *command); 545 UINT _ux_host_class_pima_endpoints_get(UX_HOST_CLASS_PIMA *cdc_acm); 546 UINT _ux_host_class_pima_entry(UX_HOST_CLASS_COMMAND *command); 547 VOID _ux_host_class_pima_notification(UX_TRANSFER *transfer_request); 548 UINT _ux_host_class_pima_command(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_COMMAND *command, 549 ULONG direction, UCHAR *data_buffer, ULONG data_length, 550 ULONG max_payload_length); 551 UINT _ux_host_class_pima_device_reset(UX_HOST_CLASS_PIMA *pima); 552 UINT _ux_host_class_pima_num_objects_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG storage_id, 553 ULONG object_format_code); 554 UINT _ux_host_class_pima_object_copy(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle, 555 ULONG storage_id, ULONG parent_object_handle); 556 UINT _ux_host_class_pima_object_delete(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle); 557 UINT _ux_host_class_pima_object_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object, 558 UCHAR *object_buffer, ULONG object_buffer_length, ULONG *object_actual_length); 559 UINT _ux_host_class_pima_object_handles_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, 560 ULONG *object_handles_array, ULONG object_handles_length, ULONG storage_id, ULONG object_format_code, ULONG object_handle_association); 561 UINT _ux_host_class_pima_object_info_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object); 562 UINT _ux_host_class_pima_object_info_send(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG storage_id, ULONG parent_object_id, 563 UX_HOST_CLASS_PIMA_OBJECT *object); 564 UINT _ux_host_class_pima_object_move(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle, ULONG storage_id, ULONG parent_object_handle); 565 UINT _ux_host_class_pima_object_send(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, UX_HOST_CLASS_PIMA_OBJECT *object, 566 UCHAR *object_buffer, ULONG object_buffer_length); 567 UINT _ux_host_class_pima_read(UX_HOST_CLASS_PIMA *pima, UCHAR *data_pointer, ULONG data_length, ULONG max_payload_length); 568 UINT _ux_host_class_pima_session_close(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session); 569 UINT _ux_host_class_pima_session_open(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session); 570 UINT _ux_host_class_pima_storage_ids_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG *storage_ids_array, ULONG storage_id_length); 571 UINT _ux_host_class_pima_storage_info_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG storage_id, UX_HOST_CLASS_PIMA_STORAGE *storage); 572 UINT _ux_host_class_pima_thumb_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object, 573 UCHAR *thumb_buffer, ULONG thumb_buffer_length, ULONG *thumb_actual_length); 574 UINT _ux_host_class_pima_write(UX_HOST_CLASS_PIMA *pima, UCHAR *data_pointer, ULONG data_length, ULONG operation_code, ULONG max_payload_length); 575 UINT _ux_host_class_pima_request_cancel(UX_HOST_CLASS_PIMA *pima); 576 UINT _ux_host_class_pima_object_transfer_abort(UX_HOST_CLASS_PIMA *pima, 577 UX_HOST_CLASS_PIMA_SESSION *pima_session, 578 ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object); 579 UINT _ux_host_class_pima_object_close(UX_HOST_CLASS_PIMA *pima, 580 UX_HOST_CLASS_PIMA_SESSION *pima_session, 581 ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object); 582 UINT _ux_host_class_pima_object_open(UX_HOST_CLASS_PIMA *pima, 583 UX_HOST_CLASS_PIMA_SESSION *pima_session, 584 ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object); 585 UINT _ux_host_class_pima_device_info_get(UX_HOST_CLASS_PIMA *pima, 586 UX_HOST_CLASS_PIMA_DEVICE *pima_device); 587 588 UINT _uxe_host_class_pima_num_objects_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG storage_id, 589 ULONG object_format_code); 590 591 UINT _uxe_host_class_pima_object_delete(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle); 592 UINT _uxe_host_class_pima_object_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object, 593 UCHAR *object_buffer, ULONG object_buffer_length, ULONG *object_actual_length); 594 UINT _uxe_host_class_pima_object_handles_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, 595 ULONG *object_handles_array, ULONG object_handles_length, ULONG storage_id, ULONG object_format_code, ULONG object_handle_association); 596 UINT _uxe_host_class_pima_object_info_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object); 597 UINT _uxe_host_class_pima_object_info_send(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG storage_id, ULONG parent_object_id, 598 UX_HOST_CLASS_PIMA_OBJECT *object); 599 UINT _uxe_host_class_pima_object_send(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, UX_HOST_CLASS_PIMA_OBJECT *object, 600 UCHAR *object_buffer, ULONG object_buffer_length); 601 UINT _uxe_host_class_pima_session_close(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session); 602 UINT _uxe_host_class_pima_session_open(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session); 603 UINT _uxe_host_class_pima_storage_ids_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG *storage_ids_array, ULONG storage_id_length); 604 UINT _uxe_host_class_pima_storage_info_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG storage_id, UX_HOST_CLASS_PIMA_STORAGE *storage); 605 UINT _uxe_host_class_pima_thumb_get(UX_HOST_CLASS_PIMA *pima, UX_HOST_CLASS_PIMA_SESSION *pima_session, ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object, 606 UCHAR *thumb_buffer, ULONG thumb_buffer_length, ULONG *thumb_actual_length); 607 UINT _uxe_host_class_pima_object_transfer_abort(UX_HOST_CLASS_PIMA *pima, 608 UX_HOST_CLASS_PIMA_SESSION *pima_session, 609 ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object); 610 UINT _uxe_host_class_pima_object_close(UX_HOST_CLASS_PIMA *pima, 611 UX_HOST_CLASS_PIMA_SESSION *pima_session, 612 ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object); 613 UINT _uxe_host_class_pima_object_open(UX_HOST_CLASS_PIMA *pima, 614 UX_HOST_CLASS_PIMA_SESSION *pima_session, 615 ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object); 616 UINT _uxe_host_class_pima_device_info_get(UX_HOST_CLASS_PIMA *pima, 617 UX_HOST_CLASS_PIMA_DEVICE *pima_device); 618 619 /* Define Device PIMA Class API prototypes. */ 620 #if defined(UX_HOST_CLASS_PIMA_ENABLE_ERROR_CHECKING) 621 622 #define ux_host_class_pima_entry _ux_host_class_pima_entry 623 #define ux_host_class_pima_device_info_get _uxe_host_class_pima_device_info_get 624 #define ux_host_class_pima_object_info_send _uxe_host_class_pima_object_info_send 625 #define ux_host_class_pima_object_info_get _uxe_host_class_pima_object_info_get 626 #define ux_host_class_pima_object_open _uxe_host_class_pima_object_open 627 #define ux_host_class_pima_object_get _uxe_host_class_pima_object_get 628 #define ux_host_class_pima_thumb_get _uxe_host_class_pima_thumb_get 629 #define ux_host_class_pima_object_send _uxe_host_class_pima_object_send 630 #define ux_host_class_pima_object_delete _uxe_host_class_pima_object_delete 631 #define ux_host_class_pima_object_transfer_abort _uxe_host_class_pima_object_transfer_abort 632 #define ux_host_class_pima_object_close _uxe_host_class_pima_object_close 633 #define ux_host_class_pima_session_open _uxe_host_class_pima_session_open 634 #define ux_host_class_pima_session_close _uxe_host_class_pima_session_close 635 #define ux_host_class_pima_storage_ids_get _uxe_host_class_pima_storage_ids_get 636 #define ux_host_class_pima_storage_info_get _uxe_host_class_pima_storage_info_get 637 #define ux_host_class_pima_object_handles_get _uxe_host_class_pima_object_handles_get 638 #define ux_host_class_pima_num_objects_get _uxe_host_class_pima_num_objects_get 639 640 #else 641 642 #define ux_host_class_pima_entry _ux_host_class_pima_entry 643 #define ux_host_class_pima_device_info_get _ux_host_class_pima_device_info_get 644 #define ux_host_class_pima_object_info_send _ux_host_class_pima_object_info_send 645 #define ux_host_class_pima_object_info_get _ux_host_class_pima_object_info_get 646 #define ux_host_class_pima_object_open _ux_host_class_pima_object_open 647 #define ux_host_class_pima_object_get _ux_host_class_pima_object_get 648 #define ux_host_class_pima_thumb_get _ux_host_class_pima_thumb_get 649 #define ux_host_class_pima_object_send _ux_host_class_pima_object_send 650 #define ux_host_class_pima_object_delete _ux_host_class_pima_object_delete 651 #define ux_host_class_pima_object_transfer_abort _ux_host_class_pima_object_transfer_abort 652 #define ux_host_class_pima_object_close _ux_host_class_pima_object_close 653 #define ux_host_class_pima_session_open _ux_host_class_pima_session_open 654 #define ux_host_class_pima_session_close _ux_host_class_pima_session_close 655 #define ux_host_class_pima_storage_ids_get _ux_host_class_pima_storage_ids_get 656 #define ux_host_class_pima_storage_info_get _ux_host_class_pima_storage_info_get 657 #define ux_host_class_pima_object_handles_get _ux_host_class_pima_object_handles_get 658 #define ux_host_class_pima_num_objects_get _ux_host_class_pima_num_objects_get 659 660 #endif 661 662 /* Determine if a C++ compiler is being used. If so, complete the standard 663 C conditional started above. */ 664 #ifdef __cplusplus 665 } 666 #endif 667 668 #endif 669