Skip to content

Commit

Permalink
fix lock command issue
Browse files Browse the repository at this point in the history
  • Loading branch information
root committed Jun 14, 2018
1 parent cd88c50 commit 2630b9f
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 54 deletions.
25 changes: 11 additions & 14 deletions SerialFlash.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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; i<AddrSize; i++)
{
SerialFlash_waitForWEL(Index) ;

SerialFlash_waitForWEL(Index) ;
if(Chip_Info.ChipSizeInByte>0x1000000)
{
// MSB~ LSB (31...0)
Expand All @@ -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 ;
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand All @@ -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 ;
Expand Down
24 changes: 17 additions & 7 deletions dpcmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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;

Expand Down
90 changes: 57 additions & 33 deletions project.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -279,7 +279,7 @@ void PrepareProgramParameters(int Index)
DownloadAddrRange.start=addrStart;
DownloadAddrRange.end=addrStart + addrLeng;
DownloadAddrRange.length=addrLeng;

}

bool ValidateProgramParameters(int Index)
Expand Down Expand Up @@ -564,22 +564,19 @@ bool threadProgram(int Index)
}

if( result && (!ValidateProgramParameters(Index)) )
{
//printf("evy - program failed1(%df)\n",Index);
{
result = false;
}
pthread_mutex_unlock(&g_count_mutex);

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;
}

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)));

Expand Down Expand Up @@ -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)
Expand All @@ -733,72 +729,100 @@ 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.start<DownloadAddrRange.start)
down_with_lock_range.start=LockAddrrange.start;
if((LockAddrrange.start+LockAddrrange.length)>DownloadAddrRange.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)
{
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<Leng; i++)
{
size_t idx_in_vc = addrs[i] - effectiveRange.start;
struct CAddressRange addr_range;
addr_range.start=addrs[i];
addr_range.end=addrs[i]+Chip_Info.MaxErasableSegmentInByte;
addr_range.length=addr_range.end-addr_range.start;

addr_range.length=addr_range.end-addr_range.start;
if(SerialFlash_rangeProgram(&addr_range,vc+idx_in_vc,Index)==0)
{
{
free(vc);
free(addrs);
free(condensed_addr);
return false;
}
}
free(vc);
free(vc2);
free(addrs);
free(condensed_addr);
return true;
}
free(vc);
free(vc2);
free(addrs);
return true;
}
Expand Down Expand Up @@ -982,7 +1006,7 @@ void threadRun(void* Type)
threadCompareFileAndChip(Index);
break;

case AUTO:
case AUTO:
TurnONVpp(Index);
bAuto[Index]=true;
threadPredefinedBatchSequences(Index) ;
Expand Down

0 comments on commit 2630b9f

Please sign in to comment.