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