/* ## Cypress CyAPI C++ library header file (CyAPI.h) ## ======================================================= ## ## Copyright Cypress Semiconductor Corporation, 2009-2012, ## All Rights Reserved ## UNPUBLISHED, LICENSED SOFTWARE. ## ## CONFIDENTIAL AND PROPRIETARY INFORMATION ## WHICH IS THE PROPERTY OF CYPRESS. ## ## Use of this file is governed ## by the license agreement included in the file ## ## /license/license.rtf ## ## where is the Cypress software ## install root directory path. ## ## ======================================================= */ #ifndef CyUSBH #define CyUSBH #include "cyusb30_def.h" /* Data straucture for the Vendor request and data */ typedef struct vendorCmdData { UCHAR *buf; /* Pointer to the data */ UCHAR opCode; /* Vendor request code */ UINT addr; /* Read/Write address */ long size; /* Size of the read/write */ bool isRead; /* Read or write */ } vendorCmdData ; #ifndef __USB200_H__ #define __USB200_H__ #pragma pack(push,1) typedef struct _USB_DEVICE_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; USHORT bcdUSB; UCHAR bDeviceClass; UCHAR bDeviceSubClass; UCHAR bDeviceProtocol; UCHAR bMaxPacketSize0; USHORT idVendor; USHORT idProduct; USHORT bcdDevice; UCHAR iManufacturer; UCHAR iProduct; UCHAR iSerialNumber; UCHAR bNumConfigurations; } USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; typedef struct _USB_ENDPOINT_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; UCHAR bEndpointAddress; UCHAR bmAttributes; USHORT wMaxPacketSize; UCHAR bInterval; } USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR; typedef struct _USB_CONFIGURATION_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; USHORT wTotalLength; UCHAR bNumInterfaces; UCHAR bConfigurationValue; UCHAR iConfiguration; UCHAR bmAttributes; UCHAR MaxPower; } USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; typedef struct _USB_INTERFACE_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; UCHAR bInterfaceNumber; UCHAR bAlternateSetting; UCHAR bNumEndpoints; UCHAR bInterfaceClass; UCHAR bInterfaceSubClass; UCHAR bInterfaceProtocol; UCHAR iInterface; } USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; typedef struct _USB_STRING_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; WCHAR bString[1]; } USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR; typedef struct _USB_COMMON_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; } USB_COMMON_DESCRIPTOR, *PUSB_COMMON_DESCRIPTOR; #pragma pack(pop) #endif /*******************************************************************************/ class CCyIsoPktInfo { public: LONG Status; LONG Length; }; /*******************************************************************************/ /* {AE18AA60-7F6A-11d4-97DD-00010229B959} */ static GUID CYUSBDRV_GUID = {0xae18aa60, 0x7f6a, 0x11d4, 0x97, 0xdd, 0x0, 0x1, 0x2, 0x29, 0xb9, 0x59}; typedef enum {TGT_DEVICE, TGT_INTFC, TGT_ENDPT, TGT_OTHER } CTL_XFER_TGT_TYPE; typedef enum {REQ_STD, REQ_CLASS, REQ_VENDOR } CTL_XFER_REQ_TYPE; typedef enum {DIR_TO_DEVICE, DIR_FROM_DEVICE } CTL_XFER_DIR_TYPE; typedef enum {XMODE_BUFFERED, XMODE_DIRECT } XFER_MODE_TYPE; const int MAX_ENDPTS = 32; const int MAX_INTERFACES = 255; const int USB_STRING_MAXLEN = 256; #define BUFSIZE_UPORT 2048 //4096 - CDT 130492 typedef enum { RAM = 1, I2CE2PROM, SPIFLASH } FX3_FWDWNLOAD_MEDIA_TYPE ; typedef enum { SUCCESS = 0, FAILED, INVALID_MEDIA_TYPE, INVALID_FWSIGNATURE, DEVICE_CREATE_FAILED, INCORRECT_IMAGE_LENGTH, INVALID_FILE, SPILASH_ERASE_FAILED, CORRUPT_FIRMWARE_IMAGE_FILE,I2CE2PROM_UNKNOWN_I2C_SIZE } FX3_FWDWNLOAD_ERROR_CODE; #define CYWB_BL_4_BYTES_COPY(destination,source) {memcpy((void *)(destination), (void *)(source), 4);} /******************************************************************************** * * The CCyEndPoint ABSTRACT Class * ********************************************************************************/ class CCyUSBEndPoint { protected: bool WaitForIO(OVERLAPPED *ovLapStatus); virtual PUCHAR BeginDirectXfer(PUCHAR buf, LONG bufLen, OVERLAPPED *ov); virtual PUCHAR BeginBufferedXfer(PUCHAR buf, LONG bufLen, OVERLAPPED *ov); public: CCyUSBEndPoint(void); CCyUSBEndPoint(CCyUSBEndPoint& ept); CCyUSBEndPoint(HANDLE h, PUSB_ENDPOINT_DESCRIPTOR pEndPtDescriptor); CCyUSBEndPoint(HANDLE hDev, PUSB_ENDPOINT_DESCRIPTOR pEndPtDescriptor,USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR* SSEndPtDescriptor); HANDLE hDevice; /* The fields of an EndPoint Descriptor */ UCHAR DscLen; UCHAR DscType; UCHAR Address; UCHAR Attributes; USHORT MaxPktSize; USHORT PktsPerFrame; UCHAR Interval; /* This are the fields for Super speed endpoint */ UCHAR ssdscLen; UCHAR ssdscType; UCHAR ssmaxburst; /* Maximum number of packets endpoint can send in one burst */ UCHAR ssbmAttribute; /* store endpoint attribute like for bulk it will be number of streams */ USHORT ssbytesperinterval; /* Other fields */ ULONG TimeOut; ULONG UsbdStatus; ULONG NtStatus; DWORD bytesWritten; DWORD LastError; bool bIn; XFER_MODE_TYPE XferMode; bool XferData(PUCHAR buf, LONG &len, CCyIsoPktInfo* pktInfos = NULL); bool XferData(PUCHAR buf, LONG &bufLen, CCyIsoPktInfo* pktInfos, bool pktMode); virtual PUCHAR BeginDataXfer(PUCHAR buf, LONG len, OVERLAPPED *ov) = 0; virtual bool FinishDataXfer(PUCHAR buf, LONG &len, OVERLAPPED *ov, PUCHAR pXmitBuf, CCyIsoPktInfo* pktInfos = NULL); bool WaitForXfer(OVERLAPPED *ov, ULONG tOut); ULONG GetXferSize(void); void SetXferSize(ULONG xfer); bool Reset(void); bool Abort(void); }; /******************************************************************************** * * The Control Endpoint Class * ********************************************************************************/ class CCyControlEndPoint : public CCyUSBEndPoint { public: CCyControlEndPoint(void); CCyControlEndPoint(CCyControlEndPoint& ept); CCyControlEndPoint(HANDLE h, PUSB_ENDPOINT_DESCRIPTOR pEndPtDescriptor); CTL_XFER_TGT_TYPE Target; CTL_XFER_REQ_TYPE ReqType; CTL_XFER_DIR_TYPE Direction; UCHAR ReqCode; WORD Value; WORD Index; bool Read(PUCHAR buf, LONG &len); bool Write(PUCHAR buf, LONG &len); PUCHAR BeginDataXfer(PUCHAR buf, LONG len, OVERLAPPED *ov); }; /******************************************************************************** * * The Isoc Endpoint Class * ********************************************************************************/ class CCyIsocEndPoint : public CCyUSBEndPoint { protected: virtual PUCHAR BeginDirectXfer(PUCHAR buf, LONG bufLen, OVERLAPPED *ov); virtual PUCHAR BeginBufferedXfer(PUCHAR buf, LONG bufLen, OVERLAPPED *ov); public: CCyIsocEndPoint(void); CCyIsocEndPoint(HANDLE h, PUSB_ENDPOINT_DESCRIPTOR pEndPtDescriptor); CCyIsocEndPoint(HANDLE h, PUSB_ENDPOINT_DESCRIPTOR pEndPtDescriptor,USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR* SSEndPtDescriptor); PUCHAR BeginDataXfer(PUCHAR buf, LONG len, OVERLAPPED *ov); CCyIsoPktInfo* CreatePktInfos(LONG bufLen, int &packets); }; /******************************************************************************** * * The Bulk Endpoint Class * ********************************************************************************/ class CCyBulkEndPoint : public CCyUSBEndPoint { public: CCyBulkEndPoint(void); CCyBulkEndPoint(HANDLE h, PUSB_ENDPOINT_DESCRIPTOR pEndPtDescriptor); CCyBulkEndPoint(HANDLE h, PUSB_ENDPOINT_DESCRIPTOR pEndPtDescriptor,USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR* SSEndPtDescriptor); PUCHAR BeginDataXfer(PUCHAR buf, LONG len, OVERLAPPED *ov); }; /******************************************************************************** * * The Interrupt Endpoint Class * ********************************************************************************/ class CCyInterruptEndPoint : public CCyUSBEndPoint { public: CCyInterruptEndPoint(void); CCyInterruptEndPoint(HANDLE h, PUSB_ENDPOINT_DESCRIPTOR pEndPtDescriptor); CCyInterruptEndPoint(HANDLE h, PUSB_ENDPOINT_DESCRIPTOR pEndPtDescriptor,USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR* SSEndPtDescriptor); PUCHAR BeginDataXfer(PUCHAR buf, LONG len, OVERLAPPED *ov); }; /******************************************************************************** * * The Interface Class * ********************************************************************************/ class CCyUSBInterface { public: CCyUSBEndPoint *EndPoints[MAX_ENDPTS]; /* Holds pointers to all the interface's endpoints, plus a pointer to the Control endpoint zero */ UCHAR bLength; UCHAR bDescriptorType; UCHAR bInterfaceNumber; UCHAR bAlternateSetting; UCHAR bNumEndpoints; /* Not counting the control endpoint */ UCHAR bInterfaceClass; UCHAR bInterfaceSubClass; UCHAR bInterfaceProtocol; UCHAR iInterface; UCHAR bAltSettings; USHORT wTotalLength; /* Needed in case Intfc has additional (non-endpt) descriptors */ CCyUSBInterface(HANDLE handle, PUSB_INTERFACE_DESCRIPTOR pIntfcDescriptor,UCHAR usb30Dummy); CCyUSBInterface(HANDLE h, PUSB_INTERFACE_DESCRIPTOR pIntfcDescriptor); CCyUSBInterface(CCyUSBInterface& ifc); /* Copy Constructor */ ~CCyUSBInterface(void); }; /******************************************************************************** * * The Config Class * ********************************************************************************/ class CCyUSBConfig { public: CCyUSBInterface *Interfaces[MAX_INTERFACES]; UCHAR bLength; UCHAR bDescriptorType; USHORT wTotalLength; UCHAR bNumInterfaces; UCHAR bConfigurationValue; UCHAR iConfiguration; UCHAR bmAttributes; UCHAR MaxPower; UCHAR AltInterfaces; CCyUSBConfig(void); CCyUSBConfig(CCyUSBConfig& cfg); /* Copy Constructor */ CCyUSBConfig(HANDLE h, PUSB_CONFIGURATION_DESCRIPTOR pConfigDescr); CCyUSBConfig(HANDLE h, PUSB_CONFIGURATION_DESCRIPTOR pConfigDescr,UCHAR usb30Dummy); ~CCyUSBConfig(void); }; /******************************************************************************** * * The Bos USB20 Extesnion Class * ********************************************************************************/ class CCyBosUSB20Extesnion { public: UCHAR bLength; /* Descriptor length */ UCHAR bDescriptorType; /* Descriptor Type */ UCHAR bDevCapabilityType; /* Device capability type */ UINT bmAttribute; /* Bitmap encoding for supprted feature and Link power managment supprted if set */ CCyBosUSB20Extesnion(void); CCyBosUSB20Extesnion(HANDLE h,PUSB_BOS_USB20_DEVICE_EXTENSION BosUsb20ExtDesc); }; /******************************************************************************** * * The Bos SuperSpeed Capability Class * ********************************************************************************/ class CCyBosSuperSpeedCapability { public: UCHAR bLength; UCHAR bDescriptorType; UCHAR bDevCapabilityType; UCHAR bmAttribute; USHORT SpeedsSuported; UCHAR bFunctionalitySupporte; UCHAR bU1DevExitLat; USHORT bU2DevExitLat; CCyBosSuperSpeedCapability(void); CCyBosSuperSpeedCapability(HANDLE h,PUSB_BOS_SS_DEVICE_CAPABILITY pUSB_SuperSpeedUsb); }; /******************************************************************************** * * The Bos Container ID Class * ********************************************************************************/ class CCyBosContainerID { public: UCHAR bLength; /* Descriptor length */ UCHAR bDescriptorType; /* Descriptor Type */ UCHAR bDevCapabilityType; /* Device capability type */ UCHAR bReserved; /* no use */ UCHAR ContainerID[USB_BOS_CAPABILITY_TYPE_CONTAINER_ID_SIZE]; /* UUID */ CCyBosContainerID(void); CCyBosContainerID(HANDLE h,PUSB_BOS_CONTAINER_ID pContainerID); }; /******************************************************************************** * * The USB BOS Class * ********************************************************************************/ class CCyUSBBOS { public: CCyBosContainerID *pContainer_ID; CCyBosUSB20Extesnion *pUSB20_DeviceExt; CCyBosSuperSpeedCapability *pSS_DeviceCap; UCHAR bLength; /* Descriptor length */ UCHAR bDescriptorType; /* Descriptor Type */ USHORT wTotalLength; /* Total length of descriptor ( icluding device capabilty */ UCHAR bNumDeviceCaps; /* Number of device capability descriptors in BOS */ CCyUSBBOS(void); CCyUSBBOS(HANDLE h,PUSB_BOS_DESCRIPTOR pBosDescrData); ~CCyUSBBOS(); }; /********************************************************************************* * * The USB Device Class - This is the main class that contains members of all the * other classes. * * To use the library, create an instance of this Class and call it's Open method. * *********************************************************************************/ class CCyUSBDevice { /* The public members are accessible (i.e. corruptible) by the user of the library * Algorithms of the class don't rely on any public members. Instead, they use the * private members of the class for their calculations. */ public: CCyUSBDevice(HANDLE hnd = NULL, GUID guid = CYUSBDRV_GUID, BOOL bOpen = true); ~CCyUSBDevice(void); CCyUSBEndPoint **EndPoints; /* Shortcut to USBCfgs[CfgNum]->Interfaces[IntfcIndex]->Endpoints */ CCyUSBEndPoint *EndPointOf(UCHAR addr); CCyUSBBOS *UsbBos; CCyIsocEndPoint *IsocInEndPt; CCyIsocEndPoint *IsocOutEndPt; CCyBulkEndPoint *BulkInEndPt; CCyBulkEndPoint *BulkOutEndPt; CCyControlEndPoint *ControlEndPt; CCyInterruptEndPoint *InterruptInEndPt; CCyInterruptEndPoint *InterruptOutEndPt; USHORT StrLangID; ULONG LastError; ULONG UsbdStatus; ULONG NtStatus; ULONG DriverVersion; ULONG USBDIVersion; char DeviceName[USB_STRING_MAXLEN]; char FriendlyName[USB_STRING_MAXLEN]; wchar_t Manufacturer[USB_STRING_MAXLEN]; wchar_t Product[USB_STRING_MAXLEN]; wchar_t SerialNumber[USB_STRING_MAXLEN]; CHAR DevPath[USB_STRING_MAXLEN]; USHORT BcdUSB; USHORT VendorID; USHORT ProductID; UCHAR USBAddress; UCHAR DevClass; UCHAR DevSubClass; UCHAR DevProtocol; INT MaxPacketSize; USHORT BcdDevice; UCHAR ConfigValue; UCHAR ConfigAttrib; UCHAR MaxPower; UCHAR IntfcClass; UCHAR IntfcSubClass; UCHAR IntfcProtocol; bool bHighSpeed; bool bSuperSpeed; DWORD BytesXfered; UCHAR DeviceCount(void); UCHAR ConfigCount(void); UCHAR IntfcCount(void); UCHAR AltIntfcCount(void); UCHAR EndPointCount(void); void SetConfig(UCHAR cfg); UCHAR Config(void) { return CfgNum; } /* Normally 0 */ UCHAR Interface(void) { return IntfcNum; } /* Usually 0 */ /* No SetInterface method since only 1 intfc per device (per Windows) */ UCHAR AltIntfc(void); bool SetAltIntfc(UCHAR alt); GUID DriverGUID(void) { return DrvGuid; } HANDLE DeviceHandle(void) { return hDevice; } void UsbdStatusString(ULONG stat, PCHAR s); bool CreateHandle(UCHAR dev); void DestroyHandle(); bool Open(UCHAR dev); void Close(void); bool Reset(void); bool ReConnect(void); bool Suspend(void); bool Resume(void); bool IsOpen(void) { return (hDevice != INVALID_HANDLE_VALUE); } UCHAR PowerState(void); bool GetBosDescriptor(PUSB_BOS_DESCRIPTOR descr); bool GetBosUSB20DeviceExtensionDescriptor(PUSB_BOS_USB20_DEVICE_EXTENSION descr); bool GetBosContainedIDDescriptor(PUSB_BOS_CONTAINER_ID descr); bool GetBosSSCapabilityDescriptor(PUSB_BOS_SS_DEVICE_CAPABILITY descr); void GetDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR descr); void GetConfigDescriptor(PUSB_CONFIGURATION_DESCRIPTOR descr); void GetIntfcDescriptor(PUSB_INTERFACE_DESCRIPTOR descr); CCyUSBConfig GetUSBConfig(int index); private: USB_DEVICE_DESCRIPTOR USBDeviceDescriptor; PUSB_CONFIGURATION_DESCRIPTOR USBConfigDescriptors[2]; PUSB_BOS_DESCRIPTOR pUsbBosDescriptor; CCyUSBConfig *USBCfgs[2]; HANDLE hWnd; HANDLE hDevice; HANDLE hDevNotification; HANDLE hHndNotification; GUID DrvGuid; UCHAR Devices; UCHAR Interfaces; UCHAR AltInterfaces; UCHAR Configs; UCHAR DevNum; UCHAR CfgNum; UCHAR IntfcNum; /* The current selected interface's bInterfaceNumber */ UCHAR IntfcIndex; /* The entry in the Config's interfaces table matching to IntfcNum and AltSetting */ bool GetInternalBosDescriptor(); void GetDevDescriptor(void); void GetCfgDescriptor(int descIndex); void GetString(wchar_t *s, UCHAR sIndex); void SetStringDescrLanguage(void); void SetAltIntfcParams(UCHAR alt); bool IoControl(ULONG cmd, PUCHAR buf, ULONG len); void SetEndPointPtrs(void); void GetDeviceName(void); void GetFriendlyName(void); void GetDriverVer(void); void GetUSBDIVer(void); void GetSpeed(void); void GetUSBAddress(void); //void CloseEndPtHandles(void); bool RegisterForPnpEvents(HANDLE h); }; /******************************************************************************** * * The FX3 Device Class * ********************************************************************************/ class CCyFX3Device: public CCyUSBDevice { public: CCyFX3Device(void); ~CCyFX3Device(void); bool IsBootLoaderRunning(); FX3_FWDWNLOAD_ERROR_CODE DownloadFw(char *fileName, FX3_FWDWNLOAD_MEDIA_TYPE enMediaType); private: bool Ep0VendorCommand(vendorCmdData cmdData); bool SetProgramEntry(UCHAR opCode,UINT start_addr); bool DownloadBufferToDevice(UINT start_addr, USHORT count, UCHAR *data_buf, UCHAR opCode); bool UploadBufferFromDevice(UINT start_addr, USHORT count, UCHAR *data_buf, UCHAR opCode); FX3_FWDWNLOAD_ERROR_CODE DownloadFwToRam(PUCHAR buffer_p, UINT fw_size, UCHAR opCode); FX3_FWDWNLOAD_ERROR_CODE DownloadUserIMGtoI2CE2PROM(PUCHAR buffer_p, UINT fw_size, UCHAR opCode); FX3_FWDWNLOAD_ERROR_CODE DownloadUserIMGtoSPIFLASH(PUCHAR buffer_p, UINT fw_size, UCHAR opCode); FX3_FWDWNLOAD_ERROR_CODE EraseSectorOfSPIFlash(UINT SectorNumber, UCHAR opCode); bool WriteToSPIFlash(PUCHAR Buf, UINT buflen, UINT ByteAddress, UCHAR opCode); }; /********************************************************************************/ #endif