2025-05-10 21:49:39 +08:00

203 lines
6.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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