tracesrv/tracecore/btrace_handler/src/TraceCoreMediaSWriter.cpp
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56
hgs
parents:
diff changeset
     1
// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     2
// All rights reserved.
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     7
//
hgs
parents:
diff changeset
     8
// Initial Contributors:
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    10
//
hgs
parents:
diff changeset
    11
// Contributors:
hgs
parents:
diff changeset
    12
//
hgs
parents:
diff changeset
    13
// Description:
hgs
parents:
diff changeset
    14
// Trace Core
hgs
parents:
diff changeset
    15
//
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
#include <kernel/kernel.h>
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include "TraceCoreMediaSWriter.h"
hgs
parents:
diff changeset
    20
#include "TraceCoreMediaIf.h"
hgs
parents:
diff changeset
    21
#include "TraceCoreConstants.h"
hgs
parents:
diff changeset
    22
#include "TraceCore.h"
hgs
parents:
diff changeset
    23
#include "TraceCoreSendReceive.h"
hgs
parents:
diff changeset
    24
#include "TraceCoreDebug.h"
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
//- Internal definitions ----------------------------------------------------
hgs
parents:
diff changeset
    28
#ifdef MEDIA_WRITER_STATISTICS
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
/**
hgs
parents:
diff changeset
    31
 * Collects statistics about the media writer
hgs
parents:
diff changeset
    32
 */
hgs
parents:
diff changeset
    33
class TMediaSWriterStatistics
hgs
parents:
diff changeset
    34
    {
hgs
parents:
diff changeset
    35
public:
hgs
parents:
diff changeset
    36
    TUint32 iTraces;                // Number of traces received
hgs
parents:
diff changeset
    37
    TUint32 iSent;                  // Number of traces sent
hgs
parents:
diff changeset
    38
    TUint32 iFailed;                // Number of traces failed to send
hgs
parents:
diff changeset
    39
    TUint32 iMissed;                // Number of traces missed due to not enough buffers
hgs
parents:
diff changeset
    40
    TUint32 iSleepCount;            // Number of times the threads have slept waiting for buffers
hgs
parents:
diff changeset
    41
    TUint32 iCannotSleepCount;      // Number of times a thread could not be slept when it should
hgs
parents:
diff changeset
    42
    TUint32 iBlockCount;            // Number of times a thread has been blocked waiting for buffers
hgs
parents:
diff changeset
    43
    TUint32 iCannotBlockCount;      // Number of times a thread could not be blocked when it should
hgs
parents:
diff changeset
    44
    TUint32 iWaitDidNotHelp;        // Number of waits that did not help
hgs
parents:
diff changeset
    45
    TUint32 iMinFreeBuffers;        // Minimum number of free buffers since boot
hgs
parents:
diff changeset
    46
    TUint32 iInvalidContextTrace;   // Number of IRQ / IDFC traces ignored
hgs
parents:
diff changeset
    47
    TUint32 iIdlePings;             // Statistics are written after some idle time
hgs
parents:
diff changeset
    48
    TBool iStatisticsChanged;       // Flags indicating change in statistics
hgs
parents:
diff changeset
    49
    };
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
/**
hgs
parents:
diff changeset
    52
 * Macro to wrap statistics-related code
hgs
parents:
diff changeset
    53
 */
hgs
parents:
diff changeset
    54
#define STATS( x ) x
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
/**
hgs
parents:
diff changeset
    57
 * Initializes the statistics structure
hgs
parents:
diff changeset
    58
 */
hgs
parents:
diff changeset
    59
TBool DTraceCoreMediaSWriter::InitStatistics()
hgs
parents:
diff changeset
    60
    {
hgs
parents:
diff changeset
    61
    iStatistics = new TMediaSWriterStatistics();
hgs
parents:
diff changeset
    62
    return iStatistics != NULL;
hgs
parents:
diff changeset
    63
    }
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
#else
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
/**
hgs
parents:
diff changeset
    68
 * Empty class for statistics if flag is not set
hgs
parents:
diff changeset
    69
 */
hgs
parents:
diff changeset
    70
class TMediaSWriterStatistics {};
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
#define STATS( x )
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
#endif
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
/**
hgs
parents:
diff changeset
    78
 * Max length of one trace
hgs
parents:
diff changeset
    79
 */
hgs
parents:
diff changeset
    80
const TUint32 KMaxBufLength = 256;
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
/**
hgs
parents:
diff changeset
    83
 * Number of traces that can be buffered
hgs
parents:
diff changeset
    84
 */
hgs
parents:
diff changeset
    85
