tracesrv/reference/sf/adapt/osrndtools.nokia/xtiv2/drivers/src/xtitx.cpp
branchBUG 3869 Reference XTI device driver for Open System Trace
changeset 61 0e5a77c79f1e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracesrv/reference/sf/adapt/osrndtools.nokia/xtiv2/drivers/src/xtitx.cpp	Mon Oct 25 18:15:05 2010 +0100
@@ -0,0 +1,567 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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
+
+XtiTx
+
+*///=========================================================================
+
+
+//- Include Files  ----------------------------------------------------------
+
+#include <kernel/kern_priv.h>
+#include <rap.h>
+#include "xtitx.h"
+//- Namespace ---------------------------------------------------------------
+
+//- Using -------------------------------------------------------------------
+
+
+//- External Data -----------------------------------------------------------
+
+
+//- External Function Prototypes --------------------------------------------
+
+
+//- Constants ---------------------------------------------------------------
+
+// Definitions for XTI
+
+const TUint8  KHwOsmoMsgAsciiPrintfLE       = 0xC3;
+const TUint32 KHwOsmoChannelSize            = 0x40L;
+
+const TInt    KBitRateBufferSize            = 20; 
+const TUint8  KDataLengthAck                = 0x01;
+const TUint8  KDataMsgAck                   = 0x02;
+
+const TUint32 KHwOsmoControlOutputAddress   = KRapRegXTIOSMO + ( KOsmoTraceControlChannel * KXtiChannelSize );
+
+const TUint32 KHwOsmoSymbianChannel0Address = KRapRegXTIOSMO + ( KOsmoSymbianSystemChannel0 * KXtiChannelSize );
+
+const TUint32 KHwOsmoSymbianChannel1Address = KRapRegXTIOSMO + ( KOsmoSymbianSystemChannel1 * KXtiChannelSize );
+
+const TUint32 KHwOsmoTraceBoxConfigAddress  = KRapRegXTIOSMO + ( KOsmoTraceBoxConfigChannel * KHwOsmoChannelSize );
+
+const TUint32 KHwOsmoReceptionAckAddress    = KRapRegXTIOSMO + ( KOsmosReceptionAckChannel * KHwOsmoChannelSize );
+
+
+//- Macros ------------------------------------------------------------------
+
+
+//- Global and Local Variables ----------------------------------------------
+
+XtiTx* XtiTx::iXtiTxPtr = NULL;
+
+//- Local Function Prototypes -----------------------------------------------
+
+
+//===========================================================================
+
+//- Local Functions ---------------------------------------------------------
+
+//===========================================================================
+
+//- Member Functions --------------------------------------------------------
+
+/*
+-----------------------------------------------------------------------------
+
+    XtiTx
+
+    XtiTx
+    
+    Constructor
+-----------------------------------------------------------------------------
+*/
+
+XtiTx::XtiTx()
+    : iSymbianChannel0Open( EFalse )
+     ,iSymbianChannel1Open( EFalse )
+     ,iTraceEnabled( EFalse )
+    {
+    }
+
+
+/*
+-----------------------------------------------------------------------------
+    XtiTx
+
+    ~XtiTx
+    
+    Destructor
+-----------------------------------------------------------------------------
+*/
+XtiTx::~XtiTx()
+    {
+    }
+
+/*
+----------------------------------------------------------------------------
+
+    XtiTx
+
+    Instance
+
+    Return an instance to XtiTx interface. This method returns the
+    only XtiTx instance system can have, it is not possible to create
+    new instances of this class.
+
+    Return Values:          iXtiTxPtr* An instance to XtiTx class
+
+-----------------------------------------------------------------------------
+*/
+XtiTx* XtiTx::Instance( )
+    {
+    // Allow only 1 instance of XtiTx to exists at any time
+    if ( iXtiTxPtr == NULL )
+        {
+        iXtiTxPtr = new XtiTx();
+        if( iXtiTxPtr != NULL )
+            {
+            if( iXtiTxPtr->CheckRDC() )
+                {
+                iXtiTxPtr->iTraceEnabled = ETrue;
+                }
+            else
+                {
+                iXtiTxPtr->iTraceEnabled = EFalse;
+                }
+            }                                
+        }
+    return iXtiTxPtr;
+    }
+
+
+
+/*
+----------------------------------------------------------------------------
+
+    XtiTx
+
+    StartWrite
+
+    Start writing data to Symbian XTI channel. This method must be called before WriteData8, WriteData16 or 
+    WriteData32 can be used.                 
+    
+    @param   aChannel     XTI channel number. Must be KOsmoSymbianSystemChannel0 or KOsmoSymbianSystemChannel1 
+    
+    @param   aMessageId   XTI message ID. Defines what type of messages are sent.
+                          Must be KOsmoMsgSymbianTrace or KOsmoMsgAsciiPrintf.
+
+    Return Values:        KErrNone, if succesfull. Otherwise KErrGeneral
+
+-----------------------------------------------------------------------------
+*/
+EXPORT_C TInt XtiTx::StartWrite( TUint8 aChannel, TUint8 aMessageId )
+    {
+    TInt ret( KErrNone );
+    // Message type must be MCU Symbian trace message or MCU ASCII printf message
+    if( CheckMessageIdForStartWrite(aMessageId) && iXtiTxPtr->iTraceEnabled )
+        {
+         // OSMO channel must be 224 or 225
+        if( aChannel == KOsmoSymbianSystemChannel0 )
+            {
+            // Check that the channel is free
+            if( iXtiTxPtr->iSymbianChannel0Open == EFalse )
+                {
+                // Open the channel
+                TRap::SetRegister8( aMessageId, KHwOsmoSymbianChannel0Address );
+                iXtiTxPtr->iSymbianChannel0Open = ETrue;
+                }
+            else
+                {
+                ret = KErrGeneral;
+                }
+            }
+        else if( aChannel == KOsmoSymbianSystemChannel1 )
+            {
+            // Check that the channel is free
+            if( iXtiTxPtr->iSymbianChannel1Open == EFalse )
+                {
+                // Open the channel
+                TRap::SetRegister8( aMessageId, KHwOsmoSymbianChannel1Address );
+                iXtiTxPtr->iSymbianChannel1Open = ETrue;
+                }
+            else
+                {
+                ret = KErrGeneral;
+                }                
+            }
+        else
+            {
+            ret = KErrGeneral;
+            }
+        }
+    else
+        {
+        ret = KErrGeneral;
+        }
+    return ret;
+    }
+
+/*
+----------------------------------------------------------------------------
+
+    XtiTx
+
+    StopWrite
+
+    Stop writing data to Symbian XTI channel which has been started by method StartWrite().
+    
+    Return Values:        KErrNone, if succesfull. Otherwise KErrGeneral                 
+    
+-----------------------------------------------------------------------------
+*/
+EXPORT_C TInt XtiTx::StopWrite( TUint8 aChannel )
+    {
+    TInt ret( KErrNone );
+    
+    // OSMO channel must be 224 or 225
+    if( aChannel == KOsmoSymbianSystemChannel0 )
+       {
+       // Check that the channel is opened
+        if( iXtiTxPtr->iSymbianChannel0Open )
+            {
+            // close the channel
+            TRap::SetRegister8( KOsmoSymbianSystemChannel0, KHwOsmoControlOutputAddress );
+            iXtiTxPtr->iSymbianChannel0Open = EFalse;
+            }
+        else
+            {
+            ret = KErrGeneral;
+            }            
+        }
+    else if( aChannel == KOsmoSymbianSystemChannel1 )
+        {
+        // Check that the channel is opened
+        if( iXtiTxPtr->iSymbianChannel1Open )
+            {
+            // close the channel
+            TRap::SetRegister8( KOsmoSymbianSystemChannel1, KHwOsmoControlOutputAddress );
+            iXtiTxPtr->iSymbianChannel1Open = EFalse;
+            }
+        else
+            {
+            ret = KErrGeneral;
+            }            
+        }
+    else
+        {        
+        ret = KErrGeneral;
+        }
+    return ret;
+    }
+
+/*
+----------------------------------------------------------------------------
+
+    XtiTx
+
+    WriteData8
+
+    Write 8 bits data to KOsmoSymbianSystemChannel0 or KOsmoSymbianSystemChannel1
+    XTI channel in KOsmoMsgSymbianTrace or KOsmoMsgAsciiPrintf message format.
+    Before using this method XTI channel and message type must be defined with
+    method XtiTx::StartWrite().
+    
+    @param   aData     Data to be written
+    
+-----------------------------------------------------------------------------
+*/
+EXPORT_C void XtiTx::WriteData8( TUint8 aChannel, TUint8 aData )
+    {
+    // OSMO channel must be 224 or 225
+    if( aChannel == KOsmoSymbianSystemChannel0 )
+        {
+        // Check that the channel is opened
+        if( iXtiTxPtr->iSymbianChannel0Open )
+            {
+            // Send data
+            TRap::SetRegister8( aData, KHwOsmoSymbianChannel0Address );
+            }
+        }
+    else if( aChannel == KOsmoSymbianSystemChannel1 )
+        {
+        // Check that the channel is opened
+        if( iXtiTxPtr->iSymbianChannel1Open )
+            {
+            // Send data
+            TRap::SetRegister8( aData, KHwOsmoSymbianChannel1Address );
+            }
+        }
+    }
+
+
+/*
+----------------------------------------------------------------------------
+
+    XtiTx
+
+    WriteData16
+
+    Write 16 bits data to KOsmoSymbianSystemChannel0 or KOsmoSymbianSystemChannel1
+    XTI channel in KOsmoMsgSymbianTrace or KOsmoMsgAsciiPrintf message format.
+    Before using this method XTI channel and message type must be defined with
+    method XtiTx::StartWrite().
+    
+    @param   aData     Data to be written
+
+-----------------------------------------------------------------------------
+*/
+EXPORT_C void XtiTx::WriteData16( TUint8 aChannel, TUint16 aData )
+    {
+    // OSMO channel must be 224 or 225
+    if( aChannel == KOsmoSymbianSystemChannel0 )
+        {
+        // Check that the channel is opened
+        if( iXtiTxPtr->iSymbianChannel0Open )
+            {
+            // Send data
+            TRap::SetRegister16( aData, KHwOsmoSymbianChannel0Address );
+            }
+        }
+    else if( aChannel == KOsmoSymbianSystemChannel1 )
+        {
+        // Check that the channel is opened
+        if( iXtiTxPtr->iSymbianChannel1Open )
+            {
+            // Send data
+            TRap::SetRegister16( aData, KHwOsmoSymbianChannel1Address );
+            }
+        }
+    }
+
+
+/*
+----------------------------------------------------------------------------
+
+    XtiTx
+
+    WriteData32
+
+    Write 32 bits data to KOsmoSymbianSystemChannel0 or KOsmoSymbianSystemChannel1
+    XTI channel in KOsmoMsgSymbianTrace or KOsmoMsgAsciiPrintf message format.
+    Before using this method XTI channel and message type must be defined with
+    method XtiTx::StartWrite().
+    
+    @param   aData     Data to be written
+
+-----------------------------------------------------------------------------
+*/
+EXPORT_C void XtiTx::WriteData32( TUint8 aChannel, TUint32 aData )
+    {
+    // OSMO channel must be 224 or 225
+    if( aChannel == KOsmoSymbianSystemChannel0 )
+        {
+        // Check that the channel is opened
+        if( iXtiTxPtr->iSymbianChannel0Open )
+            {
+            // Send data
+            TRap::SetRegister32( aData, KHwOsmoSymbianChannel0Address );
+            }
+        }
+    else if( aChannel == KOsmoSymbianSystemChannel1 )
+        {
+        // Check that the channel is opened
+        if( iXtiTxPtr->iSymbianChannel1Open )
+            {
+            // Send data
+            TRap::SetRegister32( aData, KHwOsmoSymbianChannel1Address );
+            }
+        }
+    }    
+
+/*
+----------------------------------------------------------------------------
+
+    XtiTx
+
+    SetBitRate
+
+    Sends set bit rate command to Musti
+
+    @param   aBitRate     Uart bit rate
+
+-----------------------------------------------------------------------------
+*/
+EXPORT_C void XtiTx::SetBitRate( TUint aBitRate )
+    {
+    if( iXtiTxPtr->iTraceEnabled )
+        {
+        TBuf8<KBitRateBufferSize> string;
+
+        string.Append(_L("!B"));
+	    string.AppendNum( aBitRate, EDecimal );
+    
+        // Send Symbian trace activation message
+        TRap::SetRegister8( KHwOsmoMsgAsciiPrintfLE, KHwOsmoTraceBoxConfigAddress );
+
+        // Send data
+        for (TInt i = 0; i < string.Length(); i++ )
+            {
+            TRap::SetRegister8( string[i], KHwOsmoTraceBoxConfigAddress );
+            }
+
+        // Complete message
+        TRap::SetRegister8( KOsmoTraceBoxConfigChannel, KHwOsmoControlOutputAddress );
+        }
+    }
+
+/*
+----------------------------------------------------------------------------
+
+    XtiTx
+
+    SendDataLenAckMsg
+    
+    Sends acknowledgement for data length message to Musti
+   
+-----------------------------------------------------------------------------
+*/                                  
+EXPORT_C void XtiTx::SendDataLenAckMsg( )
+    {
+    if( iXtiTxPtr->iTraceEnabled )
+        {        
+        // Send Symbian trace activation message
+        TRap::SetRegister8( KHwOsmoMsgAsciiPrintfLE, KHwOsmoReceptionAckAddress );
+        TRap::SetRegister8( KDataLengthAck, KHwOsmoReceptionAckAddress );
+        // Complete message
+        TRap::SetRegister8( KOsmosReceptionAckChannel, KHwOsmoControlOutputAddress );
+        }
+    }
+
+/*
+----------------------------------------------------------------------------
+
+    XtiTx
+
+    SendDataLenAckMsg
+   
+    Sends acknowledgement for data message to Musti
+
+-----------------------------------------------------------------------------
+*/                                  
+EXPORT_C void XtiTx::SendDataRxAckMsg( )
+    {
+    if( iXtiTxPtr->iTraceEnabled )
+        {
+        // Send Symbian trace activation message
+        TRap::SetRegister8( KHwOsmoMsgAsciiPrintfLE, KHwOsmoReceptionAckAddress );
+        TRap::SetRegister8( KDataMsgAck, KHwOsmoReceptionAckAddress );
+        // Complete message
+        TRap::SetRegister8( KOsmosReceptionAckChannel, KHwOsmoControlOutputAddress );
+        }
+    }
+
+/*
+----------------------------------------------------------------------------
+
+    XtiTx
+
+    IsTraceEnabled
+
+    Returns the flag that tells if traces are enabled
+    
+    @Return EFalse if traces not enabled in RDC, otherwise true
+    
+-----------------------------------------------------------------------------
+*/
+
+
+EXPORT_C TBool XtiTx::IsTraceEnabled()
+    {
+    return iXtiTxPtr != NULL && iXtiTxPtr->iTraceEnabled;
+    }
+
+
+/*
+----------------------------------------------------------------------------
+
+    XtiTx
+
+    CheckMessageIdForStartWrite
+
+    Checks message ID is valid for writing
+    
+    @param   aMessageId   XTI message ID. Defines what type of messages are sent.
+                          Must be KOsmoMsgSymbianTrace, KOsmoMsgAsciiPrintf, or KOsmoMsgPhoneFormatted.
+
+    @Return EFalse if traces not enabled in RDC, otherwise true
+    
+-----------------------------------------------------------------------------
+*/
+
+
+TBool XtiTx::CheckMessageIdForStartWrite( TUint8 aMessageId )
+    {
+    // Message type must be MCU Symbian trace message or MCU ASCII printf message or Phone Formatted
+    if( aMessageId == KOsmoMsgSymbianTrace || aMessageId == KOsmoMsgAsciiPrintf || aMessageId == KOsmoMsgPhoneFormatted )
+        {
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+
+/*
+----------------------------------------------------------------------------
+
+    XtiTx
+
+    CheckRDC
+
+    Checks R&D Certificate status bit in test ram
+    
+    @Return EFalse if traces not enabled in RDC, otherwise true
+    
+-----------------------------------------------------------------------------
+*/
+
+
+TBool XtiTx::CheckRDC()
+	{
+    return ETrue;
+	}
+
+
+//===========================================================================
+
+//- Global Functions --------------------------------------------------------
+
+//---------------------------------------------------------------------------
+/**
+    The entry point for a standard extension. Creates XtiTx extension.
+
+    @return KErrNone, if successful
+*/
+DECLARE_STANDARD_EXTENSION()    
+    {
+    TInt ret( KErrNoMemory );
+
+    if ( XtiTx::Instance() != NULL )
+        {
+        ret = KErrNone;
+        }
+
+    return ret;
+    }                 
+
+//- Namespace ---------------------------------------------------------------
+
+// End of File