xref: /rkdeveloptool/main.cpp (revision 8df2d64a809a0bd3732b418e5659324ca8a9aa31)
176af099aSliuyi /*
276af099aSliuyi  * (C) Copyright 2017 Fuzhou Rockchip Electronics Co., Ltd
376af099aSliuyi  * Seth Liu 2017.03.01
476af099aSliuyi  *
576af099aSliuyi  * SPDX-License-Identifier:	GPL-2.0+
676af099aSliuyi  */
776af099aSliuyi 
876af099aSliuyi #include   <unistd.h>
976af099aSliuyi #include   <dirent.h>
10c30d921cSKever Yang #include "config.h"
1176af099aSliuyi #include "DefineHeader.h"
12c30d921cSKever Yang #include "gpt.h"
1376af099aSliuyi #include "RKLog.h"
1476af099aSliuyi #include "RKScan.h"
1576af099aSliuyi #include "RKComm.h"
1676af099aSliuyi #include "RKDevice.h"
1776af099aSliuyi #include "RKImage.h"
1876af099aSliuyi extern const char *szManufName[];
1976af099aSliuyi CRKLog *g_pLogObject=NULL;
2076af099aSliuyi CONFIG_ITEM_VECTOR g_ConfigItemVec;
2176af099aSliuyi #define DEFAULT_RW_LBA 128
2276af099aSliuyi #define CURSOR_MOVEUP_LINE(n) printf("%c[%dA", 0x1B, n)
2376af099aSliuyi #define CURSOR_DEL_LINE printf("%c[2K", 0x1B)
2476af099aSliuyi #define CURSOR_MOVE_HOME printf("%c[H", 0x1B)
2576af099aSliuyi #define CURSOR_CLEAR_SCREEN printf("%c[2J", 0x1B)
2676af099aSliuyi #define ERROR_COLOR_ATTR  printf("%c[30;41m", 0x1B);
2776af099aSliuyi #define NORMAL_COLOR_ATTR  printf("%c[37;40m", 0x1B);
28c30d921cSKever Yang extern UINT CRC_32(unsigned char* pData, UINT ulSize);
29c30d921cSKever Yang extern unsigned short CRC_16(unsigned char* aData, UINT aSize);
30c30d921cSKever Yang extern void P_RC4(unsigned char* buf, unsigned short len);
31c30d921cSKever Yang extern unsigned int crc32_le(unsigned int crc, unsigned char *p, unsigned int len);
32c30d921cSKever Yang /*
33c30d921cSKever Yang u8 test_gpt_head[] = {
34c30d921cSKever Yang 	0x45, 0x46, 0x49, 0x20, 0x50, 0x41, 0x52, 0x54, 0x00, 0x00, 0x01, 0x00, 0x5C, 0x00, 0x00, 0x00,
35c30d921cSKever Yang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
36c30d921cSKever Yang 	0xFF, 0xFF, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
37c30d921cSKever Yang 	0xDE, 0xFF, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x49, 0x94, 0xEC, 0x23, 0xE8, 0x58, 0x4B,
38c30d921cSKever Yang 	0xAE, 0xB7, 0xA9, 0x46, 0x51, 0xD0, 0x08, 0xF8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
39c30d921cSKever Yang 	0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x51, 0xEA, 0xFE, 0x08};
40c30d921cSKever Yang */
41c30d921cSKever Yang 
4276af099aSliuyi void usage()
4376af099aSliuyi {
4476af099aSliuyi 	printf("\r\n---------------------Tool Usage ---------------------\r\n");
4576af099aSliuyi 	printf("Help:             -H\r\n");
4676af099aSliuyi 	printf("Version:          -V\r\n");
4776af099aSliuyi 	printf("DownloadBoot:	DB <Loader>\r\n");
48c30d921cSKever Yang 	printf("UpgradeLoader:	UL <Loader>\r\n");
4976af099aSliuyi 	printf("ReadLBA:		RL  <BeginSec> <SectorLen> <File>\r\n");
5076af099aSliuyi 	printf("WriteLBA:		WL  <BeginSec> <File>\r\n");
51c30d921cSKever Yang 	printf("WriteGPT:       GPT <parameter>\r\n");
5276af099aSliuyi 	printf("EraseFlash:		EF \r\n");
5376af099aSliuyi 	printf("TestDevice:		TD\r\n");
5476af099aSliuyi 	printf("ResetDevice:	RD [subcode]\r\n");
5576af099aSliuyi 	printf("ReadFlashID:	RID\r\n");
5676af099aSliuyi 	printf("ReadFlashInfo:	RFI\r\n");
5776af099aSliuyi 	printf("ReadChipInfo:	RCI\r\n");
5876af099aSliuyi 	printf("-------------------------------------------------------\r\n\r\n");
5976af099aSliuyi }
6076af099aSliuyi void ProgressInfoProc(DWORD deviceLayer, ENUM_PROGRESS_PROMPT promptID, long long totalValue, long long currentValue, ENUM_CALL_STEP emCall)
6176af099aSliuyi {
6276af099aSliuyi 	string strInfoText="";
6376af099aSliuyi 	char szText[256];
6476af099aSliuyi 	switch (promptID) {
6576af099aSliuyi 	case TESTDEVICE_PROGRESS:
6676af099aSliuyi 		sprintf(szText, "Test Device Total(%lld),Current(%lld)", totalValue, currentValue);
6776af099aSliuyi 		strInfoText = szText;
6876af099aSliuyi 		break;
6976af099aSliuyi 	case LOWERFORMAT_PROGRESS:
7076af099aSliuyi 		sprintf(szText, "Lowerformat Device Total(%lld),Current(%lld)", totalValue, currentValue);
7176af099aSliuyi 		strInfoText = szText;
7276af099aSliuyi 		break;
7376af099aSliuyi 	case DOWNLOADIMAGE_PROGRESS:
7476af099aSliuyi 		sprintf(szText, "Download Image Total(%lldK),Current(%lldK)", totalValue/1024, currentValue/1024);
7576af099aSliuyi 		strInfoText = szText;
7676af099aSliuyi 		break;
7776af099aSliuyi 	case CHECKIMAGE_PROGRESS:
7876af099aSliuyi 		sprintf(szText, "Check Image Total(%lldK),Current(%lldK)", totalValue/1024, currentValue/1024);
7976af099aSliuyi 		strInfoText = szText;
8076af099aSliuyi 		break;
8176af099aSliuyi 	case TAGBADBLOCK_PROGRESS:
8276af099aSliuyi 		sprintf(szText, "Tag Bad Block Total(%lld),Current(%lld)", totalValue, currentValue);
8376af099aSliuyi 		strInfoText = szText;
8476af099aSliuyi 		break;
8576af099aSliuyi 	case TESTBLOCK_PROGRESS:
8676af099aSliuyi 		sprintf(szText, "Test Block Total(%lld),Current(%lld)", totalValue, currentValue);
8776af099aSliuyi 		strInfoText = szText;
8876af099aSliuyi 		break;
8976af099aSliuyi 	case ERASEFLASH_PROGRESS:
9076af099aSliuyi 		sprintf(szText, "Erase Flash Total(%lld),Current(%lld)", totalValue, currentValue);
9176af099aSliuyi 		strInfoText = szText;
9276af099aSliuyi 		break;
9376af099aSliuyi 	case ERASESYSTEM_PROGRESS:
9476af099aSliuyi 		sprintf(szText, "Erase System partition Total(%lld),Current(%lld)", totalValue, currentValue);
9576af099aSliuyi 		strInfoText = szText;
9676af099aSliuyi 		break;
9776af099aSliuyi 	case ERASEUSERDATA_PROGRESS:
9876af099aSliuyi 		sprintf(szText, "<LocationID=%x> Erase Userdata partition Total(%lld),Current(%lld)",deviceLayer,totalValue, currentValue);
9976af099aSliuyi 		strInfoText = szText;
10076af099aSliuyi 		break;
10176af099aSliuyi 	}
10276af099aSliuyi 	if (strInfoText.size() > 0){
10376af099aSliuyi 		CURSOR_MOVEUP_LINE(1);
10476af099aSliuyi 		CURSOR_DEL_LINE;
10576af099aSliuyi 		printf("%s\r\n", strInfoText.c_str());
10676af099aSliuyi 	}
10776af099aSliuyi 	if (emCall == CALL_LAST)
10876af099aSliuyi 		deviceLayer = 0;
10976af099aSliuyi }
11076af099aSliuyi 
11176af099aSliuyi char *strupr(char *szSrc)
11276af099aSliuyi {
11376af099aSliuyi 	char *p = szSrc;
11476af099aSliuyi 	while(*p){
11576af099aSliuyi 		if ((*p >= 'a') && (*p <= 'z'))
11676af099aSliuyi 			*p = *p - 'a' + 'A';
11776af099aSliuyi 		p++;
11876af099aSliuyi 	}
11976af099aSliuyi 	return szSrc;
12076af099aSliuyi }
12176af099aSliuyi void PrintData(PBYTE pData, int nSize)
12276af099aSliuyi {
12376af099aSliuyi 	char szPrint[17] = "\0";
12476af099aSliuyi 	int i;
12576af099aSliuyi 	for( i = 0; i < nSize; i++){
12676af099aSliuyi 		if(i % 16 == 0){
12776af099aSliuyi 			if(i / 16 > 0)
12876af099aSliuyi 				printf("     %s\r\n", szPrint);
12976af099aSliuyi 			printf("%08d ", i / 16);
13076af099aSliuyi 		}
13176af099aSliuyi 		printf("%02X ", pData[i]);
13276af099aSliuyi 		szPrint[i%16] = isprint(pData[i]) ? pData[i] : '.';
13376af099aSliuyi 	}
13476af099aSliuyi 	if(i / 16 > 0)
13576af099aSliuyi 		printf("     %s\r\n", szPrint);
13676af099aSliuyi }
13776af099aSliuyi 
13876af099aSliuyi bool StringToWideString(char *pszSrc, wchar_t *&pszDest)
13976af099aSliuyi {
14076af099aSliuyi 	if (!pszSrc)
14176af099aSliuyi 		return false;
14276af099aSliuyi 	int nSrcLen = strlen(pszSrc);
14376af099aSliuyi 	int nDestLen = nSrcLen * 2;
14476af099aSliuyi 
14576af099aSliuyi 	pszDest = NULL;
14676af099aSliuyi 	pszDest = new wchar_t[nDestLen];
14776af099aSliuyi 	if (!pszDest)
14876af099aSliuyi 		return false;
14976af099aSliuyi 	nDestLen = nDestLen * sizeof(wchar_t);
15076af099aSliuyi 	memset(pszDest, 0, nDestLen);
15176af099aSliuyi 	int iRet;
15276af099aSliuyi 	iconv_t cd;
15376af099aSliuyi 	cd = iconv_open("UTF-32", "UTF-8");
15476af099aSliuyi 	if((iconv_t)-1 == cd) {
15576af099aSliuyi 		delete []pszDest;
15676af099aSliuyi 		pszDest = NULL;
15776af099aSliuyi 	      return false;
15876af099aSliuyi 	 }
15976af099aSliuyi 	char *pIn, *pOut;
16076af099aSliuyi 	pIn = (char *)pszSrc;
16176af099aSliuyi 	pOut = (char *)pszDest;
16276af099aSliuyi 
16376af099aSliuyi 	iRet = iconv(cd, (char **)&pIn, (size_t *)&nSrcLen, (char **)&pOut, (size_t *)&nDestLen);
16476af099aSliuyi 
16576af099aSliuyi 	if(iRet == -1) {
16676af099aSliuyi 		delete []pszDest;
16776af099aSliuyi 		pszDest = NULL;
16876af099aSliuyi 		iconv_close(cd);
16976af099aSliuyi 		return false;
17076af099aSliuyi 	 }
17176af099aSliuyi 
17276af099aSliuyi 	 iconv_close(cd);
17376af099aSliuyi 
17476af099aSliuyi 	 return true;
17576af099aSliuyi }
17676af099aSliuyi bool WideStringToString(wchar_t *pszSrc, char *&pszDest)
17776af099aSliuyi {
17876af099aSliuyi 	if (!pszSrc)
17976af099aSliuyi 		return false;
18076af099aSliuyi 	int nSrcLen = wcslen(pszSrc);
18176af099aSliuyi 	int nDestLen = nSrcLen * 2;
18276af099aSliuyi 	nSrcLen = nSrcLen * sizeof(wchar_t);
18376af099aSliuyi 	pszDest = NULL;
18476af099aSliuyi 	pszDest = new char[nDestLen];
18576af099aSliuyi 	if (!pszDest)
18676af099aSliuyi 		return false;
18776af099aSliuyi 	memset(pszDest, 0, nDestLen);
18876af099aSliuyi 	int iRet;
18976af099aSliuyi 	iconv_t cd;
19076af099aSliuyi 	cd = iconv_open("UTF-8", "UTF-32");
19176af099aSliuyi 
19276af099aSliuyi 	if((iconv_t)-1 == cd) {
19376af099aSliuyi 		delete []pszDest;
19476af099aSliuyi 		pszDest = NULL;
19576af099aSliuyi 	      return false;
19676af099aSliuyi 	 }
19776af099aSliuyi 	char *pIn, *pOut;
19876af099aSliuyi 	pIn = (char *)pszSrc;
19976af099aSliuyi 	pOut = (char *)pszDest;
20076af099aSliuyi 	iRet = iconv(cd, (char **)&pIn, (size_t *)&nSrcLen, (char **)&pOut, (size_t *)&nDestLen);
20176af099aSliuyi 
20276af099aSliuyi 	if(iRet == -1) {
20376af099aSliuyi 		delete []pszDest;
20476af099aSliuyi 		pszDest = NULL;
20576af099aSliuyi 		iconv_close(cd);
20676af099aSliuyi 		return false;
20776af099aSliuyi 	 }
20876af099aSliuyi 
20976af099aSliuyi 	 iconv_close(cd);
21076af099aSliuyi 
21176af099aSliuyi 	 return true;
21276af099aSliuyi }
21376af099aSliuyi int find_config_item(const char *pszName)
21476af099aSliuyi {
21576af099aSliuyi 	unsigned int i;
21676af099aSliuyi 	for(i = 0; i < g_ConfigItemVec.size(); i++){
21776af099aSliuyi 		if (strcasecmp(pszName, g_ConfigItemVec[i].szItemName) == 0){
21876af099aSliuyi 			return i;
21976af099aSliuyi 		}
22076af099aSliuyi 	}
22176af099aSliuyi 	return -1;
22276af099aSliuyi }
22376af099aSliuyi 
22476af099aSliuyi bool parse_config(char *pConfig, CONFIG_ITEM_VECTOR &vecItem)
22576af099aSliuyi {
22676af099aSliuyi 
22776af099aSliuyi 	stringstream configStream(pConfig);
22876af099aSliuyi 	string strLine, strItemName, strItemValue;
22976af099aSliuyi 	string::size_type line_size,pos;
23076af099aSliuyi 	STRUCT_CONFIG_ITEM item;
23176af099aSliuyi 	vecItem.clear();
23276af099aSliuyi 	while (!configStream.eof()){
23376af099aSliuyi 		getline(configStream, strLine);
23476af099aSliuyi 		line_size = strLine.size();
23576af099aSliuyi 		if (line_size == 0)
23676af099aSliuyi 			continue;
23776af099aSliuyi 		if (strLine[line_size-1] == '\r'){
23876af099aSliuyi 			strLine = strLine.substr(0, line_size-1);
23976af099aSliuyi 		}
240c30d921cSKever Yang 		strLine.erase(0, strLine.find_first_not_of(" "));
241c30d921cSKever Yang 		strLine.erase(strLine.find_last_not_of(" ") + 1);
242c30d921cSKever Yang 		if (strLine.size()==0 )
243c30d921cSKever Yang 			continue;
244c30d921cSKever Yang 		if (strLine[0] == '#')
245c30d921cSKever Yang 			continue;
24676af099aSliuyi 		pos = strLine.find("=");
24776af099aSliuyi 		if (pos == string::npos){
24876af099aSliuyi 			continue;
24976af099aSliuyi 		}
25076af099aSliuyi 		strItemName = strLine.substr(0, pos);
25176af099aSliuyi 		strItemValue = strLine.substr(pos + 1);
25276af099aSliuyi 		strItemName.erase(0, strItemName.find_first_not_of(" "));
25376af099aSliuyi 		strItemName.erase(strItemName.find_last_not_of(" ") + 1);
25476af099aSliuyi 		strItemValue.erase(0, strItemValue.find_first_not_of(" "));
25576af099aSliuyi 		strItemValue.erase(strItemValue.find_last_not_of(" ") + 1);
25676af099aSliuyi 		if ((strItemName.size() > 0) && (strItemValue.size() > 0)){
25776af099aSliuyi 			strcpy(item.szItemName, strItemName.c_str());
25876af099aSliuyi 			strcpy(item.szItemValue, strItemValue.c_str());
25976af099aSliuyi 			vecItem.push_back(item);
26076af099aSliuyi 		}
26176af099aSliuyi 	}
26276af099aSliuyi 	return true;
26376af099aSliuyi 
26476af099aSliuyi }
26576af099aSliuyi bool parse_config_file(const char *pConfigFile, CONFIG_ITEM_VECTOR &vecItem)
26676af099aSliuyi {
26776af099aSliuyi 	FILE *file = NULL;
26876af099aSliuyi 	file = fopen(pConfigFile, "rb");
26976af099aSliuyi 	if( !file ){
27076af099aSliuyi 		if (g_pLogObject)
27176af099aSliuyi 			g_pLogObject->Record("parse_config_file failed,err=%d,can't open file: %s\r\n", errno, pConfigFile);
27276af099aSliuyi 		return false;
27376af099aSliuyi 	}
27476af099aSliuyi 	int iFileSize;
27576af099aSliuyi 	fseek(file, 0, SEEK_END);
27676af099aSliuyi 	iFileSize = ftell(file);
27776af099aSliuyi 	fseek(file, 0, SEEK_SET);
27876af099aSliuyi 	char *pConfigBuf = NULL;
27976af099aSliuyi 	pConfigBuf = new char[iFileSize + 1];
28076af099aSliuyi 	if (!pConfigBuf){
28176af099aSliuyi 		fclose(file);
28276af099aSliuyi 		return false;
28376af099aSliuyi 	}
28476af099aSliuyi 	memset(pConfigBuf, 0, iFileSize + 1);
28576af099aSliuyi 	int iRead;
28676af099aSliuyi 	iRead = fread(pConfigBuf, 1, iFileSize, file);
28776af099aSliuyi 	if (iRead != iFileSize){
28876af099aSliuyi 		if (g_pLogObject)
28976af099aSliuyi 			g_pLogObject->Record("parse_config_file failed,err=%d, read=%d, total=%d\r\n", errno, iRead, iFileSize);
29076af099aSliuyi 		fclose(file);
29176af099aSliuyi 		delete []pConfigBuf;
29276af099aSliuyi 		return false;
29376af099aSliuyi 	}
29476af099aSliuyi 	fclose(file);
29576af099aSliuyi 	bool bRet;
29676af099aSliuyi 	bRet = parse_config(pConfigBuf, vecItem);
29776af099aSliuyi 	delete []pConfigBuf;
29876af099aSliuyi 	return bRet;
29976af099aSliuyi }
300c30d921cSKever Yang bool ParsePartitionInfo(string &strPartInfo, string &strName, UINT &uiOffset, UINT &uiLen)
301c30d921cSKever Yang {
302c30d921cSKever Yang 	string::size_type pos,prevPos;
303c30d921cSKever Yang 	string strOffset,strLen;
304c30d921cSKever Yang 	int iCount;
305c30d921cSKever Yang 	prevPos = pos = 0;
306c30d921cSKever Yang 	if (strPartInfo.size() <= 0) {
307c30d921cSKever Yang 		return false;
308c30d921cSKever Yang 	}
309c30d921cSKever Yang 	pos = strPartInfo.find('@');
310c30d921cSKever Yang 	if (pos == string::npos) {
311c30d921cSKever Yang 		return false;
312c30d921cSKever Yang 	}
313c30d921cSKever Yang 	strLen = strPartInfo.substr(prevPos, pos - prevPos);
314c30d921cSKever Yang 	strLen.erase(0, strLen.find_first_not_of(" "));
315c30d921cSKever Yang 	strLen.erase(strLen.find_last_not_of(" ") + 1);
316c30d921cSKever Yang 	if (strchr(strLen.c_str(), '-')) {
317c30d921cSKever Yang 		uiLen = 0xFFFFFFFF;
318c30d921cSKever Yang 	} else {
319c30d921cSKever Yang 		iCount = sscanf(strLen.c_str(), "0x%x", &uiLen);
320c30d921cSKever Yang 		if (iCount != 1) {
321c30d921cSKever Yang 			return false;
322c30d921cSKever Yang 		}
323c30d921cSKever Yang 	}
324c30d921cSKever Yang 
325c30d921cSKever Yang 	prevPos = pos + 1;
326c30d921cSKever Yang 	pos = strPartInfo.find('(',prevPos);
327c30d921cSKever Yang 	if (pos == string::npos) {
328c30d921cSKever Yang 		return false;
329c30d921cSKever Yang 	}
330c30d921cSKever Yang 	strOffset = strPartInfo.substr(prevPos, pos - prevPos);
331c30d921cSKever Yang 	strOffset.erase(0, strOffset.find_first_not_of(" "));
332c30d921cSKever Yang 	strOffset.erase(strOffset.find_last_not_of(" ") + 1);
333c30d921cSKever Yang 	iCount = sscanf(strOffset.c_str(), "0x%x", &uiOffset);
334c30d921cSKever Yang 	if (iCount != 1) {
335c30d921cSKever Yang 		return false;
336c30d921cSKever Yang 	}
337c30d921cSKever Yang 	prevPos = pos + 1;
338c30d921cSKever Yang 	pos = strPartInfo.find(')', prevPos);
339c30d921cSKever Yang 	if (pos == string::npos) {
340c30d921cSKever Yang 		return false;
341c30d921cSKever Yang 	}
342c30d921cSKever Yang 	strName = strPartInfo.substr(prevPos, pos - prevPos);
343c30d921cSKever Yang 	strName.erase(0, strName.find_first_not_of(" "));
344c30d921cSKever Yang 	strName.erase(strName.find_last_not_of(" ") + 1);
345c30d921cSKever Yang 
346c30d921cSKever Yang 	return true;
347c30d921cSKever Yang }
348c30d921cSKever Yang 
349c30d921cSKever Yang bool parse_parameter(char *pParameter, PARAM_ITEM_VECTOR &vecItem)
350c30d921cSKever Yang {
351c30d921cSKever Yang 	stringstream paramStream(pParameter);
352c30d921cSKever Yang 	bool bRet,bFind = false;
353c30d921cSKever Yang 	string strLine, strPartition, strPartInfo, strPartName;
354c30d921cSKever Yang 	string::size_type line_size, pos, posColon, posComma;
355c30d921cSKever Yang 	UINT uiPartOffset, uiPartSize;
356c30d921cSKever Yang 	STRUCT_PARAM_ITEM item;
357c30d921cSKever Yang 	vecItem.clear();
358c30d921cSKever Yang 	while (!paramStream.eof()) {
359c30d921cSKever Yang 		getline(paramStream,strLine);
360c30d921cSKever Yang 		line_size = strLine.size();
361c30d921cSKever Yang 		if (line_size == 0)
362c30d921cSKever Yang 			continue;
363c30d921cSKever Yang 		if (strLine[line_size - 1] == '\r'){
364c30d921cSKever Yang 			strLine = strLine.substr(0, line_size - 1);
365c30d921cSKever Yang 		}
366c30d921cSKever Yang 		strLine.erase(0, strLine.find_first_not_of(" "));
367c30d921cSKever Yang 		strLine.erase(strLine.find_last_not_of(" ") + 1);
368c30d921cSKever Yang 		if (strLine.size()==0 )
369c30d921cSKever Yang 			continue;
370c30d921cSKever Yang 		if (strLine[0] == '#')
371c30d921cSKever Yang 			continue;
372c30d921cSKever Yang 		pos = strLine.find("mtdparts");
373c30d921cSKever Yang 		if (pos == string::npos) {
374c30d921cSKever Yang 			continue;
375c30d921cSKever Yang 		}
376c30d921cSKever Yang 		bFind = true;
377c30d921cSKever Yang 		posColon = strLine.find(':', pos);
378c30d921cSKever Yang 		if (posColon == string::npos) {
379c30d921cSKever Yang 			continue;
380c30d921cSKever Yang 		}
381c30d921cSKever Yang 		strPartition = strLine.substr(posColon + 1);
382c30d921cSKever Yang 		pos = 0;
383c30d921cSKever Yang 		posComma = strPartition.find(',', pos);
384c30d921cSKever Yang 		while (posComma != string::npos) {
385c30d921cSKever Yang 			strPartInfo = strPartition.substr(pos, posComma - pos);
386c30d921cSKever Yang 			bRet = ParsePartitionInfo(strPartInfo, strPartName, uiPartOffset, uiPartSize);
387c30d921cSKever Yang 			if (bRet) {
388c30d921cSKever Yang 				strcpy(item.szItemName, strPartName.c_str());
389c30d921cSKever Yang 				item.uiItemOffset = uiPartOffset;
390c30d921cSKever Yang 				item.uiItemSize = uiPartSize;
391c30d921cSKever Yang 				vecItem.push_back(item);
392c30d921cSKever Yang 			}
393c30d921cSKever Yang 			pos = posComma + 1;
394c30d921cSKever Yang 			posComma = strPartition.find(',', pos);
395c30d921cSKever Yang 		}
396c30d921cSKever Yang 		strPartInfo = strPartition.substr(pos);
397c30d921cSKever Yang 		if (strPartInfo.size() > 0) {
398c30d921cSKever Yang 			bRet = ParsePartitionInfo(strPartInfo, strPartName, uiPartOffset, uiPartSize);
399c30d921cSKever Yang 			if (bRet) {
400c30d921cSKever Yang 				strcpy(item.szItemName, strPartName.c_str());
401c30d921cSKever Yang 				item.uiItemOffset = uiPartOffset;
402c30d921cSKever Yang 				item.uiItemSize = uiPartSize;
403c30d921cSKever Yang 				vecItem.push_back(item);
404c30d921cSKever Yang 			}
405c30d921cSKever Yang 		}
406c30d921cSKever Yang 		break;
407c30d921cSKever Yang 	}
408c30d921cSKever Yang 	return bFind;
409c30d921cSKever Yang 
410c30d921cSKever Yang }
411c30d921cSKever Yang bool parse_parameter_file(char *pParamFile, PARAM_ITEM_VECTOR &vecItem)
412c30d921cSKever Yang {
413c30d921cSKever Yang 	FILE *file = NULL;
414c30d921cSKever Yang 	file = fopen(pParamFile, "rb");
415c30d921cSKever Yang 	if( !file ) {
416c30d921cSKever Yang 		if (g_pLogObject)
417c30d921cSKever Yang 			g_pLogObject->Record("parse_parameter_file failed, err=%d, can't open file: %s\r\n", errno, pParamFile);
418c30d921cSKever Yang 		return false;
419c30d921cSKever Yang 	}
420c30d921cSKever Yang 	int iFileSize;
421c30d921cSKever Yang 	fseek(file, 0, SEEK_END);
422c30d921cSKever Yang 	iFileSize = ftell(file);
423c30d921cSKever Yang 	fseek(file, 0, SEEK_SET);
424c30d921cSKever Yang 	char *pParamBuf = NULL;
425c30d921cSKever Yang 	pParamBuf = new char[iFileSize];
426c30d921cSKever Yang 	if (!pParamBuf) {
427c30d921cSKever Yang 		fclose(file);
428c30d921cSKever Yang 		return false;
429c30d921cSKever Yang 	}
430c30d921cSKever Yang 	int iRead;
431c30d921cSKever Yang 	iRead = fread(pParamBuf, 1, iFileSize, file);
432c30d921cSKever Yang 	if (iRead != iFileSize) {
433c30d921cSKever Yang 		if (g_pLogObject)
434c30d921cSKever Yang 			g_pLogObject->Record("parse_parameter_file failed, err=%d, read=%d, total=%d\r\n", errno,iRead,iFileSize);
435c30d921cSKever Yang 		fclose(file);
436c30d921cSKever Yang 		delete []pParamBuf;
437c30d921cSKever Yang 		return false;
438c30d921cSKever Yang 	}
439c30d921cSKever Yang 	fclose(file);
440c30d921cSKever Yang 	bool bRet;
441c30d921cSKever Yang 	bRet = parse_parameter(pParamBuf, vecItem);
442c30d921cSKever Yang 	delete []pParamBuf;
443c30d921cSKever Yang 	return bRet;
444c30d921cSKever Yang }
445c30d921cSKever Yang void gen_rand_uuid(unsigned char *uuid_bin)
446c30d921cSKever Yang {
447c30d921cSKever Yang 	efi_guid_t id;
448c30d921cSKever Yang 	unsigned int *ptr = (unsigned int *)&id;
449c30d921cSKever Yang 	unsigned int i;
450c30d921cSKever Yang 
451c30d921cSKever Yang 	/* Set all fields randomly */
452c30d921cSKever Yang 	for (i = 0; i < sizeof(id) / sizeof(*ptr); i++)
453c30d921cSKever Yang 		*(ptr + i) = cpu_to_be32(rand());
454c30d921cSKever Yang 
455c30d921cSKever Yang 	id.uuid.time_hi_and_version = (id.uuid.time_hi_and_version & 0x0FFF) | 0x4000;
456c30d921cSKever Yang 	id.uuid.clock_seq_hi_and_reserved = id.uuid.clock_seq_hi_and_reserved | 0x80;
457c30d921cSKever Yang 
458c30d921cSKever Yang 	memcpy(uuid_bin, id.raw, sizeof(id));
459c30d921cSKever Yang }
460c30d921cSKever Yang 
461c30d921cSKever Yang void create_gpt_buffer(u8 *gpt, PARAM_ITEM_VECTOR &vecParts, u64 diskSectors)
462c30d921cSKever Yang {
463c30d921cSKever Yang 	legacy_mbr *mbr = (legacy_mbr *)gpt;
464c30d921cSKever Yang 	gpt_header *gptHead = (gpt_header *)(gpt + SECTOR_SIZE);
465c30d921cSKever Yang 	gpt_entry *gptEntry = (gpt_entry *)(gpt + 2 * SECTOR_SIZE);
466c30d921cSKever Yang 	u32 i,j;
467c30d921cSKever Yang 	string strPartName;
468c30d921cSKever Yang 	string::size_type colonPos;
469c30d921cSKever Yang 	/*1.protective mbr*/
470c30d921cSKever Yang 	memset(gpt, 0, SECTOR_SIZE);
471c30d921cSKever Yang 	mbr->signature = MSDOS_MBR_SIGNATURE;
472c30d921cSKever Yang 	mbr->partition_record[0].sys_ind = EFI_PMBR_OSTYPE_EFI_GPT;
473c30d921cSKever Yang 	mbr->partition_record[0].start_sect = 1;
474c30d921cSKever Yang 	mbr->partition_record[0].nr_sects = (u32)-1;
475c30d921cSKever Yang 	/*2.gpt header*/
476c30d921cSKever Yang 	memset(gpt + SECTOR_SIZE, 0, SECTOR_SIZE);
477c30d921cSKever Yang 	gptHead->signature = cpu_to_le64(GPT_HEADER_SIGNATURE);
478c30d921cSKever Yang 	gptHead->revision = cpu_to_le32(GPT_HEADER_REVISION_V1);
479c30d921cSKever Yang 	gptHead->header_size = cpu_to_le32(sizeof(gpt_header));
480c30d921cSKever Yang 	gptHead->my_lba = cpu_to_le64(1);
481c30d921cSKever Yang 	gptHead->alternate_lba = cpu_to_le64(diskSectors - 1);
482c30d921cSKever Yang 	gptHead->first_usable_lba = cpu_to_le64(34);
483c30d921cSKever Yang 	gptHead->last_usable_lba = cpu_to_le64(diskSectors - 34);
484c30d921cSKever Yang 	gptHead->partition_entry_lba = cpu_to_le64(2);
485c30d921cSKever Yang 	gptHead->num_partition_entries = cpu_to_le32(GPT_ENTRY_NUMBERS);
486c30d921cSKever Yang 	gptHead->sizeof_partition_entry = cpu_to_le32(GPT_ENTRY_SIZE);
487c30d921cSKever Yang 	gptHead->header_crc32 = 0;
488c30d921cSKever Yang 	gptHead->partition_entry_array_crc32 = 0;
489c30d921cSKever Yang 	gen_rand_uuid(gptHead->disk_guid.raw);
490c30d921cSKever Yang 
491c30d921cSKever Yang 	/*3.gpt partition entry*/
492c30d921cSKever Yang 	memset(gpt + 2 * SECTOR_SIZE, 0, 32 * SECTOR_SIZE);
493c30d921cSKever Yang 	for (i = 0; i < vecParts.size(); i++) {
494c30d921cSKever Yang 		gen_rand_uuid(gptEntry->partition_type_guid.raw);
495c30d921cSKever Yang 		gen_rand_uuid(gptEntry->unique_partition_guid.raw);
496c30d921cSKever Yang 		gptEntry->starting_lba = cpu_to_le64(vecParts[i].uiItemOffset);
497c30d921cSKever Yang 		gptEntry->ending_lba = cpu_to_le64(gptEntry->starting_lba + vecParts[i].uiItemSize - 1);
498c30d921cSKever Yang 		gptEntry->attributes.raw = 0;
499c30d921cSKever Yang 		strPartName = vecParts[i].szItemName;
500c30d921cSKever Yang 		colonPos = strPartName.find_first_of(':');
501c30d921cSKever Yang 		if (colonPos != string::npos) {
502c30d921cSKever Yang 			if (strPartName.find("bootable") != string::npos)
503c30d921cSKever Yang 				gptEntry->attributes.raw = PART_PROPERTY_BOOTABLE;
504c30d921cSKever Yang 			strPartName = strPartName.substr(0, colonPos);
505c30d921cSKever Yang 			vecParts[i].szItemName[strPartName.size()] = 0;
506c30d921cSKever Yang 		}
507c30d921cSKever Yang 		for (j = 0; j < strlen(vecParts[i].szItemName); j++)
508c30d921cSKever Yang 			gptEntry->partition_name[j] = vecParts[i].szItemName[j];
509c30d921cSKever Yang 		gptEntry++;
510c30d921cSKever Yang 	}
511c30d921cSKever Yang 
512c30d921cSKever Yang 	gptHead->partition_entry_array_crc32 = cpu_to_le32(crc32_le(0, gpt + 2 * SECTOR_SIZE, GPT_ENTRY_SIZE * GPT_ENTRY_NUMBERS));
513c30d921cSKever Yang 	gptHead->header_crc32 = cpu_to_le32(crc32_le(0, gpt + SECTOR_SIZE, sizeof(gpt_header)));
514c30d921cSKever Yang 
515c30d921cSKever Yang }
516c30d921cSKever Yang bool MakeSector0(PBYTE pSector, USHORT usFlashDataSec, USHORT usFlashBootSec)
517c30d921cSKever Yang {
518c30d921cSKever Yang 	PRK28_IDB_SEC0 pSec0;
519c30d921cSKever Yang 	memset(pSector, 0, SECTOR_SIZE);
520c30d921cSKever Yang 	pSec0 = (PRK28_IDB_SEC0)pSector;
521c30d921cSKever Yang 
522c30d921cSKever Yang 	pSec0->dwTag = 0x0FF0AA55;
523c30d921cSKever Yang 	pSec0->uiRc4Flag = 1;
524c30d921cSKever Yang 	pSec0->usBootCode1Offset = 0x4;
525c30d921cSKever Yang 	pSec0->usBootCode2Offset = 0x4;
526c30d921cSKever Yang 	pSec0->usBootDataSize = usFlashDataSec;
527c30d921cSKever Yang 	pSec0->usBootCodeSize = usFlashDataSec + usFlashBootSec;
528c30d921cSKever Yang 	return true;
529c30d921cSKever Yang }
530c30d921cSKever Yang 
531c30d921cSKever Yang 
532c30d921cSKever Yang bool MakeSector1(PBYTE pSector)
533c30d921cSKever Yang {
534c30d921cSKever Yang 	PRK28_IDB_SEC1 pSec1;
535c30d921cSKever Yang 	memset(pSector, 0, SECTOR_SIZE);
536c30d921cSKever Yang 	pSec1 = (PRK28_IDB_SEC1)pSector;
537c30d921cSKever Yang 
538c30d921cSKever Yang 	pSec1->usSysReservedBlock = 0xC;
539c30d921cSKever Yang 	pSec1->usDisk0Size = 0xFFFF;
540c30d921cSKever Yang 	pSec1->uiChipTag = 0x38324B52;
541c30d921cSKever Yang 	return true;
542c30d921cSKever Yang }
543c30d921cSKever Yang 
544c30d921cSKever Yang bool MakeSector2(PBYTE pSector)
545c30d921cSKever Yang {
546c30d921cSKever Yang 	PRK28_IDB_SEC2 pSec2;
547c30d921cSKever Yang 	memset(pSector, 0, SECTOR_SIZE);
548c30d921cSKever Yang 	pSec2 = (PRK28_IDB_SEC2)pSector;
549c30d921cSKever Yang 
550c30d921cSKever Yang 	strcpy(pSec2->szVcTag, "VC");
551c30d921cSKever Yang 	strcpy(pSec2->szCrcTag, "CRC");
552c30d921cSKever Yang 	return true;
553c30d921cSKever Yang }
554c30d921cSKever Yang 
555c30d921cSKever Yang bool MakeSector3(PBYTE pSector)
556c30d921cSKever Yang {
557c30d921cSKever Yang 	memset(pSector,0,SECTOR_SIZE);
558c30d921cSKever Yang 	return true;
559c30d921cSKever Yang }
560c30d921cSKever Yang 
561c30d921cSKever Yang int MakeIDBlockData(PBYTE pDDR, PBYTE pLoader, PBYTE lpIDBlock, USHORT usFlashDataSec, USHORT usFlashBootSec, DWORD dwLoaderDataSize, DWORD dwLoaderSize)
562c30d921cSKever Yang {
563c30d921cSKever Yang 	RK28_IDB_SEC0 sector0Info;
564c30d921cSKever Yang 	RK28_IDB_SEC1 sector1Info;
565c30d921cSKever Yang 	RK28_IDB_SEC2 sector2Info;
566c30d921cSKever Yang 	RK28_IDB_SEC3 sector3Info;
567c30d921cSKever Yang 	UINT i;
568c30d921cSKever Yang 
569c30d921cSKever Yang 	MakeSector0((PBYTE)&sector0Info, usFlashDataSec, usFlashBootSec);
570c30d921cSKever Yang 	MakeSector1((PBYTE)&sector1Info);
571c30d921cSKever Yang 	if (!MakeSector2((PBYTE)&sector2Info)) {
572c30d921cSKever Yang 		return -6;
573c30d921cSKever Yang 	}
574c30d921cSKever Yang 	if (!MakeSector3((PBYTE)&sector3Info)) {
575c30d921cSKever Yang 		return -7;
576c30d921cSKever Yang 	}
577c30d921cSKever Yang 	sector2Info.usSec0Crc = CRC_16((PBYTE)&sector0Info, SECTOR_SIZE);
578c30d921cSKever Yang 	sector2Info.usSec1Crc = CRC_16((PBYTE)&sector1Info, SECTOR_SIZE);
579c30d921cSKever Yang 	sector2Info.usSec3Crc = CRC_16((PBYTE)&sector3Info, SECTOR_SIZE);
580c30d921cSKever Yang 
581c30d921cSKever Yang 	memcpy(lpIDBlock, &sector0Info, SECTOR_SIZE);
582c30d921cSKever Yang 	memcpy(lpIDBlock + SECTOR_SIZE, &sector1Info, SECTOR_SIZE);
583c30d921cSKever Yang 	memcpy(lpIDBlock + SECTOR_SIZE * 3, &sector3Info, SECTOR_SIZE);
584c30d921cSKever Yang 	memcpy(lpIDBlock + SECTOR_SIZE * 4, pDDR, dwLoaderDataSize);
585c30d921cSKever Yang 	memcpy(lpIDBlock + SECTOR_SIZE * (4 + usFlashDataSec), pLoader, dwLoaderSize);
586c30d921cSKever Yang 
587c30d921cSKever Yang 	sector2Info.uiBootCodeCrc = CRC_32((PBYTE)(lpIDBlock + SECTOR_SIZE * 4), sector0Info.usBootCodeSize * SECTOR_SIZE);
588c30d921cSKever Yang 	memcpy(lpIDBlock + SECTOR_SIZE * 2, &sector2Info, SECTOR_SIZE);
589c30d921cSKever Yang 	for(i = 0; i < 4; i++) {
590c30d921cSKever Yang 		if(i == 1) {
591c30d921cSKever Yang 			continue;
592c30d921cSKever Yang 		} else {
593c30d921cSKever Yang 			P_RC4(lpIDBlock + SECTOR_SIZE * i, SECTOR_SIZE);
594c30d921cSKever Yang 		}
595c30d921cSKever Yang 	}
596c30d921cSKever Yang 	return 0;
597c30d921cSKever Yang }
598c30d921cSKever Yang 
599c30d921cSKever Yang 
60076af099aSliuyi 
60176af099aSliuyi bool check_device_type(STRUCT_RKDEVICE_DESC &dev, UINT uiSupportType)
60276af099aSliuyi {
60376af099aSliuyi 	if ((dev.emUsbType & uiSupportType) == dev.emUsbType)
60476af099aSliuyi 		return true;
60576af099aSliuyi 	else
60676af099aSliuyi 	{
60776af099aSliuyi 		ERROR_COLOR_ATTR;
60876af099aSliuyi 		printf("The  Device did not support this operation!");
60976af099aSliuyi 		NORMAL_COLOR_ATTR;
61076af099aSliuyi 		printf("\r\n");
61176af099aSliuyi 		return false;
61276af099aSliuyi 	}
61376af099aSliuyi }
614c30d921cSKever Yang bool write_gpt(STRUCT_RKDEVICE_DESC &dev, char *szParameter)
615c30d921cSKever Yang {
616c30d921cSKever Yang 	u8 flash_info[SECTOR_SIZE], master_gpt[34 * SECTOR_SIZE], backup_gpt[33 * SECTOR_SIZE];
617c30d921cSKever Yang 	u32 total_size_sector;
618c30d921cSKever Yang 	CRKComm *pComm = NULL;
619c30d921cSKever Yang 	PARAM_ITEM_VECTOR vecItems;
620c30d921cSKever Yang 	int iRet;
621c30d921cSKever Yang 	bool bRet, bSuccess = false;
622c30d921cSKever Yang 	if (!check_device_type(dev, RKUSB_MASKROM))
623c30d921cSKever Yang 		return false;
624c30d921cSKever Yang 
625c30d921cSKever Yang 	pComm = new CRKUsbComm(dev, g_pLogObject, bRet);
626c30d921cSKever Yang 	if (!bRet) {
627c30d921cSKever Yang 		ERROR_COLOR_ATTR;
628c30d921cSKever Yang 		printf("Creating Comm Object failed!");
629c30d921cSKever Yang 		NORMAL_COLOR_ATTR;
630c30d921cSKever Yang 		printf("\r\n");
631c30d921cSKever Yang 		return bSuccess;
632c30d921cSKever Yang 	}
633c30d921cSKever Yang 	printf("Write gpt...\r\n");
634c30d921cSKever Yang 	//1.get flash info
635c30d921cSKever Yang 	iRet = pComm->RKU_ReadFlashInfo(flash_info);
636c30d921cSKever Yang 	if (iRet != ERR_SUCCESS) {
637c30d921cSKever Yang 		ERROR_COLOR_ATTR;
638c30d921cSKever Yang 		printf("Reading Flash Info failed!");
639c30d921cSKever Yang 		NORMAL_COLOR_ATTR;
640c30d921cSKever Yang 		printf("\r\n");
641c30d921cSKever Yang 		return bSuccess;
642c30d921cSKever Yang 	}
643c30d921cSKever Yang 	total_size_sector = *(u32 *)flash_info;
644c30d921cSKever Yang 	//2.get partition from parameter
645c30d921cSKever Yang 	bRet = parse_parameter_file(szParameter, vecItems);
646c30d921cSKever Yang 	if (!bRet) {
647c30d921cSKever Yang 		ERROR_COLOR_ATTR;
648c30d921cSKever Yang 		printf("Parsing parameter failed!");
649c30d921cSKever Yang 		NORMAL_COLOR_ATTR;
650c30d921cSKever Yang 		printf("\r\n");
651c30d921cSKever Yang 		return bSuccess;
652c30d921cSKever Yang 	}
653c30d921cSKever Yang 	vecItems[vecItems.size()-1].uiItemSize = total_size_sector - 34;
654c30d921cSKever Yang 	//3.generate gpt info
655c30d921cSKever Yang 	create_gpt_buffer(master_gpt, vecItems, total_size_sector);
656c30d921cSKever Yang 	memcpy(backup_gpt, master_gpt + 2* SECTOR_SIZE, 32 * SECTOR_SIZE);
657c30d921cSKever Yang 	memcpy(backup_gpt + 32 * SECTOR_SIZE, master_gpt + SECTOR_SIZE, SECTOR_SIZE);
658c30d921cSKever Yang 	//4. write gpt
659c30d921cSKever Yang 	iRet = pComm->RKU_WriteLBA(0, 34, master_gpt);
660c30d921cSKever Yang 	if (iRet != ERR_SUCCESS) {
661c30d921cSKever Yang 		ERROR_COLOR_ATTR;
662c30d921cSKever Yang 		printf("Writing master gpt failed!");
663c30d921cSKever Yang 		NORMAL_COLOR_ATTR;
664c30d921cSKever Yang 		printf("\r\n");
665c30d921cSKever Yang 		return bSuccess;
666c30d921cSKever Yang 	}
667c30d921cSKever Yang 	iRet = pComm->RKU_WriteLBA(total_size_sector - 34, 33, backup_gpt);
668c30d921cSKever Yang 	if (iRet != ERR_SUCCESS) {
669c30d921cSKever Yang 		ERROR_COLOR_ATTR;
670c30d921cSKever Yang 		printf("Writing backup gpt failed!");
671c30d921cSKever Yang 		NORMAL_COLOR_ATTR;
672c30d921cSKever Yang 		printf("\r\n");
673c30d921cSKever Yang 		return bSuccess;
674c30d921cSKever Yang 	}
675c30d921cSKever Yang 	bSuccess = true;
676c30d921cSKever Yang 	CURSOR_MOVEUP_LINE(1);
677c30d921cSKever Yang 	CURSOR_DEL_LINE;
678c30d921cSKever Yang 	printf("Write gpt ok.\r\n");
679c30d921cSKever Yang 	return bSuccess;
680c30d921cSKever Yang }
68176af099aSliuyi 
68276af099aSliuyi bool download_boot(STRUCT_RKDEVICE_DESC &dev, char *szLoader)
68376af099aSliuyi {
68476af099aSliuyi 	if (!check_device_type(dev, RKUSB_MASKROM))
68576af099aSliuyi 		return false;
68676af099aSliuyi 	CRKImage *pImage = NULL;
68776af099aSliuyi 	CRKBoot *pBoot = NULL;
68876af099aSliuyi 	bool bRet, bSuccess = false;
68976af099aSliuyi 	int iRet;
69076af099aSliuyi 
69176af099aSliuyi 	pImage = new CRKImage(szLoader, bRet);
69276af099aSliuyi 	if (!bRet){
69376af099aSliuyi 		ERROR_COLOR_ATTR;
69476af099aSliuyi 		printf("Open loader failed,exit download boot!");
69576af099aSliuyi 		NORMAL_COLOR_ATTR;
69676af099aSliuyi 		printf("\r\n");
69776af099aSliuyi 		return bSuccess;
69876af099aSliuyi 	} else {
69976af099aSliuyi 		pBoot = (CRKBoot *)pImage->m_bootObject;
70076af099aSliuyi 		CRKComm *pComm = NULL;
70176af099aSliuyi 		CRKDevice *pDevice = NULL;
70276af099aSliuyi 
70376af099aSliuyi 		dev.emDeviceType = pBoot->SupportDevice;
70476af099aSliuyi 		pComm = new CRKUsbComm(dev, g_pLogObject, bRet);
70576af099aSliuyi 		if (!bRet) {
70676af099aSliuyi 			if (pImage)
70776af099aSliuyi 				delete pImage;
70876af099aSliuyi 			ERROR_COLOR_ATTR;
70976af099aSliuyi 			printf("Creating Comm Object failed!");
71076af099aSliuyi 			NORMAL_COLOR_ATTR;
71176af099aSliuyi 			printf("\r\n");
71276af099aSliuyi 			return bSuccess;
71376af099aSliuyi 		}
71476af099aSliuyi 
71576af099aSliuyi 		pDevice = new CRKDevice(dev);
71676af099aSliuyi 		if (!pDevice) {
71776af099aSliuyi 			if (pImage)
71876af099aSliuyi 				delete pImage;
71976af099aSliuyi 			if (pComm)
72076af099aSliuyi 				delete pComm;
72176af099aSliuyi 			ERROR_COLOR_ATTR;
72276af099aSliuyi 			printf("Creating device object failed!");
72376af099aSliuyi 			NORMAL_COLOR_ATTR;
72476af099aSliuyi 			printf("\r\n");
72576af099aSliuyi 			return bSuccess;
72676af099aSliuyi 		}
72776af099aSliuyi 
72876af099aSliuyi 		pDevice->SetObject(pImage, pComm, g_pLogObject);
72976af099aSliuyi 		printf("Download boot...\r\n");
73076af099aSliuyi 		iRet = pDevice->DownloadBoot();
73176af099aSliuyi 
73276af099aSliuyi 		CURSOR_MOVEUP_LINE(1);
73376af099aSliuyi 		CURSOR_DEL_LINE;
73476af099aSliuyi 		if (iRet == 0) {
73576af099aSliuyi 			pComm->Reset_Usb_Device();
73676af099aSliuyi 			CRKScan *pScan = NULL;
73776af099aSliuyi 			pScan = new CRKScan();
73876af099aSliuyi 			if (pScan) {
73976af099aSliuyi 				pScan->SetVidPid();
74076af099aSliuyi 				pScan->Wait(dev, RKUSB_MASKROM, dev.usVid, dev.usPid);
74176af099aSliuyi 				delete pScan;
74276af099aSliuyi 			}
74376af099aSliuyi 			bSuccess = true;
74476af099aSliuyi 			printf("Download boot ok.\r\n");
74576af099aSliuyi 		}
74676af099aSliuyi 		else
74776af099aSliuyi 			printf("Download boot failed!\r\n");
74876af099aSliuyi 
74976af099aSliuyi 		if (pImage)
75076af099aSliuyi 			delete pImage;
75176af099aSliuyi 		if(pDevice)
75276af099aSliuyi 			delete pDevice;
75376af099aSliuyi 	}
75476af099aSliuyi 	return bSuccess;
75576af099aSliuyi }
756c30d921cSKever Yang bool upgrade_loader(STRUCT_RKDEVICE_DESC &dev, char *szLoader)
757c30d921cSKever Yang {
758c30d921cSKever Yang 	if (!check_device_type(dev, RKUSB_MASKROM))
759c30d921cSKever Yang 		return false;
760c30d921cSKever Yang 	CRKImage *pImage = NULL;
761c30d921cSKever Yang 	CRKBoot *pBoot = NULL;
762c30d921cSKever Yang 	CRKComm *pComm = NULL;
763c30d921cSKever Yang 	bool bRet, bSuccess = false;
764c30d921cSKever Yang 	int iRet;
765c30d921cSKever Yang 	char index;
766c30d921cSKever Yang 	USHORT usFlashDataSec, usFlashBootSec;
767c30d921cSKever Yang 	DWORD dwLoaderSize, dwLoaderDataSize, dwDelay, dwSectorNum;
768c30d921cSKever Yang 	char loaderCodeName[] = "FlashBoot";
769c30d921cSKever Yang 	char loaderDataName[] = "FlashData";
770c30d921cSKever Yang 	PBYTE loaderCodeBuffer = NULL;
771c30d921cSKever Yang 	PBYTE loaderDataBuffer = NULL;
772c30d921cSKever Yang 	PBYTE pIDBData = NULL;
773c30d921cSKever Yang 	pImage = new CRKImage(szLoader, bRet);
774c30d921cSKever Yang 	if (!bRet){
775c30d921cSKever Yang 		ERROR_COLOR_ATTR;
776c30d921cSKever Yang 		printf("Open loader failed,exit upgrade loader!");
777c30d921cSKever Yang 		NORMAL_COLOR_ATTR;
778c30d921cSKever Yang 		printf("\r\n");
779c30d921cSKever Yang 		goto Exit_UpgradeLoader;
780c30d921cSKever Yang 	} else {
781c30d921cSKever Yang 		pBoot = (CRKBoot *)pImage->m_bootObject;
782c30d921cSKever Yang 		dev.emDeviceType = pBoot->SupportDevice;
783c30d921cSKever Yang 		pComm = new CRKUsbComm(dev, g_pLogObject, bRet);
784c30d921cSKever Yang 		if (!bRet) {
785c30d921cSKever Yang 			ERROR_COLOR_ATTR;
786c30d921cSKever Yang 			printf("Creating Comm Object failed!");
787c30d921cSKever Yang 			NORMAL_COLOR_ATTR;
788c30d921cSKever Yang 			printf("\r\n");
789c30d921cSKever Yang 			goto Exit_UpgradeLoader;
790c30d921cSKever Yang 		}
791c30d921cSKever Yang 
792c30d921cSKever Yang 		printf("Upgrade loader...\r\n");
793c30d921cSKever Yang 		index = pBoot->GetIndexByName(ENTRYLOADER, loaderCodeName);
794c30d921cSKever Yang 		if (index == -1) {
795c30d921cSKever Yang 			if (g_pLogObject) {
796c30d921cSKever Yang 				g_pLogObject->Record("ERROR:upgrade_loader-->Get LoaderCode Entry failed");
797c30d921cSKever Yang 			}
798c30d921cSKever Yang 			goto Exit_UpgradeLoader;
799c30d921cSKever Yang 		}
800c30d921cSKever Yang 		bRet = pBoot->GetEntryProperty(ENTRYLOADER, index, dwLoaderSize, dwDelay);
801c30d921cSKever Yang 		if (!bRet) {
802c30d921cSKever Yang 			if (g_pLogObject) {
803c30d921cSKever Yang 				g_pLogObject->Record("ERROR:upgrade_loader-->Get LoaderCode Entry Size failed");
804c30d921cSKever Yang 			}
805c30d921cSKever Yang 			goto Exit_UpgradeLoader;
806c30d921cSKever Yang 		}
807c30d921cSKever Yang 
808c30d921cSKever Yang 		loaderCodeBuffer = new BYTE[dwLoaderSize];
809c30d921cSKever Yang 		memset(loaderCodeBuffer, 0, dwLoaderSize);
810c30d921cSKever Yang 		if (!pBoot->GetEntryData(ENTRYLOADER, index, loaderCodeBuffer)) {
811c30d921cSKever Yang 			if (g_pLogObject) {
812c30d921cSKever Yang 				g_pLogObject->Record("ERROR:upgrade_loader-->Get LoaderCode Data failed");
813c30d921cSKever Yang 			}
814c30d921cSKever Yang 			goto Exit_UpgradeLoader;
815c30d921cSKever Yang 		}
816c30d921cSKever Yang 
817c30d921cSKever Yang 		index = pBoot->GetIndexByName(ENTRYLOADER, loaderDataName);
818c30d921cSKever Yang 		if (index == -1) {
819c30d921cSKever Yang 			if (g_pLogObject) {
820c30d921cSKever Yang 				g_pLogObject->Record("ERROR:upgrade_loader-->Get LoaderData Entry failed");
821c30d921cSKever Yang 			}
822c30d921cSKever Yang 			delete []loaderCodeBuffer;
823c30d921cSKever Yang 			return -4;
824c30d921cSKever Yang 		}
825c30d921cSKever Yang 
826c30d921cSKever Yang 		bRet = pBoot->GetEntryProperty(ENTRYLOADER, index, dwLoaderDataSize, dwDelay);
827c30d921cSKever Yang 		if (!bRet) {
828c30d921cSKever Yang 			if (g_pLogObject) {
829c30d921cSKever Yang 				g_pLogObject->Record("ERROR:upgrade_loader-->Get LoaderData Entry Size failed");
830c30d921cSKever Yang 			}
831c30d921cSKever Yang 			goto Exit_UpgradeLoader;
832c30d921cSKever Yang 		}
833c30d921cSKever Yang 
834c30d921cSKever Yang 		loaderDataBuffer = new BYTE[dwLoaderDataSize];
835c30d921cSKever Yang 		memset(loaderDataBuffer, 0, dwLoaderDataSize);
836c30d921cSKever Yang 		if (!pBoot->GetEntryData(ENTRYLOADER,index,loaderDataBuffer)) {
837c30d921cSKever Yang 			if (g_pLogObject) {
838c30d921cSKever Yang 				g_pLogObject->Record("ERROR:upgrade_loader-->Get LoaderData Data failed");
839c30d921cSKever Yang 			}
840c30d921cSKever Yang 			goto Exit_UpgradeLoader;
841c30d921cSKever Yang 		}
842c30d921cSKever Yang 
843c30d921cSKever Yang 		usFlashDataSec = (ALIGN(dwLoaderDataSize, 2048)) / SECTOR_SIZE;
844c30d921cSKever Yang 		usFlashBootSec = (ALIGN(dwLoaderSize, 2048)) / SECTOR_SIZE;
845c30d921cSKever Yang 		dwSectorNum = 4 + usFlashDataSec + usFlashBootSec;
846c30d921cSKever Yang 		pIDBData = new BYTE[dwSectorNum*SECTOR_SIZE];
847c30d921cSKever Yang 		if (!pIDBData) {
848c30d921cSKever Yang 			ERROR_COLOR_ATTR;
849c30d921cSKever Yang 			printf("New memory failed!");
850c30d921cSKever Yang 			NORMAL_COLOR_ATTR;
851c30d921cSKever Yang 			printf("\r\n");
852c30d921cSKever Yang 			goto Exit_UpgradeLoader;
853c30d921cSKever Yang 		}
854c30d921cSKever Yang 		memset(pIDBData, 0, dwSectorNum * SECTOR_SIZE);
855c30d921cSKever Yang 		iRet = MakeIDBlockData(loaderDataBuffer, loaderCodeBuffer, pIDBData, usFlashDataSec, usFlashBootSec, dwLoaderDataSize, dwLoaderSize);
856c30d921cSKever Yang 		if (iRet != 0) {
857c30d921cSKever Yang 			ERROR_COLOR_ATTR;
858c30d921cSKever Yang 			printf("Make idblock failed!");
859c30d921cSKever Yang 			NORMAL_COLOR_ATTR;
860c30d921cSKever Yang 			printf("\r\n");
861c30d921cSKever Yang 			goto Exit_UpgradeLoader;
862c30d921cSKever Yang 		}
863c30d921cSKever Yang 		iRet = pComm->RKU_WriteLBA(64, dwSectorNum, pIDBData);
864c30d921cSKever Yang 		CURSOR_MOVEUP_LINE(1);
865c30d921cSKever Yang 		CURSOR_DEL_LINE;
866c30d921cSKever Yang 		if (iRet == ERR_SUCCESS) {
867c30d921cSKever Yang 			pComm->Reset_Usb_Device();
868c30d921cSKever Yang 			bSuccess = true;
869c30d921cSKever Yang 			printf("Upgrade loader ok.\r\n");
870c30d921cSKever Yang 		} else {
871c30d921cSKever Yang 			printf("Upgrade loader failed!\r\n");
872c30d921cSKever Yang 			goto Exit_UpgradeLoader;
873c30d921cSKever Yang 		}
874c30d921cSKever Yang 	}
875c30d921cSKever Yang Exit_UpgradeLoader:
876c30d921cSKever Yang 	if (pImage)
877c30d921cSKever Yang 		delete pImage;
878c30d921cSKever Yang 	if (pComm)
879c30d921cSKever Yang 		delete pComm;
880c30d921cSKever Yang 	if (loaderCodeBuffer)
881c30d921cSKever Yang 		delete []loaderCodeBuffer;
882c30d921cSKever Yang 	if (loaderDataBuffer)
883c30d921cSKever Yang 		delete []loaderDataBuffer;
884c30d921cSKever Yang 	if (pIDBData)
885c30d921cSKever Yang 		delete []pIDBData;
886c30d921cSKever Yang 	return bSuccess;
887c30d921cSKever Yang }
888c30d921cSKever Yang 
88976af099aSliuyi bool erase_flash(STRUCT_RKDEVICE_DESC &dev)
89076af099aSliuyi {
89176af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
89276af099aSliuyi 		return false;
89376af099aSliuyi 	CRKImage *pImage = NULL;
89476af099aSliuyi 	bool bRet, bSuccess = false;
89576af099aSliuyi 	int iRet;
89676af099aSliuyi 	CRKScan *pScan = NULL;
89776af099aSliuyi 	pScan = new CRKScan();
89876af099aSliuyi 	pScan->SetVidPid();
89976af099aSliuyi 
90076af099aSliuyi 	CRKComm *pComm = NULL;
90176af099aSliuyi 	CRKDevice *pDevice = NULL;
90276af099aSliuyi 
90376af099aSliuyi 	pComm = new CRKUsbComm(dev, g_pLogObject, bRet);
90476af099aSliuyi 	if (!bRet) {
90576af099aSliuyi 		if (pScan)
90676af099aSliuyi 			delete pScan;
90776af099aSliuyi 		ERROR_COLOR_ATTR;
90876af099aSliuyi 		printf("Creating Comm Object failed!");
90976af099aSliuyi 		NORMAL_COLOR_ATTR;
91076af099aSliuyi 		printf("\r\n");
91176af099aSliuyi 		return bSuccess;
91276af099aSliuyi 	}
91376af099aSliuyi 
91476af099aSliuyi 	pDevice = new CRKDevice(dev);
91576af099aSliuyi 	if (!pDevice) {
91676af099aSliuyi 		if (pComm)
91776af099aSliuyi 			delete pComm;
91876af099aSliuyi 		if (pScan)
91976af099aSliuyi 			delete pScan;
92076af099aSliuyi 		ERROR_COLOR_ATTR;
92176af099aSliuyi 		printf("Creating device object failed!");
92276af099aSliuyi 		NORMAL_COLOR_ATTR;
92376af099aSliuyi 		printf("\r\n");
92476af099aSliuyi 		return bSuccess;
92576af099aSliuyi 	}
92676af099aSliuyi 
92776af099aSliuyi 	pDevice->SetObject(pImage, pComm, g_pLogObject);
92876af099aSliuyi 	pDevice->CallBackPointer = ProgressInfoProc;
92976af099aSliuyi 
93076af099aSliuyi 	printf("Start to erase flash...\r\n");
93176af099aSliuyi 	iRet = pDevice->EraseAllBlocks();
93276af099aSliuyi 	if (pDevice)
93376af099aSliuyi 		delete pDevice;
93476af099aSliuyi 
93576af099aSliuyi 	if (iRet == 0) {
93676af099aSliuyi 		if (pScan) {
93776af099aSliuyi 			pScan->SetVidPid();
93876af099aSliuyi 			pScan->Wait(dev, RKUSB_MASKROM, dev.usVid, dev.usPid);
93976af099aSliuyi 			delete pScan;
94076af099aSliuyi 		}
94176af099aSliuyi 		CURSOR_MOVEUP_LINE(1);
94276af099aSliuyi 		CURSOR_DEL_LINE;
94376af099aSliuyi 		bSuccess = true;
94476af099aSliuyi 		printf("Erase flash ok.\r\n");
94576af099aSliuyi 	}
94676af099aSliuyi 
94776af099aSliuyi 	return bSuccess;
94876af099aSliuyi }
94976af099aSliuyi 
95076af099aSliuyi bool test_device(STRUCT_RKDEVICE_DESC &dev)
95176af099aSliuyi {
95276af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
95376af099aSliuyi 		return false;
95476af099aSliuyi 	CRKUsbComm *pComm = NULL;
95576af099aSliuyi 	bool bRet, bSuccess = false;
95676af099aSliuyi 	int iRet;
95776af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
95876af099aSliuyi 	if (bRet) {
95976af099aSliuyi 		iRet = pComm->RKU_TestDeviceReady();
96076af099aSliuyi 		if (iRet != ERR_SUCCESS) {
96176af099aSliuyi 			if (g_pLogObject)
96276af099aSliuyi 				g_pLogObject->Record("Error:RKU_TestDeviceReady failed,err=%d", iRet);
96376af099aSliuyi 			printf("Test Device Fail!\r\n");
96476af099aSliuyi 		} else {
96576af099aSliuyi 			bSuccess = true;
96676af099aSliuyi 			printf("Test Device OK.\r\n");
96776af099aSliuyi 		}
96876af099aSliuyi 	} else {
96976af099aSliuyi 		printf("Test Device quit,Creating comm object failed!\r\n");
97076af099aSliuyi 	}
97176af099aSliuyi 	if (pComm) {
97276af099aSliuyi 		delete pComm;
97376af099aSliuyi 		pComm = NULL;
97476af099aSliuyi 	}
97576af099aSliuyi 	return bSuccess;
97676af099aSliuyi }
97776af099aSliuyi bool reset_device(STRUCT_RKDEVICE_DESC &dev, BYTE subCode = RST_NONE_SUBCODE)
97876af099aSliuyi {
97976af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
98076af099aSliuyi 		return false;
98176af099aSliuyi 	CRKUsbComm *pComm = NULL;
98276af099aSliuyi 	bool bRet, bSuccess = false;
98376af099aSliuyi 	int iRet;
98476af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
98576af099aSliuyi 	if (bRet) {
98676af099aSliuyi 		iRet = pComm->RKU_ResetDevice(subCode);
98776af099aSliuyi 		if (iRet != ERR_SUCCESS) {
98876af099aSliuyi 			if (g_pLogObject)
98976af099aSliuyi 				g_pLogObject->Record("Error:RKU_ResetDevice failed,err=%d", iRet);
99076af099aSliuyi 			printf("Reset Device Fail!\r\n");
99176af099aSliuyi 		} else {
99276af099aSliuyi 			bSuccess = true;
99376af099aSliuyi 			printf("Reset Device OK.\r\n");
99476af099aSliuyi 		}
99576af099aSliuyi 	} else {
99676af099aSliuyi 		printf("Reset Device quit,Creating comm object failed!\r\n");
99776af099aSliuyi 	}
99876af099aSliuyi 	if (pComm) {
99976af099aSliuyi 		delete pComm;
100076af099aSliuyi 		pComm = NULL;
100176af099aSliuyi 	}
100276af099aSliuyi 	return bSuccess;
100376af099aSliuyi }
100476af099aSliuyi 
100576af099aSliuyi bool read_flash_id(STRUCT_RKDEVICE_DESC &dev)
100676af099aSliuyi {
100776af099aSliuyi 	CRKUsbComm *pComm = NULL;
100876af099aSliuyi 	bool bRet, bSuccess = false;
100976af099aSliuyi 	int iRet;
101076af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
101176af099aSliuyi 		return bSuccess;
101276af099aSliuyi 
101376af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
101476af099aSliuyi 	if (bRet) {
101576af099aSliuyi 		BYTE flashID[5];
101676af099aSliuyi 		iRet = pComm->RKU_ReadFlashID(flashID);
101776af099aSliuyi 		if (iRet != ERR_SUCCESS) {
101876af099aSliuyi 			if (g_pLogObject)
101976af099aSliuyi 				g_pLogObject->Record("Error:RKU_ReadFlashID failed,err=%d", iRet);
102076af099aSliuyi 			printf("Read flash ID Fail!\r\n");
102176af099aSliuyi 		} else {
102276af099aSliuyi 			printf("Flash ID:%02X %02X %02X %02X %02X \r\n", flashID[0], flashID[1], flashID[2], flashID[3], flashID[4]);
102376af099aSliuyi 			bSuccess = true;
102476af099aSliuyi 		}
102576af099aSliuyi 	} else {
102676af099aSliuyi 		printf("Read flash ID quit,Creating comm object failed!\r\n");
102776af099aSliuyi 	}
102876af099aSliuyi 	if (pComm) {
102976af099aSliuyi 		delete pComm;
103076af099aSliuyi 		pComm = NULL;
103176af099aSliuyi 	}
103276af099aSliuyi 	return bSuccess;
103376af099aSliuyi }
103476af099aSliuyi bool read_flash_info(STRUCT_RKDEVICE_DESC &dev)
103576af099aSliuyi {
103676af099aSliuyi 	CRKUsbComm *pComm = NULL;
103776af099aSliuyi 	bool bRet, bSuccess = false;
103876af099aSliuyi 	int iRet;
103976af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
104076af099aSliuyi 		return bSuccess;
104176af099aSliuyi 
104276af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
104376af099aSliuyi 	if (bRet) {
104476af099aSliuyi 		STRUCT_FLASHINFO_CMD info;
104576af099aSliuyi 		UINT uiRead;
104676af099aSliuyi 		iRet = pComm->RKU_ReadFlashInfo((BYTE *)&info, &uiRead);
104776af099aSliuyi 		if (iRet != ERR_SUCCESS) {
104876af099aSliuyi 			if (g_pLogObject)
104976af099aSliuyi 				g_pLogObject->Record("Error:RKU_ReadFlashInfo failed,err=%d", iRet);
105076af099aSliuyi 			printf("Read flash Info Fail!\r\n");
105176af099aSliuyi 		} else {
105276af099aSliuyi 			printf("Flash Info:\r\n");
105376af099aSliuyi 			if (info.bManufCode <= 7) {
105476af099aSliuyi 				printf("\tManufacturer: %s,value=%02X\r\n", szManufName[info.bManufCode], info.bManufCode);
105576af099aSliuyi 			}
105676af099aSliuyi 			else
105776af099aSliuyi 				printf("\tManufacturer: %s,value=%02X\r\n", "Unknown", info.bManufCode);
105876af099aSliuyi 
105976af099aSliuyi 			printf("\tFlash Size: %dMB\r\n", info.uiFlashSize / 2 / 1024);
106076af099aSliuyi 			printf("\tBlock Size: %dKB\r\n", info.usBlockSize / 2);
106176af099aSliuyi 			printf("\tPage Size: %dKB\r\n", info.bPageSize / 2);
106276af099aSliuyi 			printf("\tECC Bits: %d\r\n", info.bECCBits);
106376af099aSliuyi 			printf("\tAccess Time: %d\r\n", info.bAccessTime);
106476af099aSliuyi 			printf("\tFlash CS: ");
106576af099aSliuyi 			for(int i = 0; i < 8; i++) {
106676af099aSliuyi 				if( info.bFlashCS & (1 << i) )
106776af099aSliuyi 					printf("Flash<%d> ", i);
106876af099aSliuyi 			}
106976af099aSliuyi 			printf("\r\n");
107076af099aSliuyi 			bSuccess = true;
107176af099aSliuyi 		}
107276af099aSliuyi 	}else {
107376af099aSliuyi 		printf("Read flash Info quit,Creating comm object failed!\r\n");
107476af099aSliuyi 	}
107576af099aSliuyi 	if (pComm) {
107676af099aSliuyi 		delete pComm;
107776af099aSliuyi 		pComm = NULL;
107876af099aSliuyi 	}
107976af099aSliuyi 	return bSuccess;
108076af099aSliuyi }
108176af099aSliuyi bool read_chip_info(STRUCT_RKDEVICE_DESC &dev)
108276af099aSliuyi {
108376af099aSliuyi 	CRKUsbComm *pComm = NULL;
108476af099aSliuyi 	bool bRet, bSuccess = false;
108576af099aSliuyi 	int iRet;
108676af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
108776af099aSliuyi 		return bSuccess;
108876af099aSliuyi 
108976af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
109076af099aSliuyi 	if (bRet) {
109176af099aSliuyi 		BYTE chipInfo[16];
109276af099aSliuyi 		iRet = pComm->RKU_ReadChipInfo(chipInfo);
109376af099aSliuyi 		if (iRet != ERR_SUCCESS) {
109476af099aSliuyi 			if (g_pLogObject)
109576af099aSliuyi 				g_pLogObject->Record("Error:RKU_ReadChipInfo failed,err=%d", iRet);
109676af099aSliuyi 			printf("Read Chip Info Fail!\r\n");
109776af099aSliuyi 		} else {
109876af099aSliuyi 			string strChipInfo;
109976af099aSliuyi 			g_pLogObject->PrintBuffer(strChipInfo, chipInfo, 16, 16);
110076af099aSliuyi 			printf("Chip Info:%s\r\n", strChipInfo.c_str());
110176af099aSliuyi 			bSuccess = true;
110276af099aSliuyi 		}
110376af099aSliuyi 	} else {
110476af099aSliuyi 		printf("Read Chip Info quit,Creating comm object failed!\r\n");
110576af099aSliuyi 	}
110676af099aSliuyi 	if (pComm) {
110776af099aSliuyi 		delete pComm;
110876af099aSliuyi 		pComm = NULL;
110976af099aSliuyi 	}
111076af099aSliuyi 	return bSuccess;
111176af099aSliuyi }
111276af099aSliuyi bool read_lba(STRUCT_RKDEVICE_DESC &dev, UINT uiBegin, UINT uiLen, char *szFile)
111376af099aSliuyi {
111476af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
111576af099aSliuyi 		return false;
111676af099aSliuyi 	CRKUsbComm *pComm = NULL;
111776af099aSliuyi 	FILE *file = NULL;
111876af099aSliuyi 	bool bRet, bFirst = true, bSuccess = false;
111976af099aSliuyi 	int iRet;
112076af099aSliuyi 	UINT iTotalRead = 0,iRead = 0;
112176af099aSliuyi 	int nSectorSize = 512;
112276af099aSliuyi 	BYTE pBuf[nSectorSize * DEFAULT_RW_LBA];
112376af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
112476af099aSliuyi 	if (bRet) {
112576af099aSliuyi 		if(szFile) {
112676af099aSliuyi 			file = fopen(szFile, "wb+");
112776af099aSliuyi 			if( !file ) {
112876af099aSliuyi 				printf("Read LBA failed,err=%d,can't open file: %s\r\n", errno, szFile);
112976af099aSliuyi 				goto Exit_ReadLBA;
113076af099aSliuyi 			}
113176af099aSliuyi 		}
113276af099aSliuyi 
113376af099aSliuyi 		while(uiLen > 0) {
113476af099aSliuyi 			memset(pBuf, 0, nSectorSize * DEFAULT_RW_LBA);
113576af099aSliuyi 			iRead = (uiLen >= DEFAULT_RW_LBA) ? DEFAULT_RW_LBA : uiLen;
113676af099aSliuyi 			iRet = pComm->RKU_ReadLBA( uiBegin + iTotalRead, iRead, pBuf);
113776af099aSliuyi 			if(ERR_SUCCESS == iRet) {
113876af099aSliuyi 				uiLen -= iRead;
113976af099aSliuyi 				iTotalRead += iRead;
114076af099aSliuyi 
114176af099aSliuyi 				if(szFile) {
114276af099aSliuyi 					fwrite(pBuf, 1, iRead * nSectorSize, file);
114376af099aSliuyi 					if (bFirst){
114476af099aSliuyi 						if (iTotalRead >= 1024)
114576af099aSliuyi 							printf("Read LBA from file (%d%%)\r\n", (iTotalRead / 1024) * 100 / ((uiLen + iTotalRead) / 1024));
114676af099aSliuyi 						else
114776af099aSliuyi 							printf("Read LBA from file %d%%)\r\n", iTotalRead * 100 / (uiLen + iTotalRead));
114876af099aSliuyi 						bFirst = false;
114976af099aSliuyi 					} else {
115076af099aSliuyi 						CURSOR_MOVEUP_LINE(1);
115176af099aSliuyi 						CURSOR_DEL_LINE;
115276af099aSliuyi 						if (iTotalRead >= 1024)
115376af099aSliuyi 							printf("Read LBA from file (%d%%)\r\n", (iTotalRead / 1024) * 100 / ((uiLen + iTotalRead) / 1024));
115476af099aSliuyi 						else
115576af099aSliuyi 							printf("Read LBA from file %d%%)\r\n", iTotalRead * 100 / (uiLen + iTotalRead));
115676af099aSliuyi 					}
115776af099aSliuyi 				}
115876af099aSliuyi 				else
115976af099aSliuyi 					PrintData(pBuf, nSectorSize * iRead);
116076af099aSliuyi 			} else {
116176af099aSliuyi 				if (g_pLogObject)
116276af099aSliuyi 					g_pLogObject->Record("Error:RKU_ReadLBA failed,err=%d", iRet);
116376af099aSliuyi 
116476af099aSliuyi 				printf("Read LBA failed!\r\n");
116576af099aSliuyi 				goto Exit_ReadLBA;
116676af099aSliuyi 			}
116776af099aSliuyi 		}
116876af099aSliuyi 		bSuccess = true;
116976af099aSliuyi 	} else {
117076af099aSliuyi 		printf("Read LBA quit,Creating comm object failed!\r\n");
117176af099aSliuyi 	}
117276af099aSliuyi Exit_ReadLBA:
117376af099aSliuyi 	if (pComm) {
117476af099aSliuyi 		delete pComm;
117576af099aSliuyi 		pComm = NULL;
117676af099aSliuyi 	}
117776af099aSliuyi 	if (file)
117876af099aSliuyi 		fclose(file);
117976af099aSliuyi 	return bSuccess;
118076af099aSliuyi }
118176af099aSliuyi bool write_lba(STRUCT_RKDEVICE_DESC &dev, UINT uiBegin, char *szFile)
118276af099aSliuyi {
118376af099aSliuyi 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
118476af099aSliuyi 		return false;
118576af099aSliuyi 	CRKUsbComm *pComm = NULL;
118676af099aSliuyi 	FILE *file = NULL;
118776af099aSliuyi 	bool bRet, bFirst = true, bSuccess = false;
118876af099aSliuyi 	int iRet;
118976af099aSliuyi 	long long iTotalWrite = 0, iFileSize = 0;
119076af099aSliuyi 	UINT iWrite = 0, iRead = 0;
119176af099aSliuyi 	UINT uiLen;
119276af099aSliuyi 	int nSectorSize = 512;
119376af099aSliuyi 	BYTE pBuf[nSectorSize * DEFAULT_RW_LBA];
119476af099aSliuyi 
119576af099aSliuyi 	pComm =  new CRKUsbComm(dev, g_pLogObject, bRet);
119676af099aSliuyi 	if (bRet) {
119776af099aSliuyi 		file = fopen(szFile, "rb");
119876af099aSliuyi 		if( !file ) {
119976af099aSliuyi 			printf("Write LBA failed,err=%d,can't open file: %s\r\n", errno, szFile);
120076af099aSliuyi 			goto Exit_WriteLBA;
120176af099aSliuyi 		}
120276af099aSliuyi 
120376af099aSliuyi 		iRet = fseeko(file, 0, SEEK_END);
120476af099aSliuyi 		iFileSize = ftello(file);
120576af099aSliuyi 		fseeko(file, 0, SEEK_SET);
120676af099aSliuyi 		while(iTotalWrite < iFileSize) {
120776af099aSliuyi 			memset(pBuf, 0, nSectorSize * DEFAULT_RW_LBA);
120876af099aSliuyi 			iWrite = iRead= fread(pBuf, 1, nSectorSize * DEFAULT_RW_LBA, file);
120976af099aSliuyi 			uiLen = ((iWrite % 512) == 0) ? (iWrite / 512) : (iWrite / 512 + 1);
121076af099aSliuyi 			iRet = pComm->RKU_WriteLBA( uiBegin, uiLen, pBuf);
121176af099aSliuyi 			if(ERR_SUCCESS == iRet) {
121276af099aSliuyi 				uiBegin += uiLen;
121376af099aSliuyi 				iTotalWrite += iWrite;
121476af099aSliuyi 				if (bFirst) {
121576af099aSliuyi 					if (iTotalWrite >= 1024)
121676af099aSliuyi 						printf("Write LBA from file (%lld%%)\r\n", (iTotalWrite / 1024) * 100 / (iFileSize / 1024));
121776af099aSliuyi 					else
121876af099aSliuyi 						printf("Write LBA from file %lld%%)\r\n", iTotalWrite * 100 / iFileSize);
121976af099aSliuyi 					bFirst = false;
122076af099aSliuyi 				} else {
122176af099aSliuyi 					CURSOR_MOVEUP_LINE(1);
122276af099aSliuyi 					CURSOR_DEL_LINE;
122376af099aSliuyi 					printf("Write LBA from file (%lld%%)\r\n", (iTotalWrite / 1024) * 100 / (iFileSize / 1024));
122476af099aSliuyi 				}
122576af099aSliuyi 			} else {
122676af099aSliuyi 				if (g_pLogObject)
122776af099aSliuyi 					g_pLogObject->Record("Error:RKU_WriteLBA failed,err=%d", iRet);
122876af099aSliuyi 
122976af099aSliuyi 				printf("Write LBA failed!\r\n");
123076af099aSliuyi 				goto Exit_WriteLBA;
123176af099aSliuyi 			}
123276af099aSliuyi 		}
123376af099aSliuyi 		bSuccess = true;
123476af099aSliuyi 	} else {
123576af099aSliuyi 		printf("Write LBA quit,Creating comm object failed!\r\n");
123676af099aSliuyi 	}
123776af099aSliuyi Exit_WriteLBA:
123876af099aSliuyi 	if (pComm) {
123976af099aSliuyi 		delete pComm;
124076af099aSliuyi 		pComm = NULL;
124176af099aSliuyi 	}
124276af099aSliuyi 	if (file)
124376af099aSliuyi 		fclose(file);
124476af099aSliuyi 	return bSuccess;
124576af099aSliuyi }
124676af099aSliuyi 
124776af099aSliuyi void split_item(STRING_VECTOR &vecItems, char *pszItems)
124876af099aSliuyi {
124976af099aSliuyi 	string strItem;
125076af099aSliuyi 	char szItem[100];
125176af099aSliuyi 	char *pos = NULL, *pStart;
125276af099aSliuyi 	pStart = pszItems;
125376af099aSliuyi 	pos = strchr(pStart, ',');
125476af099aSliuyi 	while(pos != NULL) {
125576af099aSliuyi 		memset(szItem, 0, 100);
125676af099aSliuyi 		strncpy(szItem, pStart, pos - pStart);
125776af099aSliuyi 		strItem = szItem;
125876af099aSliuyi 		vecItems.push_back(strItem);
125976af099aSliuyi 		pStart = pos + 1;
126076af099aSliuyi 		if (*pStart == 0)
126176af099aSliuyi 			break;
126276af099aSliuyi 		pos = strchr(pStart, ',');
126376af099aSliuyi 	}
126476af099aSliuyi 	if (strlen(pStart) > 0) {
126576af099aSliuyi 		memset(szItem, 0, 100);
126676af099aSliuyi 		strncpy(szItem, pStart, strlen(pStart));
126776af099aSliuyi 		strItem = szItem;
126876af099aSliuyi 		vecItems.push_back(strItem);
126976af099aSliuyi 	}
127076af099aSliuyi }
1271c30d921cSKever Yang 
127276af099aSliuyi bool handle_command(int argc, char* argv[], CRKScan *pScan)
127376af099aSliuyi {
127476af099aSliuyi 	string strCmd;
127576af099aSliuyi 	strCmd = argv[1];
127676af099aSliuyi 	ssize_t cnt;
127776af099aSliuyi 	bool bRet,bSuccess = false;
1278*8df2d64aSEddie Cai 	char *s;
1279*8df2d64aSEddie Cai 	int i, ret;
128076af099aSliuyi 	STRUCT_RKDEVICE_DESC dev;
128176af099aSliuyi 
128276af099aSliuyi 	transform(strCmd.begin(), strCmd.end(), strCmd.begin(), (int(*)(int))toupper);
1283*8df2d64aSEddie Cai 	s = (char*)strCmd.c_str();
1284*8df2d64aSEddie Cai 	for(i = 0; i < (int)strlen(s); i++)
1285*8df2d64aSEddie Cai 	        s[i] = toupper(s[i]);
1286*8df2d64aSEddie Cai 	printf("handle_command: %s\n", strCmd.c_str());
1287*8df2d64aSEddie Cai 	if((strcmp(strCmd.c_str(), "-H") == 0) || (strcmp(strCmd.c_str(), "--HELP")) == 0){
128876af099aSliuyi 		usage();
128976af099aSliuyi 		return true;
1290*8df2d64aSEddie Cai 	} else if((strcmp(strCmd.c_str(), "-V") == 0) || (strcmp(strCmd.c_str(), "--VERSION") == 0)) {
1291c30d921cSKever Yang 		printf("rkdeveloptool ver %s\r\n", PACKAGE_VERSION);
129276af099aSliuyi 		return true;
129376af099aSliuyi 	}
129476af099aSliuyi 	cnt = pScan->Search(RKUSB_MASKROM | RKUSB_LOADER);
129576af099aSliuyi 	if (cnt < 1) {
129676af099aSliuyi 		ERROR_COLOR_ATTR;
129776af099aSliuyi 		printf("No found any rockusb device,please plug device in!");
129876af099aSliuyi 		NORMAL_COLOR_ATTR;
129976af099aSliuyi 		printf("\r\n");
130076af099aSliuyi 		return bSuccess;
130176af099aSliuyi 	} else if (cnt > 1) {
130276af099aSliuyi 		ERROR_COLOR_ATTR;
130376af099aSliuyi 		printf("Found many rockusb devices,please plug device out!");
130476af099aSliuyi 		NORMAL_COLOR_ATTR;
130576af099aSliuyi 		printf("\r\n");
130676af099aSliuyi 		return bSuccess;
130776af099aSliuyi 	}
130876af099aSliuyi 
130976af099aSliuyi 	bRet = pScan->GetDevice(dev, 0);
131076af099aSliuyi 	if (!bRet) {
131176af099aSliuyi 		ERROR_COLOR_ATTR;
131276af099aSliuyi 		printf("Getting information of rockusb device failed!");
131376af099aSliuyi 		NORMAL_COLOR_ATTR;
131476af099aSliuyi 		printf("\r\n");
131576af099aSliuyi 		return bSuccess;
131676af099aSliuyi 	}
131776af099aSliuyi 
131876af099aSliuyi 	if(strcmp(strCmd.c_str(), "RD") == 0) {
131976af099aSliuyi 		if ((argc != 2) && (argc != 3))
132076af099aSliuyi 			printf("Parameter of [RD] command is invalid,please check help!\r\n");
132176af099aSliuyi 		else {
132276af099aSliuyi 			if (argc == 2)
132376af099aSliuyi 				bSuccess = reset_device(dev);
132476af099aSliuyi 			else {
132576af099aSliuyi 				UINT uiSubCode;
132676af099aSliuyi 				char *pszEnd;
132776af099aSliuyi 				uiSubCode = strtoul(argv[2], &pszEnd, 0);
132876af099aSliuyi 				if (*pszEnd)
132976af099aSliuyi 					printf("Subcode is invalid,please check!\r\n");
133076af099aSliuyi 				else {
133176af099aSliuyi 					if (uiSubCode <= 5)
133276af099aSliuyi 						bSuccess = reset_device(dev, uiSubCode);
133376af099aSliuyi 					else
133476af099aSliuyi 						printf("Subcode is invalid,please check!\r\n");
133576af099aSliuyi 				}
133676af099aSliuyi 			}
133776af099aSliuyi 		}
133876af099aSliuyi 	} else if(strcmp(strCmd.c_str(), "TD") == 0) {
133976af099aSliuyi 		bSuccess = test_device(dev);
134076af099aSliuyi 	} else if (strcmp(strCmd.c_str(), "RID") == 0) {//Read Flash ID
134176af099aSliuyi 		bSuccess = read_flash_id(dev);
134276af099aSliuyi 	} else if (strcmp(strCmd.c_str(), "RFI") == 0){//Read Flash Info
134376af099aSliuyi 		bSuccess = read_flash_info(dev);
134476af099aSliuyi 	} else if (strcmp(strCmd.c_str(), "RCI") == 0) {//Read Chip Info
134576af099aSliuyi 		bSuccess = read_chip_info(dev);
134676af099aSliuyi 	} else if(strcmp(strCmd.c_str(), "DB") == 0) {
134776af099aSliuyi 		if (argc > 2) {
134876af099aSliuyi 			string strLoader;
134976af099aSliuyi 			strLoader = argv[2];
135076af099aSliuyi 			bSuccess = download_boot(dev, (char *)strLoader.c_str());
135176af099aSliuyi 		} else if (argc == 2) {
135276af099aSliuyi 			ret = find_config_item("loader");
135376af099aSliuyi 			if (ret == -1)
135476af099aSliuyi 				printf("No found loader item from config!\r\n");
135576af099aSliuyi 			else
135676af099aSliuyi 				bSuccess = download_boot(dev, g_ConfigItemVec[ret].szItemValue);
135776af099aSliuyi 		} else
135876af099aSliuyi 			printf("Parameter of [DB] command is invalid,please check help!\r\n");
1359c30d921cSKever Yang 	} else if(strcmp(strCmd.c_str(), "GPT") == 0) {
1360c30d921cSKever Yang 		if (argc > 2) {
1361c30d921cSKever Yang 			string strParameter;
1362c30d921cSKever Yang 			strParameter = argv[2];
1363c30d921cSKever Yang 			bSuccess = write_gpt(dev, (char *)strParameter.c_str());
1364c30d921cSKever Yang 		} else
1365c30d921cSKever Yang 			printf("Parameter of [GPT] command is invalid,please check help!\r\n");
1366c30d921cSKever Yang 	} else if(strcmp(strCmd.c_str(), "UL") == 0) {
1367c30d921cSKever Yang 		if (argc > 2) {
1368c30d921cSKever Yang 			string strLoader;
1369c30d921cSKever Yang 			strLoader = argv[2];
1370c30d921cSKever Yang 			bSuccess = upgrade_loader(dev, (char *)strLoader.c_str());
1371c30d921cSKever Yang 		} else
1372c30d921cSKever Yang 			printf("Parameter of [UL] command is invalid,please check help!\r\n");
137376af099aSliuyi 	} else if(strcmp(strCmd.c_str(), "EF") == 0) {
137476af099aSliuyi 		if (argc == 2) {
137576af099aSliuyi 			bSuccess = erase_flash(dev);
137676af099aSliuyi 		} else
137776af099aSliuyi 			printf("Parameter of [EF] command is invalid,please check help!\r\n");
137876af099aSliuyi 	} else if(strcmp(strCmd.c_str(), "WL") == 0) {
137976af099aSliuyi 		if (argc == 4) {
138076af099aSliuyi 			UINT uiBegin;
138176af099aSliuyi 			char *pszEnd;
138276af099aSliuyi 			uiBegin = strtoul(argv[2], &pszEnd, 0);
138376af099aSliuyi 			if (*pszEnd)
138476af099aSliuyi 				printf("Begin is invalid,please check!\r\n");
138576af099aSliuyi 			else
138676af099aSliuyi 				bSuccess = write_lba(dev, uiBegin, argv[3]);
138776af099aSliuyi 		} else
138876af099aSliuyi 			printf("Parameter of [WL] command is invalid,please check help!\r\n");
138976af099aSliuyi 	} else if (strcmp(strCmd.c_str(), "RL") == 0) {//Read LBA
139076af099aSliuyi 		char *pszEnd;
139176af099aSliuyi 		UINT uiBegin, uiLen;
139276af099aSliuyi 		if (argc != 5)
139376af099aSliuyi 			printf("Parameter of [RL] command is invalid,please check help!\r\n");
139476af099aSliuyi 		else {
139576af099aSliuyi 			uiBegin = strtoul(argv[2], &pszEnd, 0);
139676af099aSliuyi 			if (*pszEnd)
139776af099aSliuyi 				printf("Begin is invalid,please check!\r\n");
139876af099aSliuyi 			else {
139976af099aSliuyi 				uiLen = strtoul(argv[3], &pszEnd, 0);
140076af099aSliuyi 				if (*pszEnd)
140176af099aSliuyi 					printf("Len is invalid,please check!\r\n");
140276af099aSliuyi 				else {
140376af099aSliuyi 					bSuccess = read_lba(dev, uiBegin, uiLen, argv[4]);
140476af099aSliuyi 				}
140576af099aSliuyi 			}
140676af099aSliuyi 		}
140776af099aSliuyi 	} else {
1408c30d921cSKever Yang 		printf("command is invalid,please press rkDevelopTool -h to check usage!\r\n");
140976af099aSliuyi 	}
141076af099aSliuyi 	return bSuccess;
141176af099aSliuyi }
141276af099aSliuyi 
141376af099aSliuyi 
141476af099aSliuyi int main(int argc, char* argv[])
141576af099aSliuyi {
141676af099aSliuyi 	CRKScan *pScan = NULL;
141776af099aSliuyi 	int ret;
141876af099aSliuyi 	char szProgramProcPath[100];
141976af099aSliuyi 	char szProgramDir[256];
142076af099aSliuyi 	string strLogDir,strConfigFile;
142176af099aSliuyi 	struct stat statBuf;
142276af099aSliuyi 
142376af099aSliuyi 	g_ConfigItemVec.clear();
142476af099aSliuyi 	sprintf(szProgramProcPath, "/proc/%d/exe", getpid());
142576af099aSliuyi 	if (readlink(szProgramProcPath, szProgramDir, 256) == -1)
142676af099aSliuyi 		strcpy(szProgramDir, ".");
142776af099aSliuyi 	else {
142876af099aSliuyi 		char *pSlash;
142976af099aSliuyi 		pSlash = strrchr(szProgramDir, '/');
143076af099aSliuyi 		if (pSlash)
143176af099aSliuyi 			*pSlash = '\0';
143276af099aSliuyi 	}
143376af099aSliuyi 	strLogDir = szProgramDir;
143476af099aSliuyi 	strLogDir +=  "/log/";
143576af099aSliuyi 	strConfigFile = szProgramDir;
143676af099aSliuyi 	strConfigFile += "/config.ini";
143776af099aSliuyi 	if (opendir(strLogDir.c_str()) == NULL)
143876af099aSliuyi 		mkdir(strLogDir.c_str(), S_IRWXU | S_IRWXG | S_IROTH);
143976af099aSliuyi 	g_pLogObject = new CRKLog(strLogDir.c_str(), "log");
144076af099aSliuyi 
144176af099aSliuyi 	if(stat(strConfigFile.c_str(), &statBuf) < 0) {
144276af099aSliuyi 		if (g_pLogObject) {
144376af099aSliuyi 			g_pLogObject->Record("Error:failed to stat config.ini,err=%d", errno);
144476af099aSliuyi 		}
144576af099aSliuyi 	} else if (S_ISREG(statBuf.st_mode)) {
144676af099aSliuyi 		parse_config_file(strConfigFile.c_str(), g_ConfigItemVec);
144776af099aSliuyi 	}
144876af099aSliuyi 
144976af099aSliuyi 	ret = libusb_init(NULL);
145076af099aSliuyi 	if (ret < 0) {
145176af099aSliuyi 		if (g_pLogObject) {
145276af099aSliuyi 			g_pLogObject->Record("Error:libusb_init failed,err=%d", ret);
145376af099aSliuyi 			delete g_pLogObject;
145476af099aSliuyi 		}
145576af099aSliuyi 		return -1;
145676af099aSliuyi 	}
145776af099aSliuyi 
145876af099aSliuyi 	pScan = new CRKScan();
145976af099aSliuyi 	if (!pScan) {
146076af099aSliuyi 		if (g_pLogObject) {
146176af099aSliuyi 			g_pLogObject->Record("Error:failed to Create object for searching device");
146276af099aSliuyi 			delete g_pLogObject;
146376af099aSliuyi 		}
146476af099aSliuyi 		libusb_exit(NULL);
146576af099aSliuyi 		return -2;
146676af099aSliuyi 	}
146776af099aSliuyi 	pScan->SetVidPid();
146876af099aSliuyi 
146976af099aSliuyi 	if (argc == 1)
147076af099aSliuyi 		usage();
147176af099aSliuyi 	else if (!handle_command(argc, argv, pScan))
147276af099aSliuyi 			return -0xFF;
147376af099aSliuyi 	if (pScan)
147476af099aSliuyi 		delete pScan;
147576af099aSliuyi 	if (g_pLogObject)
147676af099aSliuyi 		delete g_pLogObject;
147776af099aSliuyi 	libusb_exit(NULL);
147876af099aSliuyi 	return 0;
147976af099aSliuyi }
1480