os/kernelhwsrv/kerneltest/f32test/shostmassstorage/msman/test/cblockdevicetester.h
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
sl@0
    17
sl@0
    18
/**
sl@0
    19
 @file
sl@0
    20
 @internalTechnology
sl@0
    21
*/
sl@0
    22
sl@0
    23
#ifndef CBLOCKDEVICETESTER_H
sl@0
    24
#define CBLOCKDEVICETESTER_H
sl@0
    25
sl@0
    26
static const TInt KBlockSize = 0x200;
sl@0
    27
sl@0
    28
static const TInt KSizeInBlocks = 0x20;
sl@0
    29
static const TInt KSize = (KSizeInBlocks * KBlockSize);
sl@0
    30
sl@0
    31
sl@0
    32
typedef TUint TLba;
sl@0
    33
typedef TInt64 TPos;
sl@0
    34
sl@0
    35
sl@0
    36
class TLocalBuffer
sl@0
    37
    {
sl@0
    38
public:
sl@0
    39
    void Init();
sl@0
    40
    TPtrC8 Buffer() const {return iBuffer;}
sl@0
    41
    void Update(TInt aPos, TUint aLen);
sl@0
    42
sl@0
    43
public:
sl@0
    44
    TBuf8<KSize> iBuffer;
sl@0
    45
    };
sl@0
    46
sl@0
    47
sl@0
    48
class TLbaUtils
sl@0
    49
    {
sl@0
    50
public:
sl@0
    51
    static TPos Pos(TLba aLba);
sl@0
    52
    static TUint32 Length(TLba aBlocks);
sl@0
    53
    };
sl@0
    54
sl@0
    55
sl@0
    56
class RTargetMedia
sl@0
    57
    {
sl@0
    58
public:
sl@0
    59
    RTargetMedia(TInt aDriveNumber);
sl@0
    60
    void OpenL();
sl@0
    61
    void Close();
sl@0
    62
sl@0
    63
    TInt MediaRawWrite(TPos aPos, const TDesC8& aData);
sl@0
    64
    TInt MediaRawRead(TPos aPos, TUint32 aLen, TDes8& aData);
sl@0
    65
sl@0
    66
protected:
sl@0
    67
    RRawDisk iRawDisk;
sl@0
    68
    TInt iDriveNumber;
sl@0
    69
    };
sl@0
    70
sl@0
    71
sl@0
    72
sl@0
    73
class RBlockTargetMedia: public RTargetMedia
sl@0
    74
    {
sl@0
    75
public:
sl@0
    76
    RBlockTargetMedia(TInt aDriveNumber);
sl@0
    77
    void OpenL();
sl@0
    78
    TInt WriteBlock(TLba aLba);
sl@0
    79
    TInt ReadBlock(TLba aLba);
sl@0
    80
sl@0
    81
private:
sl@0
    82
    TBuf8<KBlockSize> iBlockData;
sl@0
    83
    };
sl@0
    84
sl@0
    85
sl@0
    86
class TTargetTestArea
sl@0
    87
    {
sl@0
    88
public:
sl@0
    89
    TTargetTestArea(RTargetMedia& aMedia);
sl@0
    90
    void CreateControlFile();
sl@0
    91
    void RemoveControlFile();
sl@0
    92
    void FindBlockStartL();
sl@0
    93
sl@0
    94
    TInt WriteBlockL(TBuf8<KBlockSize>& aBlock);
sl@0
    95
    TInt ReadBlockL(TBuf8<KBlockSize>& aBlock);
sl@0
    96
private:
sl@0
    97
    RTargetMedia& iTargetMedia;
sl@0
    98
    TInt iStartLba;
sl@0
    99
    };
sl@0
   100
sl@0
   101
sl@0
   102
sl@0
   103
class RTargetDrive: public RTargetMedia
sl@0
   104
    {
sl@0
   105
public:
sl@0
   106
    RTargetDrive(TInt aDriveNumber);
sl@0
   107
    TInt OpenTestAreaL(const TDesC8& aData);
sl@0
   108
sl@0
   109
    TInt Verify();
sl@0
   110
    TInt VerifyBlock(TLba aLba, TLba aBlocks);
sl@0
   111
    TInt Verify(TInt aPos, TUint aLen);
sl@0
   112
sl@0
   113
    TInt Update(TInt aPos, TUint aLen);
sl@0
   114
sl@0
   115
private:
sl@0
   116
    TPos StartPos() const;
sl@0
   117
    TPos TargetPos(TInt aPos) const;
sl@0
   118
sl@0
   119
private:
sl@0
   120
    TLba iStartLba;
sl@0
   121
    TPtrC8 iSource;
sl@0
   122
    TBuf8<KSize> iTmpBuffer;
sl@0
   123
    };
