--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/shostmassstorage/msman/test/cblockdevicetester.h Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,314 @@
+// Copyright (c) 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:
+//
+
+
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef CBLOCKDEVICETESTER_H
+#define CBLOCKDEVICETESTER_H
+
+static const TInt KBlockSize = 0x200;
+
+static const TInt KSizeInBlocks = 0x20;
+static const TInt KSize = (KSizeInBlocks * KBlockSize);
+
+
+typedef TUint TLba;
+typedef TInt64 TPos;
+
+
+class TLocalBuffer
+ {
+public:
+ void Init();
+ TPtrC8 Buffer() const {return iBuffer;}
+ void Update(TInt aPos, TUint aLen);
+
+public:
+ TBuf8<KSize> iBuffer;
+ };
+
+
+class TLbaUtils
+ {
+public:
+ static TPos Pos(TLba aLba);
+ static TUint32 Length(TLba aBlocks);
+ };
+
+
+class RTargetMedia
+ {
+public:
+ RTargetMedia(TInt aDriveNumber);
+ void OpenL();
+ void Close();
+
+ TInt MediaRawWrite(TPos aPos, const TDesC8& aData);
+ TInt MediaRawRead(TPos aPos, TUint32 aLen, TDes8& aData);
+
+protected:
+ RRawDisk iRawDisk;
+ TInt iDriveNumber;
+ };
+
+
+
+class RBlockTargetMedia: public RTargetMedia
+ {
+public:
+ RBlockTargetMedia(TInt aDriveNumber);
+ void OpenL();
+ TInt WriteBlock(TLba aLba);
+ TInt ReadBlock(TLba aLba);
+
+private:
+ TBuf8<KBlockSize> iBlockData;
+ };
+
+
+class TTargetTestArea
+ {
+public:
+ TTargetTestArea(RTargetMedia& aMedia);
+ void CreateControlFile();
+ void RemoveControlFile();
+ void FindBlockStartL();
+
+ TInt WriteBlockL(TBuf8<KBlockSize>& aBlock);
+ TInt ReadBlockL(TBuf8<KBlockSize>& aBlock);
+private:
+ RTargetMedia& iTargetMedia;
+ TInt iStartLba;
+ };
+
+
+
+class RTargetDrive: public RTargetMedia
+ {
+public:
+ RTargetDrive(TInt aDriveNumber);
+ TInt OpenTestAreaL(const TDesC8& aData);
+
+ TInt Verify();
+ TInt VerifyBlock(TLba aLba, TLba aBlocks);
+ TInt Verify(TInt aPos, TUint aLen);
+
+ TInt Update(TInt aPos, TUint aLen);
+
+private:
+ TPos StartPos() const;
+ TPos TargetPos(TInt aPos) const;
+
+private:
+ TLba iStartLba;
+ TPtrC8 iSource;
+ TBuf8<KSize> iTmpBuffer;
+ };
+
+
+class CBlockDeviceTester: public CBase
+ {
+public:
+ static CBlockDeviceTester* NewL(TInt aDriveNumber);
+ ~CBlockDeviceTester();
+protected:
+ void ConstructL();
+ CBlockDeviceTester(TInt aDriveNumber);
+
+public:
+ void OpenDriveL();
+ void CloseDrive();
+
+ TInt Update(TPos aPos, TUint aLen);
+ TInt UpdateBlock(TLba aLba, TLba aBlocks);
+
+ TInt VerifyDrive();
+ TInt Verify(TPos aPos, TUint aLen);
+ TInt VerifyBlock(TLba aLba, TLba aBlocks);
+
+protected:
+ // The drive parameters
+ TInt iDriveNumber;
+ TInt iDriveSizeInBlocks;
+
+ // Local buffer
+ TLocalBuffer iLocalBuffer;
+ // The buffer on remote drive
+ RTargetDrive iTargetDrive;
+ };
+
+
+
+class CBotTester: public CBlockDeviceTester
+ {
+public:
+ enum TTestCase
+ {
+ ETestCaseTagMismatch = 1,
+ ETestCaseInvalidSignature = 2,
+ // No Data
+ ETestCaseNoDataStallCsw = 3,
+ ETestCaseNoDataPhaseError = 4,
+ // Data OUT
+ ETestCaseDoStallCsw = 5,
+ ETestCaseDoStallData = 6,
+ ETestCaseDoPhaseError = 7,
+ ETestCaseDoResidue = 8,
+ // Data IN
+ ETestCaseDiStallCsw = 9,
+ ETestCaseDiStallData = 0xA,
+ ETestCaseDiPhaseError = 0xB,
+ ETestCaseDiResidue = 0xC,
+ // End
+ ETestCaseNotSet
+ };
+
+ static const TPos KSetTestPos = 0x1000;
+ static const TPos KWriteEnableFilePos = 0x2000;
+ static const TPos KReadEnableFilePos = 0x3000;
+ static const TPos KSenseErrorFile = 0x4000;
+
+public:
+ static CBotTester* NewL(TInt aDriveNumber);
+ virtual ~CBotTester();
+private:
+ void ConstructL();
+ CBotTester(TInt aDriveNumber);
+
+public:
+ TInt SetTest(TTestCase aTestCase);
+ TInt WriteEnableFile();
+ TInt InitReadEnableFile();
+ TInt ReadEnableFile();
+
+private:
+ /**
+ Place this buffer on block boundary and make buffers multiple of block size
+ to avoid crossing block boundary
+ */
+ static const TInt KCmdBufferSize = KBlockSize;
+ static const TInt KOutEnableBufferSize = KBlockSize * 4;
+ static const TInt KInEnableBufferSize = KBlockSize * 4;
+
+ TBuf8<KCmdBufferSize> iCmdBuffer;
+ TBuf8<KOutEnableBufferSize> iOutEnableBuffer;
+ TBuf8<KInEnableBufferSize> iInEnableBuffer;
+ };
+
+
+class CSbcErrTester: public CBlockDeviceTester
+ {
+public:
+ enum TTestSenseError
+ {
+ ETestSenseErrorNoSense = 0,
+ ETestSenseErrorMediaNotPresent = 1,
+ ETestSenseErrorUnitAttention = 2
+ };
+
+
+ static const TPos KSetTestPos = 0x1000;
+ static const TPos KWriteTestFilePos = 0x2000;
+ static const TPos KReadTestFilePos = 0x3000;
+ static const TPos KSenseErrorFile = 0x4000;
+
+public:
+ static CSbcErrTester* NewL(TInt aDriveNumber);
+ virtual ~CSbcErrTester();
+private:
+ void ConstructL();
+ CSbcErrTester(TInt aDriveNumber);
+
+public:
+ TInt WriteTestFile();
+ TInt ReadTestFile();
+
+ TInt WriteSenseErrorFile(TTestSenseError aTestSenseError);
+
+private:
+ /**
+ Place this buffer on block boundary and make buffers multiple of block size
+ to avoid block overlap
+ */
+ static const TInt KCmdBufferSize = KBlockSize;
+ static const TInt KEnableBufferSize = KBlockSize * 4;
+ static const TInt KSenseErrorBufferSize = KBlockSize * 4;
+
+ TBuf8<KCmdBufferSize> iCmdBuffer;
+ TBuf8<KEnableBufferSize> iEnableBuffer;
+ TBuf8<KSenseErrorBufferSize> iSenseErrorBuffer;
+ };
+
+
+
+class CWrPrTester: public CBase
+ {
+public:
+ static CWrPrTester* NewL(TInt aDriveNumber);
+ virtual ~CWrPrTester();
+private:
+ void ConstructL();
+ CWrPrTester(TInt aDriveNumber);
+
+public:
+ void SetWriteProtectL();
+ void ClrWriteProtectL();
+ TInt SetRemovableL();
+ TInt ClrRemovableL();
+ TInt WriteReadTestL();
+
+private:
+ enum TTestConfig
+ {
+ // Configure Media Write Protect Bit
+ ETestConfigMediaWpClr = 1,
+ ETestConfigMediaWpSet = 2,
+ // Configure Media Removable flag
+ ETestConfigMediaRmbClr = 3,
+ ETestConfigMediaRmbSet = 4
+ };
+
+private:
+ static const TPos KCmdPos = 0;
+ static const TInt KCmdBufferSize = KBlockSize;
+ TBuf8<KCmdBufferSize> iCmdBuffer;
+ TBuf8<KCmdBufferSize> iInCmdBuffer;
+
+ RTargetMedia iTargetMedia;
+
+ TTargetTestArea iTargetTestArea;
+ };
+
+
+#include "cblockdevicetester.inl"
+
+#ifdef XXX
+inline TPos TLocalBuffer::TargetStartPos() const
+ {
+ return static_cast<TInt64>(iStartLba) * KBlockSize;
+ }
+
+inline TPos TLocalBuffer::TargetPos(TPos aPos) const
+ {
+ return TargetStartPos() + aPos;
+ }
+#endif
+
+#endif // CBLOCKDEVICETESTER_H