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 ¤tByte, long long totalByte); 251 bool RKA_Param_Check(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte); 252 bool RKA_File_Download(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte); 253 bool RKA_File_Check(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte); 254 bool RKA_Gpt_Download(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte); 255 bool RKA_Gpt_Check(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte); 256 257 bool GetParameterPartSize(STRUCT_RKIMAGE_ITEM ¶mItem); 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 ¶mItem); 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