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