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