xref: /rkdeveloptool/RKComm.h (revision 76af099afcbcafd97801028de2ba3421d3c12865)
1*76af099aSliuyi #ifndef RKCOMM_HEADER
2*76af099aSliuyi #define RKCOMM_HEADER
3*76af099aSliuyi #include "DefineHeader.h"
4*76af099aSliuyi typedef enum {
5*76af099aSliuyi 		USB_BULK_READ = 0,
6*76af099aSliuyi 		USB_BULK_WRITE,
7*76af099aSliuyi 		USB_CONTROL,
8*76af099aSliuyi } USB_ACCESS_TYPE;
9*76af099aSliuyi typedef enum {
10*76af099aSliuyi 	TU_NONE_SUBCODE = 0,
11*76af099aSliuyi 	TU_ERASESYSTEM_SUBCODE = 0xFE,
12*76af099aSliuyi 	TU_LOWERFORMAT_SUBCODE = 0xFD,
13*76af099aSliuyi 	TU_ERASEUSERDATA_SUBCODE = 0xFB,
14*76af099aSliuyi 	TU_GETUSERSECTOR_SUBCODE = 0xF9
15*76af099aSliuyi } TESTUNIT_SUBCODE;
16*76af099aSliuyi typedef enum{
17*76af099aSliuyi 	RST_NONE_SUBCODE = 0,
18*76af099aSliuyi 	RST_RESETMSC_SUBCODE,
19*76af099aSliuyi 	RST_POWEROFF_SUBCODE,
20*76af099aSliuyi 	RST_RESETMASKROM_SUBCODE,
21*76af099aSliuyi 	RST_DISCONNECTRESET_SUBCODE
22*76af099aSliuyi } RESET_SUBCODE;
23*76af099aSliuyi typedef enum{
24*76af099aSliuyi 	RWMETHOD_IMAGE = 0,
25*76af099aSliuyi 	RWMETHOD_LBA
26*76af099aSliuyi } RW_SUBCODE;
27*76af099aSliuyi 
28*76af099aSliuyi typedef enum {
29*76af099aSliuyi 		TEST_UNIT_READY = 0,
30*76af099aSliuyi 		READ_FLASH_ID = 0x01,
31*76af099aSliuyi 		TEST_BAD_BLOCK = 0x03,
32*76af099aSliuyi 		READ_SECTOR = 0x04,
33*76af099aSliuyi 		WRITE_SECTOR = 0x05,
34*76af099aSliuyi 		ERASE_NORMAL = 0x06,
35*76af099aSliuyi 		ERASE_FORCE = 0x0B,
36*76af099aSliuyi 		READ_LBA = 0x14,
37*76af099aSliuyi 		WRITE_LBA = 0x15,
38*76af099aSliuyi 		ERASE_SYSTEMDISK = 0x16,
39*76af099aSliuyi 		READ_SDRAM = 0x17,
40*76af099aSliuyi 		WRITE_SDRAM = 0x18,
41*76af099aSliuyi 		EXECUTE_SDRAM = 0x19,
42*76af099aSliuyi 		READ_FLASH_INFO = 0x1A,
43*76af099aSliuyi 		READ_CHIP_INFO = 0x1B,
44*76af099aSliuyi 		SET_RESET_FLAG = 0x1E,
45*76af099aSliuyi 		WRITE_EFUSE = 0x1F,
46*76af099aSliuyi 		READ_EFUSE = 0x20,
47*76af099aSliuyi 		READ_SPI_FLASH = 0x21,
48*76af099aSliuyi 		WRITE_SPI_FLASH = 0x22,
49*76af099aSliuyi 		WRITE_NEW_EFUSE = 0x23,
50*76af099aSliuyi 		READ_NEW_EFUSE = 0x24,
51*76af099aSliuyi 		DEVICE_RESET = 0xFF
52*76af099aSliuyi } USB_OPERATION_CODE;
53*76af099aSliuyi 
54*76af099aSliuyi #pragma pack(1)
55*76af099aSliuyi 
56*76af099aSliuyi typedef struct {
57*76af099aSliuyi 	BYTE	ucOperCode;
58*76af099aSliuyi 	BYTE	ucReserved;
59*76af099aSliuyi 	DWORD	dwAddress;
60*76af099aSliuyi 	BYTE	ucReserved2;
61*76af099aSliuyi 	USHORT	usLength;
62*76af099aSliuyi 	BYTE	ucReserved3[7];
63*76af099aSliuyi } CBWCB, *PCBWCB;
64*76af099aSliuyi 
65*76af099aSliuyi typedef struct {
66*76af099aSliuyi 	DWORD	dwCBWSignature;
67*76af099aSliuyi 	DWORD	dwCBWTag;
68*76af099aSliuyi 	DWORD	dwCBWTransferLength;
69*76af099aSliuyi 	BYTE	ucCBWFlags;
70*76af099aSliuyi 	BYTE	ucCBWLUN;
71*76af099aSliuyi 	BYTE	ucCBWCBLength;
72*76af099aSliuyi 	CBWCB	cbwcb;
73*76af099aSliuyi } CBW, *PCBW;
74*76af099aSliuyi 
75*76af099aSliuyi typedef struct {
76*76af099aSliuyi 	DWORD	dwCSWSignature;
77*76af099aSliuyi 	DWORD	dwCSWTag;
78*76af099aSliuyi 	DWORD	dwCBWDataResidue;
79*76af099aSliuyi 	BYTE	ucCSWStatus;
80*76af099aSliuyi } CSW, *PCSW;
81*76af099aSliuyi 
82*76af099aSliuyi #pragma pack()
83*76af099aSliuyi #define CMD_TIMEOUT 0
84*76af099aSliuyi #define CBW_SIGN			0x43425355	/* "USBC" */
85*76af099aSliuyi #define CSW_SIGN			0x53425355	/* "USBS" */
86*76af099aSliuyi 
87*76af099aSliuyi #define DIRECTION_OUT		0x00
88*76af099aSliuyi #define DIRECTION_IN		0x80
89*76af099aSliuyi #define MAX_TEST_BLOCKS		512
90*76af099aSliuyi #define MAX_ERASE_BLOCKS	128
91*76af099aSliuyi #define  MAX_CLEAR_LEN	16*1024
92*76af099aSliuyi 
93*76af099aSliuyi #ifndef ERR_SUCCESS
94*76af099aSliuyi #define ERR_SUCCESS		0
95*76af099aSliuyi #endif
96*76af099aSliuyi #define ERR_DEVICE_READY		0
97*76af099aSliuyi #define ERR_DEVICE_OPEN_FAILED	-1
98*76af099aSliuyi #define ERR_CSW_OPEN_FAILED		-2
99*76af099aSliuyi #define ERR_DEVICE_WRITE_FAILED	-3
100*76af099aSliuyi #define ERR_DEVICE_READ_FAILED	-4
101*76af099aSliuyi #define ERR_CMD_NOTMATCH		-5
102*76af099aSliuyi #define ERR_DEVICE_UNREADY		-6
103*76af099aSliuyi #define ERR_FOUND_BAD_BLOCK		-7
104*76af099aSliuyi #define ERR_FAILED				-8
105*76af099aSliuyi #define ERR_CROSS_BORDER		-9
106*76af099aSliuyi #define ERR_DEVICE_NOT_SUPPORT  -10
107*76af099aSliuyi #define ERR_REQUEST_NOT_SUPPORT  -11
108*76af099aSliuyi #define ERR_REQUEST_FAIL		-12
109*76af099aSliuyi #define ERR_BUFFER_NOT_ENOUGH   -13
110*76af099aSliuyi #define UFI_CHECK_SIGN(cbw, csw) ((CSW_SIGN == (csw).dwCSWSignature) && ((csw).dwCSWTag == (cbw).dwCBWTag))
111*76af099aSliuyi 
112*76af099aSliuyi class CRKLog;
113*76af099aSliuyi class CRKComm
114*76af099aSliuyi {
115*76af099aSliuyi public:
116*76af099aSliuyi 	virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType) = 0;
117*76af099aSliuyi 	virtual int RKU_ReadChipInfo(BYTE *lpBuffer) = 0;
118*76af099aSliuyi 	virtual int RKU_ReadFlashID(BYTE *lpBuffer) = 0;
119*76af099aSliuyi 	virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL) = 0;
120*76af099aSliuyi 	virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0;
121*76af099aSliuyi 	virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE) = 0;
122*76af099aSliuyi 	virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE) = 0;
123*76af099aSliuyi 	virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0;
124*76af099aSliuyi 	virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0;
125*76af099aSliuyi     virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize) = 0;
126*76af099aSliuyi 	virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc) = 0;
127*76af099aSliuyi 	virtual bool Reset_Usb_Device() = 0;
128*76af099aSliuyi 	CRKComm(CRKLog *pLog);
129*76af099aSliuyi 	virtual ~CRKComm();
130*76af099aSliuyi protected:
131*76af099aSliuyi 	STRUCT_RKDEVICE_DESC m_deviceDesc;
132*76af099aSliuyi 	CRKLog *m_log;
133*76af099aSliuyi private:
134*76af099aSliuyi 	virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize) = 0;
135*76af099aSliuyi 	virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize) = 0;
136*76af099aSliuyi };
137*76af099aSliuyi class CRKUsbComm:public CRKComm
138*76af099aSliuyi {
139*76af099aSliuyi public:
140*76af099aSliuyi 	virtual	int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType);
141*76af099aSliuyi 	virtual int RKU_ReadChipInfo(BYTE *lpBuffer);
142*76af099aSliuyi 	virtual int RKU_ReadFlashID(BYTE *lpBuffer);
143*76af099aSliuyi 	virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL);
144*76af099aSliuyi 	virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE);
145*76af099aSliuyi 	virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE);
146*76af099aSliuyi 	virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE);
147*76af099aSliuyi 	virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE);
148*76af099aSliuyi 	virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer);
149*76af099aSliuyi     virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize);
150*76af099aSliuyi 	CRKUsbComm(STRUCT_RKDEVICE_DESC devDesc, CRKLog *pLog, bool &bRet);
151*76af099aSliuyi 	virtual ~CRKUsbComm();
152*76af099aSliuyi     virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc);
153*76af099aSliuyi 	virtual bool Reset_Usb_Device();
154*76af099aSliuyi private:
155*76af099aSliuyi 	void *m_pUsbHandle;
156*76af099aSliuyi 	unsigned char m_pipeBulkIn;
157*76af099aSliuyi 	unsigned char m_pipeBulkOut;
158*76af099aSliuyi 	int m_interfaceNum;
159*76af099aSliuyi 	virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize);
160*76af099aSliuyi 	virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize);
161*76af099aSliuyi 	bool InitializeUsb(STRUCT_RKDEVICE_DESC devDesc);
162*76af099aSliuyi 	void UninitializeUsb();
163*76af099aSliuyi 	bool RKU_ClearBuffer(CBW &cbw, CSW &csw);
164*76af099aSliuyi 	DWORD RKU_Read_EX(BYTE *lpBuffer, DWORD dwSize);
165*76af099aSliuyi 	void InitializeCBW(PCBW pCBW, USB_OPERATION_CODE code);
166*76af099aSliuyi 	int RandomInteger(int low, int high);
167*76af099aSliuyi 	DWORD MakeCBWTag();
168*76af099aSliuyi };
169*76af099aSliuyi 
170*76af099aSliuyi #endif