kerneltest/e32test/misc/flash.cpp
changeset 0 a41df078684a
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // e32test\misc\flash.cpp
       
    15 // 
       
    16 //
       
    17 
       
    18 #include <e32test.h>
       
    19 #include <f32file.h>
       
    20 #include "flash.h"
       
    21 
       
    22 RTest test(_L("FLASH"));
       
    23 TInt Mode;
       
    24 TFileName FileName;
       
    25 RFs Fs;
       
    26 RFile File;
       
    27 TUint32 StartAddr;
       
    28 TUint32 Size;
       
    29 
       
    30 const TUint KBufferSize=4096;
       
    31 TUint8 Buffer[KBufferSize];
       
    32 TUint8 Buffer2[KBufferSize];
       
    33 
       
    34 enum TMode
       
    35 	{
       
    36 	EDump,
       
    37 	EBlankCheck,
       
    38 	EErase,
       
    39 	EWrite,
       
    40 	EVerify,
       
    41 	};
       
    42 
       
    43 void Usage()
       
    44 	{
       
    45 	test.Printf(_L("Usage:\n"));
       
    46 	test.Printf(_L(" flash d <addr> <size> <file> - dump flash to file\n"));
       
    47 	test.Printf(_L(" flash b <addr> <size>        - blank check flash\n"));
       
    48 	test.Printf(_L(" flash e <addr> <size>        - erase flash\n"));
       
    49 	test.Printf(_L(" flash w <addr> <file>        - write file to flash\n"));
       
    50 	test.Printf(_L(" flash v <addr> <file>        - verify flash against file\n"));
       
    51 	}
       
    52 
       
    53 TInt ParseCommandLine()
       
    54 	{
       
    55 	TBuf<256> cmd;
       
    56 	User::CommandLine(cmd);
       
    57 	cmd.Trim();
       
    58 	if (cmd.Length()==0)
       
    59 		return KErrArgument;
       
    60 	TLex lex(cmd);
       
    61 	TPtrC mode_str=lex.NextToken();
       
    62 	switch (mode_str[0])
       
    63 		{
       
    64 		case 'D':
       
    65 		case 'd':
       
    66 			Mode=EDump; break;
       
    67 		case 'B':
       
    68 		case 'b':
       
    69 			Mode=EBlankCheck; break;
       
    70 		case 'E':
       
    71 		case 'e':
       
    72 			Mode=EErase; break;
       
    73 		case 'W':
       
    74 		case 'w':
       
    75 			Mode=EWrite; break;
       
    76 		case 'V':
       
    77 		case 'v':
       
    78 			Mode=EVerify; break;
       
    79 		default:
       
    80 			return KErrArgument;
       
    81 		}
       
    82 	lex.SkipSpace();
       
    83 	TInt r=lex.Val(StartAddr,EHex);
       
    84 	if (r!=KErrNone)
       
    85 		return r;
       
    86 	if (Mode==EDump || Mode==EBlankCheck || Mode==EErase)
       
    87 		{
       
    88 		lex.SkipSpace();
       
    89 		r=lex.Val(Size,EHex);
       
    90 		if (r!=KErrNone)
       
    91 			return r;
       
    92 		}
       
    93 	if (Mode==EDump || Mode==EWrite || Mode==EVerify)
       
    94 		{
       
    95 		lex.SkipSpace();
       
    96 		FileName=lex.NextToken();
       
    97 		if (FileName.Length()==0)
       
    98 			return KErrArgument;
       
    99 		if (Mode==EDump)
       
   100 			{
       
   101 			r=File.Replace(Fs,FileName,EFileWrite);
       
   102 			if (r!=KErrNone)
       
   103 				{
       
   104 				test.Printf(_L("\nCould not open file %S for write\n"),&FileName);
       
   105 				return KErrGeneral;
       
   106 				}
       
   107 			}
       
   108 		else
       
   109 			{
       
   110 			r=File.Open(Fs,FileName,EFileRead);
       
   111 			if (r!=KErrNone)
       
   112 				{
       
   113 				test.Printf(_L("\nCould not open file %S for read\n"),&FileName);
       
   114 				return KErrGeneral;
       
   115 				}
       
   116 			else
       
   117 				{
       
   118 				r=File.Size((TInt&)Size);
       
   119 				if (r!=KErrNone)
       
   120 					{
       
   121 					test.Printf(_L("\nError %d accessing file %S\n"),r,&FileName);
       
   122 					File.Close();
       
   123 					return KErrGeneral;
       
   124 					}
       
   125 				test.Printf(_L("File size %x\n"),Size);
       
   126 				}
       
   127 			}
       
   128 		}
       
   129 	return KErrNone;
       
   130 	}
       
   131 
       
   132 void DoCommand()
       
   133 	{
       
   134 	Flash* pF=Flash::New(StartAddr);
       
   135 	if (!pF)
       
   136 		{
       
   137 		test.Printf(_L("Problem with flash device\n"));
       
   138 		return;
       
   139 		}
       
   140 	TInt r=KErrNotSupported;
       
   141 	switch (Mode)
       
   142 		{
       
   143 		case EDump:
       
   144 			{
       
   145 			while (Size)
       
   146 				{
       
   147 				TUint size=Size;
       
   148 				if (size>KBufferSize)
       
   149 					size=KBufferSize;
       
   150 				r=pF->Read(StartAddr,size,Buffer);
       
   151 				if (r!=KErrNone)
       
   152 					break;
       
   153 				r=File.Write(TPtrC8(Buffer,size));
       
   154 				if (r!=KErrNone)
       
   155 					break;
       
   156 				StartAddr+=size;
       
   157 				Size-=size;
       
   158 				}
       
   159 			break;
       
   160 			}
       
   161 		case EBlankCheck:
       
   162 			{
       
   163 			r=pF->BlankCheck(StartAddr,Size);
       
   164 			if (r!=KErrNone)
       
   165 				{
       
   166 				test.Printf(_L("Error at address %08x\n"),StartAddr+r-1);
       
   167 				}
       
   168 			break;
       
   169 			}
       
   170 		case EErase:
       
   171 			r=pF->Erase(StartAddr,Size);
       
   172 			if (r!=KErrNone)
       
   173 				{
       
   174 				test.Printf(_L("Error at address %08x\n"),StartAddr+r-1);
       
   175 				}
       
   176 			break;
       
   177 		case EWrite:
       
   178 			{
       
   179 			while (Size)
       
   180 				{
       
   181 				test.Printf(_L("%08x\n"),StartAddr);
       
   182 				TUint size=Size;
       
   183 				if (size>KBufferSize)
       
   184 					size=KBufferSize;
       
   185 				TPtr8 p8(Buffer,0,size);
       
   186 				r=File.Read(p8);
       
   187 				if (r!=KErrNone)
       
   188 					break;
       
   189 				r=pF->Write(StartAddr,size,Buffer);
       
   190 				if (r!=KErrNone)
       
   191 					break;
       
   192 				StartAddr+=size;
       
   193 				Size-=size;
       
   194 				}
       
   195 			break;
       
   196 			}
       
   197 		case EVerify:
       
   198 			{
       
   199 			while (Size)
       
   200 				{
       
   201 				TUint size=Size;
       
   202 				if (size>KBufferSize)
       
   203 					size=KBufferSize;
       
   204 				r=pF->Read(StartAddr,size,Buffer);
       
   205 				if (r!=KErrNone)
       
   206 					break;
       
   207 				TPtr8 p8(Buffer2,0,size);
       
   208 				r=File.Read(p8);
       
   209 				if (r!=KErrNone)
       
   210 					break;
       
   211 				TUint i;
       
   212 				for (i=0; i<size; ++i)
       
   213 					{
       
   214 					if (Buffer2[i]!=Buffer[i])
       
   215 						{
       
   216 						test.Printf(_L("VERIFY ERROR: Flash addr %08x, flash %02x, file %02x\n"),
       
   217 									StartAddr+i,Buffer[i],Buffer2[i]);
       
   218 						return;
       
   219 						}
       
   220 					}
       
   221 				StartAddr+=size;
       
   222 				Size-=size;
       
   223 				}
       
   224 			break;
       
   225 			}
       
   226 		}
       
   227 	if (r!=KErrNone)
       
   228 		test.Printf(_L("Error %d occurred\n"),r);
       
   229 	delete pF;
       
   230 	}
       
   231 
       
   232 TInt E32Main()
       
   233 	{
       
   234 	test.Title();
       
   235 	test.Start(_L("Connect to F32"));
       
   236 	TInt r=Fs.Connect();
       
   237 	test(r==KErrNone);
       
   238 
       
   239 	r=ParseCommandLine();
       
   240 	if (r==KErrNone)
       
   241 		DoCommand();
       
   242 	else
       
   243 		Usage();
       
   244 
       
   245 	Fs.Close();
       
   246 	test.End();
       
   247 	return 0;
       
   248 	}