sl@0
   124
sl@0
   125
sl@0
   126
class CBlockDeviceTester: public CBase
sl@0
   127
	{
sl@0
   128
public:
sl@0
   129
    static CBlockDeviceTester* NewL(TInt aDriveNumber);
sl@0
   130
    ~CBlockDeviceTester();
sl@0
   131
protected:
sl@0
   132
    void ConstructL();
sl@0
   133
    CBlockDeviceTester(TInt aDriveNumber);
sl@0
   134
sl@0
   135
public:
sl@0
   136
    void OpenDriveL();
sl@0
   137
    void CloseDrive();
sl@0
   138
sl@0
   139
    TInt Update(TPos aPos, TUint aLen);
sl@0
   140
    TInt UpdateBlock(TLba aLba, TLba aBlocks);
sl@0
   141
sl@0
   142
    TInt VerifyDrive();
sl@0
   143
    TInt Verify(TPos aPos, TUint aLen);
sl@0
   144
    TInt VerifyBlock(TLba aLba, TLba aBlocks);
sl@0
   145
sl@0
   146
protected:
sl@0
   147
    // The drive parameters
sl@0
   148
    TInt iDriveNumber;
sl@0
   149
    TInt iDriveSizeInBlocks;
sl@0
   150
sl@0
   151
    // Local buffer
sl@0
   152
    TLocalBuffer iLocalBuffer;
sl@0
   153
    // The buffer on remote drive
sl@0
   154
    RTargetDrive iTargetDrive;
sl@0
   155
	};
sl@0
   156
sl@0
   157
sl@0
   158
sl@0
   159
class CBotTester: public CBlockDeviceTester
sl@0
   160
    {
sl@0
   161
public:
sl@0
   162
    enum TTestCase
sl@0
   163
        {
sl@0
   164
        ETestCaseTagMismatch = 1,
sl@0
   165
        ETestCaseInvalidSignature = 2,
sl@0
   166
        // No Data
sl@0
   167
        ETestCaseNoDataStallCsw = 3,
sl@0
   168
        ETestCaseNoDataPhaseError = 4,
sl@0
   169
        // Data OUT
sl@0
   170
        ETestCaseDoStallCsw = 5,
sl@0
   171
        ETestCaseDoStallData = 6,
sl@0
   172
        ETestCaseDoPhaseError = 7,
sl@0
   173
        ETestCaseDoResidue = 8,
sl@0
   174
        // Data IN
sl@0
   175
        ETestCaseDiStallCsw = 9,
sl@0
   176
        ETestCaseDiStallData = 0xA,
sl@0
   177
        ETestCaseDiPhaseError = 0xB,
sl@0
   178
        ETestCaseDiResidue = 0xC,
sl@0
   179
        // End
sl@0
   180
        ETestCaseNotSet
sl@0
   181
        };
sl@0
   182
sl@0
   183
    static const TPos KSetTestPos = 0x1000;
sl@0
   184
    static const TPos KWriteEnableFilePos = 0x2000;
sl@0
   185
    static const TPos KReadEnableFilePos = 0x3000;
sl@0
   186
    static const TPos KSenseErrorFile = 0x4000;
sl@0
   187
sl@0
   188
public:
sl@0
   189
    static CBotTester* NewL(TInt aDriveNumber);
sl@0
   190
    virtual ~CBotTester();
sl@0
   191
private:
sl@0
   192
    void ConstructL();
sl@0
   193
    CBotTester(TInt aDriveNumber);
sl@0
   194
sl@0
   195
public:
sl@0
   196
    TInt SetTest(TTestCase aTestCase);
sl@0
   197
    TInt WriteEnableFile();
sl@0
   198
    TInt InitReadEnableFile();
sl@0
   199
    TInt ReadEnableFile();
sl@0
   200
sl@0
   201
private:
sl@0
   202
    /**
sl@0
   203
    Place this buffer on block boundary and make buffers multiple of block size
sl@0
   204
    to avoid crossing block boundary
sl@0
   205
    */
sl@0
   206
    static const TInt KCmdBufferSize = KBlockSize;
sl@0
   207
    static const TInt KOutEnableBufferSize = KBlockSize * 4;
sl@0
   208
    static const TInt KInEnableBufferSize = KBlockSize * 4;
sl@0
   209
sl@0
   210
    TBuf8<KCmdBufferSize> iCmdBuffer;
sl@0
   211
    TBuf8<KOutEnableBufferSize> iOutEnableBuffer;
sl@0
   212
    TBuf8<KInEnableBufferSize> iInEnableBuffer;
sl@0
   213
    };
sl@0
   214
sl@0
   215
sl@0
   216
