xref: /OK3568_Linux_fs/external/rkupdate/RKBoot.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #include "RKBoot.h"
2*4882a593Smuzhiyun extern UINT CRC_32(PBYTE pData, UINT ulSize, UINT uiPreviousValue = 0);
3*4882a593Smuzhiyun 
GetRc4DisableFlag()4*4882a593Smuzhiyun bool CRKBoot::GetRc4DisableFlag()
5*4882a593Smuzhiyun {
6*4882a593Smuzhiyun     return m_bRc4Disable;
7*4882a593Smuzhiyun }
GetSignFlag()8*4882a593Smuzhiyun bool CRKBoot::GetSignFlag()
9*4882a593Smuzhiyun {
10*4882a593Smuzhiyun     return m_bSignFlag;
11*4882a593Smuzhiyun }
GetVersion()12*4882a593Smuzhiyun DWORD CRKBoot::GetVersion()
13*4882a593Smuzhiyun {
14*4882a593Smuzhiyun     return m_version;
15*4882a593Smuzhiyun }
GetMergeVersion()16*4882a593Smuzhiyun DWORD CRKBoot::GetMergeVersion()
17*4882a593Smuzhiyun {
18*4882a593Smuzhiyun     return m_mergeVersion;
19*4882a593Smuzhiyun }
GetReleaseTime()20*4882a593Smuzhiyun STRUCT_RKTIME CRKBoot::GetReleaseTime()
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun     return m_releaseTime;
23*4882a593Smuzhiyun }
GetSupportDevice()24*4882a593Smuzhiyun ENUM_RKDEVICE_TYPE CRKBoot::GetSupportDevice()
25*4882a593Smuzhiyun {
26*4882a593Smuzhiyun     return m_supportDevice;
27*4882a593Smuzhiyun }
GetEntry471Count()28*4882a593Smuzhiyun UCHAR CRKBoot::GetEntry471Count()
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun     return m_471Count;
31*4882a593Smuzhiyun }
GetEntry472Count()32*4882a593Smuzhiyun UCHAR CRKBoot::GetEntry472Count()
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun     return m_472Count;
35*4882a593Smuzhiyun }
GetEntryLoaderCount()36*4882a593Smuzhiyun UCHAR CRKBoot::GetEntryLoaderCount()
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun     return m_loaderCount;
39*4882a593Smuzhiyun }
CrcCheck()40*4882a593Smuzhiyun bool CRKBoot::CrcCheck()
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun     UINT *pOldCrc, ulNewCrc;
43*4882a593Smuzhiyun     pOldCrc = (UINT *)(m_BootData + (m_BootSize - 4));
44*4882a593Smuzhiyun     ulNewCrc = CRC_32(m_BootData, m_BootSize - 4);
45*4882a593Smuzhiyun     return (*pOldCrc == ulNewCrc) ? true : false;
46*4882a593Smuzhiyun }
SaveEntryFile(ENUM_RKBOOTENTRY type,UCHAR ucIndex,tstring fileName)47*4882a593Smuzhiyun bool CRKBoot::SaveEntryFile(ENUM_RKBOOTENTRY type, UCHAR ucIndex, tstring fileName)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun     DWORD dwOffset;
50*4882a593Smuzhiyun     UCHAR ucCount, ucSize;
51*4882a593Smuzhiyun     switch (type)
52*4882a593Smuzhiyun     {
53*4882a593Smuzhiyun         case ENTRY471:
54*4882a593Smuzhiyun             dwOffset = m_471Offset;
55*4882a593Smuzhiyun             ucCount = m_471Count;
56*4882a593Smuzhiyun             ucSize = m_471Size;
57*4882a593Smuzhiyun             break;
58*4882a593Smuzhiyun         case ENTRY472:
59*4882a593Smuzhiyun             dwOffset = m_472Offset;
60*4882a593Smuzhiyun             ucCount = m_472Count;
61*4882a593Smuzhiyun             ucSize = m_472Size;
62*4882a593Smuzhiyun             break;
63*4882a593Smuzhiyun         case ENTRYLOADER:
64*4882a593Smuzhiyun             dwOffset = m_loaderOffset;
65*4882a593Smuzhiyun             ucCount = m_loaderCount;
66*4882a593Smuzhiyun             ucSize = m_loaderSize;
67*4882a593Smuzhiyun             break;
68*4882a593Smuzhiyun         default:
69*4882a593Smuzhiyun             return false;
70*4882a593Smuzhiyun     }
71*4882a593Smuzhiyun     if (ucIndex >= ucCount)
72*4882a593Smuzhiyun     {
73*4882a593Smuzhiyun         return false;
74*4882a593Smuzhiyun     }
75*4882a593Smuzhiyun     PSTRUCT_RKBOOT_ENTRY pEntry;
76*4882a593Smuzhiyun     pEntry = (PSTRUCT_RKBOOT_ENTRY)(m_BootData + dwOffset + (ucSize * ucIndex));
77*4882a593Smuzhiyun     FILE *file = NULL;
78*4882a593Smuzhiyun     file = fopen(fileName.c_str(), _T("wb+"));
79*4882a593Smuzhiyun     if (!file)
80*4882a593Smuzhiyun     {
81*4882a593Smuzhiyun         return false;
82*4882a593Smuzhiyun     }
83*4882a593Smuzhiyun     fwrite(m_BootData + pEntry->dwDataOffset, 1, pEntry->dwDataSize, file);
84*4882a593Smuzhiyun     fclose(file);
85*4882a593Smuzhiyun     return true;
86*4882a593Smuzhiyun }
GetEntryProperty(ENUM_RKBOOTENTRY type,UCHAR ucIndex,DWORD & dwSize,DWORD & dwDelay,tchar * pName)87*4882a593Smuzhiyun bool CRKBoot::GetEntryProperty(ENUM_RKBOOTENTRY type, UCHAR ucIndex, DWORD &dwSize, DWORD &dwDelay, tchar *pName)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun     DWORD dwOffset;
90*4882a593Smuzhiyun     UCHAR ucCount, ucSize;
91*4882a593Smuzhiyun     switch (type)
92*4882a593Smuzhiyun     {
93*4882a593Smuzhiyun         case ENTRY471:
94*4882a593Smuzhiyun             dwOffset = m_471Offset;
95*4882a593Smuzhiyun             ucCount = m_471Count;
96*4882a593Smuzhiyun             ucSize = m_471Size;
97*4882a593Smuzhiyun             break;
98*4882a593Smuzhiyun         case ENTRY472:
99*4882a593Smuzhiyun             dwOffset = m_472Offset;
100*4882a593Smuzhiyun             ucCount = m_472Count;
101*4882a593Smuzhiyun             ucSize = m_472Size;
102*4882a593Smuzhiyun             break;
103*4882a593Smuzhiyun         case ENTRYLOADER:
104*4882a593Smuzhiyun             dwOffset = m_loaderOffset;
105*4882a593Smuzhiyun             ucCount = m_loaderCount;
106*4882a593Smuzhiyun             ucSize = m_loaderSize;//Loader��������ʱ�Ѿ�512����
107*4882a593Smuzhiyun             break;
108*4882a593Smuzhiyun         default:
109*4882a593Smuzhiyun             return false;
110*4882a593Smuzhiyun     }
111*4882a593Smuzhiyun     if (ucIndex >= ucCount)
112*4882a593Smuzhiyun     {
113*4882a593Smuzhiyun         return false;
114*4882a593Smuzhiyun     }
115*4882a593Smuzhiyun     PSTRUCT_RKBOOT_ENTRY pEntry;
116*4882a593Smuzhiyun     pEntry = (PSTRUCT_RKBOOT_ENTRY)(m_BootData + dwOffset + (ucSize * ucIndex));
117*4882a593Smuzhiyun     dwDelay = pEntry->dwDataDelay;
118*4882a593Smuzhiyun     dwSize = pEntry->dwDataSize;
119*4882a593Smuzhiyun     if (pName)
120*4882a593Smuzhiyun     {
121*4882a593Smuzhiyun         WCHAR_To_char(pEntry->szName, pName, 20);
122*4882a593Smuzhiyun     }
123*4882a593Smuzhiyun     return true;
124*4882a593Smuzhiyun }
GetEntryData(ENUM_RKBOOTENTRY type,UCHAR ucIndex,PBYTE lpData)125*4882a593Smuzhiyun bool CRKBoot::GetEntryData(ENUM_RKBOOTENTRY type, UCHAR ucIndex, PBYTE lpData)
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun     DWORD dwOffset;
128*4882a593Smuzhiyun     UCHAR ucCount, ucSize;
129*4882a593Smuzhiyun     switch (type)
130*4882a593Smuzhiyun     {
131*4882a593Smuzhiyun         case ENTRY471:
132*4882a593Smuzhiyun             dwOffset = m_471Offset;
133*4882a593Smuzhiyun             ucCount = m_471Count;
134*4882a593Smuzhiyun             ucSize = m_471Size;
135*4882a593Smuzhiyun             break;
136*4882a593Smuzhiyun         case ENTRY472:
137*4882a593Smuzhiyun             dwOffset = m_472Offset;
138*4882a593Smuzhiyun             ucCount = m_472Count;
139*4882a593Smuzhiyun             ucSize = m_472Size;
140*4882a593Smuzhiyun             break;
141*4882a593Smuzhiyun         case ENTRYLOADER:
142*4882a593Smuzhiyun             dwOffset = m_loaderOffset;
143*4882a593Smuzhiyun             ucCount = m_loaderCount;
144*4882a593Smuzhiyun             ucSize = m_loaderSize;
145*4882a593Smuzhiyun             break;
146*4882a593Smuzhiyun         default:
147*4882a593Smuzhiyun             return false;
148*4882a593Smuzhiyun     }
149*4882a593Smuzhiyun     if (ucIndex >= ucCount)
150*4882a593Smuzhiyun     {
151*4882a593Smuzhiyun         return false;
152*4882a593Smuzhiyun     }
153*4882a593Smuzhiyun     PSTRUCT_RKBOOT_ENTRY pEntry;
154*4882a593Smuzhiyun     pEntry = (PSTRUCT_RKBOOT_ENTRY)(m_BootData + dwOffset + (ucSize * ucIndex));
155*4882a593Smuzhiyun     memcpy(lpData, m_BootData + pEntry->dwDataOffset, pEntry->dwDataSize);
156*4882a593Smuzhiyun     return true;
157*4882a593Smuzhiyun }
GetIndexByName(ENUM_RKBOOTENTRY type,tchar * pName)158*4882a593Smuzhiyun CHAR CRKBoot::GetIndexByName(ENUM_RKBOOTENTRY type, tchar *pName)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun     DWORD dwOffset;
161*4882a593Smuzhiyun     UCHAR ucCount, ucSize;
162*4882a593Smuzhiyun     switch (type)
163*4882a593Smuzhiyun     {
164*4882a593Smuzhiyun         case ENTRY471:
165*4882a593Smuzhiyun             dwOffset = m_471Offset;
166*4882a593Smuzhiyun             ucCount = m_471Count;
167*4882a593Smuzhiyun             ucSize = m_471Size;
168*4882a593Smuzhiyun             break;
169*4882a593Smuzhiyun         case ENTRY472:
170*4882a593Smuzhiyun             dwOffset = m_472Offset;
171*4882a593Smuzhiyun             ucCount = m_472Count;
172*4882a593Smuzhiyun             ucSize = m_472Size;
173*4882a593Smuzhiyun             break;
174*4882a593Smuzhiyun         case ENTRYLOADER:
175*4882a593Smuzhiyun             dwOffset = m_loaderOffset;
176*4882a593Smuzhiyun             ucCount = m_loaderCount;
177*4882a593Smuzhiyun             ucSize = m_loaderSize;
178*4882a593Smuzhiyun             break;
179*4882a593Smuzhiyun         default:
180*4882a593Smuzhiyun             return -1;
181*4882a593Smuzhiyun     }
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun     for (UCHAR i = 0; i < ucCount; i++)
184*4882a593Smuzhiyun     {
185*4882a593Smuzhiyun         PSTRUCT_RKBOOT_ENTRY pEntry;
186*4882a593Smuzhiyun         pEntry = (PSTRUCT_RKBOOT_ENTRY)(m_BootData + dwOffset + (ucSize * i));
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun         char szName[20];
189*4882a593Smuzhiyun         WCHAR_To_char(pEntry->szName, szName, 20);
190*4882a593Smuzhiyun         if (_tcsicmp(pName, szName) == 0)
191*4882a593Smuzhiyun         {
192*4882a593Smuzhiyun             return i;
193*4882a593Smuzhiyun         }
194*4882a593Smuzhiyun     }
195*4882a593Smuzhiyun     return -1;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun 
IsNewIDBFlag()198*4882a593Smuzhiyun bool CRKBoot::IsNewIDBFlag()
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun     return m_NewIDBFlag;
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
~CRKBoot()203*4882a593Smuzhiyun CRKBoot::~CRKBoot()
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun     if (m_BootData != NULL)
206*4882a593Smuzhiyun     {
207*4882a593Smuzhiyun         delete []m_BootData;
208*4882a593Smuzhiyun     }
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun 
CRKBoot(PBYTE lpBootData,DWORD dwBootSize,bool & bCheck)211*4882a593Smuzhiyun CRKBoot::CRKBoot(PBYTE lpBootData, DWORD dwBootSize, bool &bCheck)
212*4882a593Smuzhiyun {
213*4882a593Smuzhiyun     Rc4DisableFlag.setContainer(this);
214*4882a593Smuzhiyun     Rc4DisableFlag.getter(&CRKBoot::GetRc4DisableFlag);
215*4882a593Smuzhiyun     SignFlag.setContainer(this);
216*4882a593Smuzhiyun     SignFlag.getter(&CRKBoot::GetSignFlag);
217*4882a593Smuzhiyun     Version.setContainer(this);
218*4882a593Smuzhiyun     Version.getter(&CRKBoot::GetVersion);
219*4882a593Smuzhiyun     MergeVersion.setContainer(this);
220*4882a593Smuzhiyun     MergeVersion.getter(&CRKBoot::GetMergeVersion);
221*4882a593Smuzhiyun     ReleaseTime.setContainer(this);
222*4882a593Smuzhiyun     ReleaseTime.getter(&CRKBoot::GetReleaseTime);
223*4882a593Smuzhiyun     SupportDevice.setContainer(this);
224*4882a593Smuzhiyun     SupportDevice.getter(&CRKBoot::GetSupportDevice);
225*4882a593Smuzhiyun     Entry471Count.setContainer(this);
226*4882a593Smuzhiyun     Entry471Count.getter(&CRKBoot::GetEntry471Count);
227*4882a593Smuzhiyun     Entry472Count.setContainer(this);
228*4882a593Smuzhiyun     Entry472Count.getter(&CRKBoot::GetEntry472Count);
229*4882a593Smuzhiyun     EntryLoaderCount.setContainer(this);
230*4882a593Smuzhiyun     EntryLoaderCount.getter(&CRKBoot::GetEntryLoaderCount);
231*4882a593Smuzhiyun     bCheck = true;
232*4882a593Smuzhiyun     if (lpBootData != NULL)
233*4882a593Smuzhiyun     {
234*4882a593Smuzhiyun         m_BootData = lpBootData;
235*4882a593Smuzhiyun         m_BootSize = dwBootSize;
236*4882a593Smuzhiyun         bCheck = CrcCheck();
237*4882a593Smuzhiyun         if (!bCheck)
238*4882a593Smuzhiyun         {
239*4882a593Smuzhiyun             printf("CRKBoot : CrcCheck happen error\n");
240*4882a593Smuzhiyun             return;
241*4882a593Smuzhiyun         }
242*4882a593Smuzhiyun         PSTRUCT_RKBOOT_HEAD pBootHead;
243*4882a593Smuzhiyun         pBootHead = (PSTRUCT_RKBOOT_HEAD)(m_BootData);
244*4882a593Smuzhiyun         if (pBootHead->uiTag != 0x544F4F42  && (pBootHead->uiTag != 0x2052444C)) //add suppoty rk356x new loader
245*4882a593Smuzhiyun         {
246*4882a593Smuzhiyun             bCheck = false;
247*4882a593Smuzhiyun             printf("CRKBoot : pBootHead->uiTag!=0x544F4F42 or 0x2052444C\n");
248*4882a593Smuzhiyun             return;
249*4882a593Smuzhiyun         }
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun         if (0x2052444C == pBootHead->uiTag)
252*4882a593Smuzhiyun         {
253*4882a593Smuzhiyun             m_NewIDBFlag = true;
254*4882a593Smuzhiyun             printf("RKBoot:this is new IDB flag\n");
255*4882a593Smuzhiyun         }
256*4882a593Smuzhiyun         else
257*4882a593Smuzhiyun         {
258*4882a593Smuzhiyun             m_NewIDBFlag = false;
259*4882a593Smuzhiyun         }
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun         if (pBootHead->ucRc4Flag)
262*4882a593Smuzhiyun         {
263*4882a593Smuzhiyun             m_bRc4Disable = true;
264*4882a593Smuzhiyun         }
265*4882a593Smuzhiyun         else
266*4882a593Smuzhiyun         {
267*4882a593Smuzhiyun             m_bRc4Disable = false;
268*4882a593Smuzhiyun         }
269*4882a593Smuzhiyun         if (pBootHead->ucSignFlag == 'S')
270*4882a593Smuzhiyun         {
271*4882a593Smuzhiyun             m_bSignFlag = true;
272*4882a593Smuzhiyun         }
273*4882a593Smuzhiyun         else
274*4882a593Smuzhiyun         {
275*4882a593Smuzhiyun             m_bSignFlag = false;
276*4882a593Smuzhiyun         }
277*4882a593Smuzhiyun         m_version = pBootHead->dwVersion;
278*4882a593Smuzhiyun         m_mergeVersion = pBootHead->dwMergeVersion;
279*4882a593Smuzhiyun         m_BootHeadSize = pBootHead->usSize;
280*4882a593Smuzhiyun         m_releaseTime.usYear = pBootHead->stReleaseTime.usYear;
281*4882a593Smuzhiyun         m_releaseTime.ucMonth = pBootHead->stReleaseTime.ucMonth;
282*4882a593Smuzhiyun         m_releaseTime.ucDay = pBootHead->stReleaseTime.ucDay;
283*4882a593Smuzhiyun         m_releaseTime.ucHour = pBootHead->stReleaseTime.ucHour;
284*4882a593Smuzhiyun         m_releaseTime.ucMinute = pBootHead->stReleaseTime.ucMinute;
285*4882a593Smuzhiyun         m_releaseTime.ucSecond = pBootHead->stReleaseTime.ucSecond;
286*4882a593Smuzhiyun         m_supportDevice = pBootHead->emSupportChip;
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun         m_471Offset = pBootHead->dw471EntryOffset;
289*4882a593Smuzhiyun         m_471Count = pBootHead->uc471EntryCount;
290*4882a593Smuzhiyun         m_471Size = pBootHead->uc471EntrySize;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun         m_472Offset = pBootHead->dw472EntryOffset;
293*4882a593Smuzhiyun         m_472Count = pBootHead->uc472EntryCount;
294*4882a593Smuzhiyun         m_472Size = pBootHead->uc472EntrySize;
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun         m_loaderOffset = pBootHead->dwLoaderEntryOffset;
297*4882a593Smuzhiyun         m_loaderCount = pBootHead->ucLoaderEntryCount;
298*4882a593Smuzhiyun         m_loaderSize = pBootHead->ucLoaderEntrySize;
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun         memcpy(m_crc, m_BootData + (m_BootSize - 4), 4);
301*4882a593Smuzhiyun     }
302*4882a593Smuzhiyun     else
303*4882a593Smuzhiyun     {
304*4882a593Smuzhiyun         bCheck = false;
305*4882a593Smuzhiyun         printf("CRKBoot : lpBootData = null\n");
306*4882a593Smuzhiyun         m_BootData = NULL;
307*4882a593Smuzhiyun     }
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun 
WCHAR_To_char(WCHAR * src,char * dst,int len)310*4882a593Smuzhiyun void CRKBoot::WCHAR_To_char(WCHAR *src, char *dst, int len)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun     int i;
313*4882a593Smuzhiyun     memset(dst, 0, len * sizeof(char));
314*4882a593Smuzhiyun     for (i = 0; i < len; i++)
315*4882a593Smuzhiyun     {
316*4882a593Smuzhiyun         memcpy(dst, src, 1);
317*4882a593Smuzhiyun         src++;
318*4882a593Smuzhiyun         dst++;
319*4882a593Smuzhiyun     }
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun 
322