const TUint32 KBufCount = 1;
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
/**
hgs
parents:
diff changeset
    88
 * Constructor
hgs
parents:
diff changeset
    89
 */
hgs
parents:
diff changeset
    90
EXPORT_C DTraceCoreMediaSWriter::DTraceCoreMediaSWriter()
hgs
parents:
diff changeset
    91
: DTraceCoreWriter( EWriterTypeUSBPhonet )
hgs
parents:
diff changeset
    92
, iSendDfc( DTraceCoreMediaSWriter::SendDfc, this, DTraceCore::GetActivationQ(), KDefaultDfcPriority )
hgs
parents:
diff changeset
    93
, iSendTimerActive( EFalse )
hgs
parents:
diff changeset
    94
, iFirstFreeBuffer( NULL )
hgs
parents:
diff changeset
    95
, iFirstReadyBuffer( NULL )
hgs
parents:
diff changeset
    96
, iLastReadyBuffer( NULL )
hgs
parents:
diff changeset
    97
, iTraceBuffers( NULL )
hgs
parents:
diff changeset
    98
, iFreeBuffers( KBufCount )
hgs
parents:
diff changeset
    99
, iSenderThread( NULL )
hgs
parents:
diff changeset
   100
, iLastTraceSent( 0 )
hgs
parents:
diff changeset
   101
, iStatistics( NULL )
hgs
parents:
diff changeset
   102
    {
hgs
parents:
diff changeset
   103
    // No implementation in constructor
hgs
parents:
diff changeset
   104
    }
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
/**
hgs
parents:
diff changeset
   108
 * Destructor
hgs
parents:
diff changeset
   109
 */
hgs
parents:
diff changeset
   110
EXPORT_C DTraceCoreMediaSWriter::~DTraceCoreMediaSWriter()
hgs
parents:
diff changeset
   111
    {
hgs
parents:
diff changeset
   112
    // Delete all trace buffers
hgs
parents:
diff changeset
   113
    for ( TUint i = 0; i < KBufCount; i++ )
hgs
parents:
diff changeset
   114
        {
hgs
parents:
diff changeset
   115
        delete[] iTraceBuffers[ i ].iBuffer;
hgs
parents:
diff changeset
   116
        }
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
    delete[] iTraceBuffers;
hgs
parents:
diff changeset
   119
    delete iStatistics;
hgs
parents:
diff changeset
   120
    }
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
/**
hgs
parents:
diff changeset
   124
 * Registers this writer to TraceCore
hgs
parents:
diff changeset
   125
 *
hgs
parents:
diff changeset
   126
 * @return KErrNone if successful
hgs
parents:
diff changeset
   127
 */
hgs
parents:
diff changeset
   128
