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