xref: /OK3568_Linux_fs/external/rkupdate/RKAndroidDevice.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #ifndef RKANDROIDDEVICE_HEADER
2*4882a593Smuzhiyun #define RKANDROIDDEVICE_HEADER
3*4882a593Smuzhiyun #include "RKDevice.h"
4*4882a593Smuzhiyun #include "gpt.h"
5*4882a593Smuzhiyun #pragma pack(1)
6*4882a593Smuzhiyun typedef struct
7*4882a593Smuzhiyun {
8*4882a593Smuzhiyun     DWORD   dwTag;
9*4882a593Smuzhiyun     BYTE    reserved[4];
10*4882a593Smuzhiyun     UINT    uiRc4Flag;
11*4882a593Smuzhiyun     USHORT  usBootCode1Offset;
12*4882a593Smuzhiyun     USHORT  usBootCode2Offset;
13*4882a593Smuzhiyun     BYTE    reserved1[490];
14*4882a593Smuzhiyun     USHORT  usBootDataSize;
15*4882a593Smuzhiyun     USHORT  usBootCodeSize;
16*4882a593Smuzhiyun     USHORT  usCrc;
17*4882a593Smuzhiyun } RKANDROID_IDB_SEC0, *PRKANDROID_IDB_SEC0;
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun typedef struct
20*4882a593Smuzhiyun {
21*4882a593Smuzhiyun     USHORT  usSysReservedBlock;
22*4882a593Smuzhiyun     USHORT  usDisk0Size;
23*4882a593Smuzhiyun     USHORT  usDisk1Size;
24*4882a593Smuzhiyun     USHORT  usDisk2Size;
25*4882a593Smuzhiyun     USHORT  usDisk3Size;
26*4882a593Smuzhiyun     UINT    uiChipTag;
27*4882a593Smuzhiyun     UINT    uiMachineId;
28*4882a593Smuzhiyun     USHORT  usLoaderYear;
29*4882a593Smuzhiyun     USHORT  usLoaderDate;
30*4882a593Smuzhiyun     USHORT  usLoaderVer;
31*4882a593Smuzhiyun     USHORT  usLastLoaderVer;
32*4882a593Smuzhiyun     USHORT  usReadWriteTimes;
33*4882a593Smuzhiyun     DWORD   dwFwVer;
34*4882a593Smuzhiyun     USHORT  usMachineInfoLen;
35*4882a593Smuzhiyun     UCHAR   ucMachineInfo[30];
36*4882a593Smuzhiyun     USHORT  usManufactoryInfoLen;
37*4882a593Smuzhiyun     UCHAR   ucManufactoryInfo[30];
38*4882a593Smuzhiyun     USHORT  usFlashInfoOffset;
39*4882a593Smuzhiyun     USHORT  usFlashInfoLen;
40*4882a593Smuzhiyun     UCHAR   reserved[384];
41*4882a593Smuzhiyun     UINT    uiFlashSize;//��sectorΪ��λ
42*4882a593Smuzhiyun     BYTE    reserved1;
43*4882a593Smuzhiyun     BYTE    bAccessTime;
44*4882a593Smuzhiyun     USHORT  usBlockSize;
45*4882a593Smuzhiyun     BYTE    bPageSize;
46*4882a593Smuzhiyun     BYTE    bECCBits;
47*4882a593Smuzhiyun     BYTE    reserved2[8];
48*4882a593Smuzhiyun     USHORT  usIdBlock0;
49*4882a593Smuzhiyun     USHORT  usIdBlock1;
50*4882a593Smuzhiyun     USHORT  usIdBlock2;
51*4882a593Smuzhiyun     USHORT  usIdBlock3;
52*4882a593Smuzhiyun     USHORT  usIdBlock4;
53*4882a593Smuzhiyun } RKANDROID_IDB_SEC1, *PRKANDROID_IDB_SEC1;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun typedef struct
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun     USHORT  usInfoSize;
58*4882a593Smuzhiyun     BYTE    bChipInfo[CHIPINFO_LEN];
59*4882a593Smuzhiyun     BYTE    reserved[RKANDROID_SEC2_RESERVED_LEN];
60*4882a593Smuzhiyun     char    szVcTag[3];
61*4882a593Smuzhiyun     USHORT  usSec0Crc;
62*4882a593Smuzhiyun     USHORT  usSec1Crc;
63*4882a593Smuzhiyun     UINT    uiBootCodeCrc;
64*4882a593Smuzhiyun     USHORT  usSec3CustomDataOffset;
65*4882a593Smuzhiyun     USHORT  usSec3CustomDataSize;
66*4882a593Smuzhiyun     char    szCrcTag[4];
67*4882a593Smuzhiyun     USHORT  usSec3Crc;
68*4882a593Smuzhiyun } RKANDROID_IDB_SEC2, *PRKANDROID_IDB_SEC2;
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun typedef struct
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun     USHORT  usSNSize;
73*4882a593Smuzhiyun     BYTE    sn[RKDEVICE_SN_LEN];
74*4882a593Smuzhiyun     BYTE    reserved[RKANDROID_SEC3_RESERVED_LEN];
75*4882a593Smuzhiyun     BYTE    imeiSize;
76*4882a593Smuzhiyun     BYTE    imei[RKDEVICE_IMEI_LEN];
77*4882a593Smuzhiyun     BYTE    uidSize;
78*4882a593Smuzhiyun     BYTE    uid[RKDEVICE_UID_LEN];
79*4882a593Smuzhiyun     BYTE    blueToothSize;
80*4882a593Smuzhiyun     BYTE    blueToothAddr[RKDEVICE_BT_LEN];
81*4882a593Smuzhiyun     BYTE    macSize;
82*4882a593Smuzhiyun     BYTE    macAddr[RKDEVICE_MAC_LEN];
83*4882a593Smuzhiyun } RKANDROID_IDB_SEC3, *PRKANDROID_IDB_SEC3;
84*4882a593Smuzhiyun typedef struct
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun     DWORD  dwTag;
87*4882a593Smuzhiyun     USHORT usSnSize;
88*4882a593Smuzhiyun     BYTE   btSnData[RKDEVICE_SN_LEN];
89*4882a593Smuzhiyun     BYTE   btReserve[RKANDROID_SEC3_RESERVED_LEN - 6];
90*4882a593Smuzhiyun     BYTE   btImeiSize;
91*4882a593Smuzhiyun     BYTE   btImeiData[RKDEVICE_IMEI_LEN];
92*4882a593Smuzhiyun     BYTE   btUidSize;
93*4882a593Smuzhiyun     BYTE   btUidData[RKDEVICE_UID_LEN];
94*4882a593Smuzhiyun     BYTE   btBlueToothSize;
95*4882a593Smuzhiyun     BYTE   btBlueToothData[RKDEVICE_BT_LEN];
96*4882a593Smuzhiyun     BYTE   btMacSize;
97*4882a593Smuzhiyun     BYTE   btMacData[RKDEVICE_MAC_LEN];
98*4882a593Smuzhiyun     USHORT usCrc;
99*4882a593Smuzhiyun     BYTE   btSpare[SPARE_SIZE];
100*4882a593Smuzhiyun } STRUCT_RKANDROID_WBBUFFER, *PSTRUCT_RKANDROID_WBBUFFER;
101*4882a593Smuzhiyun const BYTE Wipe_Data[] = {0x72, 0x65, 0x63, 0x6F, 0x76, 0x65,
102*4882a593Smuzhiyun                           0x72, 0x79, 0x0A, 0x2D, 0x2D, 0x77,
103*4882a593Smuzhiyun                           0x69, 0x70, 0x65, 0x5F, 0x64, 0x61, 0x74, 0x61, 0x00
104*4882a593Smuzhiyun                          };
105*4882a593Smuzhiyun const BYTE Wipe_All[] = {0x72, 0x65, 0x63, 0x6F, 0x76, 0x65,
106*4882a593Smuzhiyun                          0x72, 0x79, 0x0A, 0x2D, 0x2D, 0x77,
107*4882a593Smuzhiyun                          0x69, 0x70, 0x65, 0x5F, 0x61, 0x6C, 0x6C, 0x00
108*4882a593Smuzhiyun                         };
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun #define LBA_TRANSFER_SIZE_16K       (16*1024)
111*4882a593Smuzhiyun #define LBA_TRANSFER_SIZE_1M        (1024*1024)
112*4882a593Smuzhiyun #define LBA_LOOP_SIZE               (1024*1024)
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun #define MAX_PACKAGE_FILES           16
115*4882a593Smuzhiyun #define RKIMAGE_TAG             0x46414B52
116*4882a593Smuzhiyun #define PARTNAME_PACKAGE_FILE   "package-file"
117*4882a593Smuzhiyun #define PARTNAME_BOOTLOADER     "bootloader"
118*4882a593Smuzhiyun #define PARTNAME_PARAMETER      "parameter"
119*4882a593Smuzhiyun #define PARTNAME_KERNEL         "kernel"
120*4882a593Smuzhiyun #define PARTNAME_BOOT           "boot"
121*4882a593Smuzhiyun #define PARTNAME_RECOVERY       "recovery"
122*4882a593Smuzhiyun #define PARTNAME_UBOOT          "uboot"
123*4882a593Smuzhiyun #define PARTNAME_SYSTEM         "system"
124*4882a593Smuzhiyun #define PARTNAME_ROOTFS         "rootfs"
125*4882a593Smuzhiyun #define PARTNAME_MISC           "misc"
126*4882a593Smuzhiyun #define PARTNAME_BACKUP         "backup"
127*4882a593Smuzhiyun #define PARTNAME_OEM            "oem"
128*4882a593Smuzhiyun #define PARTNAME_USERDATA       "userdata"
129*4882a593Smuzhiyun #define PARTNAME_USER           "user"
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun #define INCLUDE_LOADER          "bootloader"
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun #define MAX_MANUFACTURER        60
134*4882a593Smuzhiyun #define MAX_MACHINE_INFO        30
135*4882a593Smuzhiyun #define MAX_MACHINE_MODEL       34
136*4882a593Smuzhiyun #define RELATIVE_PATH           60
137*4882a593Smuzhiyun #define PART_NAME               32
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun #define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
140*4882a593Smuzhiyun typedef struct
141*4882a593Smuzhiyun {
142*4882a593Smuzhiyun     char name[PART_NAME];// ��������
143*4882a593Smuzhiyun     char file[RELATIVE_PATH];// ���·��������ȡ�ļ�ʱ�õ�
144*4882a593Smuzhiyun     unsigned int part_size;//����ռ��������
145*4882a593Smuzhiyun     unsigned int offset;// �ļ���Image�е�ƫ��
146*4882a593Smuzhiyun     unsigned int flash_offset;// ��д��Flash�е�λ��(��sectorΪ��λ)
147*4882a593Smuzhiyun     unsigned int usespace;// �ļ�ռ�ÿռ䣨��PAGE����)
148*4882a593Smuzhiyun     unsigned int size;// �ֽ�����ʵ���ļ���С
149*4882a593Smuzhiyun } STRUCT_RKIMAGE_ITEM, *PSTRUCT_RKIMAGE_ITEM;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun typedef struct tagRKIMAGE_HDR
152*4882a593Smuzhiyun {
153*4882a593Smuzhiyun     unsigned int tag;
154*4882a593Smuzhiyun     unsigned int size;// �ļ���С������ĩβ��CRCУ����
155*4882a593Smuzhiyun     char machine_model[MAX_MACHINE_MODEL];
156*4882a593Smuzhiyun     char machine_info[MAX_MACHINE_INFO];
157*4882a593Smuzhiyun     char manufacturer[MAX_MANUFACTURER];
158*4882a593Smuzhiyun     unsigned int dwFWVer;
159*4882a593Smuzhiyun     int item_count;
160*4882a593Smuzhiyun     STRUCT_RKIMAGE_ITEM item[MAX_PACKAGE_FILES];
161*4882a593Smuzhiyun } STRUCT_RKIMAGE_HDR, *PSTRUCT_RKIMAGE_HDR;
162*4882a593Smuzhiyun typedef struct
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun     UINT uiTag;
165*4882a593Smuzhiyun     UINT uiVer;
166*4882a593Smuzhiyun     UINT uiFlag;
167*4882a593Smuzhiyun     UINT uiHeadSize;
168*4882a593Smuzhiyun     UINT uiReserved[3];
169*4882a593Smuzhiyun     USHORT usHashBit;
170*4882a593Smuzhiyun     USHORT usRsaBit;
171*4882a593Smuzhiyun     BYTE nFactor[256];
172*4882a593Smuzhiyun     BYTE eFactor[256];
173*4882a593Smuzhiyun     BYTE cFactor[256];
174*4882a593Smuzhiyun     BYTE dataHash[32];
175*4882a593Smuzhiyun     UINT dataLoadAddr;
176*4882a593Smuzhiyun     BYTE codeHash[32];
177*4882a593Smuzhiyun     UINT codeLoadAddr;
178*4882a593Smuzhiyun     BYTE headSignValue[256];
179*4882a593Smuzhiyun } RK_SECURE_HEADER, *PRK_SECURE_HEADER;
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun typedef struct _RK_UPDATE_ORDER
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun     UINT uiOrder;
184*4882a593Smuzhiyun     char partName[32];
185*4882a593Smuzhiyun     STRUCT_RKIMAGE_ITEM stItem;
186*4882a593Smuzhiyun     long long ulItemSize;
187*4882a593Smuzhiyun } RK_UPDATE_ORDER;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun #pragma pack()
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun class CRKAndroidDevice : public CRKDevice
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun public:
194*4882a593Smuzhiyun     static bool bGptFlag;
195*4882a593Smuzhiyun     virtual int PrepareIDB();
196*4882a593Smuzhiyun     virtual int DownloadIDBlock();
197*4882a593Smuzhiyun     virtual int DownloadImage();
198*4882a593Smuzhiyun     virtual int EraseIDB();
199*4882a593Smuzhiyun     virtual int EraseAllBlocks();
200*4882a593Smuzhiyun     virtual bool BufferWriteBack();
201*4882a593Smuzhiyun     CRKAndroidDevice(STRUCT_RKDEVICE_DESC &device);
202*4882a593Smuzhiyun     virtual ~CRKAndroidDevice();
203*4882a593Smuzhiyun     int UpgradePartition();
204*4882a593Smuzhiyun     bool GetPublicKey(unsigned char *pKey, unsigned int &nKeySize);
205*4882a593Smuzhiyun     bool IsExistBootloaderInFw();
206*4882a593Smuzhiyun     bool IsExistPartitionInFw(const char *partName, UINT &offset, UINT &size);
207*4882a593Smuzhiyun     UpgradeCallbackFunc m_pCallback;
208*4882a593Smuzhiyun     UpgradeProgressCallbackFunc m_pProcessCallback;
209*4882a593Smuzhiyun protected:
210*4882a593Smuzhiyun private:
211*4882a593Smuzhiyun     DWORD  m_dwLoaderSize;
212*4882a593Smuzhiyun     DWORD  m_dwLoaderDataSize;
213*4882a593Smuzhiyun     DWORD  m_dwLoaderHeadSize;
214*4882a593Smuzhiyun     DWORD  m_dwBackupOffset;
215*4882a593Smuzhiyun     char   m_oldIDBCounts;
216*4882a593Smuzhiyun     USHORT m_usFlashDataSec;
217*4882a593Smuzhiyun     USHORT m_usFlashBootSec;
218*4882a593Smuzhiyun     USHORT m_usFlashHeadSec;
219*4882a593Smuzhiyun     BYTE   *m_paramBuffer;
220*4882a593Smuzhiyun     BYTE *m_gptBuffer;
221*4882a593Smuzhiyun     UINT   m_uiParamFileSize;
222*4882a593Smuzhiyun     UINT   m_uiResevedBlockSize;
223*4882a593Smuzhiyun     RKANDROID_IDB_SEC0 *m_oldSec0;
224*4882a593Smuzhiyun     RKANDROID_IDB_SEC1 *m_oldSec1;
225*4882a593Smuzhiyun     RKANDROID_IDB_SEC2 *m_oldSec2;
226*4882a593Smuzhiyun     RKANDROID_IDB_SEC3 *m_oldSec3;
227*4882a593Smuzhiyun     UINT m_uiLBATimes;
228*4882a593Smuzhiyun     UINT m_uiUserSectors;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun     bool GetLoaderSize();
231*4882a593Smuzhiyun     bool GetLoaderDataSize();
232*4882a593Smuzhiyun     bool GetLoaderHeadSize();
233*4882a593Smuzhiyun     bool GetOldSectorData();
234*4882a593Smuzhiyun     bool CalcIDBCount();
235*4882a593Smuzhiyun     bool IsExistSector3Crc(PRKANDROID_IDB_SEC2 pSec);
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun     virtual bool FindBackupBuffer();
238*4882a593Smuzhiyun     virtual CHAR FindIDBlock(char pos, char &IDBlockPos);
239*4882a593Smuzhiyun     virtual char FindAllIDB();
240*4882a593Smuzhiyun     virtual bool ReserveIDBlock(char iBlockIndex = 0, char iIdblockPos = 0);
241*4882a593Smuzhiyun     virtual bool OffsetIDBlock(char pos);
242*4882a593Smuzhiyun     virtual bool MakeSector0(PBYTE pSector);
243*4882a593Smuzhiyun     virtual void MakeSector1(PBYTE pSector);
244*4882a593Smuzhiyun     virtual bool MakeSector2(PBYTE pSector);
245*4882a593Smuzhiyun     virtual bool MakeSector3(PBYTE pSector);
246*4882a593Smuzhiyun     virtual int MakeIDBlockData(PBYTE lpIDBlock);
247*4882a593Smuzhiyun     virtual int MakeNewIDBlockData(PBYTE lpIDBlock);
248*4882a593Smuzhiyun     virtual bool  MakeSpareData(PBYTE lpIDBlock, DWORD dwSectorNum, PBYTE lpSpareBuffer);
249*4882a593Smuzhiyun     virtual int WriteIDBlock(PBYTE lpIDBlock, DWORD dwSectorNum, bool bErase);
250*4882a593Smuzhiyun     bool RKA_Param_Download(STRUCT_RKIMAGE_ITEM &entry, long long &currentByte, long long totalByte);
251*4882a593Smuzhiyun     bool RKA_Param_Check(STRUCT_RKIMAGE_ITEM &entry, long long &currentByte, long long totalByte);
252*4882a593Smuzhiyun     bool RKA_File_Download(STRUCT_RKIMAGE_ITEM &entry, long long &currentByte, long long totalByte);
253*4882a593Smuzhiyun     bool RKA_File_Check(STRUCT_RKIMAGE_ITEM &entry, long long &currentByte, long long totalByte);
254*4882a593Smuzhiyun     bool RKA_Gpt_Download(STRUCT_RKIMAGE_ITEM &entry, long long &currentByte, long long totalByte);
255*4882a593Smuzhiyun     bool RKA_Gpt_Check(STRUCT_RKIMAGE_ITEM &entry, long long &currentByte, long long totalByte);
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun     bool GetParameterPartSize(STRUCT_RKIMAGE_ITEM &paramItem);
258*4882a593Smuzhiyun     bool ParsePartitionInfo(string &strPartInfo, string &strName, UINT &uiOffset, UINT &uiLen);
259*4882a593Smuzhiyun     bool MakeParamFileBuffer(STRUCT_RKIMAGE_ITEM &entry);
260*4882a593Smuzhiyun     bool CheckParamPartSize(STRUCT_RKIMAGE_HDR &rkImageHead, int iParamPos);
261*4882a593Smuzhiyun     bool write_partition_upgrade_flag(DWORD dwOffset, BYTE *pMd5, UINT uiFlag);
262*4882a593Smuzhiyun     bool read_partition_upgrade_flag(DWORD dwOffset, BYTE *pMd5, UINT *uiFlag);
263*4882a593Smuzhiyun     bool GetParameterGptFlag(STRUCT_RKIMAGE_ITEM &paramItem);
264*4882a593Smuzhiyun };
265*4882a593Smuzhiyun void create_gpt_buffer(u8 *gpt, PARAM_ITEM_VECTOR &vecParts, CONFIG_ITEM_VECTOR &vecUuid, u64 diskSectors);
266*4882a593Smuzhiyun void prepare_gpt_backup(u8 *master, u8 *backup);
267*4882a593Smuzhiyun void gen_rand_uuid(unsigned char *uuid_bin);
268*4882a593Smuzhiyun unsigned int crc32_le(unsigned int crc, unsigned char *p, unsigned int len);
269*4882a593Smuzhiyun bool parse_parameter(char *pParameter, PARAM_ITEM_VECTOR &vecItem);
270*4882a593Smuzhiyun bool get_uuid_from_parameter(char *pParameter, CONFIG_ITEM_VECTOR &vecItem);
271*4882a593Smuzhiyun bool ParsePartitionInfo(string &strPartInfo, string &strName, UINT &uiOffset, UINT &uiLen);
272*4882a593Smuzhiyun bool ParseUuidInfo(string &strUuidInfo, string &strName, string &strUUid);
273*4882a593Smuzhiyun void string_to_uuid(string strUUid, char *uuid);
274*4882a593Smuzhiyun int find_uuid_item(CONFIG_ITEM_VECTOR &vecItems, char *pszName);
275*4882a593Smuzhiyun #endif
276