xref: /rkdeveloptool/RKComm.h (revision 304f073752fd25c854e1bcf05d8e7f925b1f4e14)
176af099aSliuyi #ifndef RKCOMM_HEADER
276af099aSliuyi #define RKCOMM_HEADER
376af099aSliuyi #include "DefineHeader.h"
476af099aSliuyi typedef enum {
576af099aSliuyi 		USB_BULK_READ = 0,
676af099aSliuyi 		USB_BULK_WRITE,
776af099aSliuyi 		USB_CONTROL,
876af099aSliuyi } USB_ACCESS_TYPE;
976af099aSliuyi typedef enum {
1076af099aSliuyi 	TU_NONE_SUBCODE = 0,
1176af099aSliuyi 	TU_ERASESYSTEM_SUBCODE = 0xFE,
1276af099aSliuyi 	TU_LOWERFORMAT_SUBCODE = 0xFD,
1376af099aSliuyi 	TU_ERASEUSERDATA_SUBCODE = 0xFB,
1476af099aSliuyi 	TU_GETUSERSECTOR_SUBCODE = 0xF9
1576af099aSliuyi } TESTUNIT_SUBCODE;
1676af099aSliuyi typedef enum{
1776af099aSliuyi 	RST_NONE_SUBCODE = 0,
1876af099aSliuyi 	RST_RESETMSC_SUBCODE,
1976af099aSliuyi 	RST_POWEROFF_SUBCODE,
2076af099aSliuyi 	RST_RESETMASKROM_SUBCODE,
2176af099aSliuyi 	RST_DISCONNECTRESET_SUBCODE
2276af099aSliuyi } RESET_SUBCODE;
2376af099aSliuyi typedef enum{
2476af099aSliuyi 	RWMETHOD_IMAGE = 0,
2576af099aSliuyi 	RWMETHOD_LBA
2676af099aSliuyi } RW_SUBCODE;
2776af099aSliuyi 
2876af099aSliuyi typedef enum {
2976af099aSliuyi 		TEST_UNIT_READY = 0,
3076af099aSliuyi 		READ_FLASH_ID = 0x01,
3176af099aSliuyi 		TEST_BAD_BLOCK = 0x03,
3276af099aSliuyi 		READ_SECTOR = 0x04,
3376af099aSliuyi 		WRITE_SECTOR = 0x05,
3476af099aSliuyi 		ERASE_NORMAL = 0x06,
3576af099aSliuyi 		ERASE_FORCE = 0x0B,
3676af099aSliuyi 		READ_LBA = 0x14,
3776af099aSliuyi 		WRITE_LBA = 0x15,
3876af099aSliuyi 		ERASE_SYSTEMDISK = 0x16,
3976af099aSliuyi 		READ_SDRAM = 0x17,
4076af099aSliuyi 		WRITE_SDRAM = 0x18,
4176af099aSliuyi 		EXECUTE_SDRAM = 0x19,
4276af099aSliuyi 		READ_FLASH_INFO = 0x1A,
4376af099aSliuyi 		READ_CHIP_INFO = 0x1B,
4476af099aSliuyi 		SET_RESET_FLAG = 0x1E,
4576af099aSliuyi 		WRITE_EFUSE = 0x1F,
4676af099aSliuyi 		READ_EFUSE = 0x20,
4776af099aSliuyi 		READ_SPI_FLASH = 0x21,
4876af099aSliuyi 		WRITE_SPI_FLASH = 0x22,
4976af099aSliuyi 		WRITE_NEW_EFUSE = 0x23,
5076af099aSliuyi 		READ_NEW_EFUSE = 0x24,
51c29e5f0fSliuyi 		ERASE_LBA=0x25,
52*554066a0SArnaud Mouiche 		CHANGE_STORAGE = 0x2A,
53*554066a0SArnaud Mouiche 		READ_STORAGE = 0x2B,
54081d237aSliuyi 		READ_CAPABILITY=0xAA,
5576af099aSliuyi 		DEVICE_RESET = 0xFF
5676af099aSliuyi } USB_OPERATION_CODE;
5776af099aSliuyi 
5876af099aSliuyi #pragma pack(1)
5976af099aSliuyi 
6076af099aSliuyi typedef struct {
6176af099aSliuyi 	BYTE	ucOperCode;
6276af099aSliuyi 	BYTE	ucReserved;
6376af099aSliuyi 	DWORD	dwAddress;
6476af099aSliuyi 	BYTE	ucReserved2;
6576af099aSliuyi 	USHORT	usLength;
6676af099aSliuyi 	BYTE	ucReserved3[7];
6776af099aSliuyi } CBWCB, *PCBWCB;
6876af099aSliuyi 
6976af099aSliuyi typedef struct {
7076af099aSliuyi 	DWORD	dwCBWSignature;
7176af099aSliuyi 	DWORD	dwCBWTag;
7276af099aSliuyi 	DWORD	dwCBWTransferLength;
7376af099aSliuyi 	BYTE	ucCBWFlags;
7476af099aSliuyi 	BYTE	ucCBWLUN;
7576af099aSliuyi 	BYTE	ucCBWCBLength;
7676af099aSliuyi 	CBWCB	cbwcb;
7776af099aSliuyi } CBW, *PCBW;
7876af099aSliuyi 
7976af099aSliuyi typedef struct {
8076af099aSliuyi 	DWORD	dwCSWSignature;
8176af099aSliuyi 	DWORD	dwCSWTag;
8276af099aSliuyi 	DWORD	dwCBWDataResidue;
8376af099aSliuyi 	BYTE	ucCSWStatus;
8476af099aSliuyi } CSW, *PCSW;
8576af099aSliuyi 
8676af099aSliuyi #pragma pack()
8776af099aSliuyi #define CMD_TIMEOUT 0
8876af099aSliuyi #define CBW_SIGN			0x43425355	/* "USBC" */
8976af099aSliuyi #define CSW_SIGN			0x53425355	/* "USBS" */
9076af099aSliuyi 
9176af099aSliuyi #define DIRECTION_OUT		0x00
9276af099aSliuyi #define DIRECTION_IN		0x80
9376af099aSliuyi #define MAX_TEST_BLOCKS		512
940dcb0a4cSliuyi #define MAX_ERASE_BLOCKS	16
9576af099aSliuyi #define  MAX_CLEAR_LEN	16*1024
9676af099aSliuyi 
9776af099aSliuyi #ifndef ERR_SUCCESS
9876af099aSliuyi #define ERR_SUCCESS		0
9976af099aSliuyi #endif
10076af099aSliuyi #define ERR_DEVICE_READY		0
10176af099aSliuyi #define ERR_DEVICE_OPEN_FAILED	-1
10276af099aSliuyi #define ERR_CSW_OPEN_FAILED		-2
10376af099aSliuyi #define ERR_DEVICE_WRITE_FAILED	-3
10476af099aSliuyi #define ERR_DEVICE_READ_FAILED	-4
10576af099aSliuyi #define ERR_CMD_NOTMATCH		-5
10676af099aSliuyi #define ERR_DEVICE_UNREADY		-6
10776af099aSliuyi #define ERR_FOUND_BAD_BLOCK		-7
10876af099aSliuyi #define ERR_FAILED				-8
10976af099aSliuyi #define ERR_CROSS_BORDER		-9
11076af099aSliuyi #define ERR_DEVICE_NOT_SUPPORT  -10
11176af099aSliuyi #define ERR_REQUEST_NOT_SUPPORT  -11
11276af099aSliuyi #define ERR_REQUEST_FAIL		-12
11376af099aSliuyi #define ERR_BUFFER_NOT_ENOUGH   -13
11476af099aSliuyi #define UFI_CHECK_SIGN(cbw, csw) ((CSW_SIGN == (csw).dwCSWSignature) && ((csw).dwCSWTag == (cbw).dwCBWTag))
11576af099aSliuyi 
11676af099aSliuyi class CRKLog;
11776af099aSliuyi class CRKComm
11876af099aSliuyi {
11976af099aSliuyi public:
12076af099aSliuyi 	virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType) = 0;
12176af099aSliuyi 	virtual int RKU_ReadChipInfo(BYTE *lpBuffer) = 0;
12276af099aSliuyi 	virtual int RKU_ReadFlashID(BYTE *lpBuffer) = 0;
123081d237aSliuyi 	virtual int RKU_ReadCapability(BYTE *lpBuffer)=0;
12476af099aSliuyi 	virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL) = 0;
12576af099aSliuyi 	virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0;
12676af099aSliuyi 	virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE) = 0;
12776af099aSliuyi 	virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE) = 0;
12876af099aSliuyi 	virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0;
12976af099aSliuyi 	virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0;
13076af099aSliuyi     virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize) = 0;
13176af099aSliuyi 	virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc) = 0;
13276af099aSliuyi 	virtual bool Reset_Usb_Device() = 0;
133c29e5f0fSliuyi 	virtual int RKU_EraseLBA(DWORD dwPos,DWORD dwCount)=0;
13476af099aSliuyi 	CRKComm(CRKLog *pLog);
13576af099aSliuyi 	virtual ~CRKComm();
13676af099aSliuyi protected:
13776af099aSliuyi 	STRUCT_RKDEVICE_DESC m_deviceDesc;
13876af099aSliuyi 	CRKLog *m_log;
13976af099aSliuyi private:
14076af099aSliuyi 	virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize) = 0;
14176af099aSliuyi 	virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize) = 0;
14276af099aSliuyi };
14376af099aSliuyi class CRKUsbComm:public CRKComm
14476af099aSliuyi {
14576af099aSliuyi public:
14676af099aSliuyi 	virtual	int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType);
147*554066a0SArnaud Mouiche 	virtual int RKU_ChangeStorage(BYTE storage);
148*554066a0SArnaud Mouiche 	virtual int RKU_ReadStorage(BYTE *storage);
14976af099aSliuyi 	virtual int RKU_ReadChipInfo(BYTE *lpBuffer);
15076af099aSliuyi 	virtual int RKU_ReadFlashID(BYTE *lpBuffer);
151081d237aSliuyi 	virtual int RKU_ReadCapability(BYTE *lpBuffer);
15276af099aSliuyi 	virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL);
15376af099aSliuyi 	virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE);
15476af099aSliuyi 	virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE);
15576af099aSliuyi 	virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE);
15676af099aSliuyi 	virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE);
15776af099aSliuyi 	virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer);
15876af099aSliuyi     virtual int RKU_DeviceRequest(DWORD dwRequest, BYTE *lpBuffer, DWORD dwDataSize);
15976af099aSliuyi 	CRKUsbComm(STRUCT_RKDEVICE_DESC devDesc, CRKLog *pLog, bool &bRet);
16076af099aSliuyi 	virtual ~CRKUsbComm();
16176af099aSliuyi     virtual bool Reset_Usb_Config(STRUCT_RKDEVICE_DESC devDesc);
16276af099aSliuyi 	virtual bool Reset_Usb_Device();
163c29e5f0fSliuyi 	virtual int RKU_EraseLBA(DWORD dwPos,DWORD dwCount);
16476af099aSliuyi private:
16576af099aSliuyi 	void *m_pUsbHandle;
16676af099aSliuyi 	unsigned char m_pipeBulkIn;
16776af099aSliuyi 	unsigned char m_pipeBulkOut;
16876af099aSliuyi 	int m_interfaceNum;
16976af099aSliuyi 	virtual bool RKU_Write(BYTE *lpBuffer, DWORD dwSize);
17076af099aSliuyi 	virtual bool RKU_Read(BYTE *lpBuffer, DWORD dwSize);
17176af099aSliuyi 	bool InitializeUsb(STRUCT_RKDEVICE_DESC devDesc);
17276af099aSliuyi 	void UninitializeUsb();
17376af099aSliuyi 	bool RKU_ClearBuffer(CBW &cbw, CSW &csw);
17476af099aSliuyi 	DWORD RKU_Read_EX(BYTE *lpBuffer, DWORD dwSize);
17576af099aSliuyi 	void InitializeCBW(PCBW pCBW, USB_OPERATION_CODE code);
17676af099aSliuyi 	int RandomInteger(int low, int high);
17776af099aSliuyi 	DWORD MakeCBWTag();
17876af099aSliuyi };
17976af099aSliuyi 
18076af099aSliuyi #endif