diff --git a/SerialFlash.c b/SerialFlash.c index 62ceac6..a292ca4 100755 --- a/SerialFlash.c +++ b/SerialFlash.c @@ -11,11 +11,11 @@ extern int m_bProtectAfterWritenErase; extern int m_boEnReadQuadIO; extern int m_boEnWriteQuadIO; extern CHIP_INFO Chip_Info; -extern volatile bool g_bIsSF600; +extern volatile bool g_bIsSF600[16]; extern void Sleep(unsigned int ms); extern bool Is_NewUSBCommand(int Index); -unsigned short g_micron_usNVCR=0xFFFF; +unsigned char g_micron_usVCR=0xFFFF; unsigned char mcode_WRSR=0x01; unsigned char mcode_WRDI=0x04; @@ -1336,47 +1336,40 @@ bool CN25Qxxx_LargeRDFSR(unsigned char *cSR, int Index) *cSR = vBuffer; return SerialFlash_TRUE; } -bool CN25Qxxx_Large_doWRNVCR(unsigned short sNVCR,int Index) +bool CN25Qxxx_Large_doWRVCR(unsigned char sVCR,int Index) { - unsigned char vInstruction[3]; //size 1 + unsigned char vInstruction[2]; //size 1 SerialFlash_waitForWIP(Index); SerialFlash_waitForWEL(Index); - vInstruction[0]=0xB1; - vInstruction[1]=sNVCR&0xFF; - vInstruction[2]=(sNVCR>>8)&0xFF; + vInstruction[0]=0x81; + vInstruction[1]=sVCR&0xFF; - FlashCommand_TransceiveOut(&vInstruction,3,false,Index); + FlashCommand_TransceiveOut(&vInstruction,2,false,Index); SerialFlash_waitForWIP(Index); - unsigned short sRDNVCR=0xFFFF; + unsigned char sRDVCR=0xFF; int numOfRetry = 5 ; unsigned char re; - do{ - SerialFlash_waitForWEL(Index); - CN25Qxxx_Large_doRDNVCR(&sRDNVCR,Index); + //do{ + CN25Qxxx_Large_doRDVCR(&sRDVCR,Index); Sleep(100); - }while(sRDNVCR !=sNVCR && numOfRetry-- > 0); + // }while(sRDVCR !=sVCR && numOfRetry-- > 0); - if(numOfRetry<=0) - return false; - - TurnOFFVcc(Index); - Sleep(100); - TurnONVcc(Index); - Sleep(100); + //if(numOfRetry<=0) + // return false; return true; } -bool CN25Qxxx_Large_doRDNVCR(unsigned short *sNVCR,int Index) +bool CN25Qxxx_Large_doRDVCR(unsigned char *sVCR,int Index) { CNTRPIPE_RQ rq ; unsigned char vInstruction; //size 1 - vInstruction=0xB5; + vInstruction=0x85; rq.Function = URB_FUNCTION_VENDOR_ENDPOINT ; rq.Direction = VENDOR_DIRECTION_OUT ; @@ -1397,7 +1390,7 @@ bool CN25Qxxx_Large_doRDNVCR(unsigned short *sNVCR,int Index) return SerialFlash_FALSE ; // second control packet : fetch data - unsigned short vBuffer; + unsigned char vBuffer; rq.Function = URB_FUNCTION_VENDOR_ENDPOINT ; rq.Direction = VENDOR_DIRECTION_IN ; rq.Request = TRANSCEIVE ; @@ -1411,13 +1404,13 @@ bool CN25Qxxx_Large_doRDNVCR(unsigned short *sNVCR,int Index) rq.Value = CTRL_TIMEOUT ; rq.Index = NO_REGISTER ; } - rq.Length = 2; + rq.Length = 1; - if(InCtrlRequest(&rq, &vBuffer, 2, Index) == SerialFlash_FALSE) + if(InCtrlRequest(&rq, &vBuffer, 1, Index) == SerialFlash_FALSE) return SerialFlash_FALSE ; ///printf("evy &vBuffer=%x",&vBuffer); ///printf("evy vBuffer=%x",vBuffer); - *sNVCR = vBuffer; + *sVCR = vBuffer; return SerialFlash_TRUE; } @@ -1491,9 +1484,9 @@ bool CN25Qxxx_LargeEnable4ByteAddrMode(bool Enable4Byte,int Index) if(Enable4Byte) { WORD cSR; - RDNVCR(cSR, Index); + RDVCR(cSR, Index); cSR &= 0xFFFE; - WRNVCR(cSR, Index); + WRVCR(cSR, Index); } return true; #else @@ -2085,7 +2078,7 @@ int SerialFlash_bulkPipeRead(struct CAddressRange *AddrRange, unsigned char *vDa if(!SerialFlash_StartofOperation(Index)) return false; if(!(strstr(Chip_Info.Class,SUPPORT_NUMONYX_N25Qxxx_Large_2Die) != NULL && - strstr(Chip_Info.Class,SUPPORT_NUMONYX_N25Qxxx_Large_4Die) != NULL)) + strstr(Chip_Info.Class,SUPPORT_NUMONYX_N25Qxxx_Large_4Die) != NULL && g_bIsSF600==true)) SerialFlash_Enable4ByteAddrMode(true, Index); if(SerialFlash_EnableQuadIO(true, m_boEnReadQuadIO,Index)== SerialFlash_FALSE) @@ -2110,9 +2103,9 @@ int SerialFlash_bulkPipeRead(struct CAddressRange *AddrRange, unsigned char *vDa for(j=0; jstart*0x1000000)>>24; - if(strstr(Chip_Info.Class,SUPPORT_NUMONYX_N25Qxxx_Large_2Die) != NULL || - strstr(Chip_Info.Class,SUPPORT_NUMONYX_N25Qxxx_Large_4Die) != NULL) - { + if(g_bIsSF600[Index]==false &&(strstr(Chip_Info.Class,SUPPORT_NUMONYX_N25Qxxx_Large_2Die) != NULL || + strstr(Chip_Info.Class,SUPPORT_NUMONYX_N25Qxxx_Large_4Die) != NULL)) + { unsigned char re=0; int numOfRetry = 5 ; do{ @@ -2231,18 +2224,11 @@ bool SerialFlash_StartofOperation(int Index) strstr(Chip_Info.Class,SUPPORT_NUMONYX_N25Qxxx_Large_4Die) != NULL || strstr(Chip_Info.Class,SUPPORT_NUMONYX_N25Qxxx_Large) != NULL) { - g_micron_usNVCR=0xFFFF; - if(CN25Qxxx_Large_doRDNVCR(&g_micron_usNVCR,Index)) - { - if(g_micron_usNVCR!=0xFFFF) - { - if(CN25Qxxx_Large_doWRNVCR(0xFFFF,Index)==false) - return false; - } - return true; - } - return false; - + g_micron_usVCR=0xFF; + if(CN25Qxxx_Large_doWRVCR(g_micron_usVCR,Index)==false) + return false; + else + return true; } return true; } @@ -2254,15 +2240,7 @@ bool SerialFlash_EndofOperation(int Index) strstr(Chip_Info.Class,SUPPORT_NUMONYX_N25Qxxx_Large_4Die) != NULL || strstr(Chip_Info.Class,SUPPORT_NUMONYX_N25Qxxx_Large) != NULL) { - unsigned short sNVCR=0xFFFF; - if(g_micron_usNVCR!=0xFFFF) - { - if(CN25Qxxx_Large_doWRNVCR(g_micron_usNVCR,Index)==false) - return false; - CN25Qxxx_Large_doRDNVCR(&sNVCR,Index); - if(sNVCR!=g_micron_usNVCR) - return; - } + return true; } return true; diff --git a/SerialFlash.h b/SerialFlash.h index 4681a52..290392e 100755 --- a/SerialFlash.h +++ b/SerialFlash.h @@ -94,8 +94,8 @@ bool CN25Qxxx_LargeRDFSR(unsigned char *cSR, int Index); bool CN25Qxxx_LargeEnable4ByteAddrMode(bool Enable4Byte,int Index); bool CN25Qxxx_MutipleDIe_LargeWREAR(unsigned char cSR, int Index); bool CN25Qxxx_MutipleDIe_LargeRDEAR(unsigned char *cSR, int Index); -bool CN25Qxxx_Large_doRDNVCR(unsigned short *sNVCR,int Index); -bool CN25Qxxx_Large_doWRNVCR(unsigned short sNVCR,int Index); +bool CN25Qxxx_Large_doRDVCR(unsigned char *sVCR,int Index); +bool CN25Qxxx_Large_doWRVCR(unsigned char sVCR,int Index); size_t GetChipSize(void); size_t GetPageSize(void); diff --git a/dpcmd.c b/dpcmd.c index 90a63d8..a188213 100755 --- a/dpcmd.c +++ b/dpcmd.c @@ -498,7 +498,7 @@ int main(int argc, char *argv[]) //signal(SIGINT, sin_handler); - printf("\nDpCmd Linux 1.6.1.%02d Engine Version:\nLast Built on May 25 2018\n\n",GetConfigVer()); //1. new feature.bug.config + printf("\nDpCmd Linux 1.7.1.%02d Engine Version:\nLast Built on May 25 2018\n\n",GetConfigVer()); //1. new feature.bug.config g_ucOperation=0; GetLogPath(g_LogPath); @@ -858,8 +858,10 @@ void cli_classic_usage(bool IsShowExample) " after issuing raw instructions.\n" " - used along with --raw-instruction only.\n" " Example:\n" - " dpcmd --raw-instruction '03 FF 00 12' \n" + " dpcmd --raw-instruction \"03 FF 00 12\" \n" " --raw-require-return 1\n" + " dpcmd --raw-instruction \"06|01 0C|05\" \n" + " --raw-require-return \"0|0|1\" \n" "\n" "Optional Switches that add fine-tune ability to Basic Switches:\n" " -a [ --addr ] arg hexadecimal starting address hexadecimal(e.g.\n" @@ -1462,40 +1464,87 @@ void do_ReadSR(int Index) } -void do_RawInstructions(int Index) -{ +void do_RawInstructinos_2(int outDLen, char* para, int Index) +{ unsigned char vOut[512]; unsigned char vIn[512]={0xFF,0xFF,0xFF,0}; unsigned char Length=0; int i=0; char* pch; + + pch = strtok (para, " ,;-"); + while( pch!= NULL) + { + sscanf(pch,"%02hhx",&vOut[i]); + i++; + pch = strtok (NULL, " ,;-"); + } + + // if(strlen(g_parameter_raw_return)>0) + // sscanf(g_parameter_raw_return,"%hhu",&Length); + + if(outDLen>0) + FlashCommand_SendCommand_OneOutOneIn(vOut,i,vIn,outDLen,Index); + else + FlashCommand_SendCommand_OutOnlyInstruction(vOut,i,Index); + + if(outDLen>0) + { + printf("issuing raw instruction \"%s\" returns %d bytes as required:\n",g_parameter_raw,outDLen); + for(i=0; i0) + { + sscanf(g_parameter_raw_return,"%hhu",&Length); + strcpy(retrunParameter,g_parameter_raw_return); + + pchR = strtok (retrunParameter,"|"); + while(pchR!=NULL) + { + sscanf(pchR,"%02hhx",&pchReturn[iReturn]); + iReturn++; + pchR = strtok (NULL,"|"); + } + if(iReturn!=i) + { + printf("\nError: value of --raw-require-return failed. No return value!\n\n"); + memset(pchReturn,0,30); + } + } + + for(int j=0;j0) - sscanf(g_parameter_raw_return,"%hhu",&Length); - if(Length>0) - FlashCommand_SendCommand_OneOutOneIn(vOut,i,vIn,Length,Index); - else - FlashCommand_SendCommand_OutOnlyInstruction(vOut,i,Index); - if(Length>0) - { - printf("issuing raw instruction \"%s\" returns %d bytes as required:\n",g_parameter_raw,Length); - for(i=0; i