xref: /rkdeveloptool/RKComm.h (revision 304f073752fd25c854e1bcf05d8e7f925b1f4e14)
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 		ERASE_LBA=0x25,
52 		CHANGE_STORAGE = 0x2A,
53 		READ_STORAGE = 0x2B,
54 		READ_CAPABILITY=0xAA,
55 		DEVICE_RESET = 0xFF
56 } USB_OPERATION_CODE;
57 
58 #pragma pack(1)
59 
60 typedef struct {
61 	BYTE	ucOperCode;
62 	BYTE	ucReserved;
63 	DWORD	dwAddress;
64 	BYTE	ucReserved2;
65 	USHORT	usLength;
66 	BYTE	ucReserved3[7];
67 } CBWCB, *PCBWCB;
68 
69 typedef struct {
70 	DWORD	dwCBWSignature;
71 	DWORD	dwCBWTag;
72 	DWORD	dwCBWTransferLength;
73 	BYTE	ucCBWFlags;
74 	BYTE	ucCBWLUN;
75 	BYTE	ucCBWCBLength;
76 	CBWCB	cbwcb;
77 } CBW, *PCBW;
78 
79 typedef struct {
80 	DWORD	dwCSWSignature;
81 	DWORD	dwCSWTag;
82 	DWORD	dwCBWDataResidue;
83 	BYTE	ucCSWStatus;
84 } CSW, *PCSW;
85 
86 #pragma pack()
87 #define CMD_TIMEOUT 0
88 #define CBW_SIGN			0x43425355	/* "USBC" */
89 #define CSW_SIGN			0x53425355	/* "USBS" */
90 
91 #define DIRECTION_OUT		0x00
92 #define DIRECTION_IN		0x80
93 #define MAX_TEST_BLOCKS		512
94 #define MAX_ERASE_BLOCKS	16
95 #define  MAX_CLEAR_LEN	16*1024
96 
97 #ifndef ERR_SUCCESS
98 #define ERR_SUCCESS		0
99 #endif
100 #define ERR_DEVICE_READY		0
101 #define ERR_DEVICE_OPEN_FAILED	-1
102 #define ERR_CSW_OPEN_FAILED		-2
103 #define ERR_DEVICE_WRITE_FAILED	-3
104 #define ERR_DEVICE_READ_FAILED	-4
105 #define ERR_CMD_NOTMATCH		-5
106 #define ERR_DEVICE_UNREADY		-6
107 #define ERR_FOUND_BAD_BLOCK		-7
108 #define ERR_FAILED				-8
109 #define ERR_CROSS_BORDER		-9
110 #define ERR_DEVICE_NOT_SUPPORT  -10
111 #define ERR_REQUEST_NOT_SUPPORT  -11
112 #define ERR_REQUEST_FAIL		-12
113 #define ERR_BUFFER_NOT_ENOUGH   -13
114 #define UFI_CHECK_SIGN(cbw, csw) ((CSW_SIGN == (csw).dwCSWSignature) && ((csw).dwCSWTag == (cbw).dwCBWTag))
115 
116 class CRKLog;
117 class CRKComm
118 {
119 public:
120 	virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType) = 0;
121 	virtual int RKU_ReadChipInfo(BYTE *lpBuffer) = 0;
122 	virtual int RKU_ReadFlashID(BYTE *lpBuffer) = 0;
123 	virtual int RKU_ReadCapability(BYTE *lpBuffer)=0;
124 	virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL) = 0;
125 	virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0;
126 	virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE) = 0;
127 	virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE) = 0;
128 	virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0;
129 	virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0;
130     virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize) = 0;
131 	virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc) = 0;
132 	virtual bool Reset_Usb_Device() = 0;
133 	virtual int RKU_EraseLBA(DWORD dwPos,DWORD dwCount)=0;
134 	CRKComm(CRKLog *pLog);
135 	virtual ~CRKComm();
136 protected:
137 	STRUCT_RKDEVICE_DESC m_deviceDesc;
138 	CRKLog *m_log;
139 private:
140 	virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize) = 0;
141 	virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize) = 0;
142 };
143 class CRKUsbComm:public CRKComm
144 {
145 public:
146 	virtual	int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType);
147 	virtual int RKU_ChangeStorage(BYTE storage);
148 	virtual int RKU_ReadStorage(BYTE *storage);
149 	virtual int RKU_ReadChipInfo(BYTE *lpBuffer);
150 	virtual int RKU_ReadFlashID(BYTE *lpBuffer);
151 	virtual int RKU_ReadCapability(BYTE *lpBuffer);
152 	virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL);
153 	virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE);
154 	virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE);
155 	virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE);
156 	virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE);
157 	virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer);
158     virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize);
159 	CRKUsbComm(STRUCT_RKDEVICE_DESC devDesc, CRKLog *pLog, bool &bRet);
160 	virtual ~CRKUsbComm();
161     virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc);
162 	virtual bool Reset_Usb_Device();
163 	virtual int RKU_EraseLBA(DWORD dwPos,DWORD dwCount);
164 private:
165 	void *m_pUsbHandle;
166 	unsigned char m_pipeBulkIn;
167 	unsigned char m_pipeBulkOut;
168 	int m_interfaceNum;
169 	virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize);
170 	virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize);
171 	bool InitializeUsb(STRUCT_RKDEVICE_DESC devDesc);
172 	void UninitializeUsb();
173 	bool RKU_ClearBuffer(CBW &cbw, CSW &csw);
174 	DWORD RKU_Read_EX(BYTE *lpBuffer, DWORD dwSize);
175 	void InitializeCBW(PCBW pCBW, USB_OPERATION_CODE code);
176 	int RandomInteger(int low, int high);
177 	DWORD MakeCBWTag();
178 };
179 
180 #endif