#ifndef RKDEVICE_HEADER
|
#define RKDEVICE_HEADER
|
#include "RKImage.h"
|
#include "RKComm.h"
|
#include "RKLog.h"
|
#include "DefineHeader.h"
|
|
|
|
#define RK28_SEC3_RESERVED_LEN 419
|
#define RKANDROID_SEC3_RESERVED_LEN 419
|
|
#define RK28_SEC2_RESERVED_LEN 473
|
#define RKANDROID_SEC2_RESERVED_LEN 473
|
|
|
#define RKDEVICE_CUSTOMDATA_LEN 512
|
#define RKDEVICE_SN_LEN 30
|
#define RKDEVICE_UID_LEN 30
|
#define RKDEVICE_MAC_LEN 6
|
#define RKDEVICE_BT_LEN 6
|
#define RKDEVICE_IMEI_LEN 15
|
|
#define SECTOR_SIZE 512
|
#define SPARE_SIZE 16
|
#define IDB_BLOCKS 5
|
#define CHIPINFO_LEN 16
|
#define IDBLOCK_TOP 50
|
#define WBBUFFER_BOTTOM 5
|
#define WBBUFFER_TOP 10
|
#define CALC_UNIT(a, b) ((a>0)?((a-1)/b+1):(a))
|
#define BYTE2SECTOR(x) (CALC_UNIT(x, SECTOR_SIZE))
|
#define PAGEALIGN(x) (CALC_UNIT(x, 4))
|
//#define MAX_TEST_BLOCKS 512
|
//#define MAX_ERASE_BLOCKS 128
|
#define MAX_WRITE_SECTOR 16
|
#define IOCTL_TRANSFER_SIZE 4096
|
|
#define CRC_TAG "CRC"
|
#pragma pack(1)
|
typedef struct _STRUCT_FLASH_INFO
|
{
|
tchar szManufacturerName[16];
|
UINT uiFlashSize; //MB
|
USHORT usBlockSize;//KB
|
UINT uiPageSize; //KB
|
UINT uiSectorPerBlock;
|
BYTE blockState[IDBLOCK_TOP];
|
UINT uiBlockNum;
|
BYTE bECCBits;
|
BYTE bAccessTime; //Á½´Î·ÃÎÊFlashµÄ¼ä¸ôʱ¼ä
|
BYTE bFlashCS; // FlashƬѡ(FlashƬѡ´æÔÚÖÃ1£¬·ñÔòÖÃ0)
|
USHORT usValidSecPerBlock;//ÿ¿é¿ÉÒÔʹÓõÄÉÈÇøÊý=¿é´óС/Ò³´óС*4
|
USHORT usPhyBlokcPerIDB;//ÿ¸öIDBlockÕ¼ÓõÄÎïÀí¿éÊýÁ¿
|
UINT uiSecNumPerIDB;//ÿ¸öIDBlockÕ¼ÓõÄÉÈÇøÊý
|
} STRUCT_FLASH_INFO, *PSTRUCT_FLASH_INFO;
|
typedef struct _STRUCT_FLASHINFO_CMD
|
{
|
UINT uiFlashSize; // Flash´óС£¨ÒÔSectorΪµ¥Î»£©
|
USHORT usBlockSize; // ÎïÀíµÄBlock´óС£¨ÒÔSectorΪµ¥Î»£©
|
BYTE bPageSize; // ÎïÀíµÄPage´óС£¨ÒÔSectorΪµ¥Î»£©
|
BYTE bECCBits; // 8/14
|
BYTE bAccessTime; // Á½´Î·ÃÎÊFlashµÄ¼ä¸ôʱ¼ä
|
BYTE bManufCode; // ³§ÉÌʶ±ðÂë
|
BYTE bFlashCS; // FlashƬѡ(ÈôFlashƬѡ´æÔÚ£¬Ôò½«ÏàÓ¦µÄBitÖÃ1£¬·ñÔòÖÃ0)
|
BYTE reserved[501];
|
} STRUCT_FLASHINFO_CMD, *PSTRUCT_FLASHINFO_CMD;
|
typedef struct
|
{
|
BYTE bFlashCS;
|
UINT uiBlockNum;
|
USHORT usBlockStateSize;
|
PBYTE pBlockStateData;
|
} STRUCT_BLOCK_STATE, *PSTRUCT_BLOCK_STATE;
|
#pragma pack()
|
typedef struct
|
{
|
USHORT usVid;
|
USHORT usPid;
|
} STRUCT_DEVICE_PROP;
|
typedef vector<STRUCT_DEVICE_PROP> DEVICE_PROP_SET;
|
|
class CRKDevice
|
{
|
public:
|
|
ENUM_OS_TYPE GetOsType();
|
void SetOsType(ENUM_OS_TYPE value);
|
property<CRKDevice, ENUM_OS_TYPE, READ_WRITE> OsType;
|
|
void SetUid(PBYTE value);
|
property<CRKDevice, PBYTE, WRITE_ONLY> Uid;
|
|
void SetPrepareEraseFlag(bool value);
|
property<CRKDevice, bool, WRITE_ONLY> PrepareEraseFlag;
|
|
void SetWorkFlow(UINT value);
|
property<CRKDevice, UINT, WRITE_ONLY> WorkFlow;
|
|
void SetMiscModifyFlag(ENUM_MISC_MODIFY_FLAG value);
|
property<CRKDevice, ENUM_MISC_MODIFY_FLAG, WRITE_ONLY> MiscModifyFlag;
|
|
CRKLog *GetLogObjectPointer();
|
property<CRKDevice, CRKLog *, READ_ONLY> LogObjectPointer;
|
|
CRKComm *GetCommObjectPointer();
|
property<CRKDevice, CRKComm *, READ_ONLY> CommObjectPointer;
|
|
virtual int DownloadIDBlock() = 0;
|
virtual int DownloadImage() = 0;
|
virtual int PrepareIDB() = 0;
|
virtual bool BufferWriteBack() = 0;
|
|
|
bool CheckChip();
|
bool GetFlashInfo();
|
virtual int EraseIDB() = 0;
|
virtual int EraseAllBlocks() = 0;
|
bool SetObject(CRKImage *pImage, CRKComm *pComm, CRKLog *pLog);
|
CRKDevice(STRUCT_RKDEVICE_DESC &device);
|
virtual ~CRKDevice();
|
protected:
|
STRUCT_FLASH_INFO m_flashInfo;
|
PBYTE m_pFlashInfoData;
|
USHORT m_usFlashInfoDataOffset;
|
USHORT m_usFlashInfoDataLen;
|
DWORD m_idBlockOffset[IDB_BLOCKS];
|
PBYTE m_chipData;
|
CRKImage *m_pImage;
|
CRKComm *m_pComm;
|
CRKLog *m_pLog;
|
PBYTE m_customData;
|
USHORT m_customDataSize;
|
USHORT m_customDataOffset;
|
PBYTE m_sn;
|
BYTE m_snSize;
|
PBYTE m_mac;
|
PBYTE m_blueTooth;
|
PBYTE m_uid;
|
PBYTE m_imei;
|
USHORT m_sysDiskSize;
|
USHORT m_cfgDiskSize;
|
bool m_bGetNewDiskSizeFlag;
|
bool m_bExistSector3Crc;
|
USHORT m_usSector3Crc;
|
USHORT m_usWriteBackCrc;
|
USHORT m_usWriteBackCustomDataOffset;
|
USHORT m_usWriteBackCustomDataSize;
|
PSTRUCT_BLOCK_STATE m_pBlockState;
|
BYTE m_backupBuffer[SECTOR_SIZE + SPARE_SIZE];
|
bool m_bWriteBack;
|
UINT m_uiWorkFlow;
|
bool m_bEraseInPrepare;
|
bool m_bUidUseFlag;
|
bool m_bUidWriteOK;
|
bool m_remallocDisk;
|
bool m_bEmmc;
|
bool GptFlag;
|
bool DirectLBA;
|
bool First4Access;
|
ENUM_MISC_MODIFY_FLAG m_emMiscModifyFlag;
|
bool m_bQuickCheckMode;
|
bool BuildBlockStateMap(BYTE bFlashCS);
|
int ReadMutilSector(DWORD dwPos, DWORD dwCount, PBYTE lpBuffer);
|
bool EraseMutilBlock(BYTE bFlashCS, DWORD dwPos, DWORD dwCount, bool bForce);
|
CHAR FindValidBlocks(char bBegin, char bLen);
|
BYTE RandomByte(BYTE bLowLimit, BYTE bHighLimit);
|
bool CheckCrc16(PBYTE pCheckData, USHORT usDataLength, USHORT usOldCrc);
|
bool CheckUid(BYTE uidSize, BYTE *pUid);
|
bool GetWriteBackData(UINT uiIDBCount, PBYTE lpBuf);
|
bool GetIDBData(UINT uiIDBCount, PBYTE lpBuf, UINT uiSecCount);
|
int EraseEmmcBlock(UCHAR ucFlashCS, DWORD dwPos, DWORD dwCount);
|
virtual bool FindBackupBuffer() = 0;
|
virtual char FindAllIDB() = 0;
|
virtual CHAR FindIDBlock(char pos, char &IDBlockPos) = 0;
|
virtual bool ReserveIDBlock(char iBlockIndex = 0, char iIdblockPos = 0) = 0;
|
virtual bool OffsetIDBlock(char pos) = 0;
|
virtual bool MakeSector0(PBYTE pSector) = 0;
|
virtual void MakeSector1(PBYTE pSector) = 0;
|
virtual bool MakeSector2(PBYTE pSector) = 0;
|
virtual bool MakeSector3(PBYTE pSector) = 0;
|
virtual int MakeIDBlockData(PBYTE lpIDBlock) = 0;
|
virtual bool MakeSpareData(PBYTE lpIDBlock, DWORD dwSectorNum, PBYTE lpSpareBuffer) = 0;
|
virtual int WriteIDBlock(PBYTE lpIDBlock, DWORD dwSectorNum, bool bErase) = 0;
|
|
private:
|
ENUM_RKDEVICE_TYPE m_device;
|
ENUM_OS_TYPE m_os;
|
ENUM_RKUSB_TYPE m_usb;
|
USHORT m_bcdUsb;
|
};
|
|
USHORT UshortToBCD(USHORT num);
|
BYTE ByteToBCD(BYTE num);
|
extern USHORT CRC_16(BYTE *aData, UINT aSize);
|
extern UINT CRC_32(PBYTE pData, UINT ulSize, UINT uiPreviousValue = 0);
|
extern void P_RC4(BYTE *buf, USHORT len);
|
extern void bch_encode(BYTE *encode_in, BYTE *encode_out);
|
extern USHORT CRC_CCITT(UCHAR *p, UINT CalculateNumber);
|
extern void generate_gf();
|
extern void gen_poly();
|
#endif
|