EXPORT_C TInt DTraceCoreMediaSWriter::Register()
hgs
parents:
diff changeset
   129
    {
hgs
parents:
diff changeset
   130
    // Media writer uses the media interface from SendReceive
hgs
parents:
diff changeset
   131
    TInt retval( KErrGeneral );
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
    // Get TraceCore
hgs
parents:
diff changeset
   134
    DTraceCore* traceCore = DTraceCore::GetInstance();
hgs
parents:
diff changeset
   135
    if ( traceCore != NULL )
hgs
parents:
diff changeset
   136
        {
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
        // Get MediaWriter interface
hgs
parents:
diff changeset
   139
        DTraceCoreMediaIf* writerIf = traceCore->GetSendReceive().GetMediaWriterIf();
hgs
parents:
diff changeset
   140
        if ( writerIf != NULL )
hgs
parents:
diff changeset
   141
            {
hgs
parents:
diff changeset
   142
            // Allocates memory for the trace buffers
hgs
parents:
diff changeset
   143
            TBool memOK = ETrue;
hgs
parents:
diff changeset
   144
            STATS( memOK = InitStatistics() );
hgs
parents:
diff changeset
   145
            if(memOK)
hgs
parents:
diff changeset
   146
                {
hgs
parents:
diff changeset
   147
                iTraceBuffers = new TTraceBuffer[ KBufCount ];
hgs
parents:
diff changeset
   148
                }
hgs
parents:
diff changeset
   149
            if (iTraceBuffers == NULL)
hgs
parents:
diff changeset
   150
                {
hgs
parents:
diff changeset
   151
                memOK=EFalse;
hgs
parents:
diff changeset
   152
                }
hgs
parents:
diff changeset
   153
            if ( memOK )
hgs
parents:
diff changeset
   154
                {
hgs
parents:
diff changeset
   155
                for ( TUint i = 0; i < KBufCount && memOK; i++ )
hgs
parents:
diff changeset
   156
                    {
hgs
parents:
diff changeset
   157
                    iTraceBuffers[ i ].iBuffer = new TUint8[ KMaxBufLength ];
hgs
parents:
diff changeset
   158
                    if (iTraceBuffers[ i ].iBuffer == NULL )
hgs
parents:
diff changeset
   159
                        {
hgs
parents:
diff changeset
   160
                        memOK = EFalse;
hgs
parents:
diff changeset
   161
                        }
hgs
parents:
diff changeset
   162
                    if ( memOK )
hgs
parents:
diff changeset
   163
                        {
hgs
parents:
diff changeset
   164
                        // Initially all buffers are linked to iFirstFreeBuffer
hgs
parents:
diff changeset
   165
                        // Casting needed to work around armv5 "pointless comparison of unsigned integer with zero" warning
hgs
parents:
diff changeset
   166
                        if ( (TInt) i < (TInt) ( KBufCount - 1 ) )
hgs
parents:
diff changeset
   167
                            {
hgs
parents:
diff changeset
   168
                            iTraceBuffers[ i ].iNext = &( iTraceBuffers[ i + 1 ] );
hgs
parents:
diff changeset
   169
                            }
hgs
parents:
diff changeset
   170
                        }
hgs
parents:
diff changeset
   171
                    else
hgs
parents:
diff changeset
   172
                        {
hgs
parents:
diff changeset
   173
                        memOK = EFalse;
hgs
parents:
diff changeset
   174
                        }
hgs
parents:
diff changeset
   175
                    }
hgs
parents:
diff changeset
   176
                }
hgs
parents:
diff changeset
   177
            else
hgs
parents:
diff changeset
   178
                {
hgs
parents:
diff changeset
   179
                memOK = EFalse;
hgs
parents:
diff changeset
   180
                }
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
            // Memory was allocated succesfully
hgs
parents:
diff changeset
   183
            if ( memOK )
hgs
parents:
diff changeset
   184
                {
hgs
parents:
diff changeset
   185
                iFastCounterBetweenTraces = NKern::FastCounterFrequency() / GetTraceFrequency();
hgs
parents:
diff changeset
   186
                iFirstFreeBuffer = iTraceBuffers;
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
                // Register to the TraceCore
hgs
parents:
diff changeset
   189
                retval = DTraceCoreWriter::Register();
hgs
parents:
diff changeset
   190
                if ( retval == KErrNone )
hgs
parents:
diff changeset
   191
                    {
hgs
parents:
diff changeset
   192
                    iMediaIf = writerIf;
hgs
parents:
diff changeset
   193
                    }
hgs
parents:
diff changeset
   194
                }
hgs
parents:
diff changeset
   195
            else
hgs
parents:
diff changeset
   196
                {
hgs
parents:
diff changeset
   197
                retval = KErrNoMemory;
hgs
parents:
diff changeset
   198
                }
hgs
parents:
diff changeset
   199
            }
hgs
parents:
diff changeset
   200
        }
hgs
parents:
diff changeset
   201
    TC_TRACE( ETraceLevelFlow, Kern::Printf("<DTraceCoreMediaSWriter::Register - %d", retval) );
hgs
parents:
diff changeset
   202
    return retval;
hgs
parents:
diff changeset
   203
    }
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
/**
hgs
parents:
diff changeset
   207
 * Starts an entry
hgs
parents:
diff changeset
   208
 *
hgs
parents:
diff changeset
   209
 * @param aType the type of the trace entry
hgs
parents:
diff changeset
   210
 * @return the entry ID that is passed to other Write-functions
hgs
parents:
diff changeset
   211
 */
hgs
parents:
diff changeset
   212
