NOTICE: The Processors Wiki will End-of-Life on January 15, 2021. It is recommended to download any files or other content you may need that are hosted on processors.wiki.ti.com. The site is now set to read only.

User:DVT/UserDocumentation/DVT SoC Analyzer

From Texas Instruments Wiki
Jump to: navigation, search

Introduction[edit]

SocAnalyzer1.2.jpg

Built upon Texas Instruments' eXpressDSP™ data visualization technology (DVT), the SoC Analyzer simplifies your debugging of system integration issues and helps optimize system performance. It uses existing DSP/BIOS logging framework to collect information about system interaction and resource utilization in real time and transports the data to the host PC.

The SoC Analyzer employs reusable DVT components to analyze and present collected information in a rich set of analytic views like tables, line, state, discrete, and bar graphs.

This real-time tool provides system-level analysis and display for codec- based applications to help you understand:

  • System performance
  • Resource utilization
  • Thread interaction
  • System execution flow

Supported Devices[edit]

  • Tested Platforms
    • DM644x SoC Analyzer: DM6446
    • SoC Analyzer 1.0: DM6437
    • SoC Analyzer 1.1: DM6437 + DM648
    • SoC Analyzer 1.2: DM6437 + DM648 + DM6446 + DM6467


  • Multi Core minimal s/w requirement for standard use the SoC Analyzer
    • Linux
    • DSP/BIOS
    • Codec Engine
    • Trace Utility
    • HTTP Server ( Linux )


  • Single Core minimal s/w requirement for standard use of the SoC Analyzer
    • DSP/BIOS
    • DSP/BIOS Log Server
    • HTTP Server ( Network Developer's Kit - NDK - TCP/IP Stack )


The SoC Analyzer is delivered as part of the DVEVM/DVSDK and also available from the DVEVM update site

SoC Analyzer for Multi-Core Devices[edit]

Please refer to Multi Core SoC Analyzer

SoC Analyzer for Single-Core Devices[edit]

SoC Analyzer(Single Core)

Built upon Texas Instruments' eXpressDSP™ data visualization technology (DVT), the SoC Analyzer simplifies your debugging of a live application running on a single (DM643x, DM648x) target and helps optimize system performance. It uses existing DSP/BIOS logging framework to collect information about system interaction and resource utilization in real time and transports the data to the host PC. The SoC Analyzer employs reusable DVT components to analyze and present collected information in a rich set of summary tables (log values) and line, state, and discrete graphs.

This real-time tool provides system-level analysis and displays for codec-based applications to help you understand:

  • System performance bottlenecks
  • Resource utilization
  • Thread interaction
  • System execution flow

Using a standard programming pattern, the SoC Analyzer decodes, evaluates, and displays logged information from the:

  • DSP BIOS
  • Codec Engine
  • TI device drivers
  • BIOS Log Server Utility (samples EMIF Counters every 10 milliseconds)

The SoC Analyzer uses the DSP BIOS logging elements to display time-based visualizations and analysis:

  • Execution analysis - displays BIOS, codec, and TI device driver tasks, SWIs, and PRDs
  • Load Analysis - displays CPU and task loads
  • Throughput analysis - displays peripheral throughput and bandwidth, along with EMIF events
  • Latency analysis - display driver and code execution
  • System performance - display codec and driver profiling

Device drivers were instrumented to collect information required for performing event tracking, latency, throughput and bandwidth. This was achieved by taking advantage of existing DSP/BIOS logging facilities, and conforming to a logging format, DVT Event Log, that SoC analyzer tool uses to visualize the collected information.

SoC Analyzer communicates with the target hardware using HTTP and relies on following services from BIOS/DSP framework to collect, transfer and decode the BIOS logs.

  • NDK to provide TCPIP stack and an HTTP Server
  • BIOSUTILS CGI scripts to provide following services
    • Start / Stop streaming the collected logs
    • Capture collected logs in single shot (non-streaming)
    • Collect CPU Load information and EMIF Counter values
    • Configure EMIF by Reading and Writing to memory location
  • rtadecode commandline decoder to decode raw BIOS logs on host side using the symbol file

SoC Analyzer provides means to visualize collected data and made up of the following components.

  • DVT Solution
    • Data Model
    • Data Views
    • Control Panel

DVT Event Log Format[edit]

DVT Event Log format is a generic logging format on top of DSP/BIOS LogPrintf4, that was defined as part of SoC Analyzer project.

Peripheral drivers used this logging format to log information on target side.

Please see: DVT Event Log

HTTP Transfer[edit]

As part of SoC Analyzer project, a number of CGI commands on target running an NDK stack were defined to enable us to perform:

  • Log Transfer from target to host
  • Control the logs
  • Read/Write Memory Locations
  • Other

These commands were defined in BIOSUTILS package which is shipped as part of DSP/BIOS offering and using NDK stack.

Log Transfer Commands[edit]

Start Streaming
http://<target-cgi-path>/startstreaming.cgi?&pollRate=<N>&logMask=<binary_data_mask>

Transfer logs periodically with the given refresh rate Stream to be closed by Stop Streaming

Stop Streaming
http://<target_cgi_path>/stopstreaming
Transfer once
http://<target-cgi-path>/capturelogs.cgi?logMask=<binary_data_mask>

Transfer all the logs at once No refresh rate No need to stop stream by stopstreaming cgi, close connection after logs get transferred

Log Control Commands[edit]

Start collecting Logs
http://<target_cgi_path>/startlogging.cgi
Stop collecting Logs
http://<target_cgi_path>/stoplogging.cgi
Enable / Disable Logs (logMask = 0 will disable all logs)
http://<target-cgi-path>/enablelogging.cgi?logMask=<binary_data_mask>
Flush Logs (
http://<target-cgi-path>/logflush.cgi?logMask=<binary_data_mask>

Read/Write Memory Location[edit]

ReadWord - Used for EMIFConfig but can be used for any address
http://<target_cgi_path>/readword.cgi?address=<address>
WriteWord - Used for EMIFConfig but can be used for any address
http://<target_cgi_path>/writeword.cgi?address=<address>&value=<numbervalue>
ReadBlock
http://<target_cgi_path>/read.cgi?address=<address>&size=<size>

Misc. Commands[edit]

Get CPU Speed
http://<target-cgi-path>/getcpuspeed.cgi 
Set Track Logs - monitor values of the given addresses and log them periodically to a log buffer
http://<target-cgi-path>/settrackaddrs.cgi?addr1=<val1>&addr2=<val2>

Control Panel[edit]

The General view of the Control Panel is used to capture and process data from the target application. You must provide the target IP address.

Note: The IP address is visible in CCStudio only when you load an application on the target board. If the demonstration application is transferred to flash memory, you should use the DVSDK host application to detect the IP address of the running board.

Control Panel General Tab

To better manage the TCP/IP transport bandwidth, the Setup tab of the Control Panel provides the option to enable or disable the log collection and control log transfer from the target board. Transported data is stored in files on the PC. You can keep multiple sets of data logs by specifying different session names in the SoC Analyzer Control Panel.

Control Panel Setup Tab


Applications must enable logging on the required components. Appropriate BIOS Log buffer sizes must be set large enough to collect the duration of logs required.

The Control Panel View user interface performs several key functions:

  • Displays the initial Solution Perspective, the first time you start SoC Analyzer
  • Controls data capture of logs on the target application board
  • Selects logs of interest and external memory interface (EMIF) configuration
  • Controls log data transfer to and data processing on the PC host
  • Manages your SoC Analyzer session data

To work with application logs, the Control Panel View supports these operational Action modes:

  • Online Capture - Captures data live from the application for a specific duration. Data is captured into buffers in the target in real time and transferred (using HTTP) to the host for processing.
  • Offline Capture - Transports data already in the target log buffers. Data is transported by HTTP to the host for analysis.
  • Post Process - Processes data previously captured and stored in a session on the PC.


Offline Capture[edit]

Here is a sample flow of HTTP requests:

User may specify the number of seconds that s/he wants to collect the logs for.

User presses start collecting logs
  • Read CPU Speed and EMIF configuration registers:
http://<target-cgi-path>/readword.cgi?address=<addr> 
http://<target-cgi-path>/readword.cgi?address=<addr> 
http://<target-cgi-path>/getcpuspeed.cgi 
  • Set track logs for EMIF counters
http://<target-cgi-path>/settrackaddrs.cgi?addr1=0x20000040&addr2=0x20000044 
  • Flush the logs - This is to start off with a clean log
http://<target-cgi-path>/logflush.cgi?logMask=<binary_data_mask> 
  • Enable logging - Logs on log server are getting collected now but as nothing gets transferred to host yet we don't see any data on DVT yet.
http://<target-cgi-path>/enablelogging.cgi?logMask=<binary_data_mask> 
User presses stop collecting logs or the timer expires.
  • Disable the logs
http://<target-cgi-path>/enablelogging.cgi?logMask=0 
  • Start streaming(transferring to host)
http://<target-cgi-path>/capturelogs.cgi?logMask=<binary_data_mask> 

Stream the logs[edit]

User presses start
  • Read CPU Speed and EMIF configuration registers:
http://<target-cgi-path>/readword.cgi?address=<addr> 
http://<target-cgi-path>/readword.cgi?address=<addr> 
http://<target-cgi-path>/getcpuspeed.cgi 
  • Set track logs for EMIF counters
http://<target-cgi-path>/settrackaddrs.cgi?addr1=0x20000040&addr2=0x20000044 
  • Flush the logs - This is to start off with a clean log
http://<target-cgi-path>/logflush.cgi?logMask=<binary_data_mask> 
  • Enable logging for the selected log ids
http://<target-cgi-path>/enablelogging.cgi?logMask=<binary_data_mask> 
  • Start streaming(transferring to host) the logs (for the user selection)
http://<target-cgi-path>/startstreaming.cgi?&pollRate=14&logMask=<binary_data_mask> 
DVT analyzes and visualizes data as they are received
User presses stop
  • Disable collecting the logs
http://<target-cgi-path>/disablelogging.cgi?logMask=0 
  • Stop streaming(transferring) the logs
http://<target-cgi-path>/stopstreaming.cgi 
  • Wait until stream closes

Control Panel .cp.xml file[edit]

SoC Analyzer employs DVT's Control Panel configuration file (.cp.xml) to achieve this but it uses a custom made view component instead of generic control panel view.

Here is the .cp.xml file:

<?xml version="1.0" encoding="UTF-8"?> <ControlPanel>

  <ControlPanelView name="com.ti.dvt.c64lc.controlpanel.views.C64lcControlPanel" />
  <Node name="Post Process">
     <Solution name="64LC_sample.sol"/>
     <Property name="session" display="Session" class="com.ti.dvt.davinci.controlpanel.DavinciControlPanelModel"/>
     <Property name="symbolFile" display="Symbol File" class="com.ti.dvt.davinci.controlpanel.DavinciControlPanelModel"/>    
           
     <ActionNode name="Start" button="Start" condition="'(new String("'Session'")).equals("sessions\");'" logError="'Session cannot be null. Please pick a value from the sessions combo box.'" >
     <ActionNode name="validateSymbolFile" condition="'(new String("'Symbol File'")).equals("");" logError="'Please fill in Symbol File.'">      
     	<ResetDP />
     	<SetViewProperty viewName="Running Task" name="Number of categories" value="'0'"/>      

<Set dpName="HTTPDataSource" name="Mode" value="'file'"/> <Set dpName="HTTPDataSource" name="Input File Name" value="Session'\bioslog.bin'"/> <Set dpName="RTALiteDecoder" name="Coff File Name" value="Symbol File"/>

       <Set dpName="EMIFTranslator" name="XMLconfig File" value="Session'\emif.xml'"/>

<ReadProperty filename="SolutionDir'\'Session'\CPUSpeed.properties'" />

       <Set dpName="RTALiteDecoder" name="Cpu Speed" value="CPU Speed" />

<ScheduleJobs /> <StartDP />

     </ActionNode>
     </ActionNode>
     
     <ActionNode name="Stop" button="Stop">
     	<Set dpName="HTTPDataSource" name="Stop Url" value=""/>
     	<StopDP />
     	<ResetJobs />
     </ActionNode>
     
     <ActionNode name="Reset" button="Reset">
     	<Set dpName="HTTPDataSource" name="Stop Url" value=""/>
       <StopDP />
     	<ResetJobs />
     	<ResetDP />
     	<SetViewProperty viewName="Running Task" name="Number of categories" value="'0'"/>
       <Set dpName="EMIFTranslator" name="XMLconfig File" value="'emif.xml'"/>
     </ActionNode>
     
     <ActionNode name="Reload" button="Reload">
       <ResetJobs />
     	<Solution name="64LC_sample.sol" force="true"/>
     </ActionNode>      
      
     <ActionNode name="Restore" button="Restore">
     	<ResetJobs />
       <CloseSolution/>
       <CMD cmd="'xcopy /Y /E /R /Q "'SolutionDir'_factory" "'SolutionDir'"'" verify="'Are you sure you want to replace your settings with factory settings?'"/>             
     	<Solution name="64LC_sample.sol" force="true"/>      	
     </ActionNode>
           
  </Node>
  
  <Node name="Online Capture">
     <Solution name="64LC_sample.sol"/>
     <Property name="session" display="Session" class="com.ti.dvt.davinci.controlpanel.DavinciControlPanelModel"/>      
     <Property name="targetIpAddress" display="Target IP Address" class="com.ti.dvt.davinci.controlpanel.DavinciControlPanelModel"/>      
     <Property name="symbolFile" display="Symbol File" class="com.ti.dvt.davinci.controlpanel.DavinciControlPanelModel"/>            
     <Property name="live" display="Live" class="com.ti.dvt.davinci.controlpanel.DavinciControlPanelModel" value="'true'"/>
     
     <ActionNode name="Start" button="Start" />	
     
     <ActionNode name="Stop" button="Stop">
     	<Set dpName="HTTPDataSource" name="Stop Url" value=""/>
     	<StopDP />
     	<ResetJobs />
     </ActionNode>
     
     <ActionNode name="Reset" button="Reset">
      	<Set dpName="HTTPDataSource" name="Stop Url" value=""/>
       <StopDP />
     	<ResetJobs />
     	<ResetDP />
     	<SetViewProperty viewName="Running Task" name="Number of categories" value="'0'"/>
       <Set dpName="EMIFTranslator" name="XMLconfig File" value="'emif.xml'"/>      	
     </ActionNode>
           
     <ActionNode name="StartTargetCapture" button="StartTargetCapture" condition="'new java.net.URL("http://'Target IP Address'").openConnection().connect();'" logError="'Webserver on "'Target IP Address'" is unreachable'" >
     <ActionNode name="sessionOverWrite" condition="'((new java.io.File("'SolutionDir'\'Session'\")).listFiles()).length>0;'" confirm="'Overwrite "'session'" session?'">      
     <ActionNode name ="validateSession" condition="'(new String("'Session'")).equals("sessions\");'" logError="'Session cannot be null. Please create a new session by providing a new name in sessions combo box.'" >
     <ActionNode name="validateSymbolFile" condition="'(new String("'Symbol File'")).equals("");" logError="'Please fill in Symbol File.'">      
     
       <HTTP name="Setting Track Logs" URL="'http://'Target IP Address'/settrackaddrs.cgi?addr1=0x20000040&addr2=0x20000044'" />                      

<Java><![CDATA['

temp = Packages.com.ti.dvt.emifconfig.EMIFRegisters.toXMLString("http://'Target IP Address'/readword.cgi?addr=%ADDRESS%","DM643x");

fw = new java.io.FileWriter("'SolutionDir'\'Session'\emif.xml"); fw.write(temp); fw.close();

']]></Java>

       <Java result="CPU Speed"><![CDATA['
              urlConnection = new Packages.java.net.URL("http://'Target IP Address'/getcpuspeed.cgi").openConnection();
              urlConnection.connect();
              httpURLInputStream = urlConnection.getInputStream();
              isr = new Packages.java.io.BufferedInputStream(httpURLInputStream);
              bb = Packages.java.nio.ByteBuffer.allocateDirect(4);
              bb.order(Packages.java.nio.ByteOrder.nativeOrder());
              for (i=0; i<4; i++)
                bb.put(new Packages.java.lang.Integer(isr.read()).byteValue());               
              isr.close();
              bb.rewind();
              bb.getInt() / 1000.0;
                      
       ']]></Java> 
       <WriteProperty name="CPU Speed" filename="SolutionDir'\'Session'\CPUSpeed.properties'" />
       <Set dpName="RTALiteDecoder" name="Cpu Speed" value="CPU Speed" />
       <HTTP name="Flushing selected logs" URL="'http://'Target IP Address'/logflush.cgi?logMask='Flush Mask" />
       <HTTP name="Enabling selected logs" URL="'http://'Target IP Address'/enableLogging.cgi?logMask='Log Mask" />
     </ActionNode>          
     </ActionNode>        
     </ActionNode>
     </ActionNode>
     <ActionNode name="StopTargetCapture" button="StopTargetCapture" condition="'new java.net.URL("http://'Target IP Address'").openConnection().connect();'" logError="'Webserver on "'Target IP Address'" is unreachable'" >
     <HTTP name="Disabling selected logs" URL="'http://'Target IP Address'/disablelogging.cgi?logMask='Log Mask" /> 

<ResetDP /> <ScheduleJobs />

       <CMD cmd="'cmd /c del "'SolutionDir'\'Session'\bioslog.bin" -ui - i" />

<HTTP name="Starting the transfer" URL="'http://'Target IP Address'/capturelogs.cgi?logMask='Log Mask" destination="Session'\bioslog.bin'"/>

        <HTTP name="Enabling selected logs" URL="'http://'Target IP Address'/enableLogging.cgi?logMask='Log Mask" /> 
       

<Set dpName="HTTPDataSource" name="Mode" value="'file'"/> <Set dpName="HTTPDataSource" name="Input File Name" value="Session'\bioslog.bin'"/> <Set dpName="RTALiteDecoder" name="Coff File Name" value="Symbol File"/>

<Set dpName="EMIFTranslator" name="XMLconfig File" value="'emif.xml'"/> <Set dpName="EMIFTranslator" name="XMLconfig File" value="Session'\emif.xml'"/>

<StartDP />

     </ActionNode>
     
     
     <ActionNode name="Reload" button="Reload">
       <ResetJobs />
     	<Solution name="64LC_sample.sol" force="true"/>      	
     </ActionNode>
     
     <ActionNode name="Restore" button="Restore">
       <ResetJobs />
       <CloseSolution/>
       <CMD cmd="'xcopy /Y /E /R /Q "'SolutionDir'_factory" "'SolutionDir'"'" verify="'Are you sure you want to replace your settings with factory settings?'"/>             
     	<Solution name="64LC_sample.sol" force="true"/>
     </ActionNode>      
     
    <ActionNode name="EMIF Configuration" condition="'new java.net.URL("http://'Target IP Address'").openConnection().connect();'" logError="'Webserver on "'Target IP Address'" is unreachable'" >

<View name="com.ti.dvt.emifconfig.views.EMIFConfigView"/> <SetViewProperty name="Write Url" viewName="com.ti.dvt.emifconfig.views.EMIFConfigView" value="'http://'Target IP Address'/writeword.cgi?addr=%ADDRESS%&val=%VALUE%'"/> <SetViewProperty name="Platform" viewName="com.ti.dvt.emifconfig.views.EMIFConfigView" value="'DM643x'"/> <SetViewProperty name="Read Url" viewName="com.ti.dvt.emifconfig.views.EMIFConfigView" value="'http://'Target IP Address'/readword.cgi?addr=%ADDRESS%'"/>

    </ActionNode> 
     
     
  </Node>
  <Node name="Offline Capture">
     <Solution name="64LC_sample.sol"/>
     <Property name="session" display="Session" class="com.ti.dvt.davinci.controlpanel.DavinciControlPanelModel"/>      
     <Property name="targetIpAddress" display="Target IP Address" class="com.ti.dvt.davinci.controlpanel.DavinciControlPanelModel"/>
     <Property name="symbolFile" display="Symbol File" class="com.ti.dvt.davinci.controlpanel.DavinciControlPanelModel"/>
     
     <ActionNode name="Stop" button="Stop">
      	<Set dpName="HTTPDataSource" name="Stop Url" value=""/>
     	<StopDP />
     	<ResetJobs />
     </ActionNode>
     
     <ActionNode name="Reset" button="Reset">
      	<Set dpName="HTTPDataSource" name="Stop Url" value=""/>      
       <StopDP />
     	<ResetJobs />
     	<ResetDP />
     	<SetViewProperty viewName="Running Task" name="Number of categories" value="'0'"/>
       <Set dpName="EMIFTranslator" name="XMLconfig File" value="'emif.xml'"/>
     </ActionNode>
           
     <ActionNode name="Start" button="Start" condition="'(new String("'Session'")).equals("sessions\");'" logError="'Session cannot be null. Please create a new session by providing a new name in sessions combo box.'" >      
     <ActionNode name="validateSymbolFile" condition="'(new String("'Symbol File'")).equals("");" logError="'Please fill in Symbol File.'">      
     <ActionNode name ="validateIP" condition="'new java.net.URL("http://'Target IP Address'").openConnection().connect();'" logError="'Webserver on "'Target IP Address'" is unreachable'" >      
     <ActionNode name="SessionOverWrite" condition="'((new java.io.File("'SolutionDir'\'Session'\")).listFiles()).length>0;'" confirm="'Overwrite "'session'" session?'">      

<ResetDP />

     	<SetViewProperty viewName="Running Task" name="Number of categories" value="'0'"/>

<ScheduleJobs />

       <CMD cmd="'cmd /c del "'SolutionDir'\'Session'\bioslog.bin" -ui - i" />
       <HTTP name="Setting Track Logs" URL="'http://'Target IP Address'/settrackaddrs.cgi?addr1=0x20000040&addr2=0x20000044'" />                
       

<Java><![CDATA['

temp = Packages.com.ti.dvt.emifconfig.EMIFRegisters.toXMLString("http://'Target IP Address'/readword.cgi?addr=%ADDRESS%","DM643x");

fw = new java.io.FileWriter("'SolutionDir'\'Session'\emif.xml"); fw.write(temp); fw.close();

']]></Java>

       <Java result="CPU Speed"><![CDATA['
              urlConnection = new Packages.java.net.URL("http://'Target IP Address'/getcpuspeed.cgi").openConnection();
              urlConnection.connect();
              httpURLInputStream = urlConnection.getInputStream();
              isr = new Packages.java.io.BufferedInputStream(httpURLInputStream);
              bb = Packages.java.nio.ByteBuffer.allocateDirect(4);
              bb.order(Packages.java.nio.ByteOrder.nativeOrder());
              for (i=0; i<4; i++)
                bb.put(new Packages.java.lang.Integer(isr.read()).byteValue());               
              isr.close();
              bb.rewind();
              bb.getInt() / 1000.0;
                      
       ']]></Java> 
       <WriteProperty name="CPU Speed" filename="SolutionDir'\'Session'\CPUSpeed.properties'" />
       <Set dpName="RTALiteDecoder" name="Cpu Speed" value="CPU Speed" />                
       
       <HTTP name="Enabling selected logs" URL="'http://'Target IP Address'/enableLogging.cgi?logMask='Log Mask" />
       

<HTTP name="Starting the transfer" URL="'http://'Target IP Address'/capturelogs.cgi?logMask='Log Mask" destination="Session'\bioslog.bin'"/>

<Set dpName="HTTPDataSource" name="Mode" value="'file'"/> <Set dpName="HTTPDataSource" name="Input File Name" value="Session'\bioslog.bin'"/> <Set dpName="RTALiteDecoder" name="Coff File Name" value="Symbol File"/>

<Set dpName="EMIFTranslator" name="XMLconfig File" value="'emif.xml'"/> <Set dpName="EMIFTranslator" name="XMLconfig File" value="Session'\emif.xml'"/>


<StartDP />

     </ActionNode>
     </ActionNode>
     </ActionNode>
     </ActionNode>
           
     <ActionNode name="Reload" button="Reload">
       <ResetJobs />
     	<Solution name="64LC_sample.sol" force="true"/>      	
     </ActionNode>
     
     <ActionNode name="Restore" button="Restore">
       <ResetJobs />
       <CloseSolution/>
       <CMD cmd="'xcopy /Y /E /R /Q "'SolutionDir'_factory" "'SolutionDir'"'" verify="'Are you sure you want to replace your settings with factory settings?'"/>             
     	<Solution name="64LC_sample.sol" force="true"/>
     </ActionNode>      
     
    <ActionNode name="EMIF Configuration" condition="'new java.net.URL("http://'Target IP Address'").openConnection().connect();'" logError="'Webserver on "'Target IP Address'" is unreachable'" >

<View name="com.ti.dvt.emifconfig.views.EMIFConfigView"/> <SetViewProperty name="Write Url" viewName="com.ti.dvt.emifconfig.views.EMIFConfigView" value="'http://'Target IP Address'/writeword.cgi?addr=%ADDRESS%&val=%VALUE%'"/> <SetViewProperty name="Platform" viewName="com.ti.dvt.emifconfig.views.EMIFConfigView" value="'DM643x'"/> <SetViewProperty name="Read Url" viewName="com.ti.dvt.emifconfig.views.EMIFConfigView" value="'http://'Target IP Address'/readword.cgi?addr=%ADDRESS%'"/>

    </ActionNode> 
     
          
     
  </Node>

</ControlPanel>

DVT Solution[edit]

After selecting any Action (for example, Post Process) from the drop-down selection list in Control Panel and pressing the start button, depending on parameters specified in the control panel xml file, DVT Solution will be configured and then started.

Here is the DVT Solution for single core SoC Analyzer that employs DVT components: Solution 64lc.jpg

As an example please see how Codec Engine Logs are processed through the solution:

How Codec Engine Logs are Processed in Solution[edit]

For "DSP only" devices such as 64LC (DM643x) / Kailash (DM648x), Codec Engine logs data into a reserved buffer called "ti_sdo_ce_osal_LOG_Buffer" using an extended version of LOG_printf4() that allows passing 4 args as follows:

Description arg0 arg1 arg2 arg3 Format string
(optional) Sequence description String describing event, in the form Extension:sequence (eg "AUDDEC1:process", "VIDENC:control", "SCALE:scaleby2") Codec handle undefined 0 "%s" (format for arg0)
pre-Activate Task Id Codec handle undefined 1 undefined
post-Activate Codec name (eg, "mp4") Codec handle undefined 2 "%s" (format string for arg0)
pre-Deactivate undefined Codec handle undefined 3 undefined
post-Deactivate undefined Codec handle undefined 4 undefined

SoC Analyzer transfers the BIOS logs to host using HTTP and BIOSUtil's LogServer, runs rtadecode.exe to translate the raw binary data to a user readable format. All of the BIOS logs can be viewes in "All Logs" table before they are

Codecengine0.jpg

The logs are passed down CodecEngineLogTranslator to extract/decode the data in that log buffer to use it furthur down for visualizing and analysing Codec Engine related logs.

Tip.gif As you can see from CodecEngineLogTranslator, it uses "CCEEvent Log Name" to identify the log buffer it needs to work on. ( here "ti_sdo_ce_osal_LOG_Buffer") This buffer name is also used in a filter where we are routing data to Codec Engine related data views.

Codecengine1.jpg

CodecEngineLogTranslator[edit]

CodecEngineLogTranslator is a DVT translator that expects a RTALiteDecoder format (such as the one seen in All Logs table) as its input. Filling in EventName, EventHandle, EventType and adding in two new Columns: CodecEngineEvent, ThreadId.

Where:

  • EventName holds CodecName (e.g. mpeg4, h264, ...)
  • EventHandle holds CodecHandle
  • EventType holds CodecState as in CodecEngine states (e.g. Activate, Execute, Deactivate)
  • CodecEngineEvent holds String describing event, in the form Extension:sequence (eg "AUDDEC1:process", "VIDENC:control", "SCALE:scaleby2")
  • ThreadId holds calling DSP/BIOS task handle (this will be later translated to its corresponding DSP/BIOS task name using RTFieldLookup component)

Note that CodecEngineLogTranslator does not send anything out to its connected dataprocessor, for CodecState (0,1,2) until it gets all the information it needs. If a single DSP/BIOS log record contained all information we needed, we didn't have to do this but we are limited to 4 args and CodecHandle is used to co-relate the related logs. This picture depicts how CodecEngineLogTranslator to something more readable/consumable by DVT data views:


Codecengine2.jpg

Analysis of Codec Engine Logs[edit]

Codecengine3.jpg Codecengine4.jpg


Visualization of Codec Engine Logs[edit]

Codecengine5.jpg