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)§or0Info, usFlashDataSec, usFlashBootSec); 570c30d921cSKever Yang MakeSector1((PBYTE)§or1Info); 571c30d921cSKever Yang if (!MakeSector2((PBYTE)§or2Info)) { 572c30d921cSKever Yang return -6; 573c30d921cSKever Yang } 574c30d921cSKever Yang if (!MakeSector3((PBYTE)§or3Info)) { 575c30d921cSKever Yang return -7; 576c30d921cSKever Yang } 577c30d921cSKever Yang sector2Info.usSec0Crc = CRC_16((PBYTE)§or0Info, SECTOR_SIZE); 578c30d921cSKever Yang sector2Info.usSec1Crc = CRC_16((PBYTE)§or1Info, SECTOR_SIZE); 579c30d921cSKever Yang sector2Info.usSec3Crc = CRC_16((PBYTE)§or3Info, SECTOR_SIZE); 580c30d921cSKever Yang 581c30d921cSKever Yang memcpy(lpIDBlock, §or0Info, SECTOR_SIZE); 582c30d921cSKever Yang memcpy(lpIDBlock + SECTOR_SIZE, §or1Info, SECTOR_SIZE); 583c30d921cSKever Yang memcpy(lpIDBlock + SECTOR_SIZE * 3, §or3Info, 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, §or2Info, 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