mirror of
https://github.com/sharkcz/rkdeveloptool.git
synced 2024-11-22 14:06:47 +01:00
170 lines
5.1 KiB
C
170 lines
5.1 KiB
C
|
#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,
|
||
|
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;
|
||
|
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();
|
||
|
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
|