hc
2024-08-12 233ab1bd4c5697f5cdec94e60206e8c6ac609b4c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#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