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