1*4882a593Smuzhiyun #ifndef RKDEVICE_HEADER 2*4882a593Smuzhiyun #define RKDEVICE_HEADER 3*4882a593Smuzhiyun #include "RKImage.h" 4*4882a593Smuzhiyun #include "RKComm.h" 5*4882a593Smuzhiyun #include "RKLog.h" 6*4882a593Smuzhiyun #include "DefineHeader.h" 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define RK28_SEC3_RESERVED_LEN 419 11*4882a593Smuzhiyun #define RKANDROID_SEC3_RESERVED_LEN 419 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define RK28_SEC2_RESERVED_LEN 473 14*4882a593Smuzhiyun #define RKANDROID_SEC2_RESERVED_LEN 473 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define RKDEVICE_CUSTOMDATA_LEN 512 18*4882a593Smuzhiyun #define RKDEVICE_SN_LEN 30 19*4882a593Smuzhiyun #define RKDEVICE_UID_LEN 30 20*4882a593Smuzhiyun #define RKDEVICE_MAC_LEN 6 21*4882a593Smuzhiyun #define RKDEVICE_BT_LEN 6 22*4882a593Smuzhiyun #define RKDEVICE_IMEI_LEN 15 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define SECTOR_SIZE 512 25*4882a593Smuzhiyun #define SPARE_SIZE 16 26*4882a593Smuzhiyun #define IDB_BLOCKS 5 27*4882a593Smuzhiyun #define CHIPINFO_LEN 16 28*4882a593Smuzhiyun #define IDBLOCK_TOP 50 29*4882a593Smuzhiyun #define WBBUFFER_BOTTOM 5 30*4882a593Smuzhiyun #define WBBUFFER_TOP 10 31*4882a593Smuzhiyun #define CALC_UNIT(a, b) ((a>0)?((a-1)/b+1):(a)) 32*4882a593Smuzhiyun #define BYTE2SECTOR(x) (CALC_UNIT(x, SECTOR_SIZE)) 33*4882a593Smuzhiyun #define PAGEALIGN(x) (CALC_UNIT(x, 4)) 34*4882a593Smuzhiyun //#define MAX_TEST_BLOCKS 512 35*4882a593Smuzhiyun //#define MAX_ERASE_BLOCKS 128 36*4882a593Smuzhiyun #define MAX_WRITE_SECTOR 16 37*4882a593Smuzhiyun #define IOCTL_TRANSFER_SIZE 4096 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define CRC_TAG "CRC" 40*4882a593Smuzhiyun #pragma pack(1) 41*4882a593Smuzhiyun typedef struct _STRUCT_FLASH_INFO 42*4882a593Smuzhiyun { 43*4882a593Smuzhiyun tchar szManufacturerName[16]; 44*4882a593Smuzhiyun UINT uiFlashSize; //MB 45*4882a593Smuzhiyun USHORT usBlockSize;//KB 46*4882a593Smuzhiyun UINT uiPageSize; //KB 47*4882a593Smuzhiyun UINT uiSectorPerBlock; 48*4882a593Smuzhiyun BYTE blockState[IDBLOCK_TOP]; 49*4882a593Smuzhiyun UINT uiBlockNum; 50*4882a593Smuzhiyun BYTE bECCBits; 51*4882a593Smuzhiyun BYTE bAccessTime; //���η���Flash�ļ��ʱ�� 52*4882a593Smuzhiyun BYTE bFlashCS; // FlashƬѡ(FlashƬѡ������1��������0) 53*4882a593Smuzhiyun USHORT usValidSecPerBlock;//ÿ�����ʹ�õ�������=���С/ҳ��С*4 54*4882a593Smuzhiyun USHORT usPhyBlokcPerIDB;//ÿ��IDBlockռ�õ���������� 55*4882a593Smuzhiyun UINT uiSecNumPerIDB;//ÿ��IDBlockռ�õ������� 56*4882a593Smuzhiyun } STRUCT_FLASH_INFO, *PSTRUCT_FLASH_INFO; 57*4882a593Smuzhiyun typedef struct _STRUCT_FLASHINFO_CMD 58*4882a593Smuzhiyun { 59*4882a593Smuzhiyun UINT uiFlashSize; // Flash��С����SectorΪ��λ�� 60*4882a593Smuzhiyun USHORT usBlockSize; // �����Block��С����SectorΪ��λ�� 61*4882a593Smuzhiyun BYTE bPageSize; // �����Page��С����SectorΪ��λ�� 62*4882a593Smuzhiyun BYTE bECCBits; // 8/14 63*4882a593Smuzhiyun BYTE bAccessTime; // ���η���Flash�ļ��ʱ�� 64*4882a593Smuzhiyun BYTE bManufCode; // ����ʶ���� 65*4882a593Smuzhiyun BYTE bFlashCS; // FlashƬѡ(��FlashƬѡ���ڣ�����Ӧ��Bit��1��������0) 66*4882a593Smuzhiyun BYTE reserved[501]; 67*4882a593Smuzhiyun } STRUCT_FLASHINFO_CMD, *PSTRUCT_FLASHINFO_CMD; 68*4882a593Smuzhiyun typedef struct 69*4882a593Smuzhiyun { 70*4882a593Smuzhiyun BYTE bFlashCS; 71*4882a593Smuzhiyun UINT uiBlockNum; 72*4882a593Smuzhiyun USHORT usBlockStateSize; 73*4882a593Smuzhiyun PBYTE pBlockStateData; 74*4882a593Smuzhiyun } STRUCT_BLOCK_STATE, *PSTRUCT_BLOCK_STATE; 75*4882a593Smuzhiyun #pragma pack() 76*4882a593Smuzhiyun typedef struct 77*4882a593Smuzhiyun { 78*4882a593Smuzhiyun USHORT usVid; 79*4882a593Smuzhiyun USHORT usPid; 80*4882a593Smuzhiyun } STRUCT_DEVICE_PROP; 81*4882a593Smuzhiyun typedef vector<STRUCT_DEVICE_PROP> DEVICE_PROP_SET; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun class CRKDevice 84*4882a593Smuzhiyun { 85*4882a593Smuzhiyun public: 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun ENUM_OS_TYPE GetOsType(); 88*4882a593Smuzhiyun void SetOsType(ENUM_OS_TYPE value); 89*4882a593Smuzhiyun property<CRKDevice, ENUM_OS_TYPE, READ_WRITE> OsType; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun void SetUid(PBYTE value); 92*4882a593Smuzhiyun property<CRKDevice, PBYTE, WRITE_ONLY> Uid; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun void SetPrepareEraseFlag(bool value); 95*4882a593Smuzhiyun property<CRKDevice, bool, WRITE_ONLY> PrepareEraseFlag; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun void SetWorkFlow(UINT value); 98*4882a593Smuzhiyun property<CRKDevice, UINT, WRITE_ONLY> WorkFlow; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun void SetMiscModifyFlag(ENUM_MISC_MODIFY_FLAG value); 101*4882a593Smuzhiyun property<CRKDevice, ENUM_MISC_MODIFY_FLAG, WRITE_ONLY> MiscModifyFlag; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun CRKLog *GetLogObjectPointer(); 104*4882a593Smuzhiyun property<CRKDevice, CRKLog *, READ_ONLY> LogObjectPointer; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun CRKComm *GetCommObjectPointer(); 107*4882a593Smuzhiyun property<CRKDevice, CRKComm *, READ_ONLY> CommObjectPointer; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun virtual int DownloadIDBlock() = 0; 110*4882a593Smuzhiyun virtual int DownloadImage() = 0; 111*4882a593Smuzhiyun virtual int PrepareIDB() = 0; 112*4882a593Smuzhiyun virtual bool BufferWriteBack() = 0; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun bool CheckChip(); 116*4882a593Smuzhiyun bool GetFlashInfo(); 117*4882a593Smuzhiyun virtual int EraseIDB() = 0; 118*4882a593Smuzhiyun virtual int EraseAllBlocks() = 0; 119*4882a593Smuzhiyun bool SetObject(CRKImage *pImage, CRKComm *pComm, CRKLog *pLog); 120*4882a593Smuzhiyun CRKDevice(STRUCT_RKDEVICE_DESC &device); 121*4882a593Smuzhiyun virtual ~CRKDevice(); 122*4882a593Smuzhiyun protected: 123*4882a593Smuzhiyun STRUCT_FLASH_INFO m_flashInfo; 124*4882a593Smuzhiyun PBYTE m_pFlashInfoData; 125*4882a593Smuzhiyun USHORT m_usFlashInfoDataOffset; 126*4882a593Smuzhiyun USHORT m_usFlashInfoDataLen; 127*4882a593Smuzhiyun DWORD m_idBlockOffset[IDB_BLOCKS]; 128*4882a593Smuzhiyun PBYTE m_chipData; 129*4882a593Smuzhiyun CRKImage *m_pImage; 130*4882a593Smuzhiyun CRKComm *m_pComm; 131*4882a593Smuzhiyun CRKLog *m_pLog; 132*4882a593Smuzhiyun PBYTE m_customData; 133*4882a593Smuzhiyun USHORT m_customDataSize; 134*4882a593Smuzhiyun USHORT m_customDataOffset; 135*4882a593Smuzhiyun PBYTE m_sn; 136*4882a593Smuzhiyun BYTE m_snSize; 137*4882a593Smuzhiyun PBYTE m_mac; 138*4882a593Smuzhiyun PBYTE m_blueTooth; 139*4882a593Smuzhiyun PBYTE m_uid; 140*4882a593Smuzhiyun PBYTE m_imei; 141*4882a593Smuzhiyun USHORT m_sysDiskSize; 142*4882a593Smuzhiyun USHORT m_cfgDiskSize; 143*4882a593Smuzhiyun bool m_bGetNewDiskSizeFlag; 144*4882a593Smuzhiyun bool m_bExistSector3Crc; 145*4882a593Smuzhiyun USHORT m_usSector3Crc; 146*4882a593Smuzhiyun USHORT m_usWriteBackCrc; 147*4882a593Smuzhiyun USHORT m_usWriteBackCustomDataOffset; 148*4882a593Smuzhiyun USHORT m_usWriteBackCustomDataSize; 149*4882a593Smuzhiyun PSTRUCT_BLOCK_STATE m_pBlockState; 150*4882a593Smuzhiyun BYTE m_backupBuffer[SECTOR_SIZE + SPARE_SIZE]; 151*4882a593Smuzhiyun bool m_bWriteBack; 152*4882a593Smuzhiyun UINT m_uiWorkFlow; 153*4882a593Smuzhiyun bool m_bEraseInPrepare; 154*4882a593Smuzhiyun bool m_bUidUseFlag; 155*4882a593Smuzhiyun bool m_bUidWriteOK; 156*4882a593Smuzhiyun bool m_remallocDisk; 157*4882a593Smuzhiyun bool m_bEmmc; 158*4882a593Smuzhiyun bool GptFlag; 159*4882a593Smuzhiyun bool DirectLBA; 160*4882a593Smuzhiyun bool First4Access; 161*4882a593Smuzhiyun ENUM_MISC_MODIFY_FLAG m_emMiscModifyFlag; 162*4882a593Smuzhiyun bool m_bQuickCheckMode; 163*4882a593Smuzhiyun bool BuildBlockStateMap(BYTE bFlashCS); 164*4882a593Smuzhiyun int ReadMutilSector(DWORD dwPos, DWORD dwCount, PBYTE lpBuffer); 165*4882a593Smuzhiyun bool EraseMutilBlock(BYTE bFlashCS, DWORD dwPos, DWORD dwCount, bool bForce); 166*4882a593Smuzhiyun CHAR FindValidBlocks(char bBegin, char bLen); 167*4882a593Smuzhiyun BYTE RandomByte(BYTE bLowLimit, BYTE bHighLimit); 168*4882a593Smuzhiyun bool CheckCrc16(PBYTE pCheckData, USHORT usDataLength, USHORT usOldCrc); 169*4882a593Smuzhiyun bool CheckUid(BYTE uidSize, BYTE *pUid); 170*4882a593Smuzhiyun bool GetWriteBackData(UINT uiIDBCount, PBYTE lpBuf); 171*4882a593Smuzhiyun bool GetIDBData(UINT uiIDBCount, PBYTE lpBuf, UINT uiSecCount); 172*4882a593Smuzhiyun int EraseEmmcBlock(UCHAR ucFlashCS, DWORD dwPos, DWORD dwCount); 173*4882a593Smuzhiyun virtual bool FindBackupBuffer() = 0; 174*4882a593Smuzhiyun virtual char FindAllIDB() = 0; 175*4882a593Smuzhiyun virtual CHAR FindIDBlock(char pos, char &IDBlockPos) = 0; 176*4882a593Smuzhiyun virtual bool ReserveIDBlock(char iBlockIndex = 0, char iIdblockPos = 0) = 0; 177*4882a593Smuzhiyun virtual bool OffsetIDBlock(char pos) = 0; 178*4882a593Smuzhiyun virtual bool MakeSector0(PBYTE pSector) = 0; 179*4882a593Smuzhiyun virtual void MakeSector1(PBYTE pSector) = 0; 180*4882a593Smuzhiyun virtual bool MakeSector2(PBYTE pSector) = 0; 181*4882a593Smuzhiyun virtual bool MakeSector3(PBYTE pSector) = 0; 182*4882a593Smuzhiyun virtual int MakeIDBlockData(PBYTE lpIDBlock) = 0; 183*4882a593Smuzhiyun virtual bool MakeSpareData(PBYTE lpIDBlock, DWORD dwSectorNum, PBYTE lpSpareBuffer) = 0; 184*4882a593Smuzhiyun virtual int WriteIDBlock(PBYTE lpIDBlock, DWORD dwSectorNum, bool bErase) = 0; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun private: 187*4882a593Smuzhiyun ENUM_RKDEVICE_TYPE m_device; 188*4882a593Smuzhiyun ENUM_OS_TYPE m_os; 189*4882a593Smuzhiyun ENUM_RKUSB_TYPE m_usb; 190*4882a593Smuzhiyun USHORT m_bcdUsb; 191*4882a593Smuzhiyun }; 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun USHORT UshortToBCD(USHORT num); 194*4882a593Smuzhiyun BYTE ByteToBCD(BYTE num); 195*4882a593Smuzhiyun extern USHORT CRC_16(BYTE *aData, UINT aSize); 196*4882a593Smuzhiyun extern UINT CRC_32(PBYTE pData, UINT ulSize, UINT uiPreviousValue = 0); 197*4882a593Smuzhiyun extern void P_RC4(BYTE *buf, USHORT len); 198*4882a593Smuzhiyun extern void bch_encode(BYTE *encode_in, BYTE *encode_out); 199*4882a593Smuzhiyun extern USHORT CRC_CCITT(UCHAR *p, UINT CalculateNumber); 200*4882a593Smuzhiyun extern void generate_gf(); 201*4882a593Smuzhiyun extern void gen_poly(); 202*4882a593Smuzhiyun #endif 203