/*++ Copyright (C) 1999- Microsoft Corporation Module Name: camusb.h Abstract: Header file that declares CUsbCamera object Author: William Hsieh (williamh) created Revision History: --*/ #ifndef CAMUSB__H_ #define CAMUSB__H_ // // These are the USB timeout values in seconds // const PTP_READ_TIMEOUT = 5; const PTP_WRITE_TIMEOUT = 5; const PTP_EVENT_TIMEOUT = 0; // // USB Still image device container types // const WORD PTPCONTAINER_TYPE_UNDEFINED = 0; const WORD PTPCONTAINER_TYPE_COMMAND = 1; const WORD PTPCONTAINER_TYPE_DATA = 2; const WORD PTPCONTAINER_TYPE_RESPONSE = 3; const WORD PTPCONTAINER_TYPE_EVENT = 4; // // Used to store info about the endpoints // typedef struct _USB_PTP_ENDPOINT_INFO { USHORT BulkInMaxSize; UCHAR BulkInAddress; USHORT BulkOutMaxSize; UCHAR BulkOutAddress; USHORT InterruptMaxSize; UCHAR InterruptAddress; } USB_PTP_ENDPOINT_INFO, *PUSB_PTP_ENDPOINT_INFO; #pragma pack(push, Old, 1) // // When a USB device stalls, the usb kernel mode stack driver returns // a NTSTATUS code, STATUS_DEVICE_DATA_ERROR. Translates this NT status // code to WIN32 error code, we get ERROR_CRC. // const DWORD WIN32ERROR_USBSTALL = ERROR_CRC; // // Container header // typedef struct _USB_PTP_HEADER { DWORD Len; // total length of container in bytes including header WORD Type; // container type, one of CONTAINER_TYPE_COMMAND/RESPONSE/DATA/EVENT WORD Code; // opcode, response code, or event code DWORD TransactionId; // transaction id }USB_PTP_HEADER, *PUSB_PTP_HEADER; // // USB PTP command structure // typedef struct _USB_PTP_COMMAND { USB_PTP_HEADER Header; DWORD Params[COMMAND_NUMPARAMS_MAX]; }USB_PTP_COMMAND, *PUSB_PTP_COMMAND; // // USB PTP response structure // typedef struct _USB_PTP_RESPONSE { USB_PTP_HEADER Header; DWORD Params[RESPONSE_NUMPARAMS_MAX]; }USB_PTP_RESPONSE, *PUSB_PTP_RESPONSE; // // USB PTP event structure // typedef struct _USB_PTP_EVENT { USB_PTP_HEADER Header; DWORD Params[EVENT_NUMPARAMS_MAX]; }USB_PTP_EVENT, *PUSB_PTP_EVENT; // // USB PTP data structure // typedef struct _USB_PTP_DATA { USB_PTP_HEADER Header; BYTE Data[1]; }USB_PTP_DATA, *PUSB_PTP_DATA; // // GetDeviceStatus header // typedef struct tagUSBPTPDeviceStatusHeader { WORD Len; // status WORD Code; // ptp response code }USB_PTPDEVICESTATUS_HEADER, *PUSB_PTPDEVICESTATUS_HEADER; // // GetDeviceStatus data // typedef struct tagUSBPTPDeviceStatus { USB_PTPDEVICESTATUS_HEADER Header; // the header DWORD Params[MAX_NUM_PIPES]; }USB_PTPDEVICESTATUS, *PUSB_PTPDEVICESTATUS; const BYTE USB_PTPREQUEST_TYPE_OUT = 0x21; const BYTE USB_PTPREQUEST_TYPE_IN = 0xA1; const BYTE USB_PTPREQUEST_CANCELIO = 0x64; const BYTE USB_PTPREQUEST_GETEVENT = 0x65; const BYTE USB_PTPREQUEST_RESET = 0x66; const BYTE USB_PTPREQUEST_GETSTATUS = 0x67; const WORD USB_PTPCANCELIO_ID = 0x4001; // // Other USB Imaging Class-specific commands // typedef struct tagUSBPTPCancelIoRequest { WORD Id; DWORD TransactionId; }USB_PTPCANCELIOREQUEST, *PUSB_PTPCANCELIOREQUEST; typedef struct tagUSBPTPResetRequest { DWORD TransactionId; }USB_PTPRESETREQUEST, *PUSB_PTPRESETREQUEST; typedef struct tagUSBPTPGetEventRequest { WORD EventCode; DWORD TransactionId; DWORD Params; }USB_PTPGETEVENTREQUEST, *PUSB_PTPGETEVENTREQUEST; #pragma pack(pop, Old) // // A CPTPCamera derived class to support PTP USB devices // class CUsbCamera : public CPTPCamera { public: CUsbCamera(); ~CUsbCamera(); private: HRESULT Open(LPWSTR DevicePortName, PTPEventCallback pPTPEventCB, PTPDataCallback pPTPDataCB, LPVOID pEventParam, BOOL bEnableEvents = TRUE); HRESULT Close(); // // Functions called by the base class // HRESULT SendCommand(PTP_COMMAND *pCommand, UINT NumParams); HRESULT ReadData(BYTE *pData, UINT *pBufferSize); HRESULT SendData(BYTE *pData, UINT BufferSize); HRESULT ReadResponse(PTP_RESPONSE *pResponse); HRESULT ReadEvent(PTP_EVENT *pEvent); HRESULT AbortTransfer(); HRESULT RecoverFromError(); private: // // Private utility functions // HRESULT GetDeviceStatus(USB_PTPDEVICESTATUS *pDeviceStatus); HRESULT ClearStalls(USB_PTPDEVICESTATUS *pDeviceStatus); HRESULT SendResetDevice(); HRESULT SendCancelRequest(DWORD dwTransactionId); // // Member variables // HANDLE m_hUSB; // File handle used to communicate with USB device HANDLE m_hEventUSB; // File handle used to read events OVERLAPPED m_Overlapped; // Overlapped structure for event reads HANDLE m_hEventRead; // Event handle used by event read HANDLE m_hEventCancel; // Event handle used to cancel interrupt read HANDLE m_EventHandles[2]; // Array used by WaitForMultipleObjects USB_PTP_ENDPOINT_INFO m_EndpointInfo; // Info about the endpoints USB_PTP_COMMAND m_UsbCommand; // Re-usable buffer for commands USB_PTP_RESPONSE m_UsbResponse; // Re-usable buffer for responses USB_PTP_DATA *m_pUsbData; // Pointer to re-usable buffer for short data transfers UINT m_UsbDataSize; // Size allocated for the data transfer buffer WORD m_prevOpCode; // Used to store opcode between command and data phases DWORD m_prevTranId; // Used to store transaction id between command and data phases }; #endif // #ifndef CAMUSB__H_