xref: /OK3568_Linux_fs/external/rkupdate/RKDevice.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #ifndef RKDEVICE_HEADER
2*4882a593Smuzhiyun #define RKDEVICE_HEADER
3*4882a593Smuzhiyun #include "RKImage.h"
4*4882a593Smuzhiyun #include "RKComm.h"
5*4882a593Smuzhiyun #include "RKLog.h"
6*4882a593Smuzhiyun #include "DefineHeader.h"
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #define RK28_SEC3_RESERVED_LEN 419
11*4882a593Smuzhiyun #define RKANDROID_SEC3_RESERVED_LEN 419
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define RK28_SEC2_RESERVED_LEN 473
14*4882a593Smuzhiyun #define RKANDROID_SEC2_RESERVED_LEN 473
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define RKDEVICE_CUSTOMDATA_LEN 512
18*4882a593Smuzhiyun #define RKDEVICE_SN_LEN 30
19*4882a593Smuzhiyun #define RKDEVICE_UID_LEN 30
20*4882a593Smuzhiyun #define RKDEVICE_MAC_LEN 6
21*4882a593Smuzhiyun #define RKDEVICE_BT_LEN 6
22*4882a593Smuzhiyun #define RKDEVICE_IMEI_LEN 15
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define SECTOR_SIZE 512
25*4882a593Smuzhiyun #define SPARE_SIZE 16
26*4882a593Smuzhiyun #define IDB_BLOCKS 5
27*4882a593Smuzhiyun #define CHIPINFO_LEN 16
28*4882a593Smuzhiyun #define IDBLOCK_TOP 50
29*4882a593Smuzhiyun #define WBBUFFER_BOTTOM 5
30*4882a593Smuzhiyun #define WBBUFFER_TOP 10
31*4882a593Smuzhiyun #define CALC_UNIT(a, b)     ((a>0)?((a-1)/b+1):(a))
32*4882a593Smuzhiyun #define BYTE2SECTOR(x)      (CALC_UNIT(x, SECTOR_SIZE))
33*4882a593Smuzhiyun #define PAGEALIGN(x)        (CALC_UNIT(x, 4))
34*4882a593Smuzhiyun //#define MAX_TEST_BLOCKS       512
35*4882a593Smuzhiyun //#define MAX_ERASE_BLOCKS  128
36*4882a593Smuzhiyun #define MAX_WRITE_SECTOR    16
37*4882a593Smuzhiyun #define IOCTL_TRANSFER_SIZE     4096
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define CRC_TAG "CRC"
40*4882a593Smuzhiyun #pragma pack(1)
41*4882a593Smuzhiyun typedef struct _STRUCT_FLASH_INFO
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun     tchar   szManufacturerName[16];
44*4882a593Smuzhiyun     UINT    uiFlashSize;  //MB
45*4882a593Smuzhiyun     USHORT  usBlockSize;//KB
46*4882a593Smuzhiyun     UINT    uiPageSize;   //KB
47*4882a593Smuzhiyun     UINT    uiSectorPerBlock;
48*4882a593Smuzhiyun     BYTE    blockState[IDBLOCK_TOP];
49*4882a593Smuzhiyun     UINT    uiBlockNum;
50*4882a593Smuzhiyun     BYTE    bECCBits;
51*4882a593Smuzhiyun     BYTE    bAccessTime;  //���η���Flash�ļ��ʱ��
52*4882a593Smuzhiyun     BYTE    bFlashCS;  // FlashƬѡ(FlashƬѡ������1��������0)
53*4882a593Smuzhiyun     USHORT  usValidSecPerBlock;//ÿ�����ʹ�õ�������=���С/ҳ��С*4
54*4882a593Smuzhiyun     USHORT  usPhyBlokcPerIDB;//ÿ��IDBlockռ�õ����������
55*4882a593Smuzhiyun     UINT    uiSecNumPerIDB;//ÿ��IDBlockռ�õ�������
56*4882a593Smuzhiyun } STRUCT_FLASH_INFO, *PSTRUCT_FLASH_INFO;
57*4882a593Smuzhiyun typedef struct _STRUCT_FLASHINFO_CMD
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun     UINT    uiFlashSize;    // Flash��С����SectorΪ��λ��
60*4882a593Smuzhiyun     USHORT  usBlockSize;    // �����Block��С����SectorΪ��λ��
61*4882a593Smuzhiyun     BYTE    bPageSize;      // �����Page��С����SectorΪ��λ��
62*4882a593Smuzhiyun     BYTE    bECCBits;       // 8/14
63*4882a593Smuzhiyun     BYTE    bAccessTime;    // ���η���Flash�ļ��ʱ��
64*4882a593Smuzhiyun     BYTE    bManufCode;     // ����ʶ����
65*4882a593Smuzhiyun     BYTE    bFlashCS;       // FlashƬѡ(��FlashƬѡ���ڣ�����Ӧ��Bit��1��������0)
66*4882a593Smuzhiyun     BYTE    reserved[501];
67*4882a593Smuzhiyun } STRUCT_FLASHINFO_CMD, *PSTRUCT_FLASHINFO_CMD;
68*4882a593Smuzhiyun typedef struct
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun     BYTE bFlashCS;
71*4882a593Smuzhiyun     UINT uiBlockNum;
72*4882a593Smuzhiyun     USHORT usBlockStateSize;
73*4882a593Smuzhiyun     PBYTE pBlockStateData;
74*4882a593Smuzhiyun } STRUCT_BLOCK_STATE, *PSTRUCT_BLOCK_STATE;
75*4882a593Smuzhiyun #pragma pack()
76*4882a593Smuzhiyun typedef struct
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun     USHORT usVid;
79*4882a593Smuzhiyun     USHORT usPid;
80*4882a593Smuzhiyun } STRUCT_DEVICE_PROP;
81*4882a593Smuzhiyun typedef vector<STRUCT_DEVICE_PROP> DEVICE_PROP_SET;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun class CRKDevice
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun public:
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun     ENUM_OS_TYPE GetOsType();
88*4882a593Smuzhiyun     void SetOsType(ENUM_OS_TYPE value);
89*4882a593Smuzhiyun     property<CRKDevice, ENUM_OS_TYPE, READ_WRITE> OsType;
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun     void SetUid(PBYTE value);
92*4882a593Smuzhiyun     property<CRKDevice, PBYTE, WRITE_ONLY> Uid;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun     void SetPrepareEraseFlag(bool value);
95*4882a593Smuzhiyun     property<CRKDevice, bool, WRITE_ONLY> PrepareEraseFlag;
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun     void SetWorkFlow(UINT value);
98*4882a593Smuzhiyun     property<CRKDevice, UINT, WRITE_ONLY> WorkFlow;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun     void SetMiscModifyFlag(ENUM_MISC_MODIFY_FLAG value);
101*4882a593Smuzhiyun     property<CRKDevice, ENUM_MISC_MODIFY_FLAG, WRITE_ONLY> MiscModifyFlag;
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun     CRKLog *GetLogObjectPointer();
104*4882a593Smuzhiyun     property<CRKDevice, CRKLog *, READ_ONLY> LogObjectPointer;
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun     CRKComm *GetCommObjectPointer();
107*4882a593Smuzhiyun     property<CRKDevice, CRKComm *, READ_ONLY> CommObjectPointer;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun     virtual int DownloadIDBlock() = 0;
110*4882a593Smuzhiyun     virtual int DownloadImage() = 0;
111*4882a593Smuzhiyun     virtual int PrepareIDB() = 0;
112*4882a593Smuzhiyun     virtual bool BufferWriteBack() = 0;
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun     bool CheckChip();
116*4882a593Smuzhiyun     bool GetFlashInfo();
117*4882a593Smuzhiyun     virtual int EraseIDB() = 0;
118*4882a593Smuzhiyun     virtual int EraseAllBlocks() = 0;
119*4882a593Smuzhiyun     bool SetObject(CRKImage *pImage, CRKComm *pComm, CRKLog *pLog);
120*4882a593Smuzhiyun     CRKDevice(STRUCT_RKDEVICE_DESC &device);
121*4882a593Smuzhiyun     virtual ~CRKDevice();
122*4882a593Smuzhiyun protected:
123*4882a593Smuzhiyun     STRUCT_FLASH_INFO m_flashInfo;
124*4882a593Smuzhiyun     PBYTE   m_pFlashInfoData;
125*4882a593Smuzhiyun     USHORT  m_usFlashInfoDataOffset;
126*4882a593Smuzhiyun     USHORT  m_usFlashInfoDataLen;
127*4882a593Smuzhiyun     DWORD m_idBlockOffset[IDB_BLOCKS];
128*4882a593Smuzhiyun     PBYTE  m_chipData;
129*4882a593Smuzhiyun     CRKImage *m_pImage;
130*4882a593Smuzhiyun     CRKComm  *m_pComm;
131*4882a593Smuzhiyun     CRKLog   *m_pLog;
132*4882a593Smuzhiyun     PBYTE  m_customData;
133*4882a593Smuzhiyun     USHORT m_customDataSize;
134*4882a593Smuzhiyun     USHORT m_customDataOffset;
135*4882a593Smuzhiyun     PBYTE  m_sn;
136*4882a593Smuzhiyun     BYTE   m_snSize;
137*4882a593Smuzhiyun     PBYTE  m_mac;
138*4882a593Smuzhiyun     PBYTE  m_blueTooth;
139*4882a593Smuzhiyun     PBYTE  m_uid;
140*4882a593Smuzhiyun     PBYTE  m_imei;
141*4882a593Smuzhiyun     USHORT m_sysDiskSize;
142*4882a593Smuzhiyun     USHORT m_cfgDiskSize;
143*4882a593Smuzhiyun     bool   m_bGetNewDiskSizeFlag;
144*4882a593Smuzhiyun     bool   m_bExistSector3Crc;
145*4882a593Smuzhiyun     USHORT m_usSector3Crc;
146*4882a593Smuzhiyun     USHORT m_usWriteBackCrc;
147*4882a593Smuzhiyun     USHORT m_usWriteBackCustomDataOffset;
148*4882a593Smuzhiyun     USHORT m_usWriteBackCustomDataSize;
149*4882a593Smuzhiyun     PSTRUCT_BLOCK_STATE m_pBlockState;
150*4882a593Smuzhiyun     BYTE   m_backupBuffer[SECTOR_SIZE + SPARE_SIZE];
151*4882a593Smuzhiyun     bool m_bWriteBack;
152*4882a593Smuzhiyun     UINT m_uiWorkFlow;
153*4882a593Smuzhiyun     bool m_bEraseInPrepare;
154*4882a593Smuzhiyun     bool m_bUidUseFlag;
155*4882a593Smuzhiyun     bool m_bUidWriteOK;
156*4882a593Smuzhiyun     bool  m_remallocDisk;
157*4882a593Smuzhiyun     bool m_bEmmc;
158*4882a593Smuzhiyun     bool GptFlag;
159*4882a593Smuzhiyun     bool DirectLBA;
160*4882a593Smuzhiyun     bool First4Access;
161*4882a593Smuzhiyun     ENUM_MISC_MODIFY_FLAG m_emMiscModifyFlag;
162*4882a593Smuzhiyun     bool m_bQuickCheckMode;
163*4882a593Smuzhiyun     bool BuildBlockStateMap(BYTE bFlashCS);
164*4882a593Smuzhiyun     int ReadMutilSector(DWORD dwPos, DWORD dwCount, PBYTE lpBuffer);
165*4882a593Smuzhiyun     bool EraseMutilBlock(BYTE bFlashCS, DWORD dwPos, DWORD dwCount, bool bForce);
166*4882a593Smuzhiyun     CHAR FindValidBlocks(char bBegin, char bLen);
167*4882a593Smuzhiyun     BYTE RandomByte(BYTE bLowLimit, BYTE bHighLimit);
168*4882a593Smuzhiyun     bool CheckCrc16(PBYTE pCheckData, USHORT usDataLength, USHORT usOldCrc);
169*4882a593Smuzhiyun     bool CheckUid(BYTE uidSize, BYTE *pUid);
170*4882a593Smuzhiyun     bool GetWriteBackData(UINT uiIDBCount, PBYTE lpBuf);
171*4882a593Smuzhiyun     bool GetIDBData(UINT uiIDBCount, PBYTE lpBuf, UINT uiSecCount);
172*4882a593Smuzhiyun     int EraseEmmcBlock(UCHAR ucFlashCS, DWORD dwPos, DWORD dwCount);
173*4882a593Smuzhiyun     virtual bool FindBackupBuffer() = 0;
174*4882a593Smuzhiyun     virtual char FindAllIDB() = 0;
175*4882a593Smuzhiyun     virtual CHAR FindIDBlock(char pos, char &IDBlockPos) = 0;
176*4882a593Smuzhiyun     virtual bool ReserveIDBlock(char iBlockIndex = 0, char iIdblockPos = 0) = 0;
177*4882a593Smuzhiyun     virtual bool OffsetIDBlock(char pos) = 0;
178*4882a593Smuzhiyun     virtual bool MakeSector0(PBYTE pSector) = 0;
179*4882a593Smuzhiyun     virtual void MakeSector1(PBYTE pSector) = 0;
180*4882a593Smuzhiyun     virtual bool MakeSector2(PBYTE pSector) = 0;
181*4882a593Smuzhiyun     virtual bool MakeSector3(PBYTE pSector) = 0;
182*4882a593Smuzhiyun     virtual int MakeIDBlockData(PBYTE lpIDBlock) = 0;
183*4882a593Smuzhiyun     virtual bool MakeSpareData(PBYTE lpIDBlock, DWORD dwSectorNum, PBYTE lpSpareBuffer) = 0;
184*4882a593Smuzhiyun     virtual int WriteIDBlock(PBYTE lpIDBlock, DWORD dwSectorNum, bool bErase) = 0;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun private:
187*4882a593Smuzhiyun     ENUM_RKDEVICE_TYPE m_device;
188*4882a593Smuzhiyun     ENUM_OS_TYPE m_os;
189*4882a593Smuzhiyun     ENUM_RKUSB_TYPE m_usb;
190*4882a593Smuzhiyun     USHORT m_bcdUsb;
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun USHORT UshortToBCD(USHORT num);
194*4882a593Smuzhiyun BYTE   ByteToBCD(BYTE num);
195*4882a593Smuzhiyun extern USHORT CRC_16(BYTE *aData, UINT aSize);
196*4882a593Smuzhiyun extern UINT CRC_32(PBYTE pData, UINT ulSize, UINT uiPreviousValue = 0);
197*4882a593Smuzhiyun extern void P_RC4(BYTE *buf, USHORT len);
198*4882a593Smuzhiyun extern void bch_encode(BYTE *encode_in, BYTE *encode_out);
199*4882a593Smuzhiyun extern USHORT CRC_CCITT(UCHAR *p, UINT CalculateNumber);
200*4882a593Smuzhiyun extern void generate_gf();
201*4882a593Smuzhiyun extern void gen_poly();
202*4882a593Smuzhiyun #endif
203