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