diff -r 000000000000 -r a41df078684a kerneltest/e32test/misc/flash.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/misc/flash.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,248 @@ +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\misc\flash.cpp +// +// + +#include +#include +#include "flash.h" + +RTest test(_L("FLASH")); +TInt Mode; +TFileName FileName; +RFs Fs; +RFile File; +TUint32 StartAddr; +TUint32 Size; + +const TUint KBufferSize=4096; +TUint8 Buffer[KBufferSize]; +TUint8 Buffer2[KBufferSize]; + +enum TMode + { + EDump, + EBlankCheck, + EErase, + EWrite, + EVerify, + }; + +void Usage() + { + test.Printf(_L("Usage:\n")); + test.Printf(_L(" flash d - dump flash to file\n")); + test.Printf(_L(" flash b - blank check flash\n")); + test.Printf(_L(" flash e - erase flash\n")); + test.Printf(_L(" flash w - write file to flash\n")); + test.Printf(_L(" flash v - verify flash against file\n")); + } + +TInt ParseCommandLine() + { + TBuf<256> cmd; + User::CommandLine(cmd); + cmd.Trim(); + if (cmd.Length()==0) + return KErrArgument; + TLex lex(cmd); + TPtrC mode_str=lex.NextToken(); + switch (mode_str[0]) + { + case 'D': + case 'd': + Mode=EDump; break; + case 'B': + case 'b': + Mode=EBlankCheck; break; + case 'E': + case 'e': + Mode=EErase; break; + case 'W': + case 'w': + Mode=EWrite; break; + case 'V': + case 'v': + Mode=EVerify; break; + default: + return KErrArgument; + } + lex.SkipSpace(); + TInt r=lex.Val(StartAddr,EHex); + if (r!=KErrNone) + return r; + if (Mode==EDump || Mode==EBlankCheck || Mode==EErase) + { + lex.SkipSpace(); + r=lex.Val(Size,EHex); + if (r!=KErrNone) + return r; + } + if (Mode==EDump || Mode==EWrite || Mode==EVerify) + { + lex.SkipSpace(); + FileName=lex.NextToken(); + if (FileName.Length()==0) + return KErrArgument; + if (Mode==EDump) + { + r=File.Replace(Fs,FileName,EFileWrite); + if (r!=KErrNone) + { + test.Printf(_L("\nCould not open file %S for write\n"),&FileName); + return KErrGeneral; + } + } + else + { + r=File.Open(Fs,FileName,EFileRead); + if (r!=KErrNone) + { + test.Printf(_L("\nCould not open file %S for read\n"),&FileName); + return KErrGeneral; + } + else + { + r=File.Size((TInt&)Size); + if (r!=KErrNone) + { + test.Printf(_L("\nError %d accessing file %S\n"),r,&FileName); + File.Close(); + return KErrGeneral; + } + test.Printf(_L("File size %x\n"),Size); + } + } + } + return KErrNone; + } + +void DoCommand() + { + Flash* pF=Flash::New(StartAddr); + if (!pF) + { + test.Printf(_L("Problem with flash device\n")); + return; + } + TInt r=KErrNotSupported; + switch (Mode) + { + case EDump: + { + while (Size) + { + TUint size=Size; + if (size>KBufferSize) + size=KBufferSize; + r=pF->Read(StartAddr,size,Buffer); + if (r!=KErrNone) + break; + r=File.Write(TPtrC8(Buffer,size)); + if (r!=KErrNone) + break; + StartAddr+=size; + Size-=size; + } + break; + } + case EBlankCheck: + { + r=pF->BlankCheck(StartAddr,Size); + if (r!=KErrNone) + { + test.Printf(_L("Error at address %08x\n"),StartAddr+r-1); + } + break; + } + case EErase: + r=pF->Erase(StartAddr,Size); + if (r!=KErrNone) + { + test.Printf(_L("Error at address %08x\n"),StartAddr+r-1); + } + break; + case EWrite: + { + while (Size) + { + test.Printf(_L("%08x\n"),StartAddr); + TUint size=Size; + if (size>KBufferSize) + size=KBufferSize; + TPtr8 p8(Buffer,0,size); + r=File.Read(p8); + if (r!=KErrNone) + break; + r=pF->Write(StartAddr,size,Buffer); + if (r!=KErrNone) + break; + StartAddr+=size; + Size-=size; + } + break; + } + case EVerify: + { + while (Size) + { + TUint size=Size; + if (size>KBufferSize) + size=KBufferSize; + r=pF->Read(StartAddr,size,Buffer); + if (r!=KErrNone) + break; + TPtr8 p8(Buffer2,0,size); + r=File.Read(p8); + if (r!=KErrNone) + break; + TUint i; + for (i=0; i