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