1*76af099aSliuyi #ifndef RKCOMM_HEADER 2*76af099aSliuyi #define RKCOMM_HEADER 3*76af099aSliuyi #include "DefineHeader.h" 4*76af099aSliuyi typedef enum { 5*76af099aSliuyi USB_BULK_READ = 0, 6*76af099aSliuyi USB_BULK_WRITE, 7*76af099aSliuyi USB_CONTROL, 8*76af099aSliuyi } USB_ACCESS_TYPE; 9*76af099aSliuyi typedef enum { 10*76af099aSliuyi TU_NONE_SUBCODE = 0, 11*76af099aSliuyi TU_ERASESYSTEM_SUBCODE = 0xFE, 12*76af099aSliuyi TU_LOWERFORMAT_SUBCODE = 0xFD, 13*76af099aSliuyi TU_ERASEUSERDATA_SUBCODE = 0xFB, 14*76af099aSliuyi TU_GETUSERSECTOR_SUBCODE = 0xF9 15*76af099aSliuyi } TESTUNIT_SUBCODE; 16*76af099aSliuyi typedef enum{ 17*76af099aSliuyi RST_NONE_SUBCODE = 0, 18*76af099aSliuyi RST_RESETMSC_SUBCODE, 19*76af099aSliuyi RST_POWEROFF_SUBCODE, 20*76af099aSliuyi RST_RESETMASKROM_SUBCODE, 21*76af099aSliuyi RST_DISCONNECTRESET_SUBCODE 22*76af099aSliuyi } RESET_SUBCODE; 23*76af099aSliuyi typedef enum{ 24*76af099aSliuyi RWMETHOD_IMAGE = 0, 25*76af099aSliuyi RWMETHOD_LBA 26*76af099aSliuyi } RW_SUBCODE; 27*76af099aSliuyi 28*76af099aSliuyi typedef enum { 29*76af099aSliuyi TEST_UNIT_READY = 0, 30*76af099aSliuyi READ_FLASH_ID = 0x01, 31*76af099aSliuyi TEST_BAD_BLOCK = 0x03, 32*76af099aSliuyi READ_SECTOR = 0x04, 33*76af099aSliuyi WRITE_SECTOR = 0x05, 34*76af099aSliuyi ERASE_NORMAL = 0x06, 35*76af099aSliuyi ERASE_FORCE = 0x0B, 36*76af099aSliuyi READ_LBA = 0x14, 37*76af099aSliuyi WRITE_LBA = 0x15, 38*76af099aSliuyi ERASE_SYSTEMDISK = 0x16, 39*76af099aSliuyi READ_SDRAM = 0x17, 40*76af099aSliuyi WRITE_SDRAM = 0x18, 41*76af099aSliuyi EXECUTE_SDRAM = 0x19, 42*76af099aSliuyi READ_FLASH_INFO = 0x1A, 43*76af099aSliuyi READ_CHIP_INFO = 0x1B, 44*76af099aSliuyi SET_RESET_FLAG = 0x1E, 45*76af099aSliuyi WRITE_EFUSE = 0x1F, 46*76af099aSliuyi READ_EFUSE = 0x20, 47*76af099aSliuyi READ_SPI_FLASH = 0x21, 48*76af099aSliuyi WRITE_SPI_FLASH = 0x22, 49*76af099aSliuyi WRITE_NEW_EFUSE = 0x23, 50*76af099aSliuyi READ_NEW_EFUSE = 0x24, 51*76af099aSliuyi DEVICE_RESET = 0xFF 52*76af099aSliuyi } USB_OPERATION_CODE; 53*76af099aSliuyi 54*76af099aSliuyi #pragma pack(1) 55*76af099aSliuyi 56*76af099aSliuyi typedef struct { 57*76af099aSliuyi BYTE ucOperCode; 58*76af099aSliuyi BYTE ucReserved; 59*76af099aSliuyi DWORD dwAddress; 60*76af099aSliuyi BYTE ucReserved2; 61*76af099aSliuyi USHORT usLength; 62*76af099aSliuyi BYTE ucReserved3[7]; 63*76af099aSliuyi } CBWCB, *PCBWCB; 64*76af099aSliuyi 65*76af099aSliuyi typedef struct { 66*76af099aSliuyi DWORD dwCBWSignature; 67*76af099aSliuyi DWORD dwCBWTag; 68*76af099aSliuyi DWORD dwCBWTransferLength; 69*76af099aSliuyi BYTE ucCBWFlags; 70*76af099aSliuyi BYTE ucCBWLUN; 71*76af099aSliuyi BYTE ucCBWCBLength; 72*76af099aSliuyi CBWCB cbwcb; 73*76af099aSliuyi } CBW, *PCBW; 74*76af099aSliuyi 75*76af099aSliuyi typedef struct { 76*76af099aSliuyi DWORD dwCSWSignature; 77*76af099aSliuyi DWORD dwCSWTag; 78*76af099aSliuyi DWORD dwCBWDataResidue; 79*76af099aSliuyi BYTE ucCSWStatus; 80*76af099aSliuyi } CSW, *PCSW; 81*76af099aSliuyi 82*76af099aSliuyi #pragma pack() 83*76af099aSliuyi #define CMD_TIMEOUT 0 84*76af099aSliuyi #define CBW_SIGN 0x43425355 /* "USBC" */ 85*76af099aSliuyi #define CSW_SIGN 0x53425355 /* "USBS" */ 86*76af099aSliuyi 87*76af099aSliuyi #define DIRECTION_OUT 0x00 88*76af099aSliuyi #define DIRECTION_IN 0x80 89*76af099aSliuyi #define MAX_TEST_BLOCKS 512 90*76af099aSliuyi #define MAX_ERASE_BLOCKS 128 91*76af099aSliuyi #define MAX_CLEAR_LEN 16*1024 92*76af099aSliuyi 93*76af099aSliuyi #ifndef ERR_SUCCESS 94*76af099aSliuyi #define ERR_SUCCESS 0 95*76af099aSliuyi #endif 96*76af099aSliuyi #define ERR_DEVICE_READY 0 97*76af099aSliuyi #define ERR_DEVICE_OPEN_FAILED -1 98*76af099aSliuyi #define ERR_CSW_OPEN_FAILED -2 99*76af099aSliuyi #define ERR_DEVICE_WRITE_FAILED -3 100*76af099aSliuyi #define ERR_DEVICE_READ_FAILED -4 101*76af099aSliuyi #define ERR_CMD_NOTMATCH -5 102*76af099aSliuyi #define ERR_DEVICE_UNREADY -6 103*76af099aSliuyi #define ERR_FOUND_BAD_BLOCK -7 104*76af099aSliuyi #define ERR_FAILED -8 105*76af099aSliuyi #define ERR_CROSS_BORDER -9 106*76af099aSliuyi #define ERR_DEVICE_NOT_SUPPORT -10 107*76af099aSliuyi #define ERR_REQUEST_NOT_SUPPORT -11 108*76af099aSliuyi #define ERR_REQUEST_FAIL -12 109*76af099aSliuyi #define ERR_BUFFER_NOT_ENOUGH -13 110*76af099aSliuyi #define UFI_CHECK_SIGN(cbw, csw) ((CSW_SIGN == (csw).dwCSWSignature) && ((csw).dwCSWTag == (cbw).dwCBWTag)) 111*76af099aSliuyi 112*76af099aSliuyi class CRKLog; 113*76af099aSliuyi class CRKComm 114*76af099aSliuyi { 115*76af099aSliuyi public: 116*76af099aSliuyi virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType) = 0; 117*76af099aSliuyi virtual int RKU_ReadChipInfo(BYTE *lpBuffer) = 0; 118*76af099aSliuyi virtual int RKU_ReadFlashID(BYTE *lpBuffer) = 0; 119*76af099aSliuyi virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL) = 0; 120*76af099aSliuyi virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0; 121*76af099aSliuyi virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE) = 0; 122*76af099aSliuyi virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE) = 0; 123*76af099aSliuyi virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0; 124*76af099aSliuyi virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0; 125*76af099aSliuyi virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize) = 0; 126*76af099aSliuyi virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc) = 0; 127*76af099aSliuyi virtual bool Reset_Usb_Device() = 0; 128*76af099aSliuyi CRKComm(CRKLog *pLog); 129*76af099aSliuyi virtual ~CRKComm(); 130*76af099aSliuyi protected: 131*76af099aSliuyi STRUCT_RKDEVICE_DESC m_deviceDesc; 132*76af099aSliuyi CRKLog *m_log; 133*76af099aSliuyi private: 134*76af099aSliuyi virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize) = 0; 135*76af099aSliuyi virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize) = 0; 136*76af099aSliuyi }; 137*76af099aSliuyi class CRKUsbComm:public CRKComm 138*76af099aSliuyi { 139*76af099aSliuyi public: 140*76af099aSliuyi virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType); 141*76af099aSliuyi virtual int RKU_ReadChipInfo(BYTE *lpBuffer); 142*76af099aSliuyi virtual int RKU_ReadFlashID(BYTE *lpBuffer); 143*76af099aSliuyi virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL); 144*76af099aSliuyi virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE); 145*76af099aSliuyi virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE); 146*76af099aSliuyi virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE); 147*76af099aSliuyi virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE); 148*76af099aSliuyi virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer); 149*76af099aSliuyi virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize); 150*76af099aSliuyi CRKUsbComm(STRUCT_RKDEVICE_DESC devDesc, CRKLog *pLog, bool &bRet); 151*76af099aSliuyi virtual ~CRKUsbComm(); 152*76af099aSliuyi virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc); 153*76af099aSliuyi virtual bool Reset_Usb_Device(); 154*76af099aSliuyi private: 155*76af099aSliuyi void *m_pUsbHandle; 156*76af099aSliuyi unsigned char m_pipeBulkIn; 157*76af099aSliuyi unsigned char m_pipeBulkOut; 158*76af099aSliuyi int m_interfaceNum; 159*76af099aSliuyi virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize); 160*76af099aSliuyi virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize); 161*76af099aSliuyi bool InitializeUsb(STRUCT_RKDEVICE_DESC devDesc); 162*76af099aSliuyi void UninitializeUsb(); 163*76af099aSliuyi bool RKU_ClearBuffer(CBW &cbw, CSW &csw); 164*76af099aSliuyi DWORD RKU_Read_EX(BYTE *lpBuffer, DWORD dwSize); 165*76af099aSliuyi void InitializeCBW(PCBW pCBW, USB_OPERATION_CODE code); 166*76af099aSliuyi int RandomInteger(int low, int high); 167*76af099aSliuyi DWORD MakeCBWTag(); 168*76af099aSliuyi }; 169*76af099aSliuyi 170*76af099aSliuyi #endif