EXPORT_C TUint32 DTraceCoreMediaSWriter::WriteStart( TWriterEntryType aType )
hgs
parents:
diff changeset
   213
    {
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
    // Detaches the first free buffer from the free buffers list
hgs
parents:
diff changeset
   216
    TInt context( NKern::CurrentContext() );
hgs
parents:
diff changeset
   217
    TTraceBuffer* freeBuf = NULL;
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
    if ( context == NKern::EThread || context == NKern::EIDFC )
hgs
parents:
diff changeset
   220
        {
hgs
parents:
diff changeset
   221
#ifndef __SMP__
hgs
parents:
diff changeset
   222
        // In non SMP env the __SPIN_LOCK macro is empty. We need Kern::Lock.
hgs
parents:
diff changeset
   223
		NKern::Lock(); // Unlocked in WriteEnd
hgs
parents:
diff changeset
   224
#else
hgs
parents:
diff changeset
   225
		//already locked by BTrace spin lock
hgs
parents:
diff changeset
   226
#endif
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
		freeBuf = iFirstFreeBuffer;
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
        if ( freeBuf != NULL )
hgs
parents:
diff changeset
   231
            {
hgs
parents:
diff changeset
   232
            StartBuffer( aType, *freeBuf );
hgs
parents:
diff changeset
   233
            }
hgs
parents:
diff changeset
   234
        }
hgs
parents:
diff changeset
   235
    else
hgs
parents:
diff changeset
   236
        {
hgs
parents:
diff changeset
   237
        freeBuf = NULL;
hgs
parents:
diff changeset
   238
        }
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
    return ( TUint32 )freeBuf;
hgs
parents:
diff changeset
   241
    }
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
/**
hgs
parents:
diff changeset
   245
 * Ends an entry
hgs
parents:
diff changeset
   246
 *
hgs
parents:
diff changeset
   247
 * @param aEntryId the entry ID returned by WriteStart
hgs
parents:
diff changeset
   248
 * @param aWriteEndingZero If ETrue, write ending zero.
hgs
parents:
diff changeset
   249
 */
hgs
parents:
diff changeset
   250
EXPORT_C void DTraceCoreMediaSWriter::WriteEnd( TUint32 aEntryId  )
hgs
parents:
diff changeset
   251
    {
hgs
parents:
diff changeset
   252
hgs
parents:
diff changeset
   253
    if ( aEntryId != 0 )
hgs
parents:
diff changeset
   254
        {
hgs
parents:
diff changeset
   255
        TTraceBuffer* buf = ( TTraceBuffer* )aEntryId;
hgs
parents:
diff changeset
   256
        TBool drop = EndBuffer( *buf );
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
        if( !drop ) //trace isn't dropped
hgs
parents:
diff changeset
   259
            {
hgs
parents:
diff changeset
   260
            iSendDfc.RawAdd();
hgs
parents:
diff changeset
   261
            }
hgs
parents:
diff changeset
   262
hgs
parents:
diff changeset
   263
        // Locked in WriteStart
hgs
parents:
diff changeset
   264
#ifndef __SMP__
hgs
parents:
diff changeset
   265
        // In non SMP the __SPIN_LOCK macro is empty. We need Kern::Unlock.
hgs
parents:
diff changeset
   266
		NKern::Unlock(); // Locked in WriteStart
hgs
parents:
diff changeset
   267
#else
hgs
parents:
diff changeset
   268
		//BTrace lock is used from outside of this method.
hgs
parents:
diff changeset
   269
#endif
hgs
parents:
diff changeset
   270
        }
hgs
parents:
diff changeset
   271
    }
hgs
parents:
diff changeset
   272
hgs
parents:
diff changeset
   273
hgs
parents:
diff changeset
   274
/**
hgs
parents:
diff changeset
   275
 * Writes 8-bit data to given entry
hgs
parents:
diff changeset
   276
 *
hgs
parents:
diff changeset
   277
 * @param aEntryId the entry ID returned by WriteStart
hgs
parents:
diff changeset
   278
 * @param aData the trace data
hgs
parents:
diff changeset
   279
 */
hgs
parents:
diff changeset
   280
EXPORT_C void DTraceCoreMediaSWriter::WriteData( TUint32 aEntryId, TUint8 aData )
hgs
parents:
diff changeset
   281
    {
hgs
parents:
diff changeset
   282
    if ( aEntryId != 0 )
hgs
parents:
diff changeset
   283
        {
hgs
parents:
diff changeset
   284
        TTraceBuffer* buf = ( TTraceBuffer* )aEntryId;
hgs
parents:
diff changeset
   285
        if ( buf->iLength < KMaxBufLength )
hgs
parents:
diff changeset
   286
            {
hgs
parents:
diff changeset
   287
            *( buf->iBuffer + buf->iLength ) = aData;
hgs
parents:
diff changeset
   288
            buf->iLength++;
hgs
parents:
diff changeset
   289
            }
hgs
parents:
diff changeset
   290
        }
hgs
parents:
diff changeset
   291
    }
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
hgs
parents:
diff changeset
   294
/**
hgs
parents:
diff changeset
   295
 * Writes 16-bit data to given entry
hgs
parents:
diff changeset
   296
 *
hgs
parents:
diff changeset
   297
 * @param aEntryId the entry ID returned by WriteStart
hgs
parents:
diff changeset
   298
 * @param aData the trace data
hgs
parents:
diff changeset
   299
 */
hgs
parents:
diff changeset
   300
