xref: /OK3568_Linux_fs/external/rkupdate/RKComm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #ifndef RKCOMM_HEADER
2*4882a593Smuzhiyun #define RKCOMM_HEADER
3*4882a593Smuzhiyun #include "DefineHeader.h"
4*4882a593Smuzhiyun typedef enum
5*4882a593Smuzhiyun {
6*4882a593Smuzhiyun     USB_BULK_READ = 0,
7*4882a593Smuzhiyun     USB_BULK_WRITE,
8*4882a593Smuzhiyun     USB_CONTROL,
9*4882a593Smuzhiyun } USB_ACCESS_TYPE;
10*4882a593Smuzhiyun typedef enum
11*4882a593Smuzhiyun {
12*4882a593Smuzhiyun     TU_NONE_SUBCODE = 0,
13*4882a593Smuzhiyun     TU_ERASESYSTEM_SUBCODE = 0xFE,
14*4882a593Smuzhiyun     TU_LOWERFORMAT_SUBCODE = 0xFD,
15*4882a593Smuzhiyun     TU_ERASEUSERDATA_SUBCODE = 0xFB,
16*4882a593Smuzhiyun     TU_GETUSERSECTOR_SUBCODE = 0xF9
17*4882a593Smuzhiyun } TESTUNIT_SUBCODE;
18*4882a593Smuzhiyun typedef enum
19*4882a593Smuzhiyun {
20*4882a593Smuzhiyun     RST_NONE_SUBCODE = 0,
21*4882a593Smuzhiyun     RST_RESETMSC_SUBCODE,
22*4882a593Smuzhiyun     RST_POWEROFF_SUBCODE,
23*4882a593Smuzhiyun     RST_RESETMASKROM_SUBCODE,
24*4882a593Smuzhiyun     RST_DISCONNECTRESET_SUBCODE
25*4882a593Smuzhiyun } RESET_SUBCODE;
26*4882a593Smuzhiyun typedef enum
27*4882a593Smuzhiyun {
28*4882a593Smuzhiyun     RWMETHOD_IMAGE = 0,
29*4882a593Smuzhiyun     RWMETHOD_LBA,
30*4882a593Smuzhiyun } RW_SUBCODE;
31*4882a593Smuzhiyun /* ���� */
32*4882a593Smuzhiyun typedef enum
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun     TEST_UNIT_READY = 0,
35*4882a593Smuzhiyun     READ_FLASH_ID = 0x01,
36*4882a593Smuzhiyun     TEST_BAD_BLOCK = 0x03,
37*4882a593Smuzhiyun     READ_SECTOR = 0x04,
38*4882a593Smuzhiyun     WRITE_SECTOR = 0x05,
39*4882a593Smuzhiyun     ERASE_NORMAL = 0x06,
40*4882a593Smuzhiyun     ERASE_FORCE = 0x0B,
41*4882a593Smuzhiyun     READ_LBA = 0x14,
42*4882a593Smuzhiyun     WRITE_LBA = 0x15,
43*4882a593Smuzhiyun     ERASE_SYSTEMDISK = 0x16,
44*4882a593Smuzhiyun     READ_SDRAM = 0x17,
45*4882a593Smuzhiyun     WRITE_SDRAM = 0x18,
46*4882a593Smuzhiyun     EXECUTE_SDRAM = 0x19,
47*4882a593Smuzhiyun     READ_FLASH_INFO = 0x1A,
48*4882a593Smuzhiyun     READ_CHIP_INFO = 0x1B,
49*4882a593Smuzhiyun     SET_RESET_FLAG = 0x1E,
50*4882a593Smuzhiyun     WRITE_EFUSE = 0x1F,
51*4882a593Smuzhiyun     READ_EFUSE = 0x20,
52*4882a593Smuzhiyun     READ_SPI_FLASH = 0x21,
53*4882a593Smuzhiyun     WRITE_SPI_FLASH = 0x22,
54*4882a593Smuzhiyun     SWITCH_MASKROM = 0xFE,
55*4882a593Smuzhiyun     DEVICE_RESET = 0xFF
56*4882a593Smuzhiyun } USB_OPERATION_CODE;
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #pragma pack(1)
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun typedef struct
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun     BYTE    ucOperCode;
63*4882a593Smuzhiyun     BYTE    ucReserved;
64*4882a593Smuzhiyun     DWORD   dwAddress;
65*4882a593Smuzhiyun     BYTE    ucReserved2;
66*4882a593Smuzhiyun     USHORT  usLength;
67*4882a593Smuzhiyun     BYTE    ucReserved3[7];
68*4882a593Smuzhiyun } CBWCB, *PCBWCB;
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun typedef struct
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun     DWORD   dwCBWSignature;
73*4882a593Smuzhiyun     DWORD   dwCBWTag;
74*4882a593Smuzhiyun     DWORD   dwCBWTransferLength;
75*4882a593Smuzhiyun     BYTE    ucCBWFlags;
76*4882a593Smuzhiyun     BYTE    ucCBWLUN;
77*4882a593Smuzhiyun     BYTE    ucCBWCBLength;
78*4882a593Smuzhiyun     CBWCB   cbwcb;
79*4882a593Smuzhiyun } CBW, *PCBW;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun typedef struct
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun     DWORD   dwCSWSignature;
84*4882a593Smuzhiyun     DWORD   dwCSWTag;
85*4882a593Smuzhiyun     DWORD   dwCBWDataResidue;
86*4882a593Smuzhiyun     BYTE    ucCSWStatus;
87*4882a593Smuzhiyun } CSW, *PCSW;
88*4882a593Smuzhiyun typedef struct
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun     UINT    uiSize;
91*4882a593Smuzhiyun     UINT    uiCrc;
92*4882a593Smuzhiyun     UINT    uiBlock[5];
93*4882a593Smuzhiyun } STRUCT_END_WRITE_SECTOR, *PSTRUCT_END_WRITE_SECTOR;
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #pragma pack()
96*4882a593Smuzhiyun #define NAND_DRIVER_DEV "/dev/rknand_sys_storage"
97*4882a593Smuzhiyun #define NAND_DRIVER_DEV_VENDOR "/dev/rknand_sys_storage"
98*4882a593Smuzhiyun #define NAND_DRIVER_DEV_LBA "/dev/rkflash0"
99*4882a593Smuzhiyun #define EMMC_DRIVER_DEV "/dev/rknand_sys_storage"
100*4882a593Smuzhiyun #define EMMC_DRIVER_DEV_VENDOR "/dev/vendor_storage"
101*4882a593Smuzhiyun //#define EMMC_DRIVER_DEV_LBA "/dev/block/mmcblk0"
102*4882a593Smuzhiyun #define EMMC_DRIVER_DEV_LBA "/dev/mmcblk0"
103*4882a593Smuzhiyun #define EMMC_POINT_NAME "emmc_point_name"
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun #define READ_SECTOR_IO          _IOW('r', READ_SECTOR, unsigned int)
106*4882a593Smuzhiyun #define WRITE_SECTOR_IO         _IOW('r', WRITE_SECTOR, unsigned int)
107*4882a593Smuzhiyun #define READ_LBA_IO             _IOW('r', READ_LBA, unsigned int)
108*4882a593Smuzhiyun #define WRITE_LBA_IO            _IOW('r', WRITE_LBA, unsigned int)
109*4882a593Smuzhiyun #define START_WRITE_SECTOR_IO   _IOW('r', 0x51, unsigned int)
110*4882a593Smuzhiyun #define END_WRITE_SECTOR_IO     _IOW('r', 0x52, unsigned int)
111*4882a593Smuzhiyun #define GET_FLASH_INFO_IO       _IOW('r', READ_FLASH_INFO, unsigned int)
112*4882a593Smuzhiyun #define GET_BAD_BLOCK_IO        _IOW('r', TEST_BAD_BLOCK, unsigned int)
113*4882a593Smuzhiyun #define GET_LOCK_FLAG_IO        _IOW('r', 0x53, unsigned int)
114*4882a593Smuzhiyun #define GET_PUBLIC_KEY_IO       _IOW('r', 0x54, unsigned int)
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #define DISABLE_NAND_LBA_WRITE_IO  _IO('V',0)
117*4882a593Smuzhiyun #define ENABLE_NAND_LBA_WRITE_IO   _IO('V',1)
118*4882a593Smuzhiyun #define DISABLE_NAND_LBA_READ_IO   _IO('V',2)
119*4882a593Smuzhiyun #define ENABLE_NAND_LBA_READ_IO    _IO('V',3)
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun #define CMD_TIMEOUT 0
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun #define CBW_SIGN            0x43425355  /* "USBC" */
125*4882a593Smuzhiyun #define CSW_SIGN            0x53425355  /* "USBS" */
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun #define DIRECTION_OUT       0x00
129*4882a593Smuzhiyun #define DIRECTION_IN        0x80
130*4882a593Smuzhiyun #define MAX_TEST_BLOCKS     512
131*4882a593Smuzhiyun #define MAX_ERASE_BLOCKS    128
132*4882a593Smuzhiyun #define  MAX_CLEAR_LEN  16*1024
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #ifndef ERR_SUCCESS
135*4882a593Smuzhiyun     #define ERR_SUCCESS     0
136*4882a593Smuzhiyun #endif
137*4882a593Smuzhiyun #define ERR_DEVICE_READY        0
138*4882a593Smuzhiyun #define ERR_DEVICE_OPEN_FAILED  -1
139*4882a593Smuzhiyun #define ERR_CSW_OPEN_FAILED     -2
140*4882a593Smuzhiyun #define ERR_DEVICE_WRITE_FAILED -3
141*4882a593Smuzhiyun #define ERR_DEVICE_READ_FAILED  -4
142*4882a593Smuzhiyun #define ERR_CMD_NOTMATCH        -5
143*4882a593Smuzhiyun #define ERR_DEVICE_UNREADY      -6
144*4882a593Smuzhiyun #define ERR_FOUND_BAD_BLOCK     -7
145*4882a593Smuzhiyun #define ERR_FAILED              -8
146*4882a593Smuzhiyun #define ERR_CROSS_BORDER        -9
147*4882a593Smuzhiyun #define ERR_DEVICE_NOT_SUPPORT  -10
148*4882a593Smuzhiyun #define ERR_REQUEST_NOT_SUPPORT  -11
149*4882a593Smuzhiyun #define ERR_REQUEST_FAIL        -12
150*4882a593Smuzhiyun #define ERR_BUFFER_NOT_ENOUGH   -13
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun #define UFI_CHECK_SIGN(cbw, csw) ((CSW_SIGN == (csw).dwCSWSignature) && ((csw).dwCSWTag == (cbw).dwCBWTag))
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun class CRKLog;
155*4882a593Smuzhiyun class CRKComm
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun public:
158*4882a593Smuzhiyun     virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType) = 0;
159*4882a593Smuzhiyun     virtual int RKU_ReadChipInfo(BYTE *lpBuffer) = 0;
160*4882a593Smuzhiyun     virtual int RKU_ReadFlashID(BYTE *lpBuffer) = 0;
161*4882a593Smuzhiyun     virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL) = 0;
162*4882a593Smuzhiyun     virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0;
163*4882a593Smuzhiyun     virtual int RKU_ReadSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0;
164*4882a593Smuzhiyun     virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE) = 0;
165*4882a593Smuzhiyun     virtual int RKU_TestBadBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0;
166*4882a593Smuzhiyun     virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE) = 0;
167*4882a593Smuzhiyun     virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0;
168*4882a593Smuzhiyun     virtual int RKU_LoaderWriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0;
169*4882a593Smuzhiyun     virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0;
170*4882a593Smuzhiyun     virtual int RKU_EndWriteSector(BYTE *lpBuffer) = 0;
171*4882a593Smuzhiyun     virtual int RKU_GetLockFlag(BYTE *lpBuffer) = 0;
172*4882a593Smuzhiyun     virtual int RKU_GetPublicKey(BYTE *lpBuffer) = 0;
173*4882a593Smuzhiyun     virtual void RKU_ReopenLBAHandle() = 0;
174*4882a593Smuzhiyun     virtual int RKU_ShowNandLBADevice() = 0;
175*4882a593Smuzhiyun     virtual bool RKU_IsEmmcFlash() = 0;
176*4882a593Smuzhiyun     CRKComm(CRKLog *pLog);
177*4882a593Smuzhiyun     virtual ~CRKComm();
178*4882a593Smuzhiyun protected:
179*4882a593Smuzhiyun     CRKLog *m_log;
180*4882a593Smuzhiyun     bool m_bEmmc;
181*4882a593Smuzhiyun     int m_hDev;
182*4882a593Smuzhiyun     int m_hLbaDev;
183*4882a593Smuzhiyun private:
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun };
186*4882a593Smuzhiyun class CRKUsbComm: public CRKComm
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun public:
189*4882a593Smuzhiyun     virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType);
190*4882a593Smuzhiyun     virtual int RKU_ReadChipInfo(BYTE *lpBuffer);
191*4882a593Smuzhiyun     virtual int RKU_ReadFlashID(BYTE *lpBuffer);
192*4882a593Smuzhiyun     virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL);
193*4882a593Smuzhiyun     virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE);
194*4882a593Smuzhiyun     virtual int RKU_ReadSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer);
195*4882a593Smuzhiyun     virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE);
196*4882a593Smuzhiyun     virtual int RKU_TestBadBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE *lpBuffer);
197*4882a593Smuzhiyun     virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE);
198*4882a593Smuzhiyun     virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE);
199*4882a593Smuzhiyun     virtual int RKU_LoaderWriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE);
200*4882a593Smuzhiyun     virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer);
201*4882a593Smuzhiyun     virtual int RKU_EndWriteSector(BYTE *lpBuffer);
202*4882a593Smuzhiyun     virtual int RKU_GetLockFlag(BYTE *lpBuffer);
203*4882a593Smuzhiyun     virtual int RKU_GetPublicKey(BYTE *lpBuffer);
204*4882a593Smuzhiyun     virtual void RKU_ReopenLBAHandle();
205*4882a593Smuzhiyun     virtual int RKU_ShowNandLBADevice();
206*4882a593Smuzhiyun     virtual bool RKU_IsEmmcFlash();
207*4882a593Smuzhiyun     CRKUsbComm(CRKLog *pLog);
208*4882a593Smuzhiyun     ~CRKUsbComm();
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun protected:
211*4882a593Smuzhiyun     STRUCT_RKDEVICE_DESC m_deviceDesc;
212*4882a593Smuzhiyun     CRKLog *m_log;
213*4882a593Smuzhiyun private:
214*4882a593Smuzhiyun     bool CtrlNandLbaWrite(bool bEnable = true);
215*4882a593Smuzhiyun     bool CtrlNandLbaRead(bool bEnable = true);
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun };
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun #endif
220