Skip to content

Commit

Permalink
Modify MT25QU01GB issue
Browse files Browse the repository at this point in the history
  • Loading branch information
root committed Jun 4, 2018
1 parent 2d2d017 commit 2611a20
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 86 deletions.
90 changes: 34 additions & 56 deletions SerialFlash.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 ;
Expand All @@ -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 ;
Expand All @@ -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;

}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -2110,9 +2103,9 @@ int SerialFlash_bulkPipeRead(struct CAddressRange *AddrRange, unsigned char *vDa

for(j=0; j<loop; j++)
{
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{
Expand Down Expand Up @@ -2155,9 +2148,9 @@ int SerialFlash_bulkPipeRead(struct CAddressRange *AddrRange, unsigned char *vDa
else
{
unsigned char EAR=(AddrRange->start*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{
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions SerialFlash.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
100 changes: 74 additions & 26 deletions dpcmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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; i<outDLen; i++)
printf("%02X ",vIn[i]);
printf("\n");
}

do_ReadSR(Index);
}

void do_RawInstructions(int Index)
{
char* pch[30];
char* pchR;
unsigned char pchReturn[30];
char parameter[40];

unsigned char Length=0;
char retrunParameter[40];
int iReturn=0;
int i=0;
strcpy(parameter,g_parameter_raw);
TurnONVcc(Index);
pch = strtok (parameter," ,;-");
while( pch!= NULL)
{
sscanf(pch,"%02hhx",&vOut[i]);
i++;
pch = strtok (NULL, " ,;-");
TurnONVcc(Index);
pch[i] = strtok (parameter,"|");
while(pch[i]!=NULL)
{ i++;
pch[i] = strtok (NULL,"|");

}

if(strlen(g_parameter_raw_return)>0)
{
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;j<i;j++)
{
do_RawInstructinos_2(pchReturn[j], pch[j],Index);
}

if(strlen(g_parameter_raw_return)>0)
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<Length; i++)
printf("%02X ",vIn[i]);
printf("\n");
}
do_ReadSR(Index);
}

void RawInstructions(int Index)
Expand All @@ -1504,7 +1553,6 @@ void RawInstructions(int Index)
{
printf("\nDevice %d:\n",Index+1);
do_RawInstructions(Index);


}
}
Expand Down
1 change: 1 addition & 0 deletions dpcmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ void do_Auto(void);
void do_Verify(void);
void do_ReadSR(int Index);
void do_RawInstructions(int Index);
void do_RawInstructinos_2(int outDLen, char* para, int Index);
void RawInstructions(int Index);
bool BlankCheck(void);
bool Erase(void);
Expand Down
12 changes: 10 additions & 2 deletions project.c
Original file line number Diff line number Diff line change
Expand Up @@ -1406,14 +1406,22 @@ void SetProgReadCommand(int Index)
mcode_RDSR = RDSR;
mcode_WRSR = WRSR;
mcode_ChipErase = 0xC4;
mcode_Read = BULK_NORM_READ;
mcode_Program = PP_4ADDR_256BYTE_MICROM ;
if(strstr(Chip_Info.TypeName,"N25Q512") != NULL)
mcode_SegmentErase = 0xD4;
else
mcode_SegmentErase = 0xD8;
mcode_ProgramCode_4Adr = 0x02;
mcode_ReadCode = 0x03;
if(strstr(g_board_type,"SF100") != NULL) //is sf100
{
mcode_ReadCode = 0x03;
mcode_Read = BULK_NORM_READ;
}
else
{
mcode_ReadCode = 0x0B;
mcode_Read = BULK_4BYTE_FAST_READ_MICRON;
}



Expand Down

0 comments on commit 2611a20

Please sign in to comment.