176af099aSliuyi #ifndef RKCOMM_HEADER 276af099aSliuyi #define RKCOMM_HEADER 376af099aSliuyi #include "DefineHeader.h" 476af099aSliuyi typedef enum { 576af099aSliuyi USB_BULK_READ = 0, 676af099aSliuyi USB_BULK_WRITE, 776af099aSliuyi USB_CONTROL, 876af099aSliuyi } USB_ACCESS_TYPE; 976af099aSliuyi typedef enum { 1076af099aSliuyi TU_NONE_SUBCODE = 0, 1176af099aSliuyi TU_ERASESYSTEM_SUBCODE = 0xFE, 1276af099aSliuyi TU_LOWERFORMAT_SUBCODE = 0xFD, 1376af099aSliuyi TU_ERASEUSERDATA_SUBCODE = 0xFB, 1476af099aSliuyi TU_GETUSERSECTOR_SUBCODE = 0xF9 1576af099aSliuyi } TESTUNIT_SUBCODE; 1676af099aSliuyi typedef enum{ 1776af099aSliuyi RST_NONE_SUBCODE = 0, 1876af099aSliuyi RST_RESETMSC_SUBCODE, 1976af099aSliuyi RST_POWEROFF_SUBCODE, 2076af099aSliuyi RST_RESETMASKROM_SUBCODE, 2176af099aSliuyi RST_DISCONNECTRESET_SUBCODE 2276af099aSliuyi } RESET_SUBCODE; 2376af099aSliuyi typedef enum{ 2476af099aSliuyi RWMETHOD_IMAGE = 0, 2576af099aSliuyi RWMETHOD_LBA 2676af099aSliuyi } RW_SUBCODE; 2776af099aSliuyi 2876af099aSliuyi typedef enum { 2976af099aSliuyi TEST_UNIT_READY = 0, 3076af099aSliuyi READ_FLASH_ID = 0x01, 3176af099aSliuyi TEST_BAD_BLOCK = 0x03, 3276af099aSliuyi READ_SECTOR = 0x04, 3376af099aSliuyi WRITE_SECTOR = 0x05, 3476af099aSliuyi ERASE_NORMAL = 0x06, 3576af099aSliuyi ERASE_FORCE = 0x0B, 3676af099aSliuyi READ_LBA = 0x14, 3776af099aSliuyi WRITE_LBA = 0x15, 3876af099aSliuyi ERASE_SYSTEMDISK = 0x16, 3976af099aSliuyi READ_SDRAM = 0x17, 4076af099aSliuyi WRITE_SDRAM = 0x18, 4176af099aSliuyi EXECUTE_SDRAM = 0x19, 4276af099aSliuyi READ_FLASH_INFO = 0x1A, 4376af099aSliuyi READ_CHIP_INFO = 0x1B, 4476af099aSliuyi SET_RESET_FLAG = 0x1E, 4576af099aSliuyi WRITE_EFUSE = 0x1F, 4676af099aSliuyi READ_EFUSE = 0x20, 4776af099aSliuyi READ_SPI_FLASH = 0x21, 4876af099aSliuyi WRITE_SPI_FLASH = 0x22, 4976af099aSliuyi WRITE_NEW_EFUSE = 0x23, 5076af099aSliuyi READ_NEW_EFUSE = 0x24, 51c29e5f0fSliuyi ERASE_LBA=0x25, 52081d237aSliuyi READ_CAPABILITY=0xAA, 5376af099aSliuyi DEVICE_RESET = 0xFF 5476af099aSliuyi } USB_OPERATION_CODE; 5576af099aSliuyi 5676af099aSliuyi #pragma pack(1) 5776af099aSliuyi 5876af099aSliuyi typedef struct { 5976af099aSliuyi BYTE ucOperCode; 6076af099aSliuyi BYTE ucReserved; 6176af099aSliuyi DWORD dwAddress; 6276af099aSliuyi BYTE ucReserved2; 6376af099aSliuyi USHORT usLength; 6476af099aSliuyi BYTE ucReserved3[7]; 6576af099aSliuyi } CBWCB, *PCBWCB; 6676af099aSliuyi 6776af099aSliuyi typedef struct { 6876af099aSliuyi DWORD dwCBWSignature; 6976af099aSliuyi DWORD dwCBWTag; 7076af099aSliuyi DWORD dwCBWTransferLength; 7176af099aSliuyi BYTE ucCBWFlags; 7276af099aSliuyi BYTE ucCBWLUN; 7376af099aSliuyi BYTE ucCBWCBLength; 7476af099aSliuyi CBWCB cbwcb; 7576af099aSliuyi } CBW, *PCBW; 7676af099aSliuyi 7776af099aSliuyi typedef struct { 7876af099aSliuyi DWORD dwCSWSignature; 7976af099aSliuyi DWORD dwCSWTag; 8076af099aSliuyi DWORD dwCBWDataResidue; 8176af099aSliuyi BYTE ucCSWStatus; 8276af099aSliuyi } CSW, *PCSW; 8376af099aSliuyi 8476af099aSliuyi #pragma pack() 8576af099aSliuyi #define CMD_TIMEOUT 0 8676af099aSliuyi #define CBW_SIGN 0x43425355 /* "USBC" */ 8776af099aSliuyi #define CSW_SIGN 0x53425355 /* "USBS" */ 8876af099aSliuyi 8976af099aSliuyi #define DIRECTION_OUT 0x00 9076af099aSliuyi #define DIRECTION_IN 0x80 9176af099aSliuyi #define MAX_TEST_BLOCKS 512 92*0dcb0a4cSliuyi #define MAX_ERASE_BLOCKS 16 9376af099aSliuyi #define MAX_CLEAR_LEN 16*1024 9476af099aSliuyi 9576af099aSliuyi #ifndef ERR_SUCCESS 9676af099aSliuyi #define ERR_SUCCESS 0 9776af099aSliuyi #endif 9876af099aSliuyi #define ERR_DEVICE_READY 0 9976af099aSliuyi #define ERR_DEVICE_OPEN_FAILED -1 10076af099aSliuyi #define ERR_CSW_OPEN_FAILED -2 10176af099aSliuyi #define ERR_DEVICE_WRITE_FAILED -3 10276af099aSliuyi #define ERR_DEVICE_READ_FAILED -4 10376af099aSliuyi #define ERR_CMD_NOTMATCH -5 10476af099aSliuyi #define ERR_DEVICE_UNREADY -6 10576af099aSliuyi #define ERR_FOUND_BAD_BLOCK -7 10676af099aSliuyi #define ERR_FAILED -8 10776af099aSliuyi #define ERR_CROSS_BORDER -9 10876af099aSliuyi #define ERR_DEVICE_NOT_SUPPORT -10 10976af099aSliuyi #define ERR_REQUEST_NOT_SUPPORT -11 11076af099aSliuyi #define ERR_REQUEST_FAIL -12 11176af099aSliuyi #define ERR_BUFFER_NOT_ENOUGH -13 11276af099aSliuyi #define UFI_CHECK_SIGN(cbw, csw) ((CSW_SIGN == (csw).dwCSWSignature) && ((csw).dwCSWTag == (cbw).dwCBWTag)) 11376af099aSliuyi 11476af099aSliuyi class CRKLog; 11576af099aSliuyi class CRKComm 11676af099aSliuyi { 11776af099aSliuyi public: 11876af099aSliuyi virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType) = 0; 11976af099aSliuyi virtual int RKU_ReadChipInfo(BYTE *lpBuffer) = 0; 12076af099aSliuyi virtual int RKU_ReadFlashID(BYTE *lpBuffer) = 0; 121081d237aSliuyi virtual int RKU_ReadCapability(BYTE *lpBuffer)=0; 12276af099aSliuyi virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL) = 0; 12376af099aSliuyi virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0; 12476af099aSliuyi virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE) = 0; 12576af099aSliuyi virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE) = 0; 12676af099aSliuyi virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0; 12776af099aSliuyi virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0; 12876af099aSliuyi virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize) = 0; 12976af099aSliuyi virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc) = 0; 13076af099aSliuyi virtual bool Reset_Usb_Device() = 0; 131c29e5f0fSliuyi virtual int RKU_EraseLBA(DWORD dwPos,DWORD dwCount)=0; 13276af099aSliuyi CRKComm(CRKLog *pLog); 13376af099aSliuyi virtual ~CRKComm(); 13476af099aSliuyi protected: 13576af099aSliuyi STRUCT_RKDEVICE_DESC m_deviceDesc; 13676af099aSliuyi CRKLog *m_log; 13776af099aSliuyi private: 13876af099aSliuyi virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize) = 0; 13976af099aSliuyi virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize) = 0; 14076af099aSliuyi }; 14176af099aSliuyi class CRKUsbComm:public CRKComm 14276af099aSliuyi { 14376af099aSliuyi public: 14476af099aSliuyi virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType); 14576af099aSliuyi virtual int RKU_ReadChipInfo(BYTE *lpBuffer); 14676af099aSliuyi virtual int RKU_ReadFlashID(BYTE *lpBuffer); 147081d237aSliuyi virtual int RKU_ReadCapability(BYTE *lpBuffer); 14876af099aSliuyi virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL); 14976af099aSliuyi virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE); 15076af099aSliuyi virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE); 15176af099aSliuyi virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE); 15276af099aSliuyi virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE); 15376af099aSliuyi virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer); 15476af099aSliuyi virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize); 15576af099aSliuyi CRKUsbComm(STRUCT_RKDEVICE_DESC devDesc, CRKLog *pLog, bool &bRet); 15676af099aSliuyi virtual ~CRKUsbComm(); 15776af099aSliuyi virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc); 15876af099aSliuyi virtual bool Reset_Usb_Device(); 159c29e5f0fSliuyi virtual int RKU_EraseLBA(DWORD dwPos,DWORD dwCount); 16076af099aSliuyi private: 16176af099aSliuyi void *m_pUsbHandle; 16276af099aSliuyi unsigned char m_pipeBulkIn; 16376af099aSliuyi unsigned char m_pipeBulkOut; 16476af099aSliuyi int m_interfaceNum; 16576af099aSliuyi virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize); 16676af099aSliuyi virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize); 16776af099aSliuyi bool InitializeUsb(STRUCT_RKDEVICE_DESC devDesc); 16876af099aSliuyi void UninitializeUsb(); 16976af099aSliuyi bool RKU_ClearBuffer(CBW &cbw, CSW &csw); 17076af099aSliuyi DWORD RKU_Read_EX(BYTE *lpBuffer, DWORD dwSize); 17176af099aSliuyi void InitializeCBW(PCBW pCBW, USB_OPERATION_CODE code); 17276af099aSliuyi int RandomInteger(int low, int high); 17376af099aSliuyi DWORD MakeCBWTag(); 17476af099aSliuyi }; 17576af099aSliuyi 17676af099aSliuyi #endif