rkdeveloptool/RKComm.h

173 lines
5.2 KiB
C
Raw Normal View History

#ifndef RKCOMM_HEADER
#define RKCOMM_HEADER
#include "DefineHeader.h"
typedef enum {
USB_BULK_READ = 0,
USB_BULK_WRITE,
USB_CONTROL,
} USB_ACCESS_TYPE;
typedef enum {
TU_NONE_SUBCODE = 0,
TU_ERASESYSTEM_SUBCODE = 0xFE,
TU_LOWERFORMAT_SUBCODE = 0xFD,
TU_ERASEUSERDATA_SUBCODE = 0xFB,
TU_GETUSERSECTOR_SUBCODE = 0xF9
} TESTUNIT_SUBCODE;
typedef enum{
RST_NONE_SUBCODE = 0,
RST_RESETMSC_SUBCODE,
RST_POWEROFF_SUBCODE,
RST_RESETMASKROM_SUBCODE,
RST_DISCONNECTRESET_SUBCODE
} RESET_SUBCODE;
typedef enum{
RWMETHOD_IMAGE = 0,
RWMETHOD_LBA
} RW_SUBCODE;
typedef enum {
TEST_UNIT_READY = 0,
READ_FLASH_ID = 0x01,
TEST_BAD_BLOCK = 0x03,
READ_SECTOR = 0x04,
WRITE_SECTOR = 0x05,
ERASE_NORMAL = 0x06,
ERASE_FORCE = 0x0B,
READ_LBA = 0x14,
WRITE_LBA = 0x15,
ERASE_SYSTEMDISK = 0x16,
READ_SDRAM = 0x17,
WRITE_SDRAM = 0x18,
EXECUTE_SDRAM = 0x19,
READ_FLASH_INFO = 0x1A,
READ_CHIP_INFO = 0x1B,
SET_RESET_FLAG = 0x1E,
WRITE_EFUSE = 0x1F,
READ_EFUSE = 0x20,
READ_SPI_FLASH = 0x21,
WRITE_SPI_FLASH = 0x22,
WRITE_NEW_EFUSE = 0x23,
READ_NEW_EFUSE = 0x24,
ERASE_LBA=0x25,
DEVICE_RESET = 0xFF
} USB_OPERATION_CODE;
#pragma pack(1)
typedef struct {
BYTE ucOperCode;
BYTE ucReserved;
DWORD dwAddress;
BYTE ucReserved2;
USHORT usLength;
BYTE ucReserved3[7];
} CBWCB, *PCBWCB;
typedef struct {
DWORD dwCBWSignature;
DWORD dwCBWTag;
DWORD dwCBWTransferLength;
BYTE ucCBWFlags;
BYTE ucCBWLUN;
BYTE ucCBWCBLength;
CBWCB cbwcb;
} CBW, *PCBW;
typedef struct {
DWORD dwCSWSignature;
DWORD dwCSWTag;
DWORD dwCBWDataResidue;
BYTE ucCSWStatus;
} CSW, *PCSW;
#pragma pack()
#define CMD_TIMEOUT 0
#define CBW_SIGN 0x43425355 /* "USBC" */
#define CSW_SIGN 0x53425355 /* "USBS" */
#define DIRECTION_OUT 0x00
#define DIRECTION_IN 0x80
#define MAX_TEST_BLOCKS 512
#define MAX_ERASE_BLOCKS 128
#define MAX_CLEAR_LEN 16*1024
#ifndef ERR_SUCCESS
#define ERR_SUCCESS 0
#endif
#define ERR_DEVICE_READY 0
#define ERR_DEVICE_OPEN_FAILED -1
#define ERR_CSW_OPEN_FAILED -2
#define ERR_DEVICE_WRITE_FAILED -3
#define ERR_DEVICE_READ_FAILED -4
#define ERR_CMD_NOTMATCH -5
#define ERR_DEVICE_UNREADY -6
#define ERR_FOUND_BAD_BLOCK -7
#define ERR_FAILED -8
#define ERR_CROSS_BORDER -9
#define ERR_DEVICE_NOT_SUPPORT -10
#define ERR_REQUEST_NOT_SUPPORT -11
#define ERR_REQUEST_FAIL -12
#define ERR_BUFFER_NOT_ENOUGH -13
#define UFI_CHECK_SIGN(cbw, csw) ((CSW_SIGN == (csw).dwCSWSignature) && ((csw).dwCSWTag == (cbw).dwCBWTag))
class CRKLog;
class CRKComm
{
public:
virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType) = 0;
virtual int RKU_ReadChipInfo(BYTE *lpBuffer) = 0;
virtual int RKU_ReadFlashID(BYTE *lpBuffer) = 0;
virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL) = 0;
virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0;
virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE) = 0;
virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE) = 0;
virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0;
virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0;
virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize) = 0;
virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc) = 0;
virtual bool Reset_Usb_Device() = 0;
virtual int RKU_EraseLBA(DWORD dwPos,DWORD dwCount)=0;
CRKComm(CRKLog *pLog);
virtual ~CRKComm();
protected:
STRUCT_RKDEVICE_DESC m_deviceDesc;
CRKLog *m_log;
private:
virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize) = 0;
virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize) = 0;
};
class CRKUsbComm:public CRKComm
{
public:
virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType);
virtual int RKU_ReadChipInfo(BYTE *lpBuffer);
virtual int RKU_ReadFlashID(BYTE *lpBuffer);
virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL);
virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE);
virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE);
virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE);
virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE);
virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer);
virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize);
CRKUsbComm(STRUCT_RKDEVICE_DESC devDesc, CRKLog *pLog, bool &bRet);
virtual ~CRKUsbComm();
virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc);
virtual bool Reset_Usb_Device();
virtual int RKU_EraseLBA(DWORD dwPos,DWORD dwCount);
private:
void *m_pUsbHandle;
unsigned char m_pipeBulkIn;
unsigned char m_pipeBulkOut;
int m_interfaceNum;
virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize);
virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize);
bool InitializeUsb(STRUCT_RKDEVICE_DESC devDesc);
void UninitializeUsb();
bool RKU_ClearBuffer(CBW &cbw, CSW &csw);
DWORD RKU_Read_EX(BYTE *lpBuffer, DWORD dwSize);
void InitializeCBW(PCBW pCBW, USB_OPERATION_CODE code);
int RandomInteger(int low, int high);
DWORD MakeCBWTag();
};
#endif