kerneltest/e32test/device/t_prom.cpp
changeset 9 96e5fb8b040d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/device/t_prom.cpp	Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,179 @@
+// Copyright (c) 1996-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\device\t_prom.cpp
+// 
+//
+
+#include <e32test.h>
+#include <e32twin.h>
+#include <e32hal.h>
+#include <d32prom.h>
+
+GLDEF_D RDevE2Prom prom;
+GLDEF_D RTest test(_L("E2PROM tests"));
+
+#if !defined(__WINS__)
+LOCAL_C TInt CheckProm(TInt aVal)
+//
+// Write aVal to every location in prom and verify...
+//
+    {
+
+    TBuf16<16> buf;
+
+    test(prom.WriteAll(aVal)==KErrNone);
+    test(prom.ReadData(buf)==KErrNone);
+
+    TInt len;
+
+    for(len=0;len<16;len++)
+        test(buf[len]==aVal);
+
+    return(KErrNone);
+    }
+#endif
+
+GLDEF_C TInt E32Main()
+//
+// Test E2 PROM handling.
+//
+    {
+	test.Title();
+#if defined(__WINS__)
+	test.Start(_L("This test is valid under EPOC platforms only"));
+	test.End();
+	test.Close();
+	return(KErrNone);
+#else
+
+    test.Start(_L("Loading E2PROM LDD"));
+	TInt r=User::LoadLogicalDevice(_L("E2PROM"));
+    test(r==KErrNone || r==KErrAlreadyExists);
+    test.Next(_L("Opening device driver"));
+	test(prom.Open()==KErrNone);
+	test.Next(_L("Copying current contents of PROM"));
+	TInt currentProtectValue=prom.ProtectRead();
+	TBuf16<16> currentContents;
+
+/*  Random hacky code */
+/*
+    TBuf<0x100> buf;
+    RProcess().CommandLine(buf);
+    TLex lex(buf);
+    TUint val;
+    if (buf==KNullDesC)
+        val=0;
+    else
+        {
+        TInt r;
+        r=lex.Val(val);
+        test(r==KErrNone); 
+        test.Printf(_L("Setting to value %08x"), val);
+        }
+    currentContents.SetLength(16);
+    Mem::FillZ((TUint8 *)currentContents.Ptr(), 32);
+    test(prom.ReadData(currentContents)==KErrNone);
+    currentContents[4]=val;
+    TInt i;
+    TUint8 s=0;
+    for (i=1; i<32; i++)
+        {
+        s^=((TUint8*)currentContents.Ptr())[i];
+        }
+    s^=0x42;
+    ((TUint8*)currentContents.Ptr())[0]=s;
+    test(prom.WriteData(currentContents)==KErrNone);
+    test.Next(_L("Reading back"));
+    test(prom.ReadData(currentContents)==KErrNone);
+    test.Next(_L("Check checksum"));
+    s=0;
+    for (i=0; i<32; i++)
+        {
+        s^=((TUint8 *)currentContents.Ptr())[i];
+        }
+    test.Printf(_L("checksum=%08x"), s);
+
+    User::FreeLogicalDevice(_L("E2PROM"));
+    test.End();
+    return KErrNone;
+    }
+*/
+                                               
+	test(prom.ReadData(currentContents)==KErrNone);
+
+
+		
+    TBuf16<16> buf1;
+    TBuf16<16> buf2;
+
+	test.Next(_L("Clearing protect register"));
+
+    test(prom.ProtectClear()==KErrNone);
+    test(prom.ProtectRead()==63);
+
+    test.Next(_L("Writing all"));
+
+    test(CheckProm(0)==KErrNone);
+    test(CheckProm(0x0008)==KErrNone);
+    test(CheckProm(0x0080)==KErrNone);
+    test(CheckProm(0x0800)==KErrNone);
+    test(CheckProm(0x8000)==KErrNone);
+    test(CheckProm(0xffff)==KErrNone);
+    test(CheckProm(0xf0f0)==KErrNone);
+    test(CheckProm(0xf00f)==KErrNone);
+
+    test.Next(_L("Writing data"));
+
+    TInt len;
+
+    buf1.SetLength(16);
+
+    for(len=0;len<16;len++)
+        buf1[len]=(TInt16)len;
+
+    test(prom.WriteData(buf1)==KErrNone);
+    test.Next(_L("Reading and verifying"));
+    test(prom.ReadData(buf2)==KErrNone);
+    test(buf1==buf2);
+
+	test.Next(_L("Testing protection"));
+	test(prom.ProtectSet(6)==KErrNone);
+	test(prom.ProtectRead()==6);
+	test(prom.WriteAll(0)==KErrNone);
+	test(prom.ReadData(buf2)==KErrNone);
+	test(buf1==buf2);
+	
+	for(len=0;len<16;len++)
+		buf1[len]=(TInt16)(len+0x8570);
+
+	test(prom.WriteData(buf1)==KErrNone);
+	test(prom.ReadData(buf2)==KErrNone);
+	test(buf1!=buf2);
+	
+	for(len=6;len<16;len++)
+		buf1[len]=(TInt16)len;
+
+	test(buf1==buf2);
+	test.Next(_L("Writing back original contents"));
+	test(prom.ProtectClear()==KErrNone);
+	test(prom.WriteData(currentContents)==KErrNone);
+	test(prom.ProtectSet(currentProtectValue)==KErrNone);
+    prom.Close();
+
+    test.End();
+
+	return(KErrNone);
+#endif
+    }
+