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 DEVICE_RESET = 0xFF 53 } USB_OPERATION_CODE; 54 55 #pragma pack(1) 56 57 typedef struct { 58 BYTE ucOperCode; 59 BYTE ucReserved; 60 DWORD dwAddress; 61 BYTE ucReserved2; 62 USHORT usLength; 63 BYTE ucReserved3[7]; 64 } CBWCB, *PCBWCB; 65 66 typedef struct { 67 DWORD dwCBWSignature; 68 DWORD dwCBWTag; 69 DWORD dwCBWTransferLength; 70 BYTE ucCBWFlags; 71 BYTE ucCBWLUN; 72 BYTE ucCBWCBLength; 73 CBWCB cbwcb; 74 } CBW, *PCBW; 75 76 typedef struct { 77 DWORD dwCSWSignature; 78 DWORD dwCSWTag; 79 DWORD dwCBWDataResidue; 80 BYTE ucCSWStatus; 81 } CSW, *PCSW; 82 83 #pragma pack() 84 #define CMD_TIMEOUT 0 85 #define CBW_SIGN 0x43425355 /* "USBC" */ 86 #define CSW_SIGN 0x53425355 /* "USBS" */ 87 88 #define DIRECTION_OUT 0x00 89 #define DIRECTION_IN 0x80 90 #define MAX_TEST_BLOCKS 512 91 #define MAX_ERASE_BLOCKS 128 92 #define MAX_CLEAR_LEN 16*1024 93 94 #ifndef ERR_SUCCESS 95 #define ERR_SUCCESS 0 96 #endif 97 #define ERR_DEVICE_READY 0 98 #define ERR_DEVICE_OPEN_FAILED -1 99 #define ERR_CSW_OPEN_FAILED -2 100 #define ERR_DEVICE_WRITE_FAILED -3 101 #define ERR_DEVICE_READ_FAILED -4 102 #define ERR_CMD_NOTMATCH -5 103 #define ERR_DEVICE_UNREADY -6 104 #define ERR_FOUND_BAD_BLOCK -7 105 #define ERR_FAILED -8 106 #define ERR_CROSS_BORDER -9 107 #define ERR_DEVICE_NOT_SUPPORT -10 108 #define ERR_REQUEST_NOT_SUPPORT -11 109 #define ERR_REQUEST_FAIL -12 110 #define ERR_BUFFER_NOT_ENOUGH -13 111 #define UFI_CHECK_SIGN(cbw, csw) ((CSW_SIGN == (csw).dwCSWSignature) && ((csw).dwCSWTag == (cbw).dwCBWTag)) 112 113 class CRKLog; 114 class CRKComm 115 { 116 public: 117 virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType) = 0; 118 virtual int RKU_ReadChipInfo(BYTE *lpBuffer) = 0; 119 virtual int RKU_ReadFlashID(BYTE *lpBuffer) = 0; 120 virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL) = 0; 121 virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0; 122 virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE) = 0; 123 virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE) = 0; 124 virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0; 125 virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0; 126 virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize) = 0; 127 virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc) = 0; 128 virtual bool Reset_Usb_Device() = 0; 129 virtual int RKU_EraseLBA(DWORD dwPos,DWORD dwCount)=0; 130 CRKComm(CRKLog *pLog); 131 virtual ~CRKComm(); 132 protected: 133 STRUCT_RKDEVICE_DESC m_deviceDesc; 134 CRKLog *m_log; 135 private: 136 virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize) = 0; 137 virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize) = 0; 138 }; 139 class CRKUsbComm:public CRKComm 140 { 141 public: 142 virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType); 143 virtual int RKU_ReadChipInfo(BYTE *lpBuffer); 144 virtual int RKU_ReadFlashID(BYTE *lpBuffer); 145 virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL); 146 virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE); 147 virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE); 148 virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE); 149 virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE); 150 virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer); 151 virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize); 152 CRKUsbComm(STRUCT_RKDEVICE_DESC devDesc, CRKLog *pLog, bool &bRet); 153 virtual ~CRKUsbComm(); 154 virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc); 155 virtual bool Reset_Usb_Device(); 156 virtual int RKU_EraseLBA(DWORD dwPos,DWORD dwCount); 157 private: 158 void *m_pUsbHandle; 159 unsigned char m_pipeBulkIn; 160 unsigned char m_pipeBulkOut; 161 int m_interfaceNum; 162 virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize); 163 virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize); 164 bool InitializeUsb(STRUCT_RKDEVICE_DESC devDesc); 165 void UninitializeUsb(); 166 bool RKU_ClearBuffer(CBW &cbw, CSW &csw); 167 DWORD RKU_Read_EX(BYTE *lpBuffer, DWORD dwSize); 168 void InitializeCBW(PCBW pCBW, USB_OPERATION_CODE code); 169 int RandomInteger(int low, int high); 170 DWORD MakeCBWTag(); 171 }; 172 173 #endif