xref: /rkdeveloptool/main.cpp (revision 76af099afcbcafd97801028de2ba3421d3c12865)
1*76af099aSliuyi /*
2*76af099aSliuyi  * (C) Copyright 2017 Fuzhou Rockchip Electronics Co., Ltd
3*76af099aSliuyi  * Seth Liu 2017.03.01
4*76af099aSliuyi  *
5*76af099aSliuyi  * SPDX-License-Identifier:	GPL-2.0+
6*76af099aSliuyi  */
7*76af099aSliuyi 
8*76af099aSliuyi #include   <unistd.h>
9*76af099aSliuyi #include   <dirent.h>
10*76af099aSliuyi #include "DefineHeader.h"
11*76af099aSliuyi #include "RKLog.h"
12*76af099aSliuyi #include "RKScan.h"
13*76af099aSliuyi #include "RKComm.h"
14*76af099aSliuyi #include "RKDevice.h"
15*76af099aSliuyi #include "RKImage.h"
16*76af099aSliuyi extern const char *szManufName[];
17*76af099aSliuyi CRKLog *g_pLogObject=NULL;
18*76af099aSliuyi CONFIG_ITEM_VECTOR g_ConfigItemVec;
19*76af099aSliuyi #define DEFAULT_RW_LBA 128
20*76af099aSliuyi #define CURSOR_MOVEUP_LINE(n) printf("%c[%dA", 0x1B, n)
21*76af099aSliuyi #define CURSOR_DEL_LINE printf("%c[2K", 0x1B)
22*76af099aSliuyi #define CURSOR_MOVE_HOME printf("%c[H", 0x1B)
23*76af099aSliuyi #define CURSOR_CLEAR_SCREEN printf("%c[2J", 0x1B)
24*76af099aSliuyi #define ERROR_COLOR_ATTR  printf("%c[30;41m", 0x1B);
25*76af099aSliuyi #define NORMAL_COLOR_ATTR  printf("%c[37;40m", 0x1B);
26*76af099aSliuyi void usage()
27*76af099aSliuyi {
28*76af099aSliuyi 	printf("\r\n---------------------Tool Usage ---------------------\r\n");
29*76af099aSliuyi 	printf("Help:             -H\r\n");
30*76af099aSliuyi 	printf("Version:          -V\r\n");
31*76af099aSliuyi 	printf("DownloadBoot:	DB <Loader>\r\n");
32*76af099aSliuyi 	printf("ReadLBA:		RL  <BeginSec> <SectorLen> <File>\r\n");
33*76af099aSliuyi 	printf("WriteLBA:		WL  <BeginSec> <File>\r\n");
34*76af099aSliuyi 	printf("EraseFlash:		EF \r\n");
35*76af099aSliuyi 	printf("TestDevice:		TD\r\n");
36*76af099aSliuyi 	printf("ResetDevice:	RD [subcode]\r\n");
37*76af099aSliuyi 	printf("ReadFlashID:	RID\r\n");
38*76af099aSliuyi 	printf("ReadFlashInfo:	RFI\r\n");
39*76af099aSliuyi 	printf("ReadChipInfo:	RCI\r\n");
40*76af099aSliuyi 	printf("-------------------------------------------------------\r\n\r\n");
41*76af099aSliuyi }
42*76af099aSliuyi void ProgressInfoProc(DWORD deviceLayer, ENUM_PROGRESS_PROMPT promptID, long long totalValue, long long currentValue, ENUM_CALL_STEP emCall)
43*76af099aSliuyi {
44*76af099aSliuyi 	string strInfoText="";
45*76af099aSliuyi 	char szText[256];
46*76af099aSliuyi 	switch (promptID) {
47*76af099aSliuyi 	case TESTDEVICE_PROGRESS:
48*76af099aSliuyi 		sprintf(szText, "Test Device Total(%lld),Current(%lld)", totalValue, currentValue);
49*76af099aSliuyi 		strInfoText = szText;
50*76af099aSliuyi 		break;
51*76af099aSliuyi 	case LOWERFORMAT_PROGRESS:
52*76af099aSliuyi 		sprintf(szText, "Lowerformat Device Total(%lld),Current(%lld)", totalValue, currentValue);
53*76af099aSliuyi 		strInfoText = szText;
54*76af099aSliuyi 		break;
55*76af099aSliuyi 	case DOWNLOADIMAGE_PROGRESS:
56*76af099aSliuyi 		sprintf(szText, "Download Image Total(%lldK),Current(%lldK)", totalValue/1024, currentValue/1024);
57*76af099aSliuyi 		strInfoText = szText;
58*76af099aSliuyi 		break;
59*76af099aSliuyi 	case CHECKIMAGE_PROGRESS:
60*76af099aSliuyi 		sprintf(szText, "Check Image Total(%lldK),Current(%lldK)", totalValue/1024, currentValue/1024);
61*76af099aSliuyi 		strInfoText = szText;
62*76af099aSliuyi 		break;
63*76af099aSliuyi 	case TAGBADBLOCK_PROGRESS:
64*76af099aSliuyi 		sprintf(szText, "Tag Bad Block Total(%lld),Current(%lld)", totalValue, currentValue);
65*76af099aSliuyi 		strInfoText = szText;
66*76af099aSliuyi 		break;
67*76af099aSliuyi 	case TESTBLOCK_PROGRESS:
68*76af099aSliuyi 		sprintf(szText, "Test Block Total(%lld),Current(%lld)", totalValue, currentValue);
69*76af099aSliuyi 		strInfoText = szText;
70*76af099aSliuyi 		break;
71*76af099aSliuyi 	case ERASEFLASH_PROGRESS:
72*76af099aSliuyi 		sprintf(szText, "Erase Flash Total(%lld),Current(%lld)", totalValue, currentValue);
73*76af099aSliuyi 		strInfoText = szText;
74*76af099aSliuyi 		break;
75*76af099aSliuyi 	case ERASESYSTEM_PROGRESS:
76*76af099aSliuyi 		sprintf(szText, "Erase System partition Total(%lld),Current(%lld)", totalValue, currentValue);
77*76af099aSliuyi 		strInfoText = szText;
78*76af099aSliuyi 		break;
79*76af099aSliuyi 	case ERASEUSERDATA_PROGRESS:
80*76af099aSliuyi 		sprintf(szText, "<LocationID=%x> Erase Userdata partition Total(%lld),Current(%lld)",deviceLayer,totalValue, currentValue);
81*76af099aSliuyi 		strInfoText = szText;
82*76af099aSliuyi 		break;
83*76af099aSliuyi 	}
84*76af099aSliuyi 	if (strInfoText.size() > 0){
85*76af099aSliuyi 		CURSOR_MOVEUP_LINE(1);
86*76af099aSliuyi 		CURSOR_DEL_LINE;
87*76af099aSliuyi 		printf("%s\r\n", strInfoText.c_str());
88*76af099aSliuyi 	}
89*76af099aSliuyi 	if (emCall == CALL_LAST)
90*76af099aSliuyi 		deviceLayer = 0;
91*76af099aSliuyi }
92*76af099aSliuyi 
93*76af099aSliuyi char *strupr(char *szSrc)
94*76af099aSliuyi {
95*76af099aSliuyi 	char *p = szSrc;
96*76af099aSliuyi 	while(*p){
97*76af099aSliuyi 		if ((*p >= 'a') && (*p <= 'z'))
98*76af099aSliuyi 			*p = *p - 'a' + 'A';
99*76af099aSliuyi 		p++;
100*76af099aSliuyi 	}
101*76af099aSliuyi 	return szSrc;
102*76af099aSliuyi }
103*76af099aSliuyi void PrintData(PBYTE pData, int nSize)
104*76af099aSliuyi {
105*76af099aSliuyi 	char szPrint[17] = "\0";
106*76af099aSliuyi 	int i;
107*76af099aSliuyi 	for( i = 0; i < nSize; i++){
108*76af099aSliuyi 		if(i % 16 == 0){
109*76af099aSliuyi 			if(i / 16 > 0)
110*76af099aSliuyi 				printf("     %s\r\n", szPrint);
111*76af099aSliuyi 			printf("%08d ", i / 16);
112*76af099aSliuyi 		}
113*76af099aSliuyi 		printf("%02X ", pData[i]);
114*76af099aSliuyi 		szPrint[i%16] = isprint(pData[i]) ? pData[i] : '.';
115*76af099aSliuyi 	}
116*76af099aSliuyi 	if(i / 16 > 0)
117*76af099aSliuyi 		printf("     %s\r\n", szPrint);
118*76af099aSliuyi }
119*76af099aSliuyi 
120*76af099aSliuyi bool StringToWideString(char *pszSrc, wchar_t *&pszDest)
121*76af099aSliuyi {
122*76af099aSliuyi 	if (!pszSrc)
123*76af099aSliuyi 		return false;
124*76af099aSliuyi 	int nSrcLen = strlen(pszSrc);
125*76af099aSliuyi 	int nDestLen = nSrcLen * 2;
126*76af099aSliuyi 
127*76af099aSliuyi 	pszDest = NULL;
128*76af099aSliuyi 	pszDest = new wchar_t[nDestLen];
129*76af099aSliuyi 	if (!pszDest)
130*76af099aSliuyi 		return false;
131*76af099aSliuyi 	nDestLen = nDestLen * sizeof(wchar_t);
132*76af099aSliuyi 	memset(pszDest, 0, nDestLen);
133*76af099aSliuyi 	int iRet;
134*76af099aSliuyi 	iconv_t cd;
135*76af099aSliuyi 	cd = iconv_open("UTF-32", "UTF-8");
136*76af099aSliuyi 	if((iconv_t)-1 == cd) {
137*76af099aSliuyi 		delete []pszDest;
138*76af099aSliuyi 		pszDest = NULL;
139*76af099aSliuyi 	      return false;
140*76af099aSliuyi 	 }
141*76af099aSliuyi 	char *pIn, *pOut;
142*76af099aSliuyi 	pIn = (char *)pszSrc;
143*76af099aSliuyi 	pOut = (char *)pszDest;
144*76af099aSliuyi 
145*76af099aSliuyi 	iRet = iconv(cd, (char **)&pIn, (size_t *)&nSrcLen, (char **)&pOut, (size_t *)&nDestLen);
146*76af099aSliuyi 
147*76af099aSliuyi 	if(iRet == -1) {
148*76af099aSliuyi 		delete []pszDest;
149*76af099aSliuyi 		pszDest = NULL;
150*76af099aSliuyi 		iconv_close(cd);
151*76af099aSliuyi 		return false;
152*76af099aSliuyi 	 }
153*76af099aSliuyi 
154*76af099aSliuyi 	 iconv_close(cd);
155*76af099aSliuyi 
156*76af099aSliuyi 	 return true;
157*76af099aSliuyi }
158*76af099aSliuyi bool WideStringToString(wchar_t *pszSrc, char *&pszDest)
159*76af099aSliuyi {
160*76af099aSliuyi 	if (!pszSrc)
161*76af099aSliuyi 		return false;
162*76af099aSliuyi 	int nSrcLen = wcslen(pszSrc);
163*76af099aSliuyi 	int nDestLen = nSrcLen * 2;
164*76af099aSliuyi 	nSrcLen = nSrcLen * sizeof(wchar_t);
165*76af099aSliuyi 	pszDest = NULL;
166*76af099aSliuyi 	pszDest = new char[nDestLen];
167*76af099aSliuyi 	if (!pszDest)
168*76af099aSliuyi 		return false;
169*76af099aSliuyi 	memset(pszDest, 0, nDestLen);
170*76af099aSliuyi 	int iRet;
171*76af099aSliuyi 	iconv_t cd;
172*76af099aSliuyi 	cd = iconv_open("UTF-8", "UTF-32");
173*76af099aSliuyi 
174*76af099aSliuyi 	if((iconv_t)-1 == cd) {
175*76af099aSliuyi 		delete []pszDest;
176*76af099aSliuyi 		pszDest = NULL;
177*76af099aSliuyi 	      return false;
178*76af099aSliuyi 	 }
179*76af099aSliuyi 	char *pIn, *pOut;
180*76af099aSliuyi 	pIn = (char *)pszSrc;
181*76af099aSliuyi 	pOut = (char *)pszDest;
182*76af099aSliuyi 	iRet = iconv(cd, (char **)&pIn, (size_t *)&nSrcLen, (char **)&pOut, (size_t *)&nDestLen);
183*76af099aSliuyi 
184*76af099aSliuyi 	if(iRet == -1) {
185*76af099aSliuyi 		delete []pszDest;
186*76af099aSliuyi 		pszDest = NULL;
187*76af099aSliuyi 		iconv_close(cd);
188*76af099aSliuyi 		return false;
189*76af099aSliuyi 	 }
190*76af099aSliuyi 
191*76af099aSliuyi 	 iconv_close(cd);
192*76af099aSliuyi 
193*76af099aSliuyi 	 return true;
194*76af099aSliuyi }
195*76af099aSliuyi int find_config_item(const char *pszName)
196*76af099aSliuyi {
197*76af099aSliuyi 	unsigned int i;
198*76af099aSliuyi 	for(i = 0; i < g_ConfigItemVec.size(); i++){
199*76af099aSliuyi 		if (strcasecmp(pszName, g_ConfigItemVec[i].szItemName) == 0){
200*76af099aSliuyi 			return i;
201*76af099aSliuyi 		}
202*76af099aSliuyi 	}
203*76af099aSliuyi 	return -1;
204*76af099aSliuyi }
205*76af099aSliuyi 
206*76af099aSliuyi bool parse_config(char *pConfig, CONFIG_ITEM_VECTOR &vecItem)
207*76af099aSliuyi {
208*76af099aSliuyi 
209*76af099aSliuyi 	stringstream configStream(pConfig);
210*76af099aSliuyi 	string strLine, strItemName, strItemValue;
211*76af099aSliuyi 	string::size_type line_size,pos;
212*76af099aSliuyi 	STRUCT_CONFIG_ITEM item;
213*76af099aSliuyi 	vecItem.clear();
214*76af099aSliuyi 	while (!configStream.eof()){
215*76af099aSliuyi 		getline(configStream, strLine);
216*76af099aSliuyi 		line_size = strLine.size();
217*76af099aSliuyi 		if (line_size == 0)
218*76af099aSliuyi 			continue;
219*76af099aSliuyi 		if (strLine[line_size-1] == '\r'){
220*76af099aSliuyi 			strLine = strLine.substr(0, line_size-1);
221*76af099aSliuyi 		}
222*76af099aSliuyi 		pos = strLine.find("=");
223*76af099aSliuyi 		if (pos == string::npos){
224*76af099aSliuyi 			continue;
225*76af099aSliuyi 		}
226*76af099aSliuyi 		strItemName = strLine.substr(0, pos);
227*76af099aSliuyi 		strItemValue = strLine.substr(pos + 1);
228*76af099aSliuyi 		strItemName.erase(0, strItemName.find_first_not_of(" "));
229*76af099aSliuyi 		strItemName.erase(strItemName.find_last_not_of(" ") + 1);
230*76af099aSliuyi 		strItemValue.erase(0, strItemValue.find_first_not_of(" "));
231*76af099aSliuyi 		strItemValue.erase(strItemValue.find_last_not_of(" ") + 1);
232*76af099aSliuyi 		if ((strItemName.size() > 0) && (strItemValue.size() > 0)){
233*76af099aSliuyi 			strcpy(item.szItemName, strItemName.c_str());
234*76af099aSliuyi 			strcpy(item.szItemValue, strItemValue.c_str());
235*76af099aSliuyi 			vecItem.push_back(item);
236*76af099aSliuyi 		}
237*76af099aSliuyi 	}
238*76af099aSliuyi 	return true;
239*76af099aSliuyi 
240*76af099aSliuyi }
241*76af099aSliuyi bool parse_config_file(const char *pConfigFile, CONFIG_ITEM_VECTOR &vecItem)
242*76af099aSliuyi {
243*76af099aSliuyi 	FILE *file = NULL;
244*76af099aSliuyi 	file = fopen(pConfigFile, "rb");
245*76af099aSliuyi 	if( !file ){
246*76af099aSliuyi 		if (g_pLogObject)
247*76af099aSliuyi 			g_pLogObject->Record("parse_config_file failed,err=%d,can't open file: %s\r\n", errno, pConfigFile);
248*76af099aSliuyi 		return false;
249*76af099aSliuyi 	}
250*76af099aSliuyi 	int iFileSize;
251*76af099aSliuyi 	fseek(file, 0, SEEK_END);
252*76af099aSliuyi 	iFileSize = ftell(file);
253*76af099aSliuyi 	fseek(file, 0, SEEK_SET);
254*76af099aSliuyi 	char *pConfigBuf = NULL;
255*76af099aSliuyi 	pConfigBuf = new char[iFileSize + 1];
256*76af099aSliuyi 	if (!pConfigBuf){
257*76af099aSliuyi 		fclose(file);
258*76af099aSliuyi 		return false;
259*76af099aSliuyi 	}
260*76af099aSliuyi 	memset(pConfigBuf, 0, iFileSize + 1);
261*76af099aSliuyi 	int iRead;
262*76af099aSliuyi 	iRead = fread(pConfigBuf, 1, iFileSize, file);
263*76af099aSliuyi 	if (iRead != iFileSize){
264*76af099aSliuyi 		if (g_pLogObject)
265*76af099aSliuyi 			g_pLogObject->Record("parse_config_file failed,err=%d, read=%d, total=%d\r\n", errno, iRead, iFileSize);
266*76af099aSliuyi 		fclose(file);
267*76af099aSliuyi 		delete []pConfigBuf;
268*76af099aSliuyi 		return false;
269*76af099aSliuyi 	}
270*76af099aSliuyi 	fclose(file);
271*76af099aSliuyi 	bool bRet;
272*76af099aSliuyi 	bRet = parse_config(pConfigBuf, vecItem);
273*76af099aSliuyi 	delete []pConfigBuf;
274*76af099aSliuyi 	return bRet;
275*76af099aSliuyi }
276*76af099aSliuyi 
277*76af099aSliuyi bool check_device_type(STRUCT_RKDEVICE_DESC &dev, UINT uiSupportType)
278*76af099aSliuyi {
279*76af099aSliuyi 	if ((dev.emUsbType & uiSupportType) == dev.emUsbType)
280*76af099aSliuyi 		return true;
281*76af099aSliuyi 	else
282*76af099aSliuyi 	{
283*76af099aSliuyi 		ERROR_COLOR_ATTR;
284*76af099aSliuyi 		printf("The  Device did not support this operation!");
285*76af099aSliuyi 		NORMAL_COLOR_ATTR;
286*76af099aSliuyi 		printf("\r\n");
287*76af099aSliuyi 		return false;
288*76af099aSliuyi 	}
289*76af099aSliuyi }
290*76af099aSliuyi 
291*76af099aSliuyi bool download_boot(STRUCT_RKDEVICE_DESC &dev, char *szLoader)
292*76af099aSliuyi {
293*76af099aSliuyi 	if (!check_device_type(dev, RKUSB_MASKROM))
294*76af099aSliuyi 		return false;
295*76af099aSliuyi 	CRKImage *pImage = NULL;
296*76af099aSliuyi 	CRKBoot *pBoot = NULL;
297*76af099aSliuyi 	bool bRet, bSuccess = false;
298*76af099aSliuyi 	int iRet;
299*76af099aSliuyi 
300*76af099aSliuyi 	pImage = new CRKImage(szLoader, bRet);
301*76af099aSliuyi 	if (!bRet){
302*76af099aSliuyi 		ERROR_COLOR_ATTR;
303*76af099aSliuyi 		printf("Open loader failed,exit download boot!");
304*76af099aSliuyi 		NORMAL_COLOR_ATTR;
305*76af099aSliuyi 		printf("\r\n");
306*76af099aSliuyi 		return bSuccess;
307*76af099aSliuyi 	} else {
308*76af099aSliuyi 		pBoot = (CRKBoot *)pImage->m_bootObject;
309*76af099aSliuyi 		CRKComm *pComm = NULL;
310*76af099aSliuyi 		CRKDevice *pDevice = NULL;
311*76af099aSliuyi 
312*76af099aSliuyi 		dev.emDeviceType = pBoot->SupportDevice;
313*76af099aSliuyi 		pComm = new CRKUsbComm(dev, g_pLogObject, bRet);
314*76af099aSliuyi 		if (!bRet) {
315*76af099aSliuyi 			if (pImage)
316*76af099aSliuyi 				delete pImage;
317*76af099aSliuyi 			ERROR_COLOR_ATTR;
318*76af099aSliuyi 			printf("Creating Comm Object failed!");
319*76af099aSliuyi 			NORMAL_COLOR_ATTR;
320*76af099aSliuyi 			printf("\r\n");
321*76af099aSliuyi 			return bSuccess;
322*76af099aSliuyi 		}
323*76af099aSliuyi 
324*76af099aSliuyi 		pDevice = new CRKDevice(dev);
325*76af099aSliuyi 		if (!pDevice) {
326*76af099aSliuyi 			if (pImage)
327*76af099aSliuyi 				delete pImage;
328*76af099aSliuyi 			if (pComm)
329*76af099aSliuyi 				delete pComm;
330*76af099aSliuyi 			ERROR_COLOR_ATTR;
331*76af099aSliuyi 			printf("Creating device object failed!");
332*76af099aSliuyi 			NORMAL_COLOR_ATTR;
333*76af099aSliuyi 			printf("\r\n");
334*76af099aSliuyi 			return bSuccess;
335*76af099aSliuyi 		}
336*76af099aSliuyi 
337*76af099aSliuyi 		pDevice->SetObject(pImage, pComm, g_pLogObject);
338*76af099aSliuyi 		printf("Download boot...\r\n");
339*76af099aSliuyi 		iRet = pDevice->DownloadBoot();
340*76af099aSliuyi 
341*76af099aSliuyi 		CURSOR_MOVEUP_LINE(1);
342*76af099aSliuyi 		CURSOR_DEL_LINE;
343*76af099aSliuyi 		if (iRet == 0) {
344*76af099aSliuyi 			pComm->Reset_Usb_Device();
345*76af099aSliuyi 			CRKScan *pScan = NULL;
346*76af099aSliuyi 			pScan = new CRKScan();
347*76af099aSliuyi 			if (pScan) {
348*76af099aSliuyi 				pScan->SetVidPid();
349*76af099aSliuyi 				pScan->Wait(dev, RKUSB_MASKROM, dev.usVid, dev.usPid);
350*76af099aSliuyi 				delete pScan;
351*76af099aSliuyi 			}
352*76af099aSliuyi 			bSuccess = true;
353*76af099aSliuyi 			printf("Download boot ok.\r\n");
354*76af099aSliuyi 		}
355*76af099aSliuyi 		else
356*76af099aSliuyi 			printf("Download boot failed!\r\n");
357*76af099aSliuyi 
358*76af099aSliuyi 		if (pImage)
359*76af099aSliuyi 			delete pImage;
360*76af099aSliuyi 		if(pDevice)
361*76af099aSliuyi 			delete pDevice;
362*76af099aSliuyi 	}
363*76af099aSliuyi 	return bSuccess;
364*76af099aSliuyi }
365*76af099aSliuyi bool erase_flash(STRUCT_RKDEVICE_DESC &dev)
366*76af099aSliuyi {
367*76af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
368*76af099aSliuyi 		return false;
369*76af099aSliuyi 	CRKImage *pImage = NULL;
370*76af099aSliuyi 	bool bRet, bSuccess = false;
371*76af099aSliuyi 	int iRet;
372*76af099aSliuyi 	CRKScan *pScan = NULL;
373*76af099aSliuyi 	pScan = new CRKScan();
374*76af099aSliuyi 	pScan->SetVidPid();
375*76af099aSliuyi 
376*76af099aSliuyi 	CRKComm *pComm = NULL;
377*76af099aSliuyi 	CRKDevice *pDevice = NULL;
378*76af099aSliuyi 
379*76af099aSliuyi 	pComm = new CRKUsbComm(dev, g_pLogObject, bRet);
380*76af099aSliuyi 	if (!bRet) {
381*76af099aSliuyi 		if (pScan)
382*76af099aSliuyi 			delete pScan;
383*76af099aSliuyi 		ERROR_COLOR_ATTR;
384*76af099aSliuyi 		printf("Creating Comm Object failed!");
385*76af099aSliuyi 		NORMAL_COLOR_ATTR;
386*76af099aSliuyi 		printf("\r\n");
387*76af099aSliuyi 		return bSuccess;
388*76af099aSliuyi 	}
389*76af099aSliuyi 
390*76af099aSliuyi 	pDevice = new CRKDevice(dev);
391*76af099aSliuyi 	if (!pDevice) {
392*76af099aSliuyi 		if (pComm)
393*76af099aSliuyi 			delete pComm;
394*76af099aSliuyi 		if (pScan)
395*76af099aSliuyi 			delete pScan;
396*76af099aSliuyi 		ERROR_COLOR_ATTR;
397*76af099aSliuyi 		printf("Creating device object failed!");
398*76af099aSliuyi 		NORMAL_COLOR_ATTR;
399*76af099aSliuyi 		printf("\r\n");
400*76af099aSliuyi 		return bSuccess;
401*76af099aSliuyi 	}
402*76af099aSliuyi 
403*76af099aSliuyi 	pDevice->SetObject(pImage, pComm, g_pLogObject);
404*76af099aSliuyi 	pDevice->CallBackPointer = ProgressInfoProc;
405*76af099aSliuyi 
406*76af099aSliuyi 	printf("Start to erase flash...\r\n");
407*76af099aSliuyi 	iRet = pDevice->EraseAllBlocks();
408*76af099aSliuyi 	if (pDevice)
409*76af099aSliuyi 		delete pDevice;
410*76af099aSliuyi 
411*76af099aSliuyi 	if (iRet == 0) {
412*76af099aSliuyi 		if (pScan) {
413*76af099aSliuyi 			pScan->SetVidPid();
414*76af099aSliuyi 			pScan->Wait(dev, RKUSB_MASKROM, dev.usVid, dev.usPid);
415*76af099aSliuyi 			delete pScan;
416*76af099aSliuyi 		}
417*76af099aSliuyi 		CURSOR_MOVEUP_LINE(1);
418*76af099aSliuyi 		CURSOR_DEL_LINE;
419*76af099aSliuyi 		bSuccess = true;
420*76af099aSliuyi 		printf("Erase flash ok.\r\n");
421*76af099aSliuyi 	}
422*76af099aSliuyi 
423*76af099aSliuyi 	return bSuccess;
424*76af099aSliuyi }
425*76af099aSliuyi 
426*76af099aSliuyi bool test_device(STRUCT_RKDEVICE_DESC &dev)
427*76af099aSliuyi {
428*76af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
429*76af099aSliuyi 		return false;
430*76af099aSliuyi 	CRKUsbComm *pComm = NULL;
431*76af099aSliuyi 	bool bRet, bSuccess = false;
432*76af099aSliuyi 	int iRet;
433*76af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
434*76af099aSliuyi 	if (bRet) {
435*76af099aSliuyi 		iRet = pComm->RKU_TestDeviceReady();
436*76af099aSliuyi 		if (iRet != ERR_SUCCESS) {
437*76af099aSliuyi 			if (g_pLogObject)
438*76af099aSliuyi 				g_pLogObject->Record("Error:RKU_TestDeviceReady failed,err=%d", iRet);
439*76af099aSliuyi 			printf("Test Device Fail!\r\n");
440*76af099aSliuyi 		} else {
441*76af099aSliuyi 			bSuccess = true;
442*76af099aSliuyi 			printf("Test Device OK.\r\n");
443*76af099aSliuyi 		}
444*76af099aSliuyi 	} else {
445*76af099aSliuyi 		printf("Test Device quit,Creating comm object failed!\r\n");
446*76af099aSliuyi 	}
447*76af099aSliuyi 	if (pComm) {
448*76af099aSliuyi 		delete pComm;
449*76af099aSliuyi 		pComm = NULL;
450*76af099aSliuyi 	}
451*76af099aSliuyi 	return bSuccess;
452*76af099aSliuyi }
453*76af099aSliuyi bool reset_device(STRUCT_RKDEVICE_DESC &dev, BYTE subCode = RST_NONE_SUBCODE)
454*76af099aSliuyi {
455*76af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
456*76af099aSliuyi 		return false;
457*76af099aSliuyi 	CRKUsbComm *pComm = NULL;
458*76af099aSliuyi 	bool bRet, bSuccess = false;
459*76af099aSliuyi 	int iRet;
460*76af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
461*76af099aSliuyi 	if (bRet) {
462*76af099aSliuyi 		iRet = pComm->RKU_ResetDevice(subCode);
463*76af099aSliuyi 		if (iRet != ERR_SUCCESS) {
464*76af099aSliuyi 			if (g_pLogObject)
465*76af099aSliuyi 				g_pLogObject->Record("Error:RKU_ResetDevice failed,err=%d", iRet);
466*76af099aSliuyi 			printf("Reset Device Fail!\r\n");
467*76af099aSliuyi 		} else {
468*76af099aSliuyi 			bSuccess = true;
469*76af099aSliuyi 			printf("Reset Device OK.\r\n");
470*76af099aSliuyi 		}
471*76af099aSliuyi 	} else {
472*76af099aSliuyi 		printf("Reset Device quit,Creating comm object failed!\r\n");
473*76af099aSliuyi 	}
474*76af099aSliuyi 	if (pComm) {
475*76af099aSliuyi 		delete pComm;
476*76af099aSliuyi 		pComm = NULL;
477*76af099aSliuyi 	}
478*76af099aSliuyi 	return bSuccess;
479*76af099aSliuyi }
480*76af099aSliuyi 
481*76af099aSliuyi bool read_flash_id(STRUCT_RKDEVICE_DESC &dev)
482*76af099aSliuyi {
483*76af099aSliuyi 	CRKUsbComm *pComm = NULL;
484*76af099aSliuyi 	bool bRet, bSuccess = false;
485*76af099aSliuyi 	int iRet;
486*76af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
487*76af099aSliuyi 		return bSuccess;
488*76af099aSliuyi 
489*76af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
490*76af099aSliuyi 	if (bRet) {
491*76af099aSliuyi 		BYTE flashID[5];
492*76af099aSliuyi 		iRet = pComm->RKU_ReadFlashID(flashID);
493*76af099aSliuyi 		if (iRet != ERR_SUCCESS) {
494*76af099aSliuyi 			if (g_pLogObject)
495*76af099aSliuyi 				g_pLogObject->Record("Error:RKU_ReadFlashID failed,err=%d", iRet);
496*76af099aSliuyi 			printf("Read flash ID Fail!\r\n");
497*76af099aSliuyi 		} else {
498*76af099aSliuyi 			printf("Flash ID:%02X %02X %02X %02X %02X \r\n", flashID[0], flashID[1], flashID[2], flashID[3], flashID[4]);
499*76af099aSliuyi 			bSuccess = true;
500*76af099aSliuyi 		}
501*76af099aSliuyi 	} else {
502*76af099aSliuyi 		printf("Read flash ID quit,Creating comm object failed!\r\n");
503*76af099aSliuyi 	}
504*76af099aSliuyi 	if (pComm) {
505*76af099aSliuyi 		delete pComm;
506*76af099aSliuyi 		pComm = NULL;
507*76af099aSliuyi 	}
508*76af099aSliuyi 	return bSuccess;
509*76af099aSliuyi }
510*76af099aSliuyi bool read_flash_info(STRUCT_RKDEVICE_DESC &dev)
511*76af099aSliuyi {
512*76af099aSliuyi 	CRKUsbComm *pComm = NULL;
513*76af099aSliuyi 	bool bRet, bSuccess = false;
514*76af099aSliuyi 	int iRet;
515*76af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
516*76af099aSliuyi 		return bSuccess;
517*76af099aSliuyi 
518*76af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
519*76af099aSliuyi 	if (bRet) {
520*76af099aSliuyi 		STRUCT_FLASHINFO_CMD info;
521*76af099aSliuyi 		UINT uiRead;
522*76af099aSliuyi 		iRet = pComm->RKU_ReadFlashInfo((BYTE *)&info, &uiRead);
523*76af099aSliuyi 		if (iRet != ERR_SUCCESS) {
524*76af099aSliuyi 			if (g_pLogObject)
525*76af099aSliuyi 				g_pLogObject->Record("Error:RKU_ReadFlashInfo failed,err=%d", iRet);
526*76af099aSliuyi 			printf("Read flash Info Fail!\r\n");
527*76af099aSliuyi 		} else {
528*76af099aSliuyi 			printf("Flash Info:\r\n");
529*76af099aSliuyi 			if (info.bManufCode <= 7) {
530*76af099aSliuyi 				printf("\tManufacturer: %s,value=%02X\r\n", szManufName[info.bManufCode], info.bManufCode);
531*76af099aSliuyi 			}
532*76af099aSliuyi 			else
533*76af099aSliuyi 				printf("\tManufacturer: %s,value=%02X\r\n", "Unknown", info.bManufCode);
534*76af099aSliuyi 
535*76af099aSliuyi 			printf("\tFlash Size: %dMB\r\n", info.uiFlashSize / 2 / 1024);
536*76af099aSliuyi 			printf("\tBlock Size: %dKB\r\n", info.usBlockSize / 2);
537*76af099aSliuyi 			printf("\tPage Size: %dKB\r\n", info.bPageSize / 2);
538*76af099aSliuyi 			printf("\tECC Bits: %d\r\n", info.bECCBits);
539*76af099aSliuyi 			printf("\tAccess Time: %d\r\n", info.bAccessTime);
540*76af099aSliuyi 			printf("\tFlash CS: ");
541*76af099aSliuyi 			for(int i = 0; i < 8; i++) {
542*76af099aSliuyi 				if( info.bFlashCS & (1 << i) )
543*76af099aSliuyi 					printf("Flash<%d> ", i);
544*76af099aSliuyi 			}
545*76af099aSliuyi 			printf("\r\n");
546*76af099aSliuyi 			bSuccess = true;
547*76af099aSliuyi 		}
548*76af099aSliuyi 	}else {
549*76af099aSliuyi 		printf("Read flash Info quit,Creating comm object failed!\r\n");
550*76af099aSliuyi 	}
551*76af099aSliuyi 	if (pComm) {
552*76af099aSliuyi 		delete pComm;
553*76af099aSliuyi 		pComm = NULL;
554*76af099aSliuyi 	}
555*76af099aSliuyi 	return bSuccess;
556*76af099aSliuyi }
557*76af099aSliuyi bool read_chip_info(STRUCT_RKDEVICE_DESC &dev)
558*76af099aSliuyi {
559*76af099aSliuyi 	CRKUsbComm *pComm = NULL;
560*76af099aSliuyi 	bool bRet, bSuccess = false;
561*76af099aSliuyi 	int iRet;
562*76af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
563*76af099aSliuyi 		return bSuccess;
564*76af099aSliuyi 
565*76af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
566*76af099aSliuyi 	if (bRet) {
567*76af099aSliuyi 		BYTE chipInfo[16];
568*76af099aSliuyi 		iRet = pComm->RKU_ReadChipInfo(chipInfo);
569*76af099aSliuyi 		if (iRet != ERR_SUCCESS) {
570*76af099aSliuyi 			if (g_pLogObject)
571*76af099aSliuyi 				g_pLogObject->Record("Error:RKU_ReadChipInfo failed,err=%d", iRet);
572*76af099aSliuyi 			printf("Read Chip Info Fail!\r\n");
573*76af099aSliuyi 		} else {
574*76af099aSliuyi 			string strChipInfo;
575*76af099aSliuyi 			g_pLogObject->PrintBuffer(strChipInfo, chipInfo, 16, 16);
576*76af099aSliuyi 			printf("Chip Info:%s\r\n", strChipInfo.c_str());
577*76af099aSliuyi 			bSuccess = true;
578*76af099aSliuyi 		}
579*76af099aSliuyi 	} else {
580*76af099aSliuyi 		printf("Read Chip Info quit,Creating comm object failed!\r\n");
581*76af099aSliuyi 	}
582*76af099aSliuyi 	if (pComm) {
583*76af099aSliuyi 		delete pComm;
584*76af099aSliuyi 		pComm = NULL;
585*76af099aSliuyi 	}
586*76af099aSliuyi 	return bSuccess;
587*76af099aSliuyi }
588*76af099aSliuyi bool read_lba(STRUCT_RKDEVICE_DESC &dev, UINT uiBegin, UINT uiLen, char *szFile)
589*76af099aSliuyi {
590*76af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
591*76af099aSliuyi 		return false;
592*76af099aSliuyi 	CRKUsbComm *pComm = NULL;
593*76af099aSliuyi 	FILE *file = NULL;
594*76af099aSliuyi 	bool bRet, bFirst = true, bSuccess = false;
595*76af099aSliuyi 	int iRet;
596*76af099aSliuyi 	UINT iTotalRead = 0,iRead = 0;
597*76af099aSliuyi 	int nSectorSize = 512;
598*76af099aSliuyi 	BYTE pBuf[nSectorSize * DEFAULT_RW_LBA];
599*76af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
600*76af099aSliuyi 	if (bRet) {
601*76af099aSliuyi 		if(szFile) {
602*76af099aSliuyi 			file = fopen(szFile, "wb+");
603*76af099aSliuyi 			if( !file ) {
604*76af099aSliuyi 				printf("Read LBA failed,err=%d,can't open file: %s\r\n", errno, szFile);
605*76af099aSliuyi 				goto Exit_ReadLBA;
606*76af099aSliuyi 			}
607*76af099aSliuyi 		}
608*76af099aSliuyi 
609*76af099aSliuyi 		while(uiLen > 0) {
610*76af099aSliuyi 			memset(pBuf, 0, nSectorSize * DEFAULT_RW_LBA);
611*76af099aSliuyi 			iRead = (uiLen >= DEFAULT_RW_LBA) ? DEFAULT_RW_LBA : uiLen;
612*76af099aSliuyi 			iRet = pComm->RKU_ReadLBA( uiBegin + iTotalRead, iRead, pBuf);
613*76af099aSliuyi 			if(ERR_SUCCESS == iRet) {
614*76af099aSliuyi 				uiLen -= iRead;
615*76af099aSliuyi 				iTotalRead += iRead;
616*76af099aSliuyi 
617*76af099aSliuyi 				if(szFile) {
618*76af099aSliuyi 					fwrite(pBuf, 1, iRead * nSectorSize, file);
619*76af099aSliuyi 					if (bFirst){
620*76af099aSliuyi 						if (iTotalRead >= 1024)
621*76af099aSliuyi 							printf("Read LBA from file (%d%%)\r\n", (iTotalRead / 1024) * 100 / ((uiLen + iTotalRead) / 1024));
622*76af099aSliuyi 						else
623*76af099aSliuyi 							printf("Read LBA from file %d%%)\r\n", iTotalRead * 100 / (uiLen + iTotalRead));
624*76af099aSliuyi 						bFirst = false;
625*76af099aSliuyi 					} else {
626*76af099aSliuyi 						CURSOR_MOVEUP_LINE(1);
627*76af099aSliuyi 						CURSOR_DEL_LINE;
628*76af099aSliuyi 						if (iTotalRead >= 1024)
629*76af099aSliuyi 							printf("Read LBA from file (%d%%)\r\n", (iTotalRead / 1024) * 100 / ((uiLen + iTotalRead) / 1024));
630*76af099aSliuyi 						else
631*76af099aSliuyi 							printf("Read LBA from file %d%%)\r\n", iTotalRead * 100 / (uiLen + iTotalRead));
632*76af099aSliuyi 					}
633*76af099aSliuyi 				}
634*76af099aSliuyi 				else
635*76af099aSliuyi 					PrintData(pBuf, nSectorSize * iRead);
636*76af099aSliuyi 			} else {
637*76af099aSliuyi 				if (g_pLogObject)
638*76af099aSliuyi 					g_pLogObject->Record("Error:RKU_ReadLBA failed,err=%d", iRet);
639*76af099aSliuyi 
640*76af099aSliuyi 				printf("Read LBA failed!\r\n");
641*76af099aSliuyi 				goto Exit_ReadLBA;
642*76af099aSliuyi 			}
643*76af099aSliuyi 		}
644*76af099aSliuyi 		bSuccess = true;
645*76af099aSliuyi 	} else {
646*76af099aSliuyi 		printf("Read LBA quit,Creating comm object failed!\r\n");
647*76af099aSliuyi 	}
648*76af099aSliuyi Exit_ReadLBA:
649*76af099aSliuyi 	if (pComm) {
650*76af099aSliuyi 		delete pComm;
651*76af099aSliuyi 		pComm = NULL;
652*76af099aSliuyi 	}
653*76af099aSliuyi 	if (file)
654*76af099aSliuyi 		fclose(file);
655*76af099aSliuyi 	return bSuccess;
656*76af099aSliuyi }
657*76af099aSliuyi bool write_lba(STRUCT_RKDEVICE_DESC &dev, UINT uiBegin, char *szFile)
658*76af099aSliuyi {
659*76af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
660*76af099aSliuyi 		return false;
661*76af099aSliuyi 	CRKUsbComm *pComm = NULL;
662*76af099aSliuyi 	FILE *file = NULL;
663*76af099aSliuyi 	bool bRet, bFirst = true, bSuccess = false;
664*76af099aSliuyi 	int iRet;
665*76af099aSliuyi 	long long iTotalWrite = 0, iFileSize = 0;
666*76af099aSliuyi 	UINT iWrite = 0, iRead = 0;
667*76af099aSliuyi 	UINT uiLen;
668*76af099aSliuyi 	int nSectorSize = 512;
669*76af099aSliuyi 	BYTE pBuf[nSectorSize * DEFAULT_RW_LBA];
670*76af099aSliuyi 
671*76af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
672*76af099aSliuyi 	if (bRet) {
673*76af099aSliuyi 		file = fopen(szFile, "rb");
674*76af099aSliuyi 		if( !file ) {
675*76af099aSliuyi 			printf("Write LBA failed,err=%d,can't open file: %s\r\n", errno, szFile);
676*76af099aSliuyi 			goto Exit_WriteLBA;
677*76af099aSliuyi 		}
678*76af099aSliuyi 
679*76af099aSliuyi 		iRet = fseeko(file, 0, SEEK_END);
680*76af099aSliuyi 		iFileSize = ftello(file);
681*76af099aSliuyi 		fseeko(file, 0, SEEK_SET);
682*76af099aSliuyi 		while(iTotalWrite < iFileSize) {
683*76af099aSliuyi 			memset(pBuf, 0, nSectorSize * DEFAULT_RW_LBA);
684*76af099aSliuyi 			iWrite = iRead= fread(pBuf, 1, nSectorSize * DEFAULT_RW_LBA, file);
685*76af099aSliuyi 			if ((int)iRead != nSectorSize * DEFAULT_RW_LBA) {
686*76af099aSliuyi 				printf("Write LBA failed,err=%d,read=%d,total=%d!\r\n", errno, iRead, nSectorSize * DEFAULT_RW_LBA);
687*76af099aSliuyi 				goto Exit_WriteLBA;
688*76af099aSliuyi 			}
689*76af099aSliuyi 			uiLen = ((iWrite % 512) == 0) ? (iWrite / 512) : (iWrite / 512 + 1);
690*76af099aSliuyi 			iRet = pComm->RKU_WriteLBA( uiBegin, uiLen, pBuf);
691*76af099aSliuyi 			if(ERR_SUCCESS == iRet) {
692*76af099aSliuyi 				uiBegin += uiLen;
693*76af099aSliuyi 				iTotalWrite += iWrite;
694*76af099aSliuyi 				if (bFirst) {
695*76af099aSliuyi 					if (iTotalWrite >= 1024)
696*76af099aSliuyi 						printf("Write LBA from file (%lld%%)\r\n", (iTotalWrite / 1024) * 100 / (iFileSize / 1024));
697*76af099aSliuyi 					else
698*76af099aSliuyi 						printf("Write LBA from file %lld%%)\r\n", iTotalWrite * 100 / iFileSize);
699*76af099aSliuyi 					bFirst = false;
700*76af099aSliuyi 				} else {
701*76af099aSliuyi 					CURSOR_MOVEUP_LINE(1);
702*76af099aSliuyi 					CURSOR_DEL_LINE;
703*76af099aSliuyi 					printf("Write LBA from file (%lld%%)\r\n", (iTotalWrite / 1024) * 100 / (iFileSize / 1024));
704*76af099aSliuyi 				}
705*76af099aSliuyi 			} else {
706*76af099aSliuyi 				if (g_pLogObject)
707*76af099aSliuyi 					g_pLogObject->Record("Error:RKU_WriteLBA failed,err=%d", iRet);
708*76af099aSliuyi 
709*76af099aSliuyi 				printf("Write LBA failed!\r\n");
710*76af099aSliuyi 				goto Exit_WriteLBA;
711*76af099aSliuyi 			}
712*76af099aSliuyi 		}
713*76af099aSliuyi 		bSuccess = true;
714*76af099aSliuyi 	} else {
715*76af099aSliuyi 		printf("Write LBA quit,Creating comm object failed!\r\n");
716*76af099aSliuyi 	}
717*76af099aSliuyi Exit_WriteLBA:
718*76af099aSliuyi 	if (pComm) {
719*76af099aSliuyi 		delete pComm;
720*76af099aSliuyi 		pComm = NULL;
721*76af099aSliuyi 	}
722*76af099aSliuyi 	if (file)
723*76af099aSliuyi 		fclose(file);
724*76af099aSliuyi 	return bSuccess;
725*76af099aSliuyi }
726*76af099aSliuyi 
727*76af099aSliuyi void split_item(STRING_VECTOR &vecItems, char *pszItems)
728*76af099aSliuyi {
729*76af099aSliuyi 	string strItem;
730*76af099aSliuyi 	char szItem[100];
731*76af099aSliuyi 	char *pos = NULL, *pStart;
732*76af099aSliuyi 	pStart = pszItems;
733*76af099aSliuyi 	pos = strchr(pStart, ',');
734*76af099aSliuyi 	while(pos != NULL) {
735*76af099aSliuyi 		memset(szItem, 0, 100);
736*76af099aSliuyi 		strncpy(szItem, pStart, pos - pStart);
737*76af099aSliuyi 		strItem = szItem;
738*76af099aSliuyi 		vecItems.push_back(strItem);
739*76af099aSliuyi 		pStart = pos + 1;
740*76af099aSliuyi 		if (*pStart == 0)
741*76af099aSliuyi 			break;
742*76af099aSliuyi 		pos = strchr(pStart, ',');
743*76af099aSliuyi 	}
744*76af099aSliuyi 	if (strlen(pStart) > 0) {
745*76af099aSliuyi 		memset(szItem, 0, 100);
746*76af099aSliuyi 		strncpy(szItem, pStart, strlen(pStart));
747*76af099aSliuyi 		strItem = szItem;
748*76af099aSliuyi 		vecItems.push_back(strItem);
749*76af099aSliuyi 	}
750*76af099aSliuyi }
751*76af099aSliuyi bool handle_command(int argc, char* argv[], CRKScan *pScan)
752*76af099aSliuyi {
753*76af099aSliuyi 	string strCmd;
754*76af099aSliuyi 	strCmd = argv[1];
755*76af099aSliuyi 	ssize_t cnt;
756*76af099aSliuyi 	bool bRet,bSuccess = false;
757*76af099aSliuyi 	int ret;
758*76af099aSliuyi 	STRUCT_RKDEVICE_DESC dev;
759*76af099aSliuyi 
760*76af099aSliuyi 	transform(strCmd.begin(), strCmd.end(), strCmd.begin(), (int(*)(int))toupper);
761*76af099aSliuyi 	if(strcmp(strCmd.c_str(), "-H") == 0) {
762*76af099aSliuyi 		usage();
763*76af099aSliuyi 		return true;
764*76af099aSliuyi 	} else if(strcmp(strCmd.c_str(), "-V") == 0) {
765*76af099aSliuyi 		printf("rkDevelopTool ver 1.0\r\n");
766*76af099aSliuyi 		return true;
767*76af099aSliuyi 	}
768*76af099aSliuyi 	cnt = pScan->Search(RKUSB_MASKROM | RKUSB_LOADER);
769*76af099aSliuyi 	if (cnt < 1) {
770*76af099aSliuyi 		ERROR_COLOR_ATTR;
771*76af099aSliuyi 		printf("No found any rockusb device,please plug device in!");
772*76af099aSliuyi 		NORMAL_COLOR_ATTR;
773*76af099aSliuyi 		printf("\r\n");
774*76af099aSliuyi 		return bSuccess;
775*76af099aSliuyi 	} else if (cnt > 1) {
776*76af099aSliuyi 		ERROR_COLOR_ATTR;
777*76af099aSliuyi 		printf("Found many rockusb devices,please plug device out!");
778*76af099aSliuyi 		NORMAL_COLOR_ATTR;
779*76af099aSliuyi 		printf("\r\n");
780*76af099aSliuyi 		return bSuccess;
781*76af099aSliuyi 	}
782*76af099aSliuyi 
783*76af099aSliuyi 	bRet = pScan->GetDevice(dev, 0);
784*76af099aSliuyi 	if (!bRet) {
785*76af099aSliuyi 		ERROR_COLOR_ATTR;
786*76af099aSliuyi 		printf("Getting information of rockusb device failed!");
787*76af099aSliuyi 		NORMAL_COLOR_ATTR;
788*76af099aSliuyi 		printf("\r\n");
789*76af099aSliuyi 		return bSuccess;
790*76af099aSliuyi 	}
791*76af099aSliuyi 
792*76af099aSliuyi 	if(strcmp(strCmd.c_str(), "RD") == 0) {
793*76af099aSliuyi 		if ((argc != 2) && (argc != 3))
794*76af099aSliuyi 			printf("Parameter of [RD] command is invalid,please check help!\r\n");
795*76af099aSliuyi 		else {
796*76af099aSliuyi 			if (argc == 2)
797*76af099aSliuyi 				bSuccess = reset_device(dev);
798*76af099aSliuyi 			else {
799*76af099aSliuyi 				UINT uiSubCode;
800*76af099aSliuyi 				char *pszEnd;
801*76af099aSliuyi 				uiSubCode = strtoul(argv[2], &pszEnd, 0);
802*76af099aSliuyi 				if (*pszEnd)
803*76af099aSliuyi 					printf("Subcode is invalid,please check!\r\n");
804*76af099aSliuyi 				else {
805*76af099aSliuyi 					if (uiSubCode <= 5)
806*76af099aSliuyi 						bSuccess = reset_device(dev, uiSubCode);
807*76af099aSliuyi 					else
808*76af099aSliuyi 						printf("Subcode is invalid,please check!\r\n");
809*76af099aSliuyi 				}
810*76af099aSliuyi 			}
811*76af099aSliuyi 		}
812*76af099aSliuyi 	} else if(strcmp(strCmd.c_str(), "TD") == 0) {
813*76af099aSliuyi 		bSuccess = test_device(dev);
814*76af099aSliuyi 	} else if (strcmp(strCmd.c_str(), "RID") == 0) {//Read Flash ID
815*76af099aSliuyi 		bSuccess = read_flash_id(dev);
816*76af099aSliuyi 	} else if (strcmp(strCmd.c_str(), "RFI") == 0){//Read Flash Info
817*76af099aSliuyi 		bSuccess = read_flash_info(dev);
818*76af099aSliuyi 	} else if (strcmp(strCmd.c_str(), "RCI") == 0) {//Read Chip Info
819*76af099aSliuyi 		bSuccess = read_chip_info(dev);
820*76af099aSliuyi 	} else if(strcmp(strCmd.c_str(), "DB") == 0) {
821*76af099aSliuyi 		if (argc > 2) {
822*76af099aSliuyi 			string strLoader;
823*76af099aSliuyi 			strLoader = argv[2];
824*76af099aSliuyi 			bSuccess = download_boot(dev, (char *)strLoader.c_str());
825*76af099aSliuyi 		} else if (argc == 2) {
826*76af099aSliuyi 			ret = find_config_item("loader");
827*76af099aSliuyi 			if (ret == -1)
828*76af099aSliuyi 				printf("No found loader item from config!\r\n");
829*76af099aSliuyi 			else
830*76af099aSliuyi 				bSuccess = download_boot(dev, g_ConfigItemVec[ret].szItemValue);
831*76af099aSliuyi 		} else
832*76af099aSliuyi 			printf("Parameter of [DB] command is invalid,please check help!\r\n");
833*76af099aSliuyi 	} else if(strcmp(strCmd.c_str(), "EF") == 0) {
834*76af099aSliuyi 		if (argc == 2) {
835*76af099aSliuyi 			bSuccess = erase_flash(dev);
836*76af099aSliuyi 		} else
837*76af099aSliuyi 			printf("Parameter of [EF] command is invalid,please check help!\r\n");
838*76af099aSliuyi 	} else if(strcmp(strCmd.c_str(), "WL") == 0) {
839*76af099aSliuyi 		if (argc == 4) {
840*76af099aSliuyi 			UINT uiBegin;
841*76af099aSliuyi 			char *pszEnd;
842*76af099aSliuyi 			uiBegin = strtoul(argv[2], &pszEnd, 0);
843*76af099aSliuyi 			if (*pszEnd)
844*76af099aSliuyi 				printf("Begin is invalid,please check!\r\n");
845*76af099aSliuyi 			else
846*76af099aSliuyi 				bSuccess = write_lba(dev, uiBegin, argv[3]);
847*76af099aSliuyi 		} else
848*76af099aSliuyi 			printf("Parameter of [WL] command is invalid,please check help!\r\n");
849*76af099aSliuyi 	} else if (strcmp(strCmd.c_str(), "RL") == 0) {//Read LBA
850*76af099aSliuyi 		char *pszEnd;
851*76af099aSliuyi 		UINT uiBegin, uiLen;
852*76af099aSliuyi 		if (argc != 5)
853*76af099aSliuyi 			printf("Parameter of [RL] command is invalid,please check help!\r\n");
854*76af099aSliuyi 		else {
855*76af099aSliuyi 			uiBegin = strtoul(argv[2], &pszEnd, 0);
856*76af099aSliuyi 			if (*pszEnd)
857*76af099aSliuyi 				printf("Begin is invalid,please check!\r\n");
858*76af099aSliuyi 			else {
859*76af099aSliuyi 				uiLen = strtoul(argv[3], &pszEnd, 0);
860*76af099aSliuyi 				if (*pszEnd)
861*76af099aSliuyi 					printf("Len is invalid,please check!\r\n");
862*76af099aSliuyi 				else {
863*76af099aSliuyi 					bSuccess = read_lba(dev, uiBegin, uiLen, argv[4]);
864*76af099aSliuyi 				}
865*76af099aSliuyi 			}
866*76af099aSliuyi 		}
867*76af099aSliuyi 	} else {
868*76af099aSliuyi 		printf("command is invalid,please press upgrade_tool -h to check usage!\r\n");
869*76af099aSliuyi 	}
870*76af099aSliuyi 	return bSuccess;
871*76af099aSliuyi }
872*76af099aSliuyi 
873*76af099aSliuyi 
874*76af099aSliuyi 
875*76af099aSliuyi int main(int argc, char* argv[])
876*76af099aSliuyi {
877*76af099aSliuyi 	CRKScan *pScan = NULL;
878*76af099aSliuyi 	int ret;
879*76af099aSliuyi 	char szProgramProcPath[100];
880*76af099aSliuyi 	char szProgramDir[256];
881*76af099aSliuyi 	string strLogDir,strConfigFile;
882*76af099aSliuyi 	struct stat statBuf;
883*76af099aSliuyi 
884*76af099aSliuyi 	g_ConfigItemVec.clear();
885*76af099aSliuyi 	sprintf(szProgramProcPath, "/proc/%d/exe", getpid());
886*76af099aSliuyi 	if (readlink(szProgramProcPath, szProgramDir, 256) == -1)
887*76af099aSliuyi 		strcpy(szProgramDir, ".");
888*76af099aSliuyi 	else {
889*76af099aSliuyi 		char *pSlash;
890*76af099aSliuyi 		pSlash = strrchr(szProgramDir, '/');
891*76af099aSliuyi 		if (pSlash)
892*76af099aSliuyi 			*pSlash = '\0';
893*76af099aSliuyi 	}
894*76af099aSliuyi 	strLogDir = szProgramDir;
895*76af099aSliuyi 	strLogDir +=  "/log/";
896*76af099aSliuyi 	strConfigFile = szProgramDir;
897*76af099aSliuyi 	strConfigFile += "/config.ini";
898*76af099aSliuyi 	if (opendir(strLogDir.c_str()) == NULL)
899*76af099aSliuyi 		mkdir(strLogDir.c_str(), S_IRWXU | S_IRWXG | S_IROTH);
900*76af099aSliuyi 	g_pLogObject = new CRKLog(strLogDir.c_str(), "log");
901*76af099aSliuyi 
902*76af099aSliuyi 	if(stat(strConfigFile.c_str(), &statBuf) < 0) {
903*76af099aSliuyi 		if (g_pLogObject) {
904*76af099aSliuyi 			g_pLogObject->Record("Error:failed to stat config.ini,err=%d", errno);
905*76af099aSliuyi 		}
906*76af099aSliuyi 	} else if (S_ISREG(statBuf.st_mode)) {
907*76af099aSliuyi 		parse_config_file(strConfigFile.c_str(), g_ConfigItemVec);
908*76af099aSliuyi 	}
909*76af099aSliuyi 
910*76af099aSliuyi 	ret = libusb_init(NULL);
911*76af099aSliuyi 	if (ret < 0) {
912*76af099aSliuyi 		if (g_pLogObject) {
913*76af099aSliuyi 			g_pLogObject->Record("Error:libusb_init failed,err=%d", ret);
914*76af099aSliuyi 			delete g_pLogObject;
915*76af099aSliuyi 		}
916*76af099aSliuyi 		return -1;
917*76af099aSliuyi 	}
918*76af099aSliuyi 
919*76af099aSliuyi 	pScan = new CRKScan();
920*76af099aSliuyi 	if (!pScan) {
921*76af099aSliuyi 		if (g_pLogObject) {
922*76af099aSliuyi 			g_pLogObject->Record("Error:failed to Create object for searching device");
923*76af099aSliuyi 			delete g_pLogObject;
924*76af099aSliuyi 		}
925*76af099aSliuyi 		libusb_exit(NULL);
926*76af099aSliuyi 		return -2;
927*76af099aSliuyi 	}
928*76af099aSliuyi 	pScan->SetVidPid();
929*76af099aSliuyi 
930*76af099aSliuyi 	if (argc == 1)
931*76af099aSliuyi 		usage();
932*76af099aSliuyi 	else if (!handle_command(argc, argv, pScan))
933*76af099aSliuyi 			return -0xFF;
934*76af099aSliuyi 	if (pScan)
935*76af099aSliuyi 		delete pScan;
936*76af099aSliuyi 	if (g_pLogObject)
937*76af099aSliuyi 		delete g_pLogObject;
938*76af099aSliuyi 	libusb_exit(NULL);
939*76af099aSliuyi 	return 0;
940*76af099aSliuyi }
941