EXPORT_C void DTraceCoreMediaSWriter::WriteData( TUint32 aEntryId, TUint16 aData )
hgs
parents:
diff changeset
   301
    {
hgs
parents:
diff changeset
   302
    if ( aEntryId != 0 )
hgs
parents:
diff changeset
   303
        {
hgs
parents:
diff changeset
   304
        TTraceBuffer* buf = ( TTraceBuffer* )aEntryId;
hgs
parents:
diff changeset
   305
        if ( buf->iLength + sizeof ( TUint16 ) <= KMaxBufLength )
hgs
parents:
diff changeset
   306
            {
hgs
parents:
diff changeset
   307
            *( ( TUint16* )( buf->iBuffer + buf->iLength ) ) = aData;
hgs
parents:
diff changeset
   308
            buf->iLength += sizeof ( TUint16 );
hgs
parents:
diff changeset
   309
            }
hgs
parents:
diff changeset
   310
        }
hgs
parents:
diff changeset
   311
    }
hgs
parents:
diff changeset
   312
hgs
parents:
diff changeset
   313
hgs
parents:
diff changeset
   314
/**
hgs
parents:
diff changeset
   315
 * Writes 32-bit data to given entry
hgs
parents:
diff changeset
   316
 *
hgs
parents:
diff changeset
   317
 * @param aEntryId the entry ID returned by WriteStart
hgs
parents:
diff changeset
   318
 * @param aData the trace data
hgs
parents:
diff changeset
   319
 */
hgs
parents:
diff changeset
   320
EXPORT_C void DTraceCoreMediaSWriter::WriteData( TUint32 aEntryId, TUint32 aData )
hgs
parents:
diff changeset
   321
    {
hgs
parents:
diff changeset
   322
    if ( aEntryId != 0 )
hgs
parents:
diff changeset
   323
        {
hgs
parents:
diff changeset
   324
        TTraceBuffer* buf = ( TTraceBuffer* )aEntryId;
hgs
parents:
diff changeset
   325
        if ( buf->iLength + sizeof ( TUint32 ) <= KMaxBufLength )
hgs
parents:
diff changeset
   326
            {
hgs
parents:
diff changeset
   327
            *( ( TUint32* )( buf->iBuffer + buf->iLength ) ) = SWAP_DATA( aData );
hgs
parents:
diff changeset
   328
            buf->iLength += sizeof ( TUint32 );
hgs
parents:
diff changeset
   329
            }
hgs
parents:
diff changeset
   330
        }
hgs
parents:
diff changeset
   331
    }
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
hgs
parents:
diff changeset
   334
/**
hgs
parents:
diff changeset
   335
 * DFC for sending data
hgs
parents:
diff changeset
   336
 *
hgs
parents:
diff changeset
   337
 * @param aMediaWriter the media writer
hgs
parents:
diff changeset
   338
 */
hgs
parents:
diff changeset
   339
void DTraceCoreMediaSWriter::SendDfc( TAny* aMediaWriter )
hgs
parents:
diff changeset
   340
    {
hgs
parents:
diff changeset
   341
    DTraceCoreMediaSWriter* writer = static_cast< DTraceCoreMediaSWriter* >( aMediaWriter );
hgs
parents:
diff changeset
   342
    writer->SendDfc();
hgs
parents:
diff changeset
   343
    }
hgs
parents:
diff changeset
   344
hgs
parents:
diff changeset
   345
hgs
parents:
diff changeset
   346
/**
hgs
parents:
diff changeset
   347
 * Called from static DFC function to send a buffer
hgs
parents:
diff changeset
   348
 */
hgs
parents:
diff changeset
   349
void DTraceCoreMediaSWriter::SendDfc()
hgs
parents:
diff changeset
   350
    {
hgs
parents:
diff changeset
   351
    // Create and send note random values
hgs
parents:
diff changeset
   352
    TBuf8<64> note; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   353
    note.Append(0xAE); // Dont care, CodForChk_Dis_Magic
hgs
parents:
diff changeset
   354
    note.Append(0xAE); // Dont care, CodForChk_Dis_Magic
hgs
parents:
diff changeset
   355
    note.Append(0x00); // Lentght MSB, CodForChk_Dis_Magic
hgs
parents:
diff changeset
   356
    note.Append(0x02); // Length LSB, CodForChk_Dis_Magic
hgs
parents:
diff changeset
   357
    note.Append(0xED); // Dont care, CodForChk_Dis_Magic
hgs
parents:
diff changeset
   358
    note.Append(0xED); // Dont care, CodForChk_Dis_Magic
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
    iMediaIf->SendTrace( note );
hgs
parents:
diff changeset
   361
    }
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
// End of File