From 2630b9fe2a15c5f10c37dfa5de28086a7a21c2a2 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 14 Jun 2018 13:32:29 +0800 Subject: [PATCH] fix lock command issue --- SerialFlash.c | 25 +++++++------- dpcmd.c | 24 ++++++++++---- project.c | 90 ++++++++++++++++++++++++++++++++------------------- 3 files changed, 85 insertions(+), 54 deletions(-) diff --git a/SerialFlash.c b/SerialFlash.c index c057086..f57a6ab 100755 --- a/SerialFlash.c +++ b/SerialFlash.c @@ -1726,8 +1726,7 @@ int SerialFlash_rangeProgram(struct CAddressRange *AddrRange, unsigned char *vDa return SerialFlash_bulkPipeProgram(AddrRange, vData, PP_4ADDR_256BYTE_12,mcode_ProgramCode_4Adr,Index); } else if(strstr(Chip_Info.Class,SUPPORT_SPANSION_S70FSxx_Large)!=NULL) - { - + { if(g_bIsSF600[Index]==true) { return SerialFlash_bulkPipeProgram(AddrRange, vData, PP_4ADDR_256BYTE_S70FS01GS,mcode_ProgramCode_4Adr_S70FSxxx,Index); @@ -1815,12 +1814,12 @@ int SerialFlash_is_good() } int SerialFlash_batchErase(uintptr_t* vAddrs,size_t AddrSize,int Index) -{ +{ if(!SerialFlash_StartofOperation(Index)) return false; // if(strstr(Chip_Info.Class,SUPPORT_ATMEL_45DBxxxB) != NULL || strstr(Chip_Info.Class,SUPPORT_ATMEL_45DBxxxD) != NULL) // return AT45batchErase(vAddrs, AddrSize,Index); - + if(0 == mcode_SegmentErase) return 1; // chipErase code not initialised or not supported, please check chip class ctor. if(SerialFlash_protectBlock(false,Index) == SerialFlash_FALSE) @@ -1848,12 +1847,10 @@ int SerialFlash_batchErase(uintptr_t* vAddrs,size_t AddrSize,int Index) rq.Value = RFU ; rq.Index = NO_RESULT_IN ; } - rq.Length = 5; - + rq.Length = 5; for(i=0; i0x1000000) { // MSB~ LSB (31...0) @@ -1877,7 +1874,7 @@ int SerialFlash_batchErase(uintptr_t* vAddrs,size_t AddrSize,int Index) } SerialFlash_Enable4ByteAddrMode(false, Index); if(!SerialFlash_EndofOperation(Index)) - return false; + return false; return true ; } @@ -2082,10 +2079,10 @@ int SerialFlash_bulkPipeProgram(struct CAddressRange *AddrRange, unsigned char * divider=8; break; } - + if((AddrRange->end/0x1000000)>(AddrRange->start/0x1000000))//(AddrRange.end>0x1000000 && AddrRange.start<0x1000000) ||(AddrRange.end>0x2000000 && AddrRange.start<0x2000000) || { - + struct CAddressRange down_range; struct CAddressRange range_temp; range_temp.start= AddrRange->start&0xFF000000; @@ -2124,7 +2121,7 @@ int SerialFlash_bulkPipeProgram(struct CAddressRange *AddrRange, unsigned char * } } else - { + { size_t packageNum = (AddrRange->end - AddrRange->start) >> divider ; FlashCommand_SendCommand_SetupPacketForBulkWrite(AddrRange, modeWrite,WriteCom,Index); for(i = 0; i < packageNum; ++ i) @@ -2134,14 +2131,14 @@ int SerialFlash_bulkPipeProgram(struct CAddressRange *AddrRange, unsigned char * return false ; } } - + if(mcode_Program==AAI_2_BYTE) SerialFlash_doWRDI(Index); if(SerialFlash_protectBlock(m_bProtectAfterWritenErase,Index) == SerialFlash_FALSE) return false ; if(SerialFlash_EnableQuadIO(false,m_boEnWriteQuadIO,Index)== SerialFlash_FALSE) return false; SerialFlash_Enable4ByteAddrMode(false, Index); - + if(!SerialFlash_EndofOperation(Index)) return false; return true ; diff --git a/dpcmd.c b/dpcmd.c index 3f4dbc9..64715bb 100755 --- a/dpcmd.c +++ b/dpcmd.c @@ -54,6 +54,11 @@ CHIP_INFO Chip_Info; char *l_opt_arg; struct CAddressRange DownloadAddrRange; struct CAddressRange UploadAddrRange; +struct CAddressRange LockAddrrange; + +unsigned int g_uiLockLen=0; +unsigned int g_uiLockStart=0; + char* g_parameter_read="\0"; char* g_parameter_program="\0"; char* g_parameter_loadfile="\0"; @@ -590,13 +595,15 @@ int main(int argc, char *argv[]) case 'T': g_parameter_type= optarg; //type break; - case 'S': //lock start -// l_opt_arg = optarg; + case 'S': //lock start + sscanf(optarg,"%x",&g_uiLockStart); + // l_opt_arg = optarg; // printf("hexadecimal starting address (with arg: %s)\n", l_opt_arg); break; - case 'N': //lock length + case 'N': //lock length + sscanf(optarg,"%x",&g_uiLockLen); // l_opt_arg = optarg; -// printf("hexadecimal length of area that will be kept unchanged while updating (with arg: %s)\n", l_opt_arg); + // printf("hexadecimal length of area that will be kept unchanged while updating (with arg: %s)\n", l_opt_arg); break; case 'B': sscanf(optarg,"%d",&g_uiBlink); @@ -878,11 +885,11 @@ void cli_classic_usage(bool IsShowExample) " --type arg Specify a type to override auto detection\n" " - use --list arguement to look up supported type.\n" " --lock-start arg hexadecimal starting address(e.g. 0x1000),\n" - " - works with --prog/read/sum/auto only\n" + " - works with --auto/lock-length\n" " - defaults to 0, if omitted.\n" " --lock-length arg hexadecimal length of area that will be kept\n" " unchanged while updating\n" - " - used along with --auto only.\n" + " - used along with --auto/lock-start only.\n" " --blink arg \n" // " - 0 : Blink green LED 3 times from USB1 to USBn\n" // " (Default)\n" @@ -1415,7 +1422,10 @@ void do_DisplayOrSave(void) } void SaveProgContextChanges(void) -{ +{ + LockAddrrange.start=g_uiLockStart; + LockAddrrange.length=g_uiLockLen; + LockAddrrange.end=g_uiLockStart+g_uiLockLen; #if 0 using numeric_conversion::hexstring_to_size_t; diff --git a/project.c b/project.c index 7a7d863..c8a76ce 100755 --- a/project.c +++ b/project.c @@ -49,6 +49,7 @@ extern int g_StartupMode; extern int g_CurrentSeriase; extern struct CAddressRange DownloadAddrRange; extern struct CAddressRange UploadAddrRange; +extern struct CAddressRange LockAddrrange; extern bool g_is_operation_on_going; extern bool g_is_operation_successful[16]; extern unsigned int g_Vcc; @@ -57,8 +58,7 @@ extern unsigned int g_uiAddr; extern size_t g_uiLen; extern bool g_bEnableVpp; extern unsigned int g_uiDevNum; //evy add -extern int FlashIdentifier(CHIP_INFO * Chip_Info, int search_all,int Index); - +extern int FlashIdentifier(CHIP_INFO * Chip_Info, int search_all,int Index); pthread_mutex_t g_count_mutex; #define FIRMWARE_VERSION(x,y,z) ((x<<16) | (y<<8) | z) @@ -279,7 +279,7 @@ void PrepareProgramParameters(int Index) DownloadAddrRange.start=addrStart; DownloadAddrRange.end=addrStart + addrLeng; DownloadAddrRange.length=addrLeng; - + } bool ValidateProgramParameters(int Index) @@ -564,8 +564,7 @@ bool threadProgram(int Index) } if( result && (!ValidateProgramParameters(Index)) ) - { - //printf("evy - program failed1(%df)\n",Index); + { result = false; } pthread_mutex_unlock(&g_count_mutex); @@ -573,13 +572,11 @@ bool threadProgram(int Index) int pthread_mutex_destroy(pthread_mutex_t *mutex); if( result && ProgramChip(Index)) - { - //printf("evy - program failed2(%d)\n",Index); + { result = true; } else - { - //printf("evy - program failed3(%d)\n",Index); + { result = false; } @@ -621,9 +618,7 @@ bool threadCompareFileAndChip(int Index) result = false; if( result && (!ValidateProgramParameters(Index)) ) - result = false; - - + result = false; //refresh vcc before verify TurnOFFVcc(Index); Sleep(100); @@ -684,12 +679,13 @@ size_t GenerateDiff(uintptr_t* Addr,unsigned char* in1, unsigned long long size1 { size_t upper = min(size1, size2); size_t realAddr; - uintptr_t i,j=0; + uintptr_t i,j=0; + for(i = 0; i < upper; ++i) { if(in1[i] != in2[i]) - { + { realAddr = i + baseAddr; Addr[j++]=(realAddr & (~(step - 1))); @@ -724,7 +720,7 @@ size_t Condense(uintptr_t* out,unsigned char* vc, uintptr_t* addrs, size_t addrS extern void SetPageSize(CHIP_INFO* mem, int USBIndex); bool BlazeUpdate(int Index) -{ +{ // struct CAddressRange addr_round;//(Chip_Info.MaxErasableSegmentInByte); // if(strstr(Chip_Info.Class,SUPPORT_ATMEL_45DBxxxD) != NULL) @@ -733,39 +729,66 @@ bool BlazeUpdate(int Index) // dealwith lock phase 1 - struct CAddressRange down_with_lock_range;//(m_context.runtime.range_download); + + struct CAddressRange down_with_lock_range; down_with_lock_range.start=DownloadAddrRange.start; down_with_lock_range.end=DownloadAddrRange.end; - DownloadAddrRange.length=DownloadAddrRange.end-DownloadAddrRange.start; down_with_lock_range.length=down_with_lock_range.end-down_with_lock_range.start; + DownloadAddrRange.length= down_with_lock_range.length; + + if(LockAddrrange.length>0) + { + if(LockAddrrange.startDownloadAddrRange.end) + down_with_lock_range.end=LockAddrrange.start+LockAddrrange.length; + } struct CAddressRange effectiveRange;//(addr_round.SectionRound(down_with_lock_range)); effectiveRange.start=down_with_lock_range.start &(~(Chip_Info.MaxErasableSegmentInByte - 1)) ; effectiveRange.end=(down_with_lock_range.end + (Chip_Info.MaxErasableSegmentInByte - 1)) & (~(Chip_Info.MaxErasableSegmentInByte - 1)); effectiveRange.length=effectiveRange.end-effectiveRange.start; - + if(!threadReadRangeChip(effectiveRange,Index)) return false; - unsigned int offsetOfRealStartAddrOffset = DownloadAddrRange.start - effectiveRange.start; - + unsigned int offsetOfRealStartAddrOffset = 0; unsigned char* vc; - vc=(unsigned char*)malloc(effectiveRange.length); - memcpy(vc,pBufferForLastReadData[Index],effectiveRange.length); + unsigned char* vc2; + + vc=(unsigned char*)malloc(effectiveRange.length); + vc2=(unsigned char*)malloc(effectiveRange.length); + uintptr_t* addrs=(size_t*)malloc(min(DownloadAddrRange.length,g_ulFileSize)); size_t Leng=0; - Leng=GenerateDiff(addrs,vc+offsetOfRealStartAddrOffset,DownloadAddrRange.length,pBufferforLoadedFile,g_ulFileSize,DownloadAddrRange.start,Chip_Info.MaxErasableSegmentInByte); -// printf("Leng=%X\r\n",Leng); + memcpy(vc,pBufferForLastReadData[Index],effectiveRange.length); //memory data + + + + if(LockAddrrange.length>0) + { + unsigned int offsetOfRealStartAddrOffset = LockAddrrange.start-effectiveRange.start; //DownloadAddrRange.start - effectiveRange.start; + memcpy(pBufferforLoadedFile+offsetOfRealStartAddrOffset,pBufferForLastReadData[Index]+offsetOfRealStartAddrOffset,LockAddrrange.length); + Leng=GenerateDiff(addrs,vc,DownloadAddrRange.length,pBufferforLoadedFile,g_ulFileSize,DownloadAddrRange.start,Chip_Info.MaxErasableSegmentInByte); + } + else + { + unsigned int offsetOfRealStartAddrOffset = DownloadAddrRange.start - effectiveRange.start; + Leng=GenerateDiff(addrs,vc+offsetOfRealStartAddrOffset,DownloadAddrRange.length,pBufferforLoadedFile,g_ulFileSize,DownloadAddrRange.start,Chip_Info.MaxErasableSegmentInByte); + } + + if(Leng==0) // speed optimisation { return true; } else { + uintptr_t* condensed_addr=(size_t*)malloc(min(DownloadAddrRange.length,g_ulFileSize)); - size_t condensed_size; + size_t condensed_size; condensed_size=Condense(condensed_addr,vc, addrs, Leng, effectiveRange.start,Chip_Info.MaxErasableSegmentInByte); -// printf("condensed_size=%d\r\n",condensed_size); + SerialFlash_batchErase(condensed_addr,condensed_size,Index); if(strstr(Chip_Info.Class,SUPPORT_MACRONIX_MX25Lxxx) != NULL) @@ -773,9 +796,9 @@ bool BlazeUpdate(int Index) TurnOFFVcc(Index); Sleep(100); TurnONVcc(Index); - } - - memcpy(vc+offsetOfRealStartAddrOffset,pBufferforLoadedFile,DownloadAddrRange.length); + } + + memcpy(vc+offsetOfRealStartAddrOffset,pBufferforLoadedFile,DownloadAddrRange.length); size_t i = 0; for(i=0; i