xref: /rkdeveloptool/RKComm.h (revision 5b7562f2de7374e1e6d47cfc37120a2d9cd243f1)
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