class CSbcErrTester: public CBlockDeviceTester
sl@0
   217
    {
sl@0
   218
public:
sl@0
   219
    enum TTestSenseError
sl@0
   220
        {
sl@0
   221
        ETestSenseErrorNoSense = 0,
sl@0
   222
        ETestSenseErrorMediaNotPresent = 1,
sl@0
   223
        ETestSenseErrorUnitAttention = 2
sl@0
   224
        };
sl@0
   225
sl@0
   226
sl@0
   227
    static const TPos KSetTestPos = 0x1000;
sl@0
   228
    static const TPos KWriteTestFilePos = 0x2000;
sl@0
   229
    static const TPos KReadTestFilePos = 0x3000;
sl@0
   230
    static const TPos KSenseErrorFile = 0x4000;
sl@0
   231
sl@0
   232
public:
sl@0
   233
    static CSbcErrTester* NewL(TInt aDriveNumber);
sl@0
   234
    virtual ~CSbcErrTester();
sl@0
   235
private:
sl@0
   236
    void ConstructL();
sl@0
   237
    CSbcErrTester(TInt aDriveNumber);
sl@0
   238
sl@0
   239
public:
sl@0
   240
    TInt WriteTestFile();
sl@0
   241
    TInt ReadTestFile();
sl@0
   242
sl@0
   243
    TInt WriteSenseErrorFile(TTestSenseError aTestSenseError);
sl@0
   244
sl@0
   245
private:
sl@0
   246
    /**
sl@0
   247
    Place this buffer on block boundary and make buffers multiple of block size
sl@0
   248
    to avoid block overlap
sl@0
   249
    */
sl@0
   250
    static const TInt KCmdBufferSize = KBlockSize;
sl@0
   251
    static const TInt KEnableBufferSize = KBlockSize * 4;
sl@0
   252
    static const TInt KSenseErrorBufferSize = KBlockSize * 4;
sl@0
   253
sl@0
   254
    TBuf8<KCmdBufferSize> iCmdBuffer;
sl@0
   255
    TBuf8<KEnableBufferSize> iEnableBuffer;
sl@0
   256
    TBuf8<KSenseErrorBufferSize> iSenseErrorBuffer;
sl@0
   257
    };
sl@0
   258
sl@0
   259
sl@0
   260
sl@0
   261
class CWrPrTester: public CBase
sl@0
   262
    {
sl@0
   263
public:
sl@0
   264
    static CWrPrTester* NewL(TInt aDriveNumber);
sl@0
   265
    virtual ~CWrPrTester();
sl@0
   266
private:
sl@0
   267
    void ConstructL();
sl@0
   268
    CWrPrTester(TInt aDriveNumber);
sl@0
   269
sl@0
   270
public:
sl@0
   271
    void SetWriteProtectL();
sl@0
   272
    void ClrWriteProtectL();
sl@0
   273
    TInt SetRemovableL();
sl@0
   274
    TInt ClrRemovableL();
sl@0
   275
    TInt WriteReadTestL();
sl@0
   276
sl@0
   277
private:
sl@0
   278
    enum TTestConfig
sl@0
   279
        {
sl@0
   280
        // Configure Media Write Protect Bit
sl@0
   281
        ETestConfigMediaWpClr = 1,
sl@0
   282
        ETestConfigMediaWpSet = 2,
sl@0
   283
        // Configure Media Removable flag
sl@0
   284
        ETestConfigMediaRmbClr = 3,
sl@0
   285
        ETestConfigMediaRmbSet = 4
sl@0
   286
        };
sl@0
   287
sl@0
   288
private:
sl@0
   289
    static const TPos KCmdPos = 0;
sl@0
   290
    static const TInt KCmdBufferSize = KBlockSize;
sl@0
   291
    TBuf8<KCmdBufferSize> iCmdBuffer;
sl@0
   292
    TBuf8<KCmdBufferSize> iInCmdBuffer;
sl@0
   293
sl@0
   294
    RTargetMedia iTargetMedia;
sl@0
   295
sl@0
   296
    TTargetTestArea iTargetTestArea;
sl@0
   297
    };
sl@0
   298
sl@0
   299
sl@0
   300
#include "cblockdevicetester.inl"
sl@0
   301
sl@0
   302
#ifdef XXX
sl@0
   303
inline TPos TLocalBuffer::TargetStartPos() const
sl@0
   304
    {
sl@0
   305
    return static_cast<TInt64>(iStartLba) * KBlockSize;
sl@0
   306
    }
sl@0
   307
sl@0
   308
inline TPos TLocalBuffer::TargetPos(TPos aPos) const
sl@0
   309
    {
sl@0
   310
    return TargetStartPos() + aPos;
sl@0
   311
    }
sl@0
   312
#endif
sl@0
   313
sl@0
   314
#endif // CBLOCKDEVICETESTER_H