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