#ifndef RKANDROIDDEVICE_HEADER
|
#define RKANDROIDDEVICE_HEADER
|
#include "RKDevice.h"
|
#include "gpt.h"
|
#pragma pack(1)
|
typedef struct
|
{
|
DWORD dwTag;
|
BYTE reserved[4];
|
UINT uiRc4Flag;
|
USHORT usBootCode1Offset;
|
USHORT usBootCode2Offset;
|
BYTE reserved1[490];
|
USHORT usBootDataSize;
|
USHORT usBootCodeSize;
|
USHORT usCrc;
|
} RKANDROID_IDB_SEC0, *PRKANDROID_IDB_SEC0;
|
|
typedef struct
|
{
|
USHORT usSysReservedBlock;
|
USHORT usDisk0Size;
|
USHORT usDisk1Size;
|
USHORT usDisk2Size;
|
USHORT usDisk3Size;
|
UINT uiChipTag;
|
UINT uiMachineId;
|
USHORT usLoaderYear;
|
USHORT usLoaderDate;
|
USHORT usLoaderVer;
|
USHORT usLastLoaderVer;
|
USHORT usReadWriteTimes;
|
DWORD dwFwVer;
|
USHORT usMachineInfoLen;
|
UCHAR ucMachineInfo[30];
|
USHORT usManufactoryInfoLen;
|
UCHAR ucManufactoryInfo[30];
|
USHORT usFlashInfoOffset;
|
USHORT usFlashInfoLen;
|
UCHAR reserved[384];
|
UINT uiFlashSize;//ÒÔsectorΪµ¥Î»
|
BYTE reserved1;
|
BYTE bAccessTime;
|
USHORT usBlockSize;
|
BYTE bPageSize;
|
BYTE bECCBits;
|
BYTE reserved2[8];
|
USHORT usIdBlock0;
|
USHORT usIdBlock1;
|
USHORT usIdBlock2;
|
USHORT usIdBlock3;
|
USHORT usIdBlock4;
|
} RKANDROID_IDB_SEC1, *PRKANDROID_IDB_SEC1;
|
|
typedef struct
|
{
|
USHORT usInfoSize;
|
BYTE bChipInfo[CHIPINFO_LEN];
|
BYTE reserved[RKANDROID_SEC2_RESERVED_LEN];
|
char szVcTag[3];
|
USHORT usSec0Crc;
|
USHORT usSec1Crc;
|
UINT uiBootCodeCrc;
|
USHORT usSec3CustomDataOffset;
|
USHORT usSec3CustomDataSize;
|
char szCrcTag[4];
|
USHORT usSec3Crc;
|
} RKANDROID_IDB_SEC2, *PRKANDROID_IDB_SEC2;
|
|
typedef struct
|
{
|
USHORT usSNSize;
|
BYTE sn[RKDEVICE_SN_LEN];
|
BYTE reserved[RKANDROID_SEC3_RESERVED_LEN];
|
BYTE imeiSize;
|
BYTE imei[RKDEVICE_IMEI_LEN];
|
BYTE uidSize;
|
BYTE uid[RKDEVICE_UID_LEN];
|
BYTE blueToothSize;
|
BYTE blueToothAddr[RKDEVICE_BT_LEN];
|
BYTE macSize;
|
BYTE macAddr[RKDEVICE_MAC_LEN];
|
} RKANDROID_IDB_SEC3, *PRKANDROID_IDB_SEC3;
|
typedef struct
|
{
|
DWORD dwTag;
|
USHORT usSnSize;
|
BYTE btSnData[RKDEVICE_SN_LEN];
|
BYTE btReserve[RKANDROID_SEC3_RESERVED_LEN - 6];
|
BYTE btImeiSize;
|
BYTE btImeiData[RKDEVICE_IMEI_LEN];
|
BYTE btUidSize;
|
BYTE btUidData[RKDEVICE_UID_LEN];
|
BYTE btBlueToothSize;
|
BYTE btBlueToothData[RKDEVICE_BT_LEN];
|
BYTE btMacSize;
|
BYTE btMacData[RKDEVICE_MAC_LEN];
|
USHORT usCrc;
|
BYTE btSpare[SPARE_SIZE];
|
} STRUCT_RKANDROID_WBBUFFER, *PSTRUCT_RKANDROID_WBBUFFER;
|
const BYTE Wipe_Data[] = {0x72, 0x65, 0x63, 0x6F, 0x76, 0x65,
|
0x72, 0x79, 0x0A, 0x2D, 0x2D, 0x77,
|
0x69, 0x70, 0x65, 0x5F, 0x64, 0x61, 0x74, 0x61, 0x00
|
};
|
const BYTE Wipe_All[] = {0x72, 0x65, 0x63, 0x6F, 0x76, 0x65,
|
0x72, 0x79, 0x0A, 0x2D, 0x2D, 0x77,
|
0x69, 0x70, 0x65, 0x5F, 0x61, 0x6C, 0x6C, 0x00
|
};
|
#define LBA_TRANSFER_SIZE 16*1024
|
#define LBA_LOOP_SIZE 1024*1024
|
|
#define MAX_PACKAGE_FILES 16
|
#define RKIMAGE_TAG 0x46414B52
|
#define PARTNAME_PACKAGE_FILE "package-file"
|
#define PARTNAME_BOOTLOADER "bootloader"
|
#define PARTNAME_PARAMETER "parameter"
|
#define PARTNAME_KERNEL "kernel"
|
#define PARTNAME_BOOT "boot"
|
#define PARTNAME_RECOVERY "recovery"
|
#define PARTNAME_UBOOT "uboot"
|
#define PARTNAME_SYSTEM "system"
|
#define PARTNAME_ROOTFS "rootfs"
|
#define PARTNAME_MISC "misc"
|
#define PARTNAME_BACKUP "backup"
|
#define PARTNAME_OEM "oem"
|
#define PARTNAME_USERDATA "userdata"
|
#define PARTNAME_USER "user"
|
|
#define INCLUDE_LOADER "bootloader"
|
|
#define MAX_MANUFACTURER 60
|
#define MAX_MACHINE_INFO 30
|
#define MAX_MACHINE_MODEL 34
|
#define RELATIVE_PATH 60
|
#define PART_NAME 32
|
|
#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
|
typedef struct
|
{
|
char name[PART_NAME];// ·ÖÇøÃû³Æ
|
char file[RELATIVE_PATH];// Ïà¶Ô·¾¶Ãû£¬ÌáÈ¡ÎļþʱÓõ½
|
unsigned int part_size;//·ÖÇøÕ¼ÓÃÉÈÇøÊý
|
unsigned int offset;// ÎļþÔÚImageÖÐµÄÆ«ÒÆ
|
unsigned int flash_offset;// ÉÕдµ½FlashÖеÄλÖÃ(ÒÔsectorΪµ¥Î»)
|
unsigned int usespace;// ÎļþÕ¼Óÿռ䣨°´PAGE¶ÔÆë)
|
unsigned int size;// ×Ö½ÚÊý£¬Êµ¼ÊÎļþ´óС
|
} STRUCT_RKIMAGE_ITEM, *PSTRUCT_RKIMAGE_ITEM;
|
|
typedef struct tagRKIMAGE_HDR
|
{
|
unsigned int tag;
|
unsigned int size;// Îļþ´óС£¬²»º¬Ä©Î²µÄCRCУÑéÂë
|
char machine_model[MAX_MACHINE_MODEL];
|
char machine_info[MAX_MACHINE_INFO];
|
char manufacturer[MAX_MANUFACTURER];
|
unsigned int dwFWVer;
|
int item_count;
|
STRUCT_RKIMAGE_ITEM item[MAX_PACKAGE_FILES];
|
} STRUCT_RKIMAGE_HDR, *PSTRUCT_RKIMAGE_HDR;
|
typedef struct
|
{
|
UINT uiTag;
|
UINT uiVer;
|
UINT uiFlag;
|
UINT uiHeadSize;
|
UINT uiReserved[3];
|
USHORT usHashBit;
|
USHORT usRsaBit;
|
BYTE nFactor[256];
|
BYTE eFactor[256];
|
BYTE cFactor[256];
|
BYTE dataHash[32];
|
UINT dataLoadAddr;
|
BYTE codeHash[32];
|
UINT codeLoadAddr;
|
BYTE headSignValue[256];
|
} RK_SECURE_HEADER, *PRK_SECURE_HEADER;
|
|
typedef struct _RK_UPDATE_ORDER
|
{
|
UINT uiOrder;
|
char partName[32];
|
STRUCT_RKIMAGE_ITEM stItem;
|
long long ulItemSize;
|
} RK_UPDATE_ORDER;
|
|
#pragma pack()
|
|
class CRKAndroidDevice : public CRKDevice
|
{
|
public:
|
static bool bGptFlag;
|
virtual int PrepareIDB();
|
virtual int DownloadIDBlock();
|
virtual int DownloadImage();
|
virtual int EraseIDB();
|
virtual int EraseAllBlocks();
|
virtual bool BufferWriteBack();
|
CRKAndroidDevice(STRUCT_RKDEVICE_DESC &device);
|
virtual ~CRKAndroidDevice();
|
int UpgradePartition();
|
bool GetPublicKey(unsigned char *pKey, unsigned int &nKeySize);
|
bool IsExistBootloaderInFw();
|
bool IsExistPartitionInFw(const char *partName, UINT &offset, UINT &size);
|
UpgradeCallbackFunc m_pCallback;
|
UpgradeProgressCallbackFunc m_pProcessCallback;
|
protected:
|
private:
|
DWORD m_dwLoaderSize;
|
DWORD m_dwLoaderDataSize;
|
DWORD m_dwLoaderHeadSize;
|
DWORD m_dwBackupOffset;
|
char m_oldIDBCounts;
|
USHORT m_usFlashDataSec;
|
USHORT m_usFlashBootSec;
|
USHORT m_usFlashHeadSec;
|
BYTE *m_paramBuffer;
|
BYTE *m_gptBuffer;
|
UINT m_uiParamFileSize;
|
UINT m_uiResevedBlockSize;
|
RKANDROID_IDB_SEC0 *m_oldSec0;
|
RKANDROID_IDB_SEC1 *m_oldSec1;
|
RKANDROID_IDB_SEC2 *m_oldSec2;
|
RKANDROID_IDB_SEC3 *m_oldSec3;
|
UINT m_uiLBATimes;
|
UINT m_uiUserSectors;
|
|
bool GetLoaderSize();
|
bool GetLoaderDataSize();
|
bool GetLoaderHeadSize();
|
bool GetOldSectorData();
|
bool CalcIDBCount();
|
bool IsExistSector3Crc(PRKANDROID_IDB_SEC2 pSec);
|
|
virtual bool FindBackupBuffer();
|
virtual CHAR FindIDBlock(char pos, char &IDBlockPos);
|
virtual char FindAllIDB();
|
virtual bool ReserveIDBlock(char iBlockIndex = 0, char iIdblockPos = 0);
|
virtual bool OffsetIDBlock(char pos);
|
virtual bool MakeSector0(PBYTE pSector);
|
virtual void MakeSector1(PBYTE pSector);
|
virtual bool MakeSector2(PBYTE pSector);
|
virtual bool MakeSector3(PBYTE pSector);
|
virtual int MakeIDBlockData(PBYTE lpIDBlock);
|
virtual int MakeNewIDBlockData(PBYTE lpIDBlock);
|
virtual bool MakeSpareData(PBYTE lpIDBlock, DWORD dwSectorNum, PBYTE lpSpareBuffer);
|
virtual int WriteIDBlock(PBYTE lpIDBlock, DWORD dwSectorNum, bool bErase);
|
bool RKA_Param_Download(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte);
|
bool RKA_Param_Check(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte);
|
bool RKA_File_Download(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte);
|
bool RKA_File_Check(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte);
|
bool RKA_Gpt_Download(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte);
|
bool RKA_Gpt_Check(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte);
|
|
bool GetParameterPartSize(STRUCT_RKIMAGE_ITEM ¶mItem);
|
bool ParsePartitionInfo(string &strPartInfo, string &strName, UINT &uiOffset, UINT &uiLen);
|
bool MakeParamFileBuffer(STRUCT_RKIMAGE_ITEM &entry);
|
bool CheckParamPartSize(STRUCT_RKIMAGE_HDR &rkImageHead, int iParamPos);
|
bool write_partition_upgrade_flag(DWORD dwOffset, BYTE *pMd5, UINT uiFlag);
|
bool read_partition_upgrade_flag(DWORD dwOffset, BYTE *pMd5, UINT *uiFlag);
|
bool GetParameterGptFlag(STRUCT_RKIMAGE_ITEM ¶mItem);
|
};
|
void create_gpt_buffer(u8 *gpt, PARAM_ITEM_VECTOR &vecParts, CONFIG_ITEM_VECTOR &vecUuid, u64 diskSectors);
|
void prepare_gpt_backup(u8 *master, u8 *backup);
|
void gen_rand_uuid(unsigned char *uuid_bin);
|
unsigned int crc32_le(unsigned int crc, unsigned char *p, unsigned int len);
|
bool parse_parameter(char *pParameter, PARAM_ITEM_VECTOR &vecItem);
|
bool get_uuid_from_parameter(char *pParameter, CONFIG_ITEM_VECTOR &vecItem);
|
bool ParsePartitionInfo(string &strPartInfo, string &strName, UINT &uiOffset, UINT &uiLen);
|
bool ParseUuidInfo(string &strUuidInfo, string &strName, string &strUUid);
|
void string_to_uuid(string strUUid, char *uuid);
|
int find_uuid_item(CONFIG_ITEM_VECTOR &vecItems, char *pszName);
|
#endif
|