Release 1.0. See the RELEASE_NOTES file for details.
authorDoug Deao <d-deao@ti.com>
Sun, 4 Aug 2013 05:42:02 +0000 (00:42 -0500)
committerDoug Deao <d-deao@ti.com>
Sun, 4 Aug 2013 05:46:07 +0000 (00:46 -0500)
28 files changed:
RELEASE_NOTES [new file with mode: 0644]
common/error_handler.c [new file with mode: 0644]
common/error_handler.h [new file with mode: 0644]
common/logging.c [new file with mode: 0644]
common/logging.h [new file with mode: 0644]
ctprofsrv_1.0_Manifest.htm [new file with mode: 0644]
example_app/ctprof_ex.c [new file with mode: 0644]
example_app/ctprof_utility.c [new file with mode: 0644]
example_app/ctprof_utility.h [new file with mode: 0644]
example_app/makefile [new file with mode: 0644]
server/ETBAddr.h [new file with mode: 0644]
server/ETBInterface.h [new file with mode: 0644]
server/TIETB.c [new file with mode: 0644]
server/command_handler.c [new file with mode: 0644]
server/command_handler.h [new file with mode: 0644]
server/ctoolsprof.h [new file with mode: 0644]
server/ctoolsprof_srv_main.c [new file with mode: 0644]
server/error.c [new file with mode: 0644]
server/error.h [new file with mode: 0644]
server/etb_handler.c [new file with mode: 0644]
server/etb_handler.h [new file with mode: 0644]
server/makefile [new file with mode: 0644]
server/remote_commands.c [new file with mode: 0644]
server/remote_commands.h [new file with mode: 0644]
server/signal_handler.c [new file with mode: 0644]
server/signal_handler.h [new file with mode: 0644]
server/socket.c [new file with mode: 0644]
server/socket.h [new file with mode: 0644]

diff --git a/RELEASE_NOTES b/RELEASE_NOTES
new file mode 100644 (file)
index 0000000..60b59d2
--- /dev/null
@@ -0,0 +1,91 @@
+ctprof_srv  
+
+Version 1.0
+Release Date: 7/32/2013 
+
+Description
+===========
+
+Ctprof provides system level bus profiling use cases for any slave in the
+device that has a CP Tracer. Ctprof is made up of two components; ctprof
+which is the host client application, and ctprof_srv which is the target
+server application. The client is delivered with TI's CCS emupacks (see
+System Requirements for minimum emupack revision for this release) and can be
+installed independent of CCS. The server is delivered as source with an example
+application which also contains a small "C" file that can be integrated with
+your application for coordinating collection activity with ctprof_srv.
+
+Organization
+============
+
+The ctools_srv project is delivered as source in three directories:
+
+    server
+    common
+    example_app
+
+Both the server and example_app have makefiles. 
+
+Make & Installation
+===================
+
+If using SC-MCSDK 02.02.00 then ctprof_srv and ctprof_ex should be
+pre-installed in the /usr directory. Otherwise:
+
+The server and example_app directories contain makefiles that utilizes the
+CROSS_COMPILE environment variable. Both release and debug versions can be made. 
+The executable is saved in the release or debug directories. 
+
+Examples:
+
+make clean debug
+make clean release
+make clean release install DESTDIR=/your/favorite/utility/dir
+make clean all (make both the debug and release versions)
+
+Typically the executable files will need to be copied to the appropriate target
+system's Linux bin directory.
+
+System Requirements
+===================
+
+- A Host Linux machine (Ubuntu 10.4 or higher) with emupack 5.1.NNN.0 installed.
+- A TCI6414 EVM or equivalent target system with a working network connection
+  (TCP is used).
+- Requires the SC-MCSDK 02.02.00 Linux image.
+
+Documentation
+=============
+
+The server should simply be run in the background from the console:
+
+$ctprof_srv &
+
+Use -h to see options.
+
+The client is then used from a host to connect to the server and issue
+use case commands (like measure utilized bandwidth or latency of a specific
+slave) that are serviced by ctprof_srv through a socket interface. 
+
+See http://processors.wiki.ti.com/index.php/CToolsLib/ctoolsprof for
+documentation and examples.
+
+History
+=======
+
+July 31/2013 - First release
+
+
+Known Deficiencies
+==================
+
+Enhancements & New Features
+===========================
+
+Bug Fixes
+=========
+
+End of Document
+
+
+
diff --git a/common/error_handler.c b/common/error_handler.c
new file mode 100644 (file)
index 0000000..e3b6d22
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * error_handler.c
+ *
+ * Ctools Profiler Common Implementation
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <errno.h>
+#include <semaphore.h>
+#include "error_handler.h"
+#include "logging.h"
+#include "ctoolsprof.h"
+
+/***************************************************************************** 
+ *  Note: This file must be compatible with c++
+ *
+ *  TODO: need to add context msg for things like filenames operands
+ *****************************************************************************/
+char * error_type[] = {
+       /* [ERR_TYPE_SYSTEM] = */ "system",
+    /* [ERR_TYPE_LOCAL] = */ "ctoolsprof"
+};
+
+typedef enum {FATAL, NON_FATAL} error_prefix_t;
+
+char * error_prefix[] = { 
+    /* [FATAL] = */ "Fatal Error",
+    /* [NON_FATAL] = */ "Non Fatal Error"
+};
+
+/******************************************************************************
+ * error_handler() 
+ *
+ *  - Print the error to stderr.
+ *  - Log the error.
+ *  - Clean-up if fatal and call exit().    
+ *****************************************************************************/
+#if DEBUG
+void error_handler(error_type_t err_type, err_id_t err_id, const char * file,
+                   const char * func, int line )
+#else
+void error_handler(error_type_t err_type, err_id_t err_id)
+#endif
+{
+       bool fatal;
+    char *msg_prefix;
+    char *err_msg;
+    char *sys_msg = "";
+    char * fmt;
+
+    LOGMSG2("Error id is %d\n", err_id);
+
+       if (g_interactive_mode && err_type == ERR_TYPE_LOCAL){ 
+               msg_prefix = (error_info[err_id].fatal) ? error_prefix[FATAL]
+                                                : error_prefix[NON_FATAL];
+        fatal = error_info[err_id].fatal;
+        err_msg = error_info[err_id].msg;
+    } else if (!g_interactive_mode && err_type == ERR_TYPE_LOCAL){
+               msg_prefix = error_prefix[FATAL];
+        fatal = true;
+        err_msg = error_info[err_id].msg;
+    } else {
+               msg_prefix = error_prefix[FATAL];
+        fatal = true;
+        sys_msg = strerror(errno);
+        err_msg = error_info[err_id].msg;
+    }
+
+#if DEBUG
+    fmt = "%s:%d:%s: %s: %s: %s: %s\n";
+    fprintf(stderr, fmt, file, line, func, error_type[err_type], msg_prefix,
+            sys_msg, err_msg);
+
+    LOGERR(fmt, file, line, func, error_type[err_type], msg_prefix, sys_msg,
+           err_msg); 
+#else
+    fmt = "%s: %s: %s: %s\n";
+    fprintf(stderr, fmt, error_type[err_type], msg_prefix, sys_msg, err_msg);
+
+    LOGERR(fmt, error_type[err_type], msg_prefix, sys_msg, err_msg);
+#endif
+
+    if (fatal) {
+        clean_up();
+        exit(-1);
+    }
+}
+
diff --git a/common/error_handler.h b/common/error_handler.h
new file mode 100644 (file)
index 0000000..ab65071
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * error_handler.h
+ *
+ * Ctools Profiler Common Implementation
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+#ifndef ERRORHANDLER_H
+#define ERRORHANDLER_H
+
+#include "error.h"
+
+typedef enum { ERR_TYPE_SYSTEM, ERR_TYPE_LOCAL} error_type_t; 
+
+#if DEBUG
+void error_handler(error_type_t err_type, err_id_t err_id, const char * file,
+                   const char * func, int line );
+
+#define err_handler(x,y) error_handler(x,y, __FILE__, __func__, __LINE__)
+#else
+void error_handler(error_type_t err_type, err_id_t err_id);
+
+#define err_handler error_handler
+
+#endif
+#endif
diff --git a/common/logging.c b/common/logging.c
new file mode 100644 (file)
index 0000000..19fa5d4
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * logging.c
+ *
+ * Ctools Profiler Common Implementation
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdarg.h>
+#include <sys/time.h>
+#include <time.h>
+#include "error_handler.h"
+#include "logging.h"
+
+bool g_log_enable = false;
+int  g_log_level = 0;
+
+static FILE *logout;
+
+#define time_buf_size 16 
+static char time_buf[time_buf_size];
+/***************************************************************************** 
+ *  Internal Function Prototypes 
+ *  - See Private Function section below for implementations )
+ *****************************************************************************/
+char * get_timestamp();
+
+/***************************************************************************** 
+ *  Public functions
+ *****************************************************************************/
+/******************************************************************************
+ * log_handler() (for --logfile option)
+ *
+ *  - Enable logging to ctprof_log.txt and set log level.    
+ *****************************************************************************/
+void log_handler(void **argv, int argc)
+{
+
+    if ((int)argv[0] > 2) {
+        err_handler(ERR_TYPE_LOCAL, ERR_OPT_ARG);
+    }
+
+    if (g_log_enable == false) {
+        logout = fopen(LOG_FILENAME,"w");
+        if (logout == NULL) {
+            err_handler(ERR_TYPE_LOCAL, ERR_LOG_FILE);
+            return;
+        }
+    }
+
+    g_log_level = (int)argv[0];
+    g_log_enable = true;
+
+    fprintf(logout, "Log level set to %d\n", (int)argv[0]);  
+
+}
+
+/******************************************************************************
+ * log_msg()
+ *
+ *     - log message to logout with timestamp in milliseconds 
+ *     - Display format " M|F|E H:M:S:MS | Function:Line: Message"
+ *       where:
+ *           M - message
+ *           F - function start
+ *           E - error      
+ *****************************************************************************/
+void log_msg( log_type_t log_type, const char * format, ...)
+{
+    char * prefix;
+       va_list marker;
+       
+    
+    switch (log_type) {
+    case LOG_MSG:
+         prefix = " M ";
+         break;
+    case LOG_ERR:
+         prefix = " E ";
+         break;
+    case LOG_FUNC:
+         prefix = " F ";
+    };
+
+    va_start( marker, format);
+    fprintf(logout, "%s %s | ", prefix, get_timestamp());
+    vfprintf(logout, format, marker);
+    fprintf(logout,"\n"); 
+    va_end(marker);
+    fflush(logout);
+
+}
+/***************************************************************************** 
+ *  Private functions
+ *****************************************************************************/
+/******************************************************************************
+ * -get_timestamp
+ *      Provide timestamp string in H:M:S:MS 
+ * 
+ *  TODO: Use of gettimeofday (which is part of the POSIX standard) works
+ *  for Linux but not for Windows. For Windows we must implement our own version
+ *  of gettimeofday per the guide at:
+ *     http://suacommunity.com/dictionary/gettimeofday-entry.php
+ *****************************************************************************/
+char * get_timestamp()
+{
+
+    struct timeval tv;
+    time_t curtime;
+    int time_size = 0;
+
+    gettimeofday(&tv, NULL);
+    curtime = tv.tv_sec;
+
+    time_size = strftime(time_buf, time_buf_size, "%T", localtime(&curtime));
+    snprintf(time_buf + time_size, time_buf_size, ":%03ld", tv.tv_usec/1000); 
+
+    return time_buf;
+}
+
+
+
diff --git a/common/logging.h b/common/logging.h
new file mode 100644 (file)
index 0000000..23f236f
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * logging.h
+ *
+ * Ctools Profiler Common Implementation
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+#ifndef LOGGING_H
+#define LOGGING_H
+
+extern bool g_log_enable;
+extern int  g_log_level;
+
+#ifdef CLIENT
+#define LOG_FILENAME "ctprof_log.txt"
+#endif
+#ifdef SERVER
+#define LOG_FILENAME "ctprof_srv_log.txt"
+#endif
+
+typedef enum {LOG_MSG, LOG_ERR, LOG_FUNC} log_type_t;
+
+void log_handler(void **notused, int argc);
+void log_msg( log_type_t log_type, const char * format, ...);
+
+
+#define IF_LOGGING_ENABLED if (g_log_enable) 
+
+#define LOGFUNC() if (g_log_enable && g_log_level > 0) { \
+                           log_msg(LOG_FUNC,"%s", __func__); \
+                       } 
+
+#define LOGMSG0(...) if (g_log_enable && g_log_level >= 0) {\
+                           log_msg(LOG_MSG, __VA_ARGS__);   \
+                       } 
+
+#define LOGMSG1(...) if (g_log_enable && g_log_level >= 1) {\
+                           log_msg(LOG_MSG, __VA_ARGS__);   \
+                       } 
+
+
+#define LOGMSG2(...) if (g_log_enable && g_log_level >= 2) {\
+                           log_msg(LOG_MSG, __VA_ARGS__);   \
+                       } 
+
+
+#define LOGERR(...) if (g_log_enable) { \
+                           log_msg(LOG_ERR, __VA_ARGS__); \
+                       } 
+#endif
+
diff --git a/ctprofsrv_1.0_Manifest.htm b/ctprofsrv_1.0_Manifest.htm
new file mode 100644 (file)
index 0000000..b86c8e3
--- /dev/null
@@ -0,0 +1,1826 @@
+<html xmlns:v="urn:schemas-microsoft-com:vml"\r
+xmlns:o="urn:schemas-microsoft-com:office:office"\r
+xmlns:w="urn:schemas-microsoft-com:office:word"\r
+xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"\r
+xmlns="http://www.w3.org/TR/REC-html40">\r
+\r
+<head>\r
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">\r
+<meta name=ProgId content=Word.Document>\r
+<meta name=Generator content="Microsoft Word 12">\r
+<meta name=Originator content="Microsoft Word 12">\r
+<link rel=File-List href="ctprofsrv_1.0_Manifest_files/filelist.xml">\r
+<link rel=Edit-Time-Data href="ctprofsrv_1.0_Manifest_files/editdata.mso">\r
+<!--[if !mso]>\r
+<style>\r
+v\:* {behavior:url(#default#VML);}\r
+o\:* {behavior:url(#default#VML);}\r
+w\:* {behavior:url(#default#VML);}\r
+.shape {behavior:url(#default#VML);}\r
+</style>\r
+<![endif]-->\r
+<title>ASP Software Manifest</title>\r
+<!--[if gte mso 9]><xml>\r
+ <o:DocumentProperties>\r
+  <o:Subject>Software Manifest</o:Subject>\r
+  <o:Author>Texas Instruments, Incorporated</o:Author>\r
+  <o:Keywords>Manifest Open Source License</o:Keywords>\r
+  <o:Description>This document lists the licensing for a specific software release.</o:Description>\r
+  <o:Template>Normal</o:Template>\r
+  <o:LastAuthor>a0343404</o:LastAuthor>\r
+  <o:Revision>4</o:Revision>\r
+  <o:TotalTime>69</o:TotalTime>\r
+  <o:LastPrinted>2011-06-27T19:49:00Z</o:LastPrinted>\r
+  <o:Created>2013-07-30T22:10:00Z</o:Created>\r
+  <o:LastSaved>2013-08-01T13:28:00Z</o:LastSaved>\r
+  <o:Pages>2</o:Pages>\r
+  <o:Words>803</o:Words>\r
+  <o:Characters>4580</o:Characters>\r
+  <o:Category>Manifest</o:Category>\r
+  <o:Company>Texas Instruments</o:Company>\r
+  <o:Lines>38</o:Lines>\r
+  <o:Paragraphs>10</o:Paragraphs>\r
+  <o:CharactersWithSpaces>5373</o:CharactersWithSpaces>\r
+  <o:Version>12.00</o:Version>\r
+ </o:DocumentProperties>\r
+ <o:OfficeDocumentSettings>\r
+  <o:RelyOnVML/>\r
+  <o:AllowPNG/>\r
+ </o:OfficeDocumentSettings>\r
+</xml><![endif]-->\r
+<link rel=themeData href="ctprofsrv_1.0_Manifest_files/themedata.thmx">\r
+<link rel=colorSchemeMapping\r
+href="ctprofsrv_1.0_Manifest_files/colorschememapping.xml">\r
+<!--[if gte mso 9]><xml>\r
+ <w:WordDocument>\r
+  <w:Zoom>110</w:Zoom>\r
+  <w:SpellingState>Clean</w:SpellingState>\r
+  <w:GrammarState>Clean</w:GrammarState>\r
+  <w:TrackMoves>false</w:TrackMoves>\r
+  <w:TrackFormatting/>\r
+  <w:PunctuationKerning/>\r
+  <w:ValidateAgainstSchemas/>\r
+  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>\r
+  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>\r
+  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>\r
+  <w:DoNotPromoteQF/>\r
+  <w:LidThemeOther>EN-US</w:LidThemeOther>\r
+  <w:LidThemeAsian>X-NONE</w:LidThemeAsian>\r
+  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>\r
+  <w:Compatibility>\r
+   <w:BreakWrappedTables/>\r
+   <w:SnapToGridInCell/>\r
+   <w:WrapTextWithPunct/>\r
+   <w:UseAsianBreakRules/>\r
+   <w:DontGrowAutofit/>\r
+   <w:SplitPgBreakAndParaMark/>\r
+   <w:DontVertAlignCellWithSp/>\r
+   <w:DontBreakConstrainedForcedTables/>\r
+   <w:DontVertAlignInTxbx/>\r
+   <w:Word11KerningPairs/>\r
+   <w:CachedColBalance/>\r
+  </w:Compatibility>\r
+  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>\r
+  <m:mathPr>\r
+   <m:mathFont m:val="Cambria Math"/>\r
+   <m:brkBin m:val="before"/>\r
+   <m:brkBinSub m:val="&#45;-"/>\r
+   <m:smallFrac m:val="off"/>\r
+   <m:dispDef/>\r
+   <m:lMargin m:val="0"/>\r
+   <m:rMargin m:val="0"/>\r
+   <m:defJc m:val="centerGroup"/>\r
+   <m:wrapIndent m:val="1440"/>\r
+   <m:intLim m:val="subSup"/>\r
+   <m:naryLim m:val="undOvr"/>\r
+  </m:mathPr></w:WordDocument>\r
+</xml><![endif]--><!--[if gte mso 9]><xml>\r
+ <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"\r
+  DefSemiHidden="false" DefQFormat="false" LatentStyleCount="267">\r
+  <w:LsdException Locked="true" QFormat="true" Name="Normal"/>\r
+  <w:LsdException Locked="true" QFormat="true" Name="heading 1"/>\r
+  <w:LsdException Locked="true" SemiHidden="true" UnhideWhenUsed="true"\r
+   QFormat="true" Name="heading 2"/>\r
+  <w:LsdException Locked="true" SemiHidden="true" UnhideWhenUsed="true"\r
+   QFormat="true" Name="heading 3"/>\r
+  <w:LsdException Locked="true" SemiHidden="true" UnhideWhenUsed="true"\r
+   QFormat="true" Name="heading 4"/>\r
+  <w:LsdException Locked="true" SemiHidden="true" UnhideWhenUsed="true"\r
+   QFormat="true" Name="heading 5"/>\r
+  <w:LsdException Locked="true" SemiHidden="true" UnhideWhenUsed="true"\r
+   QFormat="true" Name="heading 6"/>\r
+  <w:LsdException Locked="true" SemiHidden="true" UnhideWhenUsed="true"\r
+   QFormat="true" Name="heading 7"/>\r
+  <w:LsdException Locked="true" SemiHidden="true" UnhideWhenUsed="true"\r
+   QFormat="true" Name="heading 8"/>\r
+  <w:LsdException Locked="true" SemiHidden="true" UnhideWhenUsed="true"\r
+   QFormat="true" Name="heading 9"/>\r
+  <w:LsdException Locked="true" Name="toc 1"/>\r
+  <w:LsdException Locked="true" Name="toc 2"/>\r
+  <w:LsdException Locked="true" Name="toc 3"/>\r
+  <w:LsdException Locked="true" Name="toc 4"/>\r
+  <w:LsdException Locked="true" Name="toc 5"/>\r
+  <w:LsdException Locked="true" Name="toc 6"/>\r
+  <w:LsdException Locked="true" Name="toc 7"/>\r
+  <w:LsdException Locked="true" Name="toc 8"/>\r
+  <w:LsdException Locked="true" Name="toc 9"/>\r
+  <w:LsdException Locked="true" SemiHidden="true" UnhideWhenUsed="true"\r
+   QFormat="true" Name="caption"/>\r
+  <w:LsdException Locked="true" QFormat="true" Name="Title"/>\r
+  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>\r
+  <w:LsdException Locked="true" QFormat="true" Name="Subtitle"/>\r
+  <w:LsdException Locked="false" Priority="99" Name="Hyperlink"/>\r
+  <w:LsdException Locked="true" QFormat="true" Name="Strong"/>\r
+  <w:LsdException Locked="true" QFormat="true" Name="Emphasis"/>\r
+  <w:LsdException Locked="false" Priority="99" Name="HTML Preformatted"/>\r
+  <w:LsdException Locked="false" Priority="99" Name="No List"/>\r
+  <w:LsdException Locked="true" Name="Table Grid"/>\r
+  <w:LsdException Locked="false" Priority="99" SemiHidden="true"\r
+   Name="Placeholder Text"/>\r
+  <w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>\r
+  <w:LsdException Locked="false" Priority="60" Name="Light Shading"/>\r
+  <w:LsdException Locked="false" Priority="61" Name="Light List"/>\r
+  <w:LsdException Locked="false" Priority="62" Name="Light Grid"/>\r
+  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>\r
+  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>\r
+  <w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>\r
+  <w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>\r
+  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>\r
+  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>\r
+  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>\r
+  <w:LsdException Locked="false" Priority="70" Name="Dark List"/>\r
+  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>\r
+  <w:LsdException Locked="false" Priority="72" Name="Colorful List"/>\r
+  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>\r
+  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="99" SemiHidden="true" Name="Revision"/>\r
+  <w:LsdException Locked="false" Priority="34" QFormat="true"\r
+   Name="List Paragraph"/>\r
+  <w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>\r
+  <w:LsdException Locked="false" Priority="30" QFormat="true"\r
+   Name="Intense Quote"/>\r
+  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>\r
+  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>\r
+  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>\r
+  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>\r
+  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>\r
+  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>\r
+  <w:LsdException Locked="false" Priority="19" QFormat="true"\r
+   Name="Subtle Emphasis"/>\r
+  <w:LsdException Locked="false" Priority="21" QFormat="true"\r
+   Name="Intense Emphasis"/>\r
+  <w:LsdException Locked="false" Priority="31" QFormat="true"\r
+   Name="Subtle Reference"/>\r
+  <w:LsdException Locked="false" Priority="32" QFormat="true"\r
+   Name="Intense Reference"/>\r
+  <w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>\r
+  <w:LsdException Locked="false" Priority="37" SemiHidden="true"\r
+   UnhideWhenUsed="true" Name="Bibliography"/>\r
+  <w:LsdException Locked="false" Priority="39" SemiHidden="true"\r
+   UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>\r
+ </w:LatentStyles>\r
+</xml><![endif]-->\r
+<style>\r
+<!--\r
+ /* Font Definitions */\r
+ @font-face\r
+       {font-family:"MS Mincho";\r
+       panose-1:2 2 6 9 4 2 5 8 3 4;\r
+       mso-font-alt:"\FF2D\FF33 \660E\671D";\r
+       mso-font-charset:128;\r
+       mso-generic-font-family:modern;\r
+       mso-font-pitch:fixed;\r
+       mso-font-signature:-536870145 1791491579 18 0 131231 0;}\r
+@font-face\r
+       {font-family:"Cambria Math";\r
+       panose-1:2 4 5 3 5 4 6 3 2 4;\r
+       mso-font-charset:0;\r
+       mso-generic-font-family:roman;\r
+       mso-font-pitch:variable;\r
+       mso-font-signature:-536870145 1107305727 0 0 415 0;}\r
+@font-face\r
+       {font-family:Calibri;\r
+       panose-1:2 15 5 2 2 2 4 3 2 4;\r
+       mso-font-charset:0;\r
+       mso-generic-font-family:swiss;\r
+       mso-font-pitch:variable;\r
+       mso-font-signature:-520092929 1073786111 9 0 415 0;}\r
+@font-face\r
+       {font-family:Tahoma;\r
+       panose-1:2 11 6 4 3 5 4 4 2 4;\r
+       mso-font-charset:0;\r
+       mso-generic-font-family:swiss;\r
+       mso-font-pitch:variable;\r
+       mso-font-signature:-520081665 -1073717157 41 0 66047 0;}\r
+@font-face\r
+       {font-family:"\@MS Mincho";\r
+       panose-1:2 2 6 9 4 2 5 8 3 4;\r
+       mso-font-charset:128;\r
+       mso-generic-font-family:modern;\r
+       mso-font-pitch:fixed;\r
+       mso-font-signature:-536870145 1791491579 18 0 131231 0;}\r
+@font-face\r
+       {font-family:Consolas;\r
+       panose-1:2 11 6 9 2 2 4 3 2 4;\r
+       mso-font-charset:0;\r
+       mso-generic-font-family:modern;\r
+       mso-font-pitch:fixed;\r
+       mso-font-signature:-520092929 1073806591 9 0 415 0;}\r
+ /* Style Definitions */\r
+ p.MsoNormal, li.MsoNormal, div.MsoNormal\r
+       {mso-style-unhide:no;\r
+       mso-style-qformat:yes;\r
+       mso-style-parent:"";\r
+       margin:0in;\r
+       margin-bottom:.0001pt;\r
+       mso-pagination:widow-orphan;\r
+       font-size:10.0pt;\r
+       font-family:"Arial","sans-serif";\r
+       mso-fareast-font-family:"Times New Roman";\r
+       mso-font-kerning:11.0pt;}\r
+p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText\r
+       {mso-style-noshow:yes;\r
+       mso-style-unhide:no;\r
+       mso-style-link:"Footnote Text Char";\r
+       margin:0in;\r
+       margin-bottom:.0001pt;\r
+       mso-pagination:widow-orphan;\r
+       font-size:10.0pt;\r
+       font-family:"Arial","sans-serif";\r
+       mso-fareast-font-family:"Times New Roman";\r
+       mso-font-kerning:11.0pt;}\r
+p.MsoHeader, li.MsoHeader, div.MsoHeader\r
+       {mso-style-unhide:no;\r
+       mso-style-link:"Header Char";\r
+       margin:0in;\r
+       margin-bottom:.0001pt;\r
+       mso-pagination:widow-orphan;\r
+       tab-stops:center 3.0in right 6.0in;\r
+       font-size:10.0pt;\r
+       font-family:"Arial","sans-serif";\r
+       mso-fareast-font-family:"Times New Roman";\r
+       mso-font-kerning:11.0pt;}\r
+p.MsoFooter, li.MsoFooter, div.MsoFooter\r
+       {mso-style-unhide:no;\r
+       mso-style-link:"Footer Char";\r
+       margin:0in;\r
+       margin-bottom:.0001pt;\r
+       mso-pagination:widow-orphan;\r
+       tab-stops:center 3.0in right 6.0in;\r
+       font-size:10.0pt;\r
+       font-family:"Arial","sans-serif";\r
+       mso-fareast-font-family:"Times New Roman";\r
+       mso-font-kerning:11.0pt;}\r
+span.MsoFootnoteReference\r
+       {mso-style-noshow:yes;\r
+       mso-style-unhide:no;\r
+       font-family:"Times New Roman","serif";\r
+       mso-ascii-font-family:"Times New Roman";\r
+       mso-hansi-font-family:"Times New Roman";\r
+       mso-bidi-font-family:"Times New Roman";\r
+       vertical-align:super;}\r
+p.MsoBodyText, li.MsoBodyText, div.MsoBodyText\r
+       {mso-style-unhide:no;\r
+       mso-style-link:"Body Text Char";\r
+       margin-top:0in;\r
+       margin-right:0in;\r
+       margin-bottom:6.0pt;\r
+       margin-left:0in;\r
+       mso-pagination:widow-orphan;\r
+       font-size:10.0pt;\r
+       font-family:"Arial","sans-serif";\r
+       mso-fareast-font-family:"Times New Roman";\r
+       mso-font-kerning:11.0pt;}\r
+p.MsoBlockText, li.MsoBlockText, div.MsoBlockText\r
+       {mso-style-unhide:no;\r
+       margin-top:0in;\r
+       margin-right:1.0in;\r
+       margin-bottom:6.0pt;\r
+       margin-left:1.0in;\r
+       mso-pagination:widow-orphan;\r
+       font-size:10.0pt;\r
+       font-family:"Arial","sans-serif";\r
+       mso-fareast-font-family:"Times New Roman";\r
+       mso-font-kerning:11.0pt;}\r
+a:link, span.MsoHyperlink\r
+       {mso-style-priority:99;\r
+       mso-style-unhide:no;\r
+       color:blue;\r
+       text-decoration:underline;\r
+       text-underline:single;}\r
+a:visited, span.MsoHyperlinkFollowed\r
+       {mso-style-unhide:no;\r
+       color:purple;\r
+       mso-themecolor:followedhyperlink;\r
+       text-decoration:underline;\r
+       text-underline:single;}\r
+p.MsoDocumentMap, li.MsoDocumentMap, div.MsoDocumentMap\r
+       {mso-style-noshow:yes;\r
+       mso-style-unhide:no;\r
+       mso-style-link:"Document Map Char";\r
+       margin:0in;\r
+       margin-bottom:.0001pt;\r
+       mso-pagination:widow-orphan;\r
+       background:navy;\r
+       font-size:10.0pt;\r
+       font-family:"Tahoma","sans-serif";\r
+       mso-fareast-font-family:"Times New Roman";\r
+       mso-font-kerning:11.0pt;}\r
+pre\r
+       {mso-style-priority:99;\r
+       mso-style-unhide:no;\r
+       mso-style-link:"HTML Preformatted Char";\r
+       margin:0in;\r
+       margin-bottom:.0001pt;\r
+       mso-pagination:widow-orphan;\r
+       font-size:10.0pt;\r
+       font-family:"Courier New";\r
+       mso-fareast-font-family:Calibri;\r
+       mso-fareast-theme-font:minor-latin;}\r
+p.MsoAcetate, li.MsoAcetate, div.MsoAcetate\r
+       {mso-style-noshow:yes;\r
+       mso-style-unhide:no;\r
+       mso-style-link:"Balloon Text Char";\r
+       margin:0in;\r
+       margin-bottom:.0001pt;\r
+       mso-pagination:widow-orphan;\r
+       font-size:8.0pt;\r
+       font-family:"Tahoma","sans-serif";\r
+       mso-fareast-font-family:"Times New Roman";\r
+       mso-font-kerning:11.0pt;}\r
+span.HTMLPreformattedChar\r
+       {mso-style-name:"HTML Preformatted Char";\r
+       mso-style-priority:99;\r
+       mso-style-unhide:no;\r
+       mso-style-locked:yes;\r
+       mso-style-link:"HTML Preformatted";\r
+       font-family:"Courier New";\r
+       mso-ascii-font-family:"Courier New";\r
+       mso-fareast-font-family:Calibri;\r
+       mso-fareast-theme-font:minor-latin;\r
+       mso-hansi-font-family:"Courier New";\r
+       mso-bidi-font-family:"Courier New";}\r
+span.FootnoteTextChar\r
+       {mso-style-name:"Footnote Text Char";\r
+       mso-style-noshow:yes;\r
+       mso-style-unhide:no;\r
+       mso-style-locked:yes;\r
+       mso-style-link:"Footnote Text";\r
+       font-family:"Arial","sans-serif";\r
+       mso-ascii-font-family:Arial;\r
+       mso-hansi-font-family:Arial;\r
+       mso-bidi-font-family:Arial;\r
+       mso-font-kerning:11.0pt;}\r
+span.HeaderChar\r
+       {mso-style-name:"Header Char";\r
+       mso-style-noshow:yes;\r
+       mso-style-unhide:no;\r
+       mso-style-locked:yes;\r
+       mso-style-link:Header;\r
+       font-family:"Arial","sans-serif";\r
+       mso-ascii-font-family:Arial;\r
+       mso-hansi-font-family:Arial;\r
+       mso-bidi-font-family:Arial;\r
+       mso-font-kerning:11.0pt;}\r
+span.FooterChar\r
+       {mso-style-name:"Footer Char";\r
+       mso-style-noshow:yes;\r
+       mso-style-unhide:no;\r
+       mso-style-locked:yes;\r
+       mso-style-link:Footer;\r
+       font-family:"Arial","sans-serif";\r
+       mso-ascii-font-family:Arial;\r
+       mso-hansi-font-family:Arial;\r
+       mso-bidi-font-family:Arial;\r
+       mso-font-kerning:11.0pt;}\r
+span.BodyTextChar\r
+       {mso-style-name:"Body Text Char";\r
+       mso-style-noshow:yes;\r
+       mso-style-unhide:no;\r
+       mso-style-locked:yes;\r
+       mso-style-link:"Body Text";\r
+       font-family:"Arial","sans-serif";\r
+       mso-ascii-font-family:Arial;\r
+       mso-hansi-font-family:Arial;\r
+       mso-bidi-font-family:Arial;\r
+       mso-font-kerning:11.0pt;}\r
+span.DocumentMapChar\r
+       {mso-style-name:"Document Map Char";\r
+       mso-style-noshow:yes;\r
+       mso-style-unhide:no;\r
+       mso-style-locked:yes;\r
+       mso-style-link:"Document Map";\r
+       mso-ansi-font-size:1.0pt;\r
+       font-family:"Arial","sans-serif";\r
+       mso-ascii-font-family:Arial;\r
+       mso-hansi-font-family:Arial;\r
+       mso-bidi-font-family:Arial;\r
+       mso-font-kerning:11.0pt;}\r
+span.BalloonTextChar\r
+       {mso-style-name:"Balloon Text Char";\r
+       mso-style-noshow:yes;\r
+       mso-style-unhide:no;\r
+       mso-style-locked:yes;\r
+       mso-style-link:"Balloon Text";\r
+       mso-ansi-font-size:1.0pt;\r
+       font-family:"Arial","sans-serif";\r
+       mso-ascii-font-family:Arial;\r
+       mso-hansi-font-family:Arial;\r
+       mso-bidi-font-family:Arial;\r
+       mso-font-kerning:11.0pt;}\r
+p.EditorsComment, li.EditorsComment, div.EditorsComment\r
+       {mso-style-name:"Editors Comment";\r
+       mso-style-unhide:no;\r
+       mso-style-parent:"Block Text";\r
+       mso-style-next:"Body Text";\r
+       margin-top:0in;\r
+       margin-right:1.0in;\r
+       margin-bottom:6.0pt;\r
+       margin-left:1.0in;\r
+       mso-pagination:widow-orphan;\r
+       font-size:10.0pt;\r
+       font-family:"Arial","sans-serif";\r
+       mso-fareast-font-family:"Times New Roman";\r
+       mso-font-kerning:11.0pt;\r
+       font-style:italic;\r
+       mso-bidi-font-style:normal;}\r
+p.StyleEditorsCommentCustomColorRGB51153255, li.StyleEditorsCommentCustomColorRGB51153255, div.StyleEditorsCommentCustomColorRGB51153255\r
+       {mso-style-name:"Style Editors Comment + Custom Color\(RGB\(51153255\)\)";\r
+       mso-style-update:auto;\r
+       mso-style-unhide:no;\r
+       mso-style-parent:"Editors Comment";\r
+       margin-top:0in;\r
+       margin-right:1.0in;\r
+       margin-bottom:6.0pt;\r
+       margin-left:0in;\r
+       mso-pagination:widow-orphan;\r
+       font-size:10.0pt;\r
+       font-family:"Arial","sans-serif";\r
+       mso-fareast-font-family:"Times New Roman";\r
+       color:#3399FF;\r
+       mso-font-kerning:11.0pt;\r
+       font-style:italic;}\r
+span.1ParaChar\r
+       {mso-style-name:"1_Para Char";\r
+       mso-style-unhide:no;\r
+       mso-style-locked:yes;\r
+       mso-style-link:1_Para;\r
+       font-family:"Arial","sans-serif";\r
+       mso-ascii-font-family:Arial;\r
+       mso-hansi-font-family:Arial;\r
+       mso-bidi-font-family:Arial;\r
+       mso-font-kerning:10.0pt;\r
+       mso-ansi-language:EN-US;\r
+       mso-fareast-language:EN-US;\r
+       mso-bidi-language:AR-SA;}\r
+p.1Para, li.1Para, div.1Para\r
+       {mso-style-name:1_Para;\r
+       mso-style-unhide:no;\r
+       mso-style-parent:"";\r
+       mso-style-link:"1_Para Char";\r
+       margin-top:10.0pt;\r
+       margin-right:0in;\r
+       margin-bottom:6.0pt;\r
+       margin-left:0in;\r
+       text-align:justify;\r
+       line-height:11.0pt;\r
+       mso-line-height-rule:exactly;\r
+       mso-pagination:widow-orphan lines-together;\r
+       font-size:10.0pt;\r
+       font-family:"Arial","sans-serif";\r
+       mso-fareast-font-family:"Times New Roman";\r
+       mso-font-kerning:10.0pt;}\r
+span.SpellE\r
+       {mso-style-name:"";\r
+       mso-spl-e:yes;}\r
+span.GramE\r
+       {mso-style-name:"";\r
+       mso-gram-e:yes;}\r
+.MsoChpDefault\r
+       {mso-style-type:export-only;\r
+       mso-default-props:yes;\r
+       font-size:10.0pt;\r
+       mso-ansi-font-size:10.0pt;\r
+       mso-bidi-font-size:10.0pt;}\r
+@page WordSection1\r
+       {size:11.0in 8.5in;\r
+       mso-page-orientation:landscape;\r
+       margin:1.25in 1.0in 1.25in 1.0in;\r
+       mso-header-margin:.5in;\r
+       mso-footer-margin:.5in;\r
+       mso-paper-source:0;}\r
+div.WordSection1\r
+       {page:WordSection1;}\r
+-->\r
+</style>\r
+<!--[if gte mso 10]>\r
+<style>\r
+ /* Style Definitions */\r
+ table.MsoNormalTable\r
+       {mso-style-name:"Table Normal";\r
+       mso-tstyle-rowband-size:0;\r
+       mso-tstyle-colband-size:0;\r
+       mso-style-noshow:yes;\r
+       mso-style-priority:99;\r
+       mso-style-qformat:yes;\r
+       mso-style-parent:"";\r
+       mso-padding-alt:0in 5.4pt 0in 5.4pt;\r
+       mso-para-margin:0in;\r
+       mso-para-margin-bottom:.0001pt;\r
+       mso-pagination:widow-orphan;\r
+       font-size:10.0pt;\r
+       font-family:"Times New Roman","serif";}\r
+table.MsoTableGrid\r
+       {mso-style-name:"Table Grid";\r
+       mso-tstyle-rowband-size:0;\r
+       mso-tstyle-colband-size:0;\r
+       mso-style-unhide:no;\r
+       border:solid windowtext 1.0pt;\r
+       mso-border-alt:solid windowtext .5pt;\r
+       mso-padding-alt:0in 5.4pt 0in 5.4pt;\r
+       mso-border-insideh:.5pt solid windowtext;\r
+       mso-border-insidev:.5pt solid windowtext;\r
+       mso-para-margin:0in;\r
+       mso-para-margin-bottom:.0001pt;\r
+       mso-pagination:widow-orphan;\r
+       font-size:10.0pt;\r
+       font-family:"Times New Roman","serif";}\r
+</style>\r
+<![endif]--><!--[if gte mso 9]><xml>\r
+ <o:shapedefaults v:ext="edit" spidmax="9218"/>\r
+</xml><![endif]--><!--[if gte mso 9]><xml>\r
+ <o:shapelayout v:ext="edit">\r
+  <o:idmap v:ext="edit" data="1"/>\r
+ </o:shapelayout></xml><![endif]-->\r
+</head>\r
+\r
+<body lang=EN-US link=blue vlink=purple style='tab-interval:.5in'>\r
+\r
+<div class=WordSection1>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><v:shapetype id="_x0000_t75"\r
+ coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"\r
+ filled="f" stroked="f">\r
+ <v:stroke joinstyle="miter"/>\r
+ <v:formulas>\r
+  <v:f eqn="if lineDrawn pixelLineWidth 0"/>\r
+  <v:f eqn="sum @0 1 0"/>\r
+  <v:f eqn="sum 0 0 @1"/>\r
+  <v:f eqn="prod @2 1 2"/>\r
+  <v:f eqn="prod @3 21600 pixelWidth"/>\r
+  <v:f eqn="prod @3 21600 pixelHeight"/>\r
+  <v:f eqn="sum @0 0 1"/>\r
+  <v:f eqn="prod @6 1 2"/>\r
+  <v:f eqn="prod @7 21600 pixelWidth"/>\r
+  <v:f eqn="sum @8 21600 0"/>\r
+  <v:f eqn="prod @7 21600 pixelHeight"/>\r
+  <v:f eqn="sum @10 21600 0"/>\r
+ </v:formulas>\r
+ <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>\r
+ <o:lock v:ext="edit" aspectratio="t"/>\r
+</v:shapetype><v:shape id="Picture_x0020_1" o:spid="_x0000_i1025" type="#_x0000_t75"\r
+ alt="hdr_ti_logo" style='width:180pt;height:24.75pt;visibility:visible;\r
+ mso-wrap-style:square;mso-left-percent:-10001;mso-top-percent:-10001;\r
+ mso-position-horizontal:absolute;mso-position-horizontal-relative:char;\r
+ mso-position-vertical:absolute;mso-position-vertical-relative:line;\r
+ mso-left-percent:-10001;mso-top-percent:-10001'>\r
+ <v:textbox style='mso-rotate-with-shape:t'/>\r
+</v:shape><b style='mso-bidi-font-weight:normal'><span style='font-size:12.0pt'><span\r
+style='mso-spacerun:yes'>                                                                                   \r
+</span><span style='mso-spacerun:yes'>                     </span><span\r
+style='mso-spacerun:yes'>    </span>August 1, 2013<o:p></o:p></span></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'><o:p>&nbsp;</o:p></span></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'><o:p>&nbsp;</o:p></span></b></p>\r
+\r
+<p class=MsoNormal><v:line id="_x0000_s1028" style='position:absolute;flip:y;\r
+ z-index:1;mso-position-horizontal-relative:page;\r
+ mso-position-vertical-relative:page' from="396pt,-17.65pt" to="396pt,342.9pt"\r
+ strokecolor="white">\r
+ <w:wrap anchorx="page" anchory="page"/>\r
+ <w:anchorlock/>\r
+</v:line><span class=SpellE><span class=GramE><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'>ctprof_srv</span></b></span></span><b\r
+style='mso-bidi-font-weight:normal'><span style='font-size:12.0pt'> Manifest<o:p></o:p></span></b></p>\r
+\r
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'>Legend <o:p></o:p></span></b></p>\r
+\r
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+\r
+<table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0\r
+ style='border-collapse:collapse;border:none;mso-border-alt:solid windowtext .5pt;\r
+ mso-yfti-tbllook:480;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh:\r
+ .5pt solid windowtext;mso-border-insidev:.5pt solid windowtext'>\r
+ <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>\r
+  <td width=131 valign=top style='width:98.1pt;border:solid windowtext 1.0pt;\r
+  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'>Software\r
+  Name </span></b><span style='font-size:12.0pt;font-family:"Times New Roman","serif";\r
+  mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+  <td width=748 valign=top style='width:560.7pt;border:solid windowtext 1.0pt;\r
+  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:\r
+  solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'>The name of the application or file<span\r
+  style='font-size:12.0pt;font-family:"Times New Roman","serif";mso-fareast-font-family:\r
+  Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:1'>\r
+  <td width=131 valign=top style='width:98.1pt;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'>Version\r
+  </span></b><span style='font-size:12.0pt;font-family:"Times New Roman","serif";\r
+  mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+  <td width=748 valign=top style='width:560.7pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;\r
+  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'>Version of the application or file<span\r
+  style='font-size:12.0pt;font-family:"Times New Roman","serif";mso-fareast-font-family:\r
+  Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:2'>\r
+  <td width=131 valign=top style='width:98.1pt;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'>License\r
+  Type</span></b><span style='font-size:12.0pt;font-family:"Times New Roman","serif";\r
+  mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+  <td width=748 valign=top style='width:560.7pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;\r
+  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'>Type of license(s) under which TI will be providing\r
+  software to the licensee (e.g. BSD, GPLv2, TI TSPA License, TI Commercial\r
+  License). See Open Source Reference License Disclaimer in the Disclaimers Section.<span\r
+  style='font-size:12.0pt;font-family:"Times New Roman","serif";mso-fareast-font-family:\r
+  Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:3'>\r
+  <td width=131 valign=top style='width:98.1pt;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'>Location\r
+  </span></b><span style='font-size:12.0pt;font-family:"Times New Roman","serif";\r
+  mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+  <td width=748 valign=top style='width:560.7pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;\r
+  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'>The directory name and path on the media (or in an\r
+  archive) where the Software is located.<span style='font-size:12.0pt;\r
+  font-family:"Times New Roman","serif";mso-fareast-font-family:Calibri;\r
+  mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:4'>\r
+  <td width=131 valign=top style='width:98.1pt;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'>Delivered\r
+  As</span></b><span style='font-size:12.0pt;font-family:"Times New Roman","serif";\r
+  mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+  <td width=748 valign=top style='width:560.7pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;\r
+  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'>This field will either be \93Source\94\93Binary\94 or \93Source\r
+  and Binary\94 and is the form the content of the Software is delivered\r
+  in.&nbsp; If the Software is delivered in an archive format, this field\r
+  applies to the contents of the archive. If the word Limited is used with\r
+  Source, as in \93Limited Source\94 or \93Limited Source and Binary\94 then only\r
+  portions of the Source for the application are provided.<span\r
+  style='font-size:12.0pt;font-family:"Times New Roman","serif";mso-fareast-font-family:\r
+  Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:5'>\r
+  <td width=131 valign=top style='width:98.1pt;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'>Modified\r
+  by TI</span></b><span style='font-size:12.0pt;font-family:"Times New Roman","serif";\r
+  mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+  <td width=748 valign=top style='width:560.7pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;\r
+  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'>This field will either be \93Yes\94 or \93No\94. A \93Yes\94 means\r
+  TI has made changes to the Software. A \93No\94 means TI has not made any\r
+  changes. Note: This field is not applicable for Software \93Obtained from\94 TI.<span\r
+  style='font-size:12.0pt;font-family:"Times New Roman","serif";mso-fareast-font-family:\r
+  Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:6;mso-yfti-lastrow:yes'>\r
+  <td width=131 valign=top style='width:98.1pt;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'>Obtained\r
+  from</span></b><span style='font-size:12.0pt;font-family:"Times New Roman","serif";\r
+  mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+  <td width=748 valign=top style='width:560.7pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;\r
+  mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:3.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'>This field specifies from where or from whom TI\r
+  obtained the Software. It may be a URL to an Open Source site, a 3<sup>rd</sup>\r
+  party licensor, or TI (if TI developed the software). If this field contains\r
+  a link to Open Source software, the date TI downloaded the Software is also\r
+  recorded. See Links Disclaimer in the Disclaimers Section.<span\r
+  style='font-size:12.0pt;font-family:"Times New Roman","serif";mso-fareast-font-family:\r
+  Calibri;mso-fareast-theme-font:minor-latin'><o:p></o:p></span></p>\r
+  </td>\r
+ </tr>\r
+</table>\r
+\r
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'><o:p>&nbsp;</o:p></span></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'>DISCLAIMERS<o:p></o:p></span></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><u>Export Control Classification Number (ECCN)<o:p></o:p></u></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal style='margin-left:.5in;mso-outline-level:1'>Any use of ECCNs\r
+listed in the Manifest is at the user\92s risk and without recourse to TI.<span\r
+style='mso-spacerun:yes'>   </span>Your company, as the exporter of record, is\r
+responsible for determining the correct classification of any item at the time\r
+of export. Any export classification by TI of Software is for TI\92s internal use\r
+only and shall not be construed as a representation or warranty regarding the\r
+proper export classification for such Software or whether an export license or\r
+other documentation is required for exporting such Software<b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'>.<span style='mso-spacerun:yes'> \r
+</span><o:p></o:p></span></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'><o:p>&nbsp;</o:p></span></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><u>Links in the Manifest<o:p></o:p></u></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=1Para style='margin-left:.5in'>Any links appearing on this Manifest\r
+(for example in the \93Obtained from\94 field) were verified at the time the\r
+Manifest was created. TI makes no guarantee that any listed links will remain\r
+active in the future.</p>\r
+\r
+<p class=1Para><b style='mso-bidi-font-weight:normal'><u>Open Source License\r
+References<o:p></o:p></u></b></p>\r
+\r
+<p class=1Para style='margin-left:.5in'>Your company is responsible for\r
+confirming the applicable license terms for any open source Software listed in\r
+this Manifest that was not \93Obtained from\94 TI.<span style='mso-spacerun:yes'> \r
+</span>Any open source license specified in this Manifest for Software that was\r
+not \93Obtained from\94 TI is for TI\92s internal use only and shall not be construed\r
+as a representation or warranty regarding the proper open source license terms\r
+for such Software.</p>\r
+\r
+<b style='mso-bidi-font-weight:normal'><span style='font-size:12.0pt;\r
+font-family:"Arial","sans-serif";mso-fareast-font-family:"Times New Roman";\r
+mso-font-kerning:11.0pt;mso-ansi-language:EN-US;mso-fareast-language:EN-US;\r
+mso-bidi-language:AR-SA'><br clear=all style='mso-special-character:line-break;\r
+page-break-before:always'>\r
+</span></b>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'><o:p>&nbsp;</o:p></span></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'>Export Information<o:p></o:p></span></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'><o:p>&nbsp;</o:p></span></b></p>\r
+\r
+<p class=MsoNormal><span style='mso-fareast-font-family:"MS Mincho";mso-font-kerning:\r
+0pt;mso-fareast-language:JA'>ECCN for Software included in this release:<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>Publically\r
+Available</span><span style='mso-fareast-font-family:"MS Mincho";mso-font-kerning:\r
+0pt;mso-fareast-language:JA'>&nbsp; <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='mso-fareast-font-family:"MS Mincho";mso-font-kerning:\r
+0pt;mso-fareast-language:JA'><o:p>&nbsp;</o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='mso-fareast-font-family:"MS Mincho";mso-font-kerning:\r
+0pt;mso-fareast-language:JA'>ECCN for Technology (e.g., user documentation,\r
+specifications) included in this release:<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif"'>N/A</span><span\r
+style='mso-fareast-font-family:"MS Mincho";mso-font-kerning:0pt;mso-fareast-language:\r
+JA'><o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'><o:p>&nbsp;</o:p></span></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'>Manifest<o:p></o:p></span></b></p>\r
+\r
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal>See Legend above for a description of the columns and\r
+possible values.</p>\r
+\r
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+\r
+<table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0 width=865\r
+ style='width:648.85pt;border-collapse:collapse;border:none;mso-border-alt:\r
+ solid windowtext .5pt;mso-yfti-tbllook:480;mso-padding-alt:0in 5.4pt 0in 5.4pt;\r
+ mso-border-insideh:.75pt solid windowtext;mso-border-insidev:.75pt solid windowtext'>\r
+ <thead>\r
+  <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes;page-break-inside:avoid'>\r
+   <td width=115 valign=top style='width:1.2in;border:solid windowtext 1.0pt;\r
+   mso-border-top-alt:.5pt;mso-border-left-alt:.5pt;mso-border-bottom-alt:.75pt;\r
+   mso-border-right-alt:.75pt;mso-border-color-alt:windowtext;mso-border-style-alt:\r
+   solid;background:#E6E6E6;padding:0in 5.4pt 0in 5.4pt'>\r
+   <p class=MsoNormal style='margin-top:3.0pt'><b style='mso-bidi-font-weight:\r
+   normal'>Software Name<o:p></o:p></b></p>\r
+   </td>\r
+   <td width=76 valign=top style='width:56.9pt;border:solid windowtext 1.0pt;\r
+   border-left:none;mso-border-left-alt:solid windowtext .75pt;mso-border-alt:\r
+   solid windowtext .75pt;mso-border-top-alt:solid windowtext .5pt;background:\r
+   #E6E6E6;padding:0in 5.4pt 0in 5.4pt'>\r
+   <p class=MsoNormal style='margin-top:3.0pt'><b style='mso-bidi-font-weight:\r
+   normal'>Version<o:p></o:p></b></p>\r
+   </td>\r
+   <td width=89 valign=top style='width:66.4pt;border:solid windowtext 1.0pt;\r
+   border-left:none;mso-border-left-alt:solid windowtext .75pt;mso-border-alt:\r
+   solid windowtext .75pt;mso-border-top-alt:solid windowtext .5pt;background:\r
+   #E6E6E6;padding:0in 5.4pt 0in 5.4pt'>\r
+   <p class=MsoNormal style='margin-top:3.0pt'><b style='mso-bidi-font-weight:\r
+   normal'>License Type<o:p></o:p></b></p>\r
+   </td>\r
+   <td width=84 valign=top style='width:63.0pt;border:solid windowtext 1.0pt;\r
+   border-left:none;mso-border-left-alt:solid windowtext .75pt;mso-border-alt:\r
+   solid windowtext .75pt;mso-border-top-alt:solid windowtext .5pt;background:\r
+   #E6E6E6;padding:0in 5.4pt 0in 5.4pt'>\r
+   <p class=MsoNormal style='margin-top:3.0pt'><b style='mso-bidi-font-weight:\r
+   normal'>Delivered <o:p></o:p></b></p>\r
+   <p class=MsoNormal style='margin-top:3.0pt'><b style='mso-bidi-font-weight:\r
+   normal'>As <o:p></o:p></b></p>\r
+   </td>\r
+   <td width=108 valign=top style='width:81.0pt;border:solid windowtext 1.0pt;\r
+   border-left:none;mso-border-left-alt:solid windowtext .75pt;mso-border-alt:\r
+   solid windowtext .75pt;mso-border-top-alt:solid windowtext .5pt;background:\r
+   #E6E6E6;padding:0in 5.4pt 0in 5.4pt'>\r
+   <p class=MsoNormal style='margin-top:3.0pt'><b style='mso-bidi-font-weight:\r
+   normal'>Modified by <o:p></o:p></b></p>\r
+   <p class=MsoNormal style='margin-top:3.0pt'><b style='mso-bidi-font-weight:\r
+   normal'>TI <o:p></o:p></b></p>\r
+   </td>\r
+   <td width=394 colspan=2 valign=top style='width:295.15pt;border:solid windowtext 1.0pt;\r
+   border-left:none;mso-border-left-alt:solid windowtext .75pt;mso-border-top-alt:\r
+   .5pt;mso-border-left-alt:.75pt;mso-border-bottom-alt:.75pt;mso-border-right-alt:\r
+   .5pt;mso-border-color-alt:windowtext;mso-border-style-alt:solid;background:\r
+   #E6E6E6;padding:0in 5.4pt 0in 5.4pt'>\r
+   <p class=MsoNormal style='margin-top:3.0pt;mso-outline-level:1'><b\r
+   style='mso-bidi-font-weight:normal'><span style='font-size:9.0pt'><o:p>&nbsp;</o:p></span></b></p>\r
+   </td>\r
+  </tr>\r
+ </thead>\r
+ <tr style='mso-yfti-irow:1;page-break-inside:avoid'>\r
+  <td width=115 rowspan=2 valign=top style='width:1.2in;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:\r
+  solid windowtext .75pt;mso-border-left-alt:solid windowtext .5pt;padding:\r
+  0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><span class=SpellE>ctprof_srv</span></p>\r
+  </td>\r
+  <td width=76 rowspan=2 valign=top style='width:56.9pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal>1.0</p>\r
+  </td>\r
+  <td width=89 rowspan=2 valign=top style='width:66.4pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal>BSD</p>\r
+  </td>\r
+  <td width=84 rowspan=2 valign=top style='width:63.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal>\93Source and Binary\94</p>\r
+  </td>\r
+  <td width=108 rowspan=2 valign=top style='width:81.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal>N/A</p>\r
+  </td>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'>Location<o:p></o:p></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal>./<span class=SpellE>ctoolsprof</span>/server</p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:2;page-break-inside:avoid'>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'><span\r
+  style='font-size:9.0pt'>Obtained from</span></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal>TI</p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:3;page-break-inside:avoid'>\r
+  <td width=115 rowspan=2 valign=top style='width:1.2in;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:\r
+  solid windowtext .75pt;mso-border-left-alt:solid windowtext .5pt;padding:\r
+  0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><span class=SpellE>ctprof_ex</span></p>\r
+  </td>\r
+  <td width=76 rowspan=2 valign=top style='width:56.9pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal>1.0</p>\r
+  </td>\r
+  <td width=89 rowspan=2 valign=top style='width:66.4pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal>BSD</p>\r
+  </td>\r
+  <td width=84 rowspan=2 valign=top style='width:63.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal>\93Source and Binary\94</p>\r
+  </td>\r
+  <td width=108 rowspan=2 valign=top style='width:81.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal>N/A</p>\r
+  </td>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'>Location<o:p></o:p></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal>./<span class=SpellE>ctoolsprof</span>/<span class=SpellE>example_app</span></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:4;page-break-inside:avoid'>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'><span\r
+  style='font-size:9.0pt'>Obtained from</span></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal>TI</p>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:5;page-break-inside:avoid'>\r
+  <td width=115 rowspan=2 valign=top style='width:1.2in;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:\r
+  solid windowtext .75pt;mso-border-left-alt:solid windowtext .5pt;padding:\r
+  0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=76 rowspan=2 valign=top style='width:56.9pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=89 rowspan=2 valign=top style='width:66.4pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=84 rowspan=2 valign=top style='width:63.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=108 rowspan=2 valign=top style='width:81.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'>Location<o:p></o:p></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:6;page-break-inside:avoid'>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'><span\r
+  style='font-size:9.0pt'>Obtained from</span></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:7;page-break-inside:avoid'>\r
+  <td width=115 rowspan=2 valign=top style='width:1.2in;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:\r
+  solid windowtext .75pt;mso-border-left-alt:solid windowtext .5pt;padding:\r
+  0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=76 rowspan=2 valign=top style='width:56.9pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=89 rowspan=2 valign=top style='width:66.4pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=84 rowspan=2 valign=top style='width:63.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=108 rowspan=2 valign=top style='width:81.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'>Location<o:p></o:p></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:8;page-break-inside:avoid'>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'><span\r
+  style='font-size:9.0pt'>Obtained from</span></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:9;page-break-inside:avoid'>\r
+  <td width=115 rowspan=2 valign=top style='width:1.2in;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:\r
+  solid windowtext .75pt;mso-border-left-alt:solid windowtext .5pt;padding:\r
+  0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=76 rowspan=2 valign=top style='width:56.9pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=89 rowspan=2 valign=top style='width:66.4pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=84 rowspan=2 valign=top style='width:63.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=108 rowspan=2 valign=top style='width:81.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'>Location<o:p></o:p></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:10;page-break-inside:avoid'>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'><span\r
+  style='font-size:9.0pt'>Obtained from</span></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:11;page-break-inside:avoid'>\r
+  <td width=115 rowspan=2 valign=top style='width:1.2in;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:\r
+  solid windowtext .75pt;mso-border-left-alt:solid windowtext .5pt;padding:\r
+  0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=76 rowspan=2 valign=top style='width:56.9pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=89 rowspan=2 valign=top style='width:66.4pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=84 rowspan=2 valign=top style='width:63.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=108 rowspan=2 valign=top style='width:81.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'>Location<o:p></o:p></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:12;page-break-inside:avoid'>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'><span\r
+  style='font-size:9.0pt'>Obtained from</span></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:13;page-break-inside:avoid'>\r
+  <td width=115 rowspan=2 valign=top style='width:1.2in;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:\r
+  solid windowtext .75pt;mso-border-left-alt:solid windowtext .5pt;padding:\r
+  0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=76 rowspan=2 valign=top style='width:56.9pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=89 rowspan=2 valign=top style='width:66.4pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=84 rowspan=2 valign=top style='width:63.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=108 rowspan=2 valign=top style='width:81.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'>Location<o:p></o:p></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:14;page-break-inside:avoid'>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'><span\r
+  style='font-size:9.0pt'>Obtained from</span></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:15;page-break-inside:avoid'>\r
+  <td width=115 rowspan=2 valign=top style='width:1.2in;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:\r
+  solid windowtext .75pt;mso-border-left-alt:solid windowtext .5pt;padding:\r
+  0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=76 rowspan=2 valign=top style='width:56.9pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=89 rowspan=2 valign=top style='width:66.4pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=84 rowspan=2 valign=top style='width:63.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=108 rowspan=2 valign=top style='width:81.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'>Location<o:p></o:p></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:16;page-break-inside:avoid'>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'><span\r
+  style='font-size:9.0pt'>Obtained from</span></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:17;page-break-inside:avoid'>\r
+  <td width=115 rowspan=2 valign=top style='width:1.2in;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-alt:\r
+  solid windowtext .75pt;mso-border-left-alt:solid windowtext .5pt;padding:\r
+  0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=76 rowspan=2 valign=top style='width:56.9pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=89 rowspan=2 valign=top style='width:66.4pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=84 rowspan=2 valign=top style='width:63.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=108 rowspan=2 valign=top style='width:81.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'>Location<o:p></o:p></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:18;page-break-inside:avoid'>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'><span\r
+  style='font-size:9.0pt'>Obtained from</span></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:19;page-break-inside:avoid'>\r
+  <td width=115 rowspan=2 valign=top style='width:1.2in;border:solid windowtext 1.0pt;\r
+  border-top:none;mso-border-top-alt:solid windowtext .75pt;mso-border-top-alt:\r
+  .75pt;mso-border-left-alt:.5pt;mso-border-bottom-alt:.5pt;mso-border-right-alt:\r
+  .75pt;mso-border-color-alt:windowtext;mso-border-style-alt:solid;padding:\r
+  0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=76 rowspan=2 valign=top style='width:56.9pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-bottom-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=89 rowspan=2 valign=top style='width:66.4pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-bottom-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=84 rowspan=2 valign=top style='width:63.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-bottom-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=108 rowspan=2 valign=top style='width:81.0pt;border-top:none;\r
+  border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-bottom-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'>Location<o:p></o:p></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-right-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+ <tr style='mso-yfti-irow:20;mso-yfti-lastrow:yes;page-break-inside:avoid'>\r
+  <td width=104 valign=top style='width:77.9pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-alt:solid windowtext .75pt;mso-border-bottom-alt:solid windowtext .5pt;\r
+  padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal style='margin-top:2.0pt;margin-right:0in;margin-bottom:\r
+  2.0pt;margin-left:0in'><b style='mso-bidi-font-weight:normal'><span\r
+  style='font-size:9.0pt'>Obtained from</span></b></p>\r
+  </td>\r
+  <td width=290 valign=top style='width:217.25pt;border-top:none;border-left:\r
+  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;\r
+  mso-border-top-alt:solid windowtext .75pt;mso-border-left-alt:solid windowtext .75pt;\r
+  mso-border-top-alt:.75pt;mso-border-left-alt:.75pt;mso-border-bottom-alt:\r
+  .5pt;mso-border-right-alt:.5pt;mso-border-color-alt:windowtext;mso-border-style-alt:\r
+  solid;padding:0in 5.4pt 0in 5.4pt'>\r
+  <p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+  </td>\r
+ </tr>\r
+</table>\r
+\r
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'><o:p>&nbsp;</o:p></span></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'><o:p>&nbsp;</o:p></span></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'>Credits <o:p></o:p></span></b></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><span style='font-size:12.0pt'><o:p>&nbsp;</o:p></span></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal style='mso-outline-level:1'><b style='mso-bidi-font-weight:\r
+normal'><span style='font-size:12.0pt'>Licenses <o:p></o:p></span></b></p>\r
+\r
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal><o:p>&nbsp;</o:p></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'>/*<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>* <span class=SpellE>ctoolsprof_srv_main.c</span><o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>* <span class=SpellE>Ctools</span>\r
+Profiler Server Implementation<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>* Copyright (C) 2013 Texas\r
+Instruments Incorporated - http://www.ti.com/ <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>* <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>* <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>Redistribution</span> and use in source and\r
+binary forms, with or without <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>modification</span>, are permitted provided\r
+that the following conditions <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>are</span> met:<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<span style='mso-spacerun:yes'>   \r
+</span>Redistributions of source code must retain the above copyright <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<span style='mso-spacerun:yes'>   \r
+</span><span class=GramE>notice</span>, this list of conditions and the\r
+following disclaimer.<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<span style='mso-spacerun:yes'>   \r
+</span>Redistributions in binary form must reproduce the above copyright<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<span style='mso-spacerun:yes'>   \r
+</span><span class=GramE>notice</span>, this list of conditions and the\r
+following disclaimer in the <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<span style='mso-spacerun:yes'>   \r
+</span><span class=GramE>documentation</span> and/or other materials provided\r
+with the<span style='mso-spacerun:yes'>   </span><o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<span style='mso-spacerun:yes'>   \r
+</span><span class=GramE>distribution</span>.<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<span style='mso-spacerun:yes'>   \r
+</span>Neither the name of Texas Instruments Incorporated nor the names of<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<span style='mso-spacerun:yes'>   \r
+</span><span class=GramE>its</span> contributors may be used to endorse or\r
+promote products derived<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>* <span\r
+style='mso-spacerun:yes'>   </span><span class=GramE>from</span> this software\r
+without specific prior written permission.<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>THIS</span> SOFTWARE IS PROVIDED BY THE\r
+COPYRIGHT HOLDERS AND CONTRIBUTORS <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>&quot;</span>AS IS&quot; AND ANY EXPRESS OR\r
+IMPLIED WARRANTIES, INCLUDING, BUT NOT <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>LIMITED</span> TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\r
+AND FITNESS FOR<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>A</span> PARTICULAR PURPOSE ARE DISCLAIMED.\r
+IN NO EVENT SHALL THE COPYRIGHT <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>OWNER</span> OR CONTRIBUTORS BE LIABLE FOR\r
+ANY DIRECT, INDIRECT, INCIDENTAL, <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>SPECIAL</span>, EXEMPLARY, OR CONSEQUENTIAL\r
+DAMAGES (INCLUDING, BUT NOT <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>LIMITED</span> TO, PROCUREMENT OF SUBSTITUTE\r
+GOODS OR SERVICES; LOSS OF USE,<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>DATA</span>, OR PROFITS; OR BUSINESS\r
+INTERRUPTION) HOWEVER CAUSED AND ON ANY<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>THEORY</span> OF LIABILITY, WHETHER IN\r
+CONTRACT, STRICT LIABILITY, OR TORT <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>(</span>INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\r
+IN ANY WAY OUT OF THE USE <o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span><span class=GramE>*<span\r
+style='mso-spacerun:yes'>  </span>OF</span> THIS SOFTWARE, EVEN IF ADVISED OF\r
+THE POSSIBILITY OF SUCH DAMAGE.<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'><span style='mso-spacerun:yes'> </span>*<o:p></o:p></span></p>\r
+\r
+<p class=MsoNormal><span style='font-family:Consolas;color:#3F7F5F;mso-font-kerning:\r
+0pt'>*/<o:p></o:p></span></p>\r
+\r
+</div>\r
+\r
+</body>\r
+\r
+</html>\r
diff --git a/example_app/ctprof_ex.c b/example_app/ctprof_ex.c
new file mode 100644 (file)
index 0000000..4e44a25
--- /dev/null
@@ -0,0 +1,207 @@
+/*
+ * ctprof_ex.c
+ *
+ * Ctools Profiler Example Implementation
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <getopt.h>
+#include <stdint.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+#include "ctprof_utility.h"
+
+const int g_major_version = 0;
+const int g_minor_version = 1;
+const int g_copyright_year = 2013;
+
+FILE *g_stdout;
+FILE *g_stderr;
+char * g_whoami;
+
+struct memory_blk_t{
+    char * name;
+    uint32_t phy_addr;
+    void * v_addr;
+    size_t phy_size;
+}; 
+
+struct memory_blk_t memory_table[] = {
+    {"Corepac L2_0", 0x10800000, 0, 1024*1024}, /* Corepac 0 L2 */
+    {"Corepac L2_1", 0x11800000, 0, 1024*1024}, /* Corepac 1 L2 */
+    {"Corepac L2_2", 0x12800000, 0, 1024*1024}, /* Corepac 2 L2 */
+    {"Corepac L2_3", 0x13800000, 0, 1024*1024} /* Corepac 3 L2 */
+};
+
+const int zero_test_words = 65536;
+const int memory_table_elements = sizeof(memory_table)/sizeof(struct memory_blk_t);
+
+static struct option long_options[] = {
+    {"interations", required_argument, 0, 'i'},
+    {"quiet", no_argument, 0,'q'},
+    {"help", no_argument, 0, 'h'},
+    {"version", no_argument, 0, 'v'}
+};
+
+static char * short_options = "i:qhv";
+
+static int test_iterations = 1;
+
+
+#define USE_SIGNALS 1
+
+int main(int argc, char *argv[])
+{
+    /* Intialize globals */
+    g_stdout = stdout;
+    g_stderr = stderr;
+    g_whoami = argv[0];
+
+    /* evaluate commamnd line */
+    while (1) {
+
+        int option, option_index = 0;
+
+        option = getopt_long(argc, argv, short_options, long_options, &option_index);
+        
+        if (option == -1) break;
+
+        switch (option) {
+        case 'i':
+            test_iterations = atoi(optarg);
+            break;
+        case 'q':
+            g_stdout = fopen("/dev/null", "w");
+            break;
+        case 'h':
+            fprintf(g_stdout, "Usage: ctprof_ex [ihqv]\n");
+            fprintf(g_stdout, " --iterations/-i <n>     Run test n times\n");
+            fprintf(g_stdout, " --help/-h               Print this\n");
+            fprintf(g_stdout, " --quiet/-q              Send stdout to /dev/null\n");
+            fprintf(g_stdout, " --version/-v            Print version\n");
+            fprintf(g_stdout, "\n");
+            exit(0);
+        case 'v':
+            fprintf(g_stdout, "ctprof_ex version %d.%d\n", 
+                                             g_major_version, g_minor_version);
+            fprintf(g_stdout, "Copyright (C) %d Texas Instruments, Inc.\n", 
+                                                             g_copyright_year); 
+            exit(0);
+            break;
+        default:
+            fprintf(g_stderr,"Invalid option - try -h\n");
+            exit(0); 
+        } /* End of switch */
+
+    }/* end of while*/
+
+    /************************************************************/
+    /* Wait until ctprof is recording to start                  */
+    /************************************************************/
+    if (ctprof_pipe_open() == -1) {
+        fprintf(g_stderr, "Can't open pipe to ctprof\n");
+        exit(-1);
+    }
+
+#if USE_SIGNALS
+    ctprof_ready_wait();
+    ctprof_start_recording();
+#endif
+    ctprof_recording_wait();
+
+    /************************************************************/
+    /* Map each memory table element                            */
+    /************************************************************/
+    int mem_fd = open("/dev/mem", O_RDWR | O_SYNC | O_RSYNC );
+    if (mem_fd == -1) {
+        fprintf(g_stderr, "Can't open /dev/mem\n");
+        exit(-1);
+    }
+
+    for (int i = 0; i <  memory_table_elements; i++) {
+        memory_table[i].v_addr = mmap(0, memory_table[i].phy_size, 
+                                       PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, 
+                                       memory_table[i].phy_addr);
+
+        mlock(memory_table[i].v_addr, memory_table[i].phy_size); 
+    }   
+
+    /************************************************************/
+    /* Test Loop                                                */
+    /************************************************************/
+    while (test_iterations != 0) {
+
+        fprintf(g_stdout, "\r%s:Test Iterations left %d\n", g_whoami, test_iterations);
+
+        /* This test writes zero to the first 64K words of each memory_table element */
+        for (int i = 0; i <  memory_table_elements; i++) {
+
+#if USE_SIGNALS
+            if (i == 2) {
+                ctprof_end_recording();
+                ctprof_stopped_wait();
+            }
+#endif
+            fprintf(g_stdout, "\r%s:Testing %d words of %s\n", g_whoami, zero_test_words, memory_table[i].name);
+
+            uint32_t * addr = (uint32_t *)memory_table[i].v_addr;
+            for (int n = 0; n < zero_test_words; n++) {
+                 *addr++ = 0;
+            }
+
+            addr = (uint32_t *)memory_table[i].v_addr;
+            int test_failed_cnt = 0;
+
+            for (int n = 0; n < zero_test_words; n++) {
+                 if (*addr++ != 0 ) {
+                    test_failed_cnt++;
+                }
+            }
+
+            fprintf(g_stdout, "\r%s:%s had %d failures\n", g_whoami, memory_table[i].name, test_failed_cnt);           
+
+        }
+        test_iterations--;
+
+    } /* End of while*/
+
+    fprintf(g_stdout, "\r%s:Exiting\n", g_whoami);
+    ctprof_pipe_close();
+    exit(0);
+}
+
+
diff --git a/example_app/ctprof_utility.c b/example_app/ctprof_utility.c
new file mode 100644 (file)
index 0000000..3d1320d
--- /dev/null
@@ -0,0 +1,184 @@
+/*
+ * ctprof_utility.c
+ *
+ * Ctools Profiler Utility Implementation
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <signal.h>
+#include "ctprof_utility.h"
+
+static char * fifo_filename = "ctprof_fifo";
+//static FILE * fp;
+static int ctprof_pipe_fd;
+static bool fifo_opened = false;
+static char readbuf[32];
+
+/* State definitions
+ * ready - ctprof_srv is ready for a signal
+ * recording - ctprof_srv is recording
+ * stopped - ctprof_srv has stopped recording
+ */
+static const char msg_recording[] = "ctprof recording\n";
+static const char msg_stopped[] = "ctprof stopped\n";
+static const char msg_ready[] = "ctprof ready\n"; 
+
+
+
+/* Note: This implementation uses named pipes for very 
+ * simple ipc. This could be changed in the future to
+ * use sockets or some other ipc so check the requirements
+ * for the version of ctprof you are using 
+ */
+
+static pid_t ctprof_srv_pid;
+
+int ctprof_pipe_open(void)
+{
+    /* If fifo can't be opend then return -1 */
+    if (!fifo_opened) {
+        if (-1 == (ctprof_pipe_fd = open(fifo_filename, O_RDONLY))) {
+            return -1;
+        }
+        fifo_opened = true;     
+    }
+
+    read(ctprof_pipe_fd, &ctprof_srv_pid, sizeof(pid_t));
+
+}
+
+void ctprof_pipe_close(void)
+{
+    if (fifo_opened) {
+        close(ctprof_pipe_fd);
+        fifo_opened = false;
+    }        
+
+}
+
+static pid_t ctprof_get_pid(void) 
+{
+    if (fifo_opened) {
+        return ctprof_srv_pid;
+    } else {
+        return -1;
+    }
+}
+
+ctprof_state_t ctprof_get_state(void)
+{
+    /* If the fifo opened sucessfully, then fgets should block
+     * until data is avaiable.
+     */
+    if (fifo_opened) {
+        read(ctprof_pipe_fd, readbuf, sizeof(readbuf));
+
+        if (0 == strcmp(readbuf, msg_recording)) {
+            return CTPROF_RECORDING;
+        }
+        if (0 == strcmp(readbuf, msg_stopped)) {
+            return CTPROF_STOPPED;
+        }
+        if (0 == strcmp(readbuf, msg_ready)) {
+            return CTPROF_READY;
+        }
+    }
+
+    return -1;
+
+}
+
+void ctprof_ready_wait()
+{
+    ctprof_state_t ctprof_state;
+
+    do {
+
+        ctprof_state = ctprof_get_state();
+
+        if(ctprof_state == CTPROF_READY) {
+            break;
+        }
+
+    } while (1);
+}
+
+void ctprof_recording_wait()
+{
+    ctprof_state_t ctprof_state;
+
+    do {
+
+        ctprof_state = ctprof_get_state();
+
+        if(ctprof_state == CTPROF_RECORDING) {
+            break;
+        }
+
+    } while (1);
+}
+
+void ctprof_stopped_wait()
+{
+    ctprof_state_t ctprof_state;
+
+    do {
+
+        ctprof_state = ctprof_get_state();
+
+        if(ctprof_state == CTPROF_STOPPED) {
+            break;
+        }
+
+    } while (1);
+}
+
+/* Start recording with a signal*/
+void ctprof_start_recording()
+{
+    kill(ctprof_get_pid(), SIGUSR1);
+}
+
+/* End recording for this session*/
+void ctprof_end_recording()
+{
+    kill(ctprof_get_pid(), SIGUSR2);
+}
+
diff --git a/example_app/ctprof_utility.h b/example_app/ctprof_utility.h
new file mode 100644 (file)
index 0000000..e062dce
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * ctprof_utility.h
+ *
+ * Ctools Profiler Utility Interface
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+#ifndef CTPROF_UTILITY_H
+#define CTPROF_UTILITY_H
+
+typedef enum {
+    CTPROF_READY,
+    CTPROF_STOPPED,
+    CTPROF_RECORDING,
+} ctprof_state_t;
+
+int ctprof_pipe_open(void);
+void ctprof_pipe_close(void);
+ctprof_state_t ctprof_get_state(void);
+void ctprof_ready_wait();
+void ctprof_recording_wait();
+void ctprof_stopped_wait();
+void ctprof_start_recording();
+void ctprof_end_recording();
+
+#endif
diff --git a/example_app/makefile b/example_app/makefile
new file mode 100644 (file)
index 0000000..6371d48
--- /dev/null
@@ -0,0 +1,71 @@
+#
+# makefile for ctoolsprof server
+#
+# examples:
+# make debug install
+# make release install
+# make clean debug install
+# make clean release install OR make all
+
+ifeq ($(findstring arm, $(MAKECMDGOALS)), arm) 
+       CC= $(CROSS_COMPILE)gcc --static
+else
+       CC = gcc
+endif
+
+ifeq ($(findstring debug, $(MAKECMDGOALS)), debug) 
+       CFLAGS= -std=c99 -c -g -Wall $(INC_PATH) -D DEBUG -D _GNU_SOURCE $(TEST)
+       OBJDIR= ./debug
+else 
+    CFLAGS= -std=c99 -c -O2 $(INC_PATH) -D SERVER -D _GNU_SOURCE $(TEST)
+       OBJDIR= ./release
+endif
+LFLAGS =
+LIBS= 
+LIB_PATH=
+INCLUDE_PATH = -I ../example_app
+
+.PHONY: clean debug release install arm
+
+all: clean release install
+
+#
+# Declare.c and .h dependencies
+#
+ctprof_ex.o: ctprof_ex.c
+ctprof_utility.o : ctprof_utility.h ctprof_utility.c 
+
+#
+# Add objects
+#
+
+OBJECTS = $(addprefix $(OBJDIR)/, ctprof_ex.o ctprof_utility.o)
+
+#.c.o:
+#      @echo "Compiling" $<
+#      $(CC) $(CFLAGS) $<
+
+$(OBJDIR)/%.o: %.c
+       @echo "Compiling" $<
+       @mkdir -p $(OBJDIR)
+       $(CC) $(CFLAGS) $(INCLUDE_PATH) -o $@ $<
+
+ctprof_ex: $(OBJECTS)
+       @echo "Building target" $@
+       $(CC) $(LFLAGS) $(LIBS_PATH) -o $@ $(OBJECTS) $(LIBS)
+
+debug: ctprof_ex
+       @echo "debug build complete"
+
+release: ctprof_ex
+       @echo "release build complete"
+
+arm: ctprof_ex
+       @echo "ARM version built"
+
+install: 
+       mv ctprof_ex ~/bin/ctprof_ex
+
+clean:
+       -rm $(OBJECTS)
+
diff --git a/server/ETBAddr.h b/server/ETBAddr.h
new file mode 100644 (file)
index 0000000..2c812c6
--- /dev/null
@@ -0,0 +1,418 @@
+/****************************************************************************\r
+CToolsLib - ETB Library \r
+\r
+Copyright (c) 2009-2012 Texas Instruments Inc. (www.ti.com)\r
+All rights reserved.\r
+\r
+Redistribution and use in source and binary forms, with or without\r
+modification, are permitted provided that the following conditions\r
+are met:\r
+1. Redistributions of source code must retain the above copyright\r
+   notice, this list of conditions and the following disclaimer.\r
+2. Redistributions in binary form must reproduce the above copyright\r
+   notice, this list of conditions and the following disclaimer in the\r
+   documentation and/or other materials provided with the distribution.\r
+3. The name of the author may not be used to endorse or promote products\r
+   derived from this software without specific prior written permission.\r
+\r
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR\r
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\r
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+****************************************************************************/\r
+#ifndef __ETB_ADDR_H\r
+#define __ETB_ADDR_H\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/*! \file CSETBAddr.h\r
+    \version 1.2\r
+\r
+    This file contains the ETB and TI Data Trace Formatter addresses.\r
+    The "n" parameter used for the address is a CPU enumeration for homogeneous multi-core devices.\r
+    For example, TCI6488 has n values as 0,1,3 for the three DSPs. \r
+    If a device does not have such multiple cores and associated ETBs, n is unused and should be 0.\r
+    where ETB is being programmed and accessed.\r
+ */\r
+\r
+/************************************************************************** \r
+   Device specific information\r
+   A new device can be supported by adding a device preprocessor \r
+   block specifying base addresses. \r
+**************************************************************************/\r
+\r
+#if defined(TCI6612) || defined(TCI6614) || defined(TCI6616) || defined(TCI6618) \\r
+|| defined(C6657) || defined(C6670) || defined(C6671) || defined(C6672) || defined(C6674) || defined(C6678) || defined(C66AK2Hxx) || defined(C66AK2Exx) && !defined(C66x)\r
+\r
+#define C66x\r
+\r
+#endif\r
+\r
+#if defined(TCI6486)  \r
+    #define NUM_ETB_INSTANCES 6\r
+    #define DTF_PRESENT 1\r
+    #define SYSETB_PRESENT 0\r
+    \r
+    /* ETB base address for different device types */\r
+    #define _ETB_BaseAddress(n) ( 0x02C40000 + (n<<12) ) /* Base Address for ETB MMRs associated with GEMx */\r
+    /* DTF MMR address. */\r
+    #define DTF_CNTL(n)         ( 0x02A80100 + (n << 4)) /* memory mapped address for DTF Control register for GEMx */\r
+   \r
+#elif defined(TCI6488) \r
+    #define NUM_ETB_INSTANCES 3\r
+    #define DTF_PRESENT 1\r
+    #define SYSETB_PRESENT 0\r
+\r
+    /* ETB base address for different device types */\r
+    #define _ETB_BaseAddress(n) ( 0x02AD0000 + (n<<15) ) /* Base Address for ETB MMRs associated with GEMx */\r
+    /* DTF MMR address. */\r
+    #define DTF_CNTL(n)         (0x02880400 + (n << 2)) /* memory mapped address for DTF Control register for GEMx */\r
+    \r
+#elif defined(TCI6484) \r
+    #define NUM_ETB_INSTANCES 1\r
+    #define DTF_PRESENT 1\r
+    #define SYSETB_PRESENT 0\r
+\r
+    /* ETB base address for different device types */\r
+    #define _ETB_BaseAddress(n) (0x02AD0000) /* Base Address for ETB MMRs associated with GEMx */\r
+    /* DTF MMR address */\r
+    #define DTF_BASE(n)         (0x02AD1000) \r
+    #define DTF_CNTL(n)         (DTF_BASE(n) + 0x000) /* memory mapped address for DTF Control register for GEMx */\r
+    #define TAGSET(n)           (DTF_BASE(n) + 0xFA0) /* memory mapped address for DTF Control register for GEMx */\r
+    #define TAGCLR(n)           (DTF_BASE(n) + 0xFA4) /* memory mapped address for DTF Control register for GEMx */\r
+    #define DTF_LOCK(n)         (DTF_BASE(n) + 0xFB0) /* memory mapped address for DTF Control register for GEMx */\r
+    #define DTF_LOCK_STATUS(n)  (DTF_BASE(n) + 0xFB4) /* memory mapped address for DTF Control register for GEMx */\r
+    #define ID(n)               (DTF_BASE(n) + 0xFC8) /* memory mapped address for DTF Control register for GEMx */\r
+    /* PSC MMR address */\r
+    #define PSC_BASE            (0x02AC0000) \r
+    #define PSC_MDCTL(n)        (PSC_BASE+ 0xA00 + (4*n)) /* memory mapped address for Module Control Register for clock, reset and EMU behavior control */\r
+    #define PSC_MDSTAT(n)       (PSC_BASE+ 0x800 + (4*n)) /* memory mapped address for Module status register */ \r
+    #define PSC_PTCMD           (PSC_BASE+ 0x120) /* memory mapped address for transition command register */\r
+    #define PSC_PTSTAT          (PSC_BASE+ 0x128) /* memory mapped address for transition command status register */ \r
+\r
+#elif defined(C66x)\r
+    #define NUM_ETB_INSTANCES   9 /* For 6616, there are 4 DSP ETB and 1 SYS ETB. For 6678/6608, there are 8 DSP ETB and 1 SYS ETB */\r
+    #define SYSETB_PRESENT 1\r
+    #define SYS_ETB_ID  8 /* calculated to get system etb base address using _ETB_BaseAddress(n). For keystone2 devices, SYS_ETB_ID (TBR)\r
+                             is not used to get system etb base address using _ETB_BaseAddress(n).  */\r
+#ifndef __linux\r
+    #define DTF_PRESENT 1\r
+    #define DMA_SUPPORT\r
+#endif\r
+\r
+#if defined(C66AK2Hxx) || defined(C66AK2Exx)\r
+    /* Get ETB base address for different cores and system ETB */\r
+    #define _ETB_BaseAddress(n) ((n==SYS_ETB_ID)?(0x03019000):(0x027D0000 + (n << 16))) /* Base Address for ETB MMRs associated with CorePACx and SYS ETB (TBR) */\r
+#else\r
+#ifdef __linux\r
+    #define ETB_BaseAddress(n) (0x027D0000 + (n << 16))\r
+    #define _ETB_BaseAddress(n) virtural_ETB_BaseAddress[n]\r
+    #define SIZEOF_ETB_SPACE 4096\r
+#else\r
+    /* Get ETB base address for different cores and system ETB */\r
+    #define _ETB_BaseAddress(n) (0x027D0000 + (n << 16)) /* Base Address for ETB MMRs associated with CorePACx and SYS ETB*/\r
+#endif\r
+#endif\r
+\r
+    /* Debug SS MIPI STM TBR DMA slave port address */\r
+    #define TBR_RBD          (0x02850000)\r
+    \r
+    /* DTF MMR address */\r
+#ifdef __linux\r
+    #define DTF_BaseAddress(n)  (0x02440000 + (n << 16))\r
+    #define DTF_BASE(n)         virtural_DTF_BaseAddress[n]\r
+    #define SIZEOF_DTF_SPACE    4096\r
+#else\r
+    #define DTF_BASE(n)         (0x02440000 + (n << 16))\r
+#endif\r
+    #define DTF_CNTL(n)         (DTF_BASE(n) + 0x000) /* memory mapped address for DTF Control register for C66x */\r
+    #define TAGSET(n)           (DTF_BASE(n) + 0xFA0) /* memory mapped address for DTF Control register for C66x */\r
+    #define TAGCLR(n)           (DTF_BASE(n) + 0xFA4) /* memory mapped address for DTF Control register for C66x */\r
+    #define DTF_LOCK(n)         (DTF_BASE(n) + 0xFB0) /* memory mapped address for DTF Control register for C66x */\r
+    #define DTF_LOCK_STATUS(n)  (DTF_BASE(n) + 0xFB4) /* memory mapped address for DTF Control register for C66x */\r
+    #define ID(n)               (DTF_BASE(n) + 0xFC8) /* memory mapped address for DTF Control register for C66x */\r
+    \r
+    /* PSC MMR address */\r
+#ifdef __linux\r
+    #define PSC_BaseAddress     (0x02350000)\r
+    #define PSC_BASE            virtural_PSC_BaseAddress\r
+    #define SIZEOF_PSC_SPACE    4096\r
+#else\r
+    #define PSC_BASE            (0x02350000)\r
+#endif\r
+#define PSC_PDSTAT(n)  (PSC_BASE + 0x200 + (4*n))\r
+    #define PSC_PDCTL(n)        (PSC_BASE + 0x300 + (4*n)) /* memory mapped address for Power Domain Control Register */     \r
+    #define PSC_MDCTL(n)        (PSC_BASE + 0xA00 + (4*n)) /* memory mapped address for Module Control Register for clock, reset and EMU behavior control */\r
+    #define PSC_MDSTAT(n)       (PSC_BASE+ 0x800 + (4*n)) /* memory mapped address for Module status register */ \r
+    #define PSC_PTCMD           (PSC_BASE + 0x120) /* memory mapped address for transition command register */\r
+    #define PSC_PTSTAT          (PSC_BASE + 0x128)  /* memory mapped address for transition command status register */ \r
+\r
+#elif defined(TI816x) \r
+    #define NUM_ETB_INSTANCES   1\r
+    #define SYSETB_PRESENT 1\r
+    #define SYS_ETB_ID  1 \r
+\r
+    /* ETB base address for different device types */\r
+    // the variable 'n' is used as a dummy and always 'zero' is added to the base address. This is done to remove a compiler warning\r
+    #define _ETB_BaseAddress(n) ( 0x4B162000 + (0 << n) ) /* Base Address for ETB MMRs associated with TI81x - one ETB*/\r
+    \r
+    #if defined(ETM) \r
+        #define DTF_PRESENT 0\r
+    #elif defined(DSP) \r
+        #define DTF_PRESENT 1\r
+    #elif defined(STM) \r
+        #define DTF_PRESENT 0\r
+    #endif\r
+\r
+    /* DTF MMR address */\r
+    #define DTF_BASE(n)         (0x4B166000 + (n << 16)) \r
+    #define DTF_CNTL(n)         (DTF_BASE(n) + 0x000) /* memory mapped address for DTF Control register for C66x */\r
+    #define TAGSET(n)           (DTF_BASE(n) + 0xFA0) /* memory mapped address for DTF Control register for C66x */\r
+    #define TAGCLR(n)           (DTF_BASE(n) + 0xFA4) /* memory mapped address for DTF Control register for C66x */\r
+    #define DTF_LOCK(n)         (DTF_BASE(n) + 0xFB0) /* memory mapped address for DTF Control register for C66x */\r
+    #define DTF_LOCK_STATUS(n)  (DTF_BASE(n) + 0xFB4) /* memory mapped address for DTF Control register for C66x */\r
+    #define ID(n)               (DTF_BASE(n) + 0xFC8) /* memory mapped address for DTF Control register for C66x */\r
+\r
+#elif defined(OMAP3x)//OMAP3\r
+    #define DTF_PRESENT 0\r
+    #error Need to find out ETB base address from device data sheet for this device.\r
+\r
+#elif defined(_OMAP) || defined(_OMAP54xx)\r
+    #define NUM_ETB_INSTANCES   1\r
+    #define SYSETB_PRESENT      1\r
+    #define SYS_ETB_ID          1 \r
+\r
+#ifdef _OMAP\r
+    /* ETB base address for OMAP devices */\r
+    // the variable 'n' is used as a dummy and always 'zero' is added to the base address. This is done to remove a compiler warning\r
+    #define _ETB_BaseAddress(n) ( 0x54162000 + (0 << n) ) /* Base Address for ETB MMRs - one ETB */\r
+#endif\r
+\r
+#ifdef _OMAP54xx\r
+       /* TBR base address for OMAP54xx ES2 devices */\r
+    /* Note that for OMAP5 ES1 the OMAP4430 A9 build will work - _OMAP */\r
+    #define _ETB_BaseAddress(n) ( 0x54167000 ) /* Base Address for ETB MMRs - one ETB */\r
+#endif\r
+\r
+    #if defined(ETM) \r
+        #define DTF_PRESENT 0\r
+    #elif defined(DSP) \r
+        #define DTF_PRESENT 1\r
+    #elif defined(STM) \r
+        #define DTF_PRESENT 0\r
+    #endif\r
+\r
+#ifdef _OMAP54xx\r
+    #define ENABLE_ETB_FORMATTER\r
+#endif\r
+    /* DTF (Trace Funnel) MMR address, Registers defined in CoreSight Components TRM */\r
+    #define DTF_BASE(n)         (0x54164000 + (n << 16)) \r
+    #define DTF_CNTL(n)         (DTF_BASE(n) + 0x000) /* Funnel control register */\r
+    #define TAGSET(n)           (DTF_BASE(n) + 0xFA0) /* Claim Tag Set register  */\r
+    #define TAGCLR(n)           (DTF_BASE(n) + 0xFA4) /* Claim Tag Clear register */\r
+    #define DTF_LOCK(n)         (DTF_BASE(n) + 0xFB0) /* Lock Access - WO */\r
+    #define DTF_LOCK_STATUS(n)  (DTF_BASE(n) + 0xFB4) /* Lock Status - RO */\r
+    #define ID(n)               (DTF_BASE(n) + 0xFC8) /* Device ID */\r
+\r
+#elif defined(TCI6612_CSETB) || defined(TCI6614_CSETB) \r
+    #define NUM_ETB_INSTANCES   1\r
+    #define SYSETB_PRESENT      1\r
+    #define SYS_ETB_ID          1 \r
+    #define DTF_PRESENT 0\r
+\r
+    /* ETB base address for TCI6614 device */\r
+    // the variable 'n' is used as a dummy and always 'zero' is added to the base address. This is done to remove a compiler warning\r
+    #define _ETB_BaseAddress(n) ( 0x025A6000 + (0 << n) ) /* Base Address for CS-ETB */\r
+\r
+#elif defined(C66AK2Hxx_CSSTM_ETB) || defined(C66AK2Exx_CSSTM_ETB)\r
+\r
+    #define NUM_ETB_INSTANCES   1\r
+    #define SYSETB_PRESENT      1\r
+    #define SYS_ETB_ID          1\r
+    #define DTF_PRESENT 0\r
+    #define DMA_SUPPORT\r
+\r
+    /* CSSTM ETB base address for Keystone2 devices */\r
+    #define _ETB_BaseAddress(n) (0x03020000 + (n << 12)) /* Base Address for CSSTM-ETB, 'n' is the A15 MPU SS id. For keystone2, there is only one A15 MPU SS and n=0  */\r
+\r
+    /* CSSTM TBR DMA slave port address */\r
+    #define TBR_RBD          (0x027D4000)\r
+\r
+#if defined(C66AK2Hxx_CSSTM_ETB)\r
+#define C66AK2Hxx\r
+#elif defined(C66AK2Exx_CSSTM_ETB)\r
+#define C66AK2Exx\r
+#endif\r
+\r
+#elif defined(C66AK2Hxx_CSSTM_ETB) || defined(C66AK2Exx_CSSTM_ETB)\r
+\r
+    #define NUM_ETB_INSTANCES   1\r
+    #define SYSETB_PRESENT      1\r
+    #define SYS_ETB_ID          1\r
+    #define DTF_PRESENT 0\r
+\r
+    /* CSSTM ETB base address for Keystone2 devices */\r
+    #define _ETB_BaseAddress(n) (0x03020000 + (n << 12)) /* Base Address for CSSTM-ETB, 'n' is the A15 MPU SS id. For keystone2, there is only one A15 MPU SS and n=0  */\r
+\r
+    /* CSSTM TBR DMA slave port address */\r
+    #define TBR_RBD          (0x027D4000)\r
+\r
+#if defined(C66AK2Hxx_CSSTM_ETB)\r
+#define C66AK2Hxx\r
+#elif defined(C66AK2Exx_CSSTM_ETB)\r
+#define C66AK2Exx\r
+#endif\r
+\r
+#else\r
+    #error No device type preprocessor defined for the ETBLib\r
+#endif\r
+\r
+\r
+\r
+\r
+/************************************************************************** \r
+   No changes need to be made below this point to support a new device \r
+**************************************************************************/\r
+\r
+/* Registers common for both TI-ETB and TBR implementations*/\r
+\r
+/* ETB RAM Depth Register RDP */\r
+/* TBR RAM Size Register  */\r
+#define ETB_RDP(n)          (_ETB_BaseAddress(n) + 0x004)\r
+/* ETB Status Register STS */\r
+/* TBR Status Register */\r
+#define ETB_STS(n)          (_ETB_BaseAddress(n) + 0x00C)\r
+/* ETB/TBR RAM Read Data Register RRD */\r
+#define ETB_RRD(n)          (_ETB_BaseAddress(n) + 0x010)\r
+/* ETB/TBR RAM Read Pointer Register RRP */\r
+#define ETB_RRP(n)          (_ETB_BaseAddress(n) + 0x014)\r
+/* ETB/TBR RAM Write Pointer Register RWP */\r
+#define ETB_RWP(n)          (_ETB_BaseAddress(n) + 0x018)\r
+/* ETB/TBR Trigger counter register */\r
+#define ETB_TRIG(n)         (_ETB_BaseAddress(n) + 0x01C)\r
+/* ETB/TBR Control Register CTL */\r
+#define ETB_CTL(n)          (_ETB_BaseAddress(n) + 0x020)\r
+/* ETB/TBR RAM Write Data Register RWD */\r
+#define ETB_RWD(n)          (_ETB_BaseAddressn(n)+ 0x024)\r
+/* ETB Formatter and Flush Status Register FFSR */\r
+/* TBR Operation Status Register OPSTAT */\r
+#define ETB_FFSR(n)         (_ETB_BaseAddress(n) + 0x300)\r
+/* ETB Formatter and Flush Control Register FFCR */\r
+/* TBR Operations Control Register OPCTRL*/\r
+#define ETB_FFCR(n)         (_ETB_BaseAddress(n) + 0x304)\r
+/* ETB/TBR Lock Access Register */\r
+#define ETB_LOCK(n)         (_ETB_BaseAddress(n) + 0xFB0)\r
+/* ETB/TBR Lock Status Register */\r
+#define ETB_LOCK_STATUS(n)  (_ETB_BaseAddress(n) + 0xFB4)\r
+/* ETB/TBR device ID Register */\r
+#define ETB_DEVID(n)        (_ETB_BaseAddress(n) + 0xFC8)\r
+\r
+/* Registers specific to TI-ETB implementation*/\r
+#define ETB_WIDTH(n)        (_ETB_BaseAddress(n) + 0x008) /* ETB RAM Width Register STS */\r
+#define ETB_RBD(n)          (_ETB_BaseAddress(n) + 0xA00) /* ETB RAM burst read Register */\r
+#define ETB_TI_CTL(n)       (_ETB_BaseAddress(n) + 0xE20) /* ETB TI Control Register */\r
+#define ETB_IRST(n)         (_ETB_BaseAddress(n) + 0xE00) /* ETB TI Interrupt Raw Status Register */\r
+#define ETB_ICST(n)         (_ETB_BaseAddress(n) + 0xE04) /* ETB TI Interrupt Raw Status Register */\r
+#define ETB_IER(n)          (_ETB_BaseAddress(n) + 0xE0C) /* ETB TI Interrupt Enable Register */\r
+#define ETB_IECST(n)        (_ETB_BaseAddress(n) + 0xE10) /* Clear interrupt enable bits */\r
+\r
+/* Registers specific to TBR implementation */\r
+#define TBR_FIFOSZ(n)          (_ETB_BaseAddress(n) + 0x008) /*TBR Output FIFO Size Register */\r
+#define TBR_OUTLVL(n)          (_ETB_BaseAddress(n) + 0x100) /*Output FIFO Trigger Level Register */\r
+#define TBR_SICTRL(n)          (_ETB_BaseAddress(n) + 0x104) /*TBR System Interface Control */\r
+#define TBR_IDPERIOD(n)        (_ETB_BaseAddress(n) + 0x108) /*ID Repeat Period Register */\r
+#define TBR_SEQCNTL(n)         (_ETB_BaseAddress(n) + 0x10C) /*Message Sequence Insertion Control */\r
+#define TBR_EOI(n)             (_ETB_BaseAddress(n) + 0x120) /*TBR EOI register */\r
+#define TBR_IRQSTATUS_RAW(n)   (_ETB_BaseAddress(n) + 0x124) /*TBR IRQ Status (Raw) register */\r
+#define TBR_IRQSTATUS(n)       (_ETB_BaseAddress(n) + 0x128) /*TBR IRQ Status register */\r
+#define TBR_IRQENABLE_SET(n)   (_ETB_BaseAddress(n) + 0x12C) /*TBR IRQ Enable set register */\r
+#define TBR_IRQENABLE_CLR(n)   (_ETB_BaseAddress(n) + 0x130) /*TBR IRQ Enable clear register */\r
+#define TBR_CLAIMSET(n)        (_ETB_BaseAddress(n) + 0xFA0) /*Claim Tag Set Register */\r
+#define TBR_CLAIMCLR(n)        (_ETB_BaseAddress(n) + 0xFA4) /*Claim Tag Clear Register */\r
+#define TBR_AUTHSTAT(n)        (_ETB_BaseAddress(n) + 0xFB8) /*Authorization Status Register */\r
+\r
+\r
+/* ETB enable bit */\r
+#define ETB_ENABLE      0x00000001\r
+/* ETB Status Register Bit definitions */\r
+#define ETB_STS_ACQCOMP  0x00000004 /* bit 2: 1=acquisition complete */\r
+#define ETB_STS_FULL     0x00000001 /* bit 0: 1=RAM full */\r
+/* ETB Formatter and Flush Status Register bits */\r
+#define ETB_FLUSH_INPROGRESS 0x00000001 /* bit 0: 1 = flush in progress */\r
+/* ETB unlock value */\r
+#define ETB_UNLOCK_VAL   0xC5ACCE55 /* Value to unlock ETB for register accesses */\r
+\r
+/* DTF values */\r
+#define LOCK_STATUS_IMP_BIT            (1<<0)\r
+#define LOCK_STATUS_STAT_BIT   (1<<1)\r
+#define DTF_ID_MAJOR_MASK          (0xF<<4)       \r
+#define DTF_ID_MAJOR_VER1          (0x1<<4)       \r
+#define DTF_ID_MAJOR_VER2          (0x2<<4)    \r
+#define TI_ETB_CIRCULARMODE_BIT        (0x1<<1)\r
+#define TI_ETB_TI_MODE          (0x1<<0)\r
+\r
+#define TBR_BRIDGE_MODE         (0x1<<1)\r
+#define TBR_BUFFER_MODE         (0xFFFFFFFD)\r
+\r
+#define DTF_VER2_FLUSH_BIT  (1<<7)\r
+\r
+#define TI_ETB_IRST_UNDERFLOW (1 << 3)\r
+#define TI_ETB_IRST_OVERFLOW  (1 << 2)\r
+#define TI_ETB_IRST_FULL      (1 << 1)\r
+#define TI_ETB_IRST_HALF_FULL (1 << 0)\r
+\r
+#define TBR_IRST_AQCMP      (1 << 1)\r
+#define TBR_IRST_DAV        (1 << 0)\r
+#define TBR_STP_FULL        (1 << 15)\r
+\r
+#define TBR_TWP_DISABLE (0xFFFFFFFE)\r
+#define TBR_TWP_ENABLE  (0x1)\r
+\r
+#define TBR_TWP_IDPERIOD (0x8)\r
+\r
+#define TBR_TWP_SEQATBID (0x6F << 16)\r
+#define TBR_TWP_SEQPERIOD (0x10)\r
+\r
+/* TBR Operations Control Register (OPCTRL)bits */\r
+#define TBR_OUTFLUSH_INPROGRESS (1<<16) /* bit 16: 1 = output flush in progress */\r
+#define TBR_OUTFLUSH_START (1<<16) /* set bit 16 = 1 : output flush in started */\r
+\r
+/* TBR Status Register(STAT) bits */\r
+#define TBR_DRAIN_INPROGRESS (1<<4) /* bit 4: 1 = DMA drain in progress */\r
+\r
+/* TBR System interface control (SICTRL) register */\r
+#define TBR_READ_REQ_PENDING (1<<1)\r
+\r
+#if defined(C66AK2Hxx_CSSTM_ETB) || defined(C66AK2Exx_CSSTM_ETB)\r
+\r
+#define TBR_NUMBLOCK (0xF)\r
+#define TBR_BLOCKSZ (0x1F)\r
+\r
+#else\r
+\r
+#define TBR_NUMBLOCK (0xF)\r
+#define TBR_BLOCKSZ (0x3F)\r
+\r
+#endif\r
+\r
+/* TI-ETB and TBR device identifiers */\r
+#define ETB_DEVICE_ID (0x20)\r
+#define TBR_DEVICE_ID (0x11)\r
+\r
+\r
+/* ETB Maximum Burst Size value */\r
+#define ETB_BURST_SIZE  0x400\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif //__ETB_ADDR_H\r
diff --git a/server/ETBInterface.h b/server/ETBInterface.h
new file mode 100644 (file)
index 0000000..7e5ce61
--- /dev/null
@@ -0,0 +1,506 @@
+#ifndef __ETB_INTERFACE_H\r
+#define __ETB_INTERFACE_H\r
+\r
+#include <stdint.h> /*ANSI C99 specific type definitions */\r
+/*\r
+ * Embedded Trace Buffer (ETB) API \r
+ *\r
+ * Copyright (C) 2009-2012 Texas Instruments Incorporated - http://www.ti.com/ \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/*! \file ETBInterface.h\r
+    \version 1.7\r
+    Application Access to Embedded Trace Buffer.\r
+\r
+    This module allows users to program ETB debug hardware.\r
+*/\r
+/* The mainpage for doxygen has been added to the end of this file */\r
+\r
+/*! \par ETBLIB_MAJOR_VERSION\r
+    ETBLib major revision. This number will be changed for API modifications. \r
+*/\r
+#define ETBLIB_MAJOR_VERSION    (0x1)\r
+\r
+/*! \par ETBLIB_MINOR_VERSION\r
+    ETBLib minor revision. This number will be changed for bug fixes. \r
+*/\r
+#define ETBLIB_MINOR_VERSION    (0xD)\r
+\r
+/*! \par SYS_ETB\r
+    If the ETB is for System Trace (STM), use SYS_ETB as a coreID. \r
+*/\r
+#define SYS_ETB 0xFF\r
+\r
+#if defined(TCI6612) || defined(TCI6614) || defined(TCI6616) || defined(TCI6618) && !defined(C6670)\r
+#define C6670\r
+#endif\r
+\r
+#if defined(C6671) || defined(C6672) || defined(C6674) && !defined(C6678)\r
+#define C6678\r
+#endif\r
+\r
+\r
+/*! \par eETB_Error\r
+    Common function return error enumeration. \r
+*/\r
+typedef enum _eETB_Error \r
+{\r
+    \r
+    eETB_Success = 0,             /*!< Function completed successfully */\r
+    eETB_Error_Bad_Param = -1,    /*!< Error, method parameter error */\r
+    eETB_Error_Program = -2,      /*!< Error, Error programming hardware */\r
+    eETB_Error_Cannot_Own = -3,   /*!< Error, Error programming hardware, ownership cannot be taken */\r
+    eETB_Error_Cannot_Read = -4,  /*!< Error, Cannot read ETB as ETB is not in a readable state */\r
+    eETB_Error_Cannot_Write = -5, /*!< Error, Cannot write ETB as ETB is not in a writabe state */\r
+    eETB_Error_Psc_Enabling = -6, /*!< Error, Error programming hardware, Cannot enable PSC modules for ETB */\r
+    eETB_Overflow = -7,           /*!< Error, Read Overflow - TI Mode only */\r
+    eETB_Underflow = -8           /*!< Error. Read Underflow - TI Mode only */\r
+} eETB_Error ;\r
+\r
+\r
+/*! \par ETB_errorCallback\r
+    The callback function is called with the function's exit status.  Note that this function is not exported\r
+    by the interface, but is used as a parameter for calls. \r
+    \r
+    \param[in] eETB_Error error returned by calling routine.\r
+    \return void \r
+\r
+    \par Details:\r
+    \details   \r
+    This is a user provided callback normally used to centralize error handling and error is desired to be handled in a \r
+    callback routine provided by the caller instead a return error code. \r
+*/\r
+typedef void(*ETB_errorCallback)(eETB_Error);\r
+\r
+\r
+/*! \par eETB_Mode\r
+    Type of ETB mode. This is used to define ETB mode during an ETB_open call.\r
+    This mode should be very carefully selected as per the actual ETB on chip.\r
+*/\r
+typedef enum _eETB_Mode\r
+{\r
+    eETB_Circular = 0,                  /*!< Circular mode for ETB11, CSETB, TI ETB. Only circular buffer mode and can't be read while capturing*/\r
+    eETB_TI_Mode = 1,                   /*!< For TI-ETB implemetation, this is TI ETB mode (simultaneneous read/write) with a circular buffer mode\r
+                                             For Keystone2 SYS ETB and CSSTM ETB, provides circular buffer mode with no support for simultaneneous read/write of ETB buffer*/\r
+    eETB_Stop_Buffer = 2,               /*!< Stop on buffer full mode*/\r
+    eETB_TI_Mode_AND_Stop_Buffer = 3    /*!< For TI-ETB implemetation, this is TI ETB mode (simultaneneous read/write) with stop on buffer full mode\r
+                                        For Keystone2 SYS ETB and CSSTM ETB, provides stop on buffer full mode with no support for simultaneneous read/write of ETB buffer */\r
+} eETB_Mode ;\r
+\r
+/*! \par eDMA_Mode\r
+    Type of DMA mode. This is used to define the DMA mode during a DMA configuraion.\r
+*/\r
+typedef enum _eDMA_Mode\r
+{\r
+    eDMA_Circular = 0,                  /*!< Circular mode */\r
+    eDMA_Stop_Buffer = 1                /*!< Stop on buffer full mode */\r
+} eDMA_Mode ;\r
+\r
+/*! \par eCIC_Select\r
+    The Chip-level Interrupt Controller number values.\r
+*/\r
+typedef enum _eCIC_Select\r
+{\r
+    eCIC_0,\r
+    eCIC_1,\r
+    eCIC_2,\r
+    eCIC_3\r
+} eCIC_Select;\r
+\r
+/*! \par DMAConfig\r
+    \brief DMA configuration structure\r
+*/\r
+typedef struct _DMAConfig\r
+{\r
+#if defined(C6670) || defined(C6678)\r
+       \r
+       uint32_t cc;           /*!< EDMA3 channel controller number. Only applicable for C6670 and C6678 devices. */\r
+    uint16_t clrChannel;   /*!< 1st DMA channel number for DMA draining (needs to\r
+                                 be able to access CPINTC). Application must have\r
+                                 configured the channel to PaRAM mapping for this\r
+                                 channel before using this API. Only applicable for C6670 and C6678 devices.\r
+                            */\r
+    uint16_t etbChannel;   /*!< 2nd DMA channel number for DMA draining (needs to\r
+                                 be able to access the ETB). Application must have\r
+                                 configured the channel to PaRAM mapping for this\r
+                                 channel before using this API. Only applicable for C6670 and C6678 devices.\r
+                            */\r
+       eCIC_Select cic;       /*!< External chip level interrupt controller INTCx,\r
+                                 also called Chip Interrupt Controller CICx.\r
+                                 Selection from the eCIC_Select enumeration.\r
+                                                                Only applicable for C6670 and C6678 devices.\r
+                            */\r
+                                                       \r
+#endif\r
+                                                       \r
+    uint16_t linkparam[3]; /*!< 3 additional parameter RAM entry numbers (used for\r
+                                 linking by the library). Thses must be different\r
+                                 PaRAM entries than thos mapped to channel 1 & 2.\r
+                            */\r
+    uint32_t dbufAddress;  /*!< DMA Drain buffer address */\r
+    uint32_t dbufWords;    /*!< DMA Drain buffer size in 32-bit words */\r
+    eDMA_Mode mode;        /*!< DMA Drain buffer mode (only eDMA_Circular and\r
+                                 eDMA_Stop_Buffer are valid values)\r
+                            */\r
+} DMAConfig;\r
+\r
+/*! \par DMAStatus\r
+    \brief DMA status structure\r
+    \details\r
+    This structure is populated in the ETB_flush_dma function to provide the\r
+    address for the beginning of the circular buffer and the number of words\r
+    that have been transferred into it. The buffer address and size that are\r
+    provided in the DMA configuration structure is duplicated here to provide\r
+    all of the information required to manage reading the circular buffer.\r
+*/\r
+typedef struct _DMAStatus\r
+{\r
+    uint32_t startAddr; /*!< Current starting lcoation address in DMA drain\r
+                              buffer.\r
+                        */\r
+    uint32_t availableWords; /*!< Total number of 32-bit words that have been written\r
+                                   into the DMA drain buffer.\r
+                             */\r
+    uint32_t isWrapped;    /*!< DMA Drain buffer is full and has started writing\r
+                                 over previously written words.\r
+                           */\r
+    uint32_t dbufAddress;  /*!< DMA Drain buffer address */\r
+    uint32_t dbufWords;    /*!< DMA Drain buffer size in 32-bit words */\r
+    uint32_t flushRequired; /*!< Only allow flushing ETB once related to DMA */\r
+} DMAStatus;\r
+\r
+/*! \par ETBHandle\r
+    ETB Handle object. This is an incomplete structure, thus making the actual implementation\r
+    private to the ETBLib.\r
+*/\r
+\r
+typedef struct _ETBHandle_t ETBHandle;\r
+\r
+/*! \par ETBHandle_Pntr\r
+    Pointer to a ETB Handle object\r
+*/\r
+\r
+typedef ETBHandle * ETBHandle_Pntr;\r
+\r
+/*! \par ETBStatus\r
+    \brief ETB status structure definition.\r
+*/\r
+typedef struct _ETBStatus\r
+{\r
+       uint8_t canRead; /*!< ETB can be read*/\r
+       uint8_t isWrapped; /*!< ETB is wrapped */\r
+       uint32_t availableWords; /*!< ETB has the available words to be read */\r
+       uint32_t ETB_TraceCaptureEn; /*!< ETB trace capture is enabled or not */\r
+    uint32_t overflow; /*!< ETB overflow occurred (only used if trying to read\r
+                            while writting the ETB in non-DMA mode) */                        \r
+} ETBStatus;\r
+\r
+/*! \par ETBCapability\r
+    \brief ETB status structure definition.\r
+*/\r
+typedef struct _ETBProperties\r
+{\r
+       uint8_t is_dma_supported; /*!< ETB-EDMA extension supported or not*/\r
+\r
+}ETBProperties;\r
+\r
+/*! \par ETB_open\r
+    \brief Open and initialize ETB.\r
+\r
+    \param[in] pErrCallBack is called if not NULL and this function returns any eETB_Error value other than eETB_Success.\r
+    \param[in] mode is the mode in which ETB should be used. Most commonly it is eETB_Circular.\r
+    \param[in] coreID core ID (0,1,2....) for a device with homogeneous DSPs or CPUs. For example, TCI6488 would have this parameter as 0,1, or 2. For device with no such multiple cores and associated ETBs, its should be defeulted to 0.\r
+    If the ETB is for System Trace (STM), use SYS_ETB as a coreID. \r
+    \param[out] ppHandle is pointer to a ETBhandle pointer, the pointer is allocated by the ETBLib so caller should not allocate the pointer. This should be passed back to "ETB_close()" call, once done.\r
+    \param[out] pETBSizeInWords contains size of ETB buffer in 32 bit words, if successfully opened. \r
+    \return eETB_Error. \r
+    \r
+    \par Details:\r
+    \details  \r
+    This function must be called as the very first call to initialize ETB module access. \r
+    The return value is NULL, if failed. \r
+    An allocated handle pointer is returned, if success.\r
+*/\r
+eETB_Error  ETB_open(ETB_errorCallback pErrCallBack, eETB_Mode mode, uint8_t coreID, ETBHandle** ppHandle, uint32_t* pETBSizeInWords);\r
+\r
+\r
+/*! \par ETB_enable\r
+    Enable ETB to start capturing data. \r
+\r
+    \param[in] pETBHandle ETB Handle pointer.\r
+    \param[in] triggerCount is number of words written to ETB RAM following a trigger event. This is only used for ARM. Use 0 for DSP.\r
+    \return eETB_Error. \r
+    \r
+    \par Details:\r
+    \details  \r
+    This function enables ETB. As soon as ETB is enabled, it starts capturing trace data.\r
+    The ETB should be enabled after trace export, clocks and data trace formatter (if applicable) has been programmed.\r
+*/\r
+eETB_Error  ETB_enable(ETBHandle* pETBHandle, uint32_t triggerCount);\r
+\r
+/*! \par ETB_disable\r
+    Disable ETB to stop capturing data. \r
+\r
+    \param[in] pETBHandle ETB Handle pointer.\r
+    \return eETB_Error. \r
+    \r
+    \par Details:\r
+    \details  \r
+    This function disables ETB. As soon as ETB is disabled, it stops capturing trace data.\r
+    A CoreSight ETB is ready to be read once it is disabled. \r
+    A TI ETB in TI_ETB mode does not need to be disabled before reading out the ETB contents.\r
+*/\r
+eETB_Error  ETB_disable(ETBHandle* pETBHandle);\r
+\r
+/*! \par ETB_status\r
+    Function to check the ETB status to check if it is ready to be read.\r
+\r
+    \param[in] pETBHandle ETB Handle pointer.\r
+    \param[out] status contains ETB status parameters. \r
+    \return eETB_Error. \r
+    \r
+    \par Details:\r
+    \details  \r
+    This function provides information ETB state.\r
+    Before making a call to ETB_read , it is expected to call this method to get the state of the ETB.\r
+*/\r
+eETB_Error  ETB_status(ETBHandle* pETBHandle, ETBStatus* status);\r
+\r
+/*! \par ETB_read\r
+    Function to read out ETB RAM contents.\r
+\r
+    \param[in] pETBHandle ETB Handle pointer.\r
+    \param[in] pBuffer an allocated buffer pointer passed in that would contain ETB buffer on return. \r
+    \param[in] bufferLength is the size of the allocated buffer in 32 bit long words unit. \r
+    \param[in] startWord is the index (0 based) of the ETB word to start reading. ETB_canread() provides number of available words. Use 0 for reading from a valid start of buffer.\r
+    \param[in] requestSize is the requested number of words to be read from the ETB.\r
+    \param[out] pRetSize contains the actual number of read words and retured as part of pBuffer.\r
+    \return eETB_Error. \r
+    \r
+    \par Details:\r
+    \details  \r
+    This function reads ETB contents, if the ETB can be read. \r
+    Caller of this function is responsible to allocate and deallocate the buffer.\r
+    If the request size is more than available ETB words and the buffer size is at least the request size, request sise is returned.\r
+    If the buffer is NULL or allocated size is less than the requested words, an error is returned.\r
+    \r
+    \note\r
+    If using the DMA drain buffer, ETB_flush_dma <b>MUST</b> be called before\r
+    using this read function.\r
+    \r
+*/\r
+eETB_Error  ETB_read(ETBHandle* pETBHandle, uint32_t *pBuffer, uint32_t bufferLength, uint32_t startWord, uint32_t requestSize, uint32_t* pRetSize);\r
+\r
+/*! \par ETB_close\r
+    Function to close the ETB and relese ETB handle pointer.\r
+\r
+    \param[in] pETBHandle ETB Handle pointer.\r
+    \return eETB_Error \r
+    \r
+    \par Details:\r
+    \details  \r
+    This function should be the last call made once your are done with the ETB.\r
+    After closing th ETB, ETB_open call is requuired before ETB can be used again.\r
+*/\r
+eETB_Error  ETB_close(ETBHandle* pETBHandle);\r
+\r
+/*! \par ETB_flush\r
+    Flush the ETB. \r
+\r
+    \param[in] pHandle ETB Handle pointer.\r
+    \return eETB_Error. \r
+    \r
+    \par Details:\r
+    \details  \r
+    This function flushes the ETB input buffer and ADTF. If you have temporarily stopped trace export\r
+    with TEND, the flush will provide the end of the current trace packet, avoiding the "insufficient\r
+    data" error when decoding.\r
+\r
+    If DSP Core-ETB is configured in EDMA mode, the ADTF is both flushed and stopped by ETB_flush().\r
+    If DSP Core-ETB is configured in non-EDMA mode, only the ADTF is flushed by ETB_flush(). In this case \r
+       the ADTF is stopped in the ETB_disable function.\r
+       If System ETB is configured either in EDMA or non-EDMA mode, STM data is flushed to the ETB by ETB_flush().\r
+    \r
+    This function is only valid if the library has been opened in TI mode.\r
+    Note that if you are not in TI mode the ETB_disable function performs the flush operation.\r
+       \r
+       Note: When the ETB is configured in EDMA mode, ETB_flush() must be called prior to ETB_flush_dma(). \r
+    \r
+*/\r
+eETB_Error  ETB_flush(ETBHandle* pHandle);\r
+\r
+/*! \par ETB_config_dma\r
+    Configure the DMA used to interface with the ETB. \r
+\r
+    \param[in] pHandle\r
+    \param[in] pConfig\r
+    \return eETB_Error. \r
+\r
+    \par Details:\r
+    \details  \r
+    This function is passed a configuration structure that is used to setup the\r
+    EDMA3 to transfer data written into the ETB to a location in memory. The\r
+    ETB half-full and full interrupts are used as system events to start each\r
+    transaction. The interrupts are routed from the ETB through the chip-level\r
+    INTCx (interrupt controller) to an input event in the EDMA3. Two DMA channels\r
+    are required, one for clearing the INTCx system interrupt status register,\r
+    and the second for transferring data from the ETB to the drain buffer in\r
+    memory.\r
+    \r
+    ETB_open must be called before this configuration function with the option\r
+    eETB_TI_Mode. Any other option will cause this function to return in error.\r
+    \r
+    \note The application is responsible for all DMA channel and parameter\r
+    RAM mapping and configuration.\r
+\r
+*/\r
+\r
+eETB_Error  ETB_config_dma(ETBHandle* pHandle, const DMAConfig *pConfig);\r
+\r
+/*! \par ETB_flush_dma\r
+    Configure a DMA transfer to flush remaining words in ETB to memory buffer.\r
+\r
+    \param[in] pHandle\r
+    \param[in] pStatus\r
+    \return eETB_Error. \r
+\r
+    \par Details:\r
+    \details  \r
+    This function is used to copy any remaining information in the ETB that\r
+    has not reached the half-full or full mark in the buffer. Status information\r
+    is populated in the DMAStatus structure that can be used to manage collecting\r
+    information from the drain buffer in memory.\r
+\r
+    The DMA drain functions will only use a multiple of half of the the ETB\r
+    size. If the number of words that is passed as part of the DMA configuration\r
+    is not a multiple of half the ETB size, the DMA status value in the handle\r
+    will get set to the number of words that are actually being used.\r
+    \r
+\r
+    \note\r
+    The application must have stopped all tracing and ETB_flush function must be\r
+    called before this function.\r
+    \r
+*/\r
+eETB_Error  ETB_flush_dma(ETBHandle* pHandle, DMAStatus *pStatus);\r
+\r
+/*! \par ETB_setDmaStatus\r
+    Set the DMAStatus structure used by the DMA library functions.\r
+\r
+    \param[in] pHandle\r
+    \param[in] pStatus\r
+\r
+    \par Details:\r
+    \details  \r
+    When using the DMA drain functionality with multiple DMA buffers, this\r
+    function is required to set the correct status parameters before making\r
+    dependent API calls such as ETB_read.\r
+\r
+*/\r
+void ETB_setDmaStatus(ETBHandle* pHandle, DMAStatus *pStatus);\r
+\r
+/*! \par ETB_getProperties\r
+    Set the properties(capabilties supported) by the ETB.\r
+\r
+    \param[in] pProperties\r
+\r
+    \par Details:\r
+    \details\r
+    This API can be used by the application to determine the capabilities\r
+    supported by ETB of a particular device. For example: The Application\r
+    can determine whether ETB-DMA extension is supported or not.\r
+*/\r
+void ETB_getProperties(ETBProperties *pProperties);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif //__ETB_INTERFACE_H\r
+\r
+/******************************************************************************/\r
+/* *****  DOXYGEN  ***** */\r
+/******************************************************************************/\r
+/*! \mainpage\r
+\par Introduction\r
+The ETB Library provides an application interface to program and drain the\r
+Embedded Trace Buffer (ETB). There are two kinds of ETB in TI devices, CSETB and\r
+TIETB. The ETBLib contains CCSv5 projects in the ETBLib/project directory\r
+specifying the supported devices and rules to pickup specific files and flags\r
+for different devices. \n\n\r
+For C66xx devices using the TIETB in TI mode (enabling the ETB to be read while\r
+enabled and actively getting written) there is also an option to use the EDMA3\r
+to drain the ETB to specified memory buffer.\r
+\r
+\par EDMA3 Drain Buffer\r
+The DMA drain buffer is used to increase the amount of storage used for\r
+trace data beyond the size of the ETB. The DMA uses the half-full and full\r
+interrupt from the ETB as a trigger to start a transaction that will read half\r
+of the ETB for each interrupt. For all Keystone1 devices except C6657, The ETB \r
+interrupts must get routed through the chip-level interrupt controller (INTCx) \r
+to interface with the EDMA3 controller. Where as in case of all keystone2 and \r
+C6657, the ETB half and full events are directly connected to the EDMA3 controller.\r
+\n\n\r
+\subpage edma3_page\r
+\n\r
+\note If the Drain Buffer is located in MSMC or DDR3 memory, it should be put in\r
+a non-cacheable region.\r
+\n\r
+\r
+\par Devices supported by the library are:\r
+\r
+ - C6A816x, also referenced as TI816x (Netra)\r
+ - C66xx (C6670, TCI6614/16/18)\r
+ - C6678\r
+ - OMAP-A9\r
+ - OMAP-A15\r
+ - TCI6484\r
+ - TCI6488\r
+ - C6657\r
+ - C66AK2Hxx (Keystone 2)\r
+\r
+\par API Functions:\r
+\r
+ - #ETB_open\r
+ - #ETB_enable\r
+ - #ETB_disable\r
+ - #ETB_status\r
+ - #ETB_read\r
+ - #ETB_close\r
+ - #ETB_flush\r
+ - #ETB_config_dma\r
+ - #ETB_flush_dma\r
+ - #ETB_setDmaStatus\r
+ - #ETB_getProperties\r
+\r
+*/\r
diff --git a/server/TIETB.c b/server/TIETB.c
new file mode 100644 (file)
index 0000000..114e53e
--- /dev/null
@@ -0,0 +1,2739 @@
+/****************************************************************************\r
+CToolsLib - ETB Library\r
+\r
+Copyright (c) 2009-2010 Texas Instruments Inc. (www.ti.com)\r
+All rights reserved.\r
+\r
+Redistribution and use in source and binary forms, with or without\r
+modification, are permitted provided that the following conditions\r
+are met:\r
+1. Redistributions of source code must retain the above copyright\r
+   notice, this list of conditions and the following disclaimer.\r
+2. Redistributions in binary form must reproduce the above copyright\r
+   notice, this list of conditions and the following disclaimer in the\r
+   documentation and/or other materials provided with the distribution.\r
+3. The name of the author may not be used to endorse or promote products\r
+   derived from this software without specific prior written permission.\r
+\r
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR\r
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\r
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+****************************************************************************/\r
+\r
+/*! \file TIETB.c\r
+    \version 1.7\r
+*/\r
+//#include <stdio.h>\r
+//#include <stdlib.h>\r
+\r
+#include "ETBInterface.h"\r
+#include "ETBAddr.h"\r
+\r
+#ifdef DMA_SUPPORT\r
+#include "edma_dev-c66xx.h"\r
+\r
+#if defined(C66AK2Hxx_CSSTM_ETB)\r
+\r
+#define GET_GLOBAL_ADDR(addr) (uint32_t)(addr)\r
+\r
+#else\r
+\r
+#define GET_GLOBAL_ADDR(addr) \\r
+    (uint32_t)( ((uint32_t)(addr)) < (uint32_t)0x00900000 ? \\r
+    ((uint32_t)(addr) | (uint32_t)((DNUM + 16) << 24)) : (uint32_t)(addr) )\r
+#endif\r
+#endif\r
+\r
+#if DTF_PRESENT\r
+#include "c6x.h"\r
+#endif\r
+\r
+////////////////////////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Private structs\r
+//\r
+////////////////////////////////////////////////////////////////////////////////////////////////\r
+\r
+#if defined(C6657) || defined(C66AK2Hxx) || defined(C66AK2Exx) || defined(C66AK2Hxx_CSSTM_ETB) || defined(C66AK2Exx_CSSTM_ETB)\r
+\r
+/* DMA config structure used internally\r
+   for C6657 and keystone2 devices\r
+*/\r
+typedef struct _DMAConfigInt\r
+{\r
+\r
+       uint32_t cc;           /* EDMA3 channel controller number. */\r
+\r
+    uint16_t etbhalfChannel;   /* ETB half full channel for DMA draining (needs to\r
+                                 be able to access the ETB).\r
+                            */\r
+    uint16_t etbfullChannel;   /* ETB full channel for DMA draining (needs to\r
+                                 be able to access the ETB).\r
+                            */\r
+    uint16_t linkparam[3]; /* 3 additional parameter RAM entry numbers.\r
+                            */\r
+    uint32_t dbufAddress;  /* DMA Drain buffer address */\r
+    uint32_t dbufWords;    /* DMA Drain buffer size in 32-bit words */\r
+    eDMA_Mode mode;        /* DMA Drain buffer mode (only eDMA_Circular and\r
+                                 eDMA_Stop_Buffer are valid values)\r
+                            */\r
+} DMAConfigInt;\r
+\r
+#endif\r
+\r
+struct _ETBHandle_t\r
+{\r
+    uint32_t ulContext;    /*!< ETB context handle*/\r
+    uint8_t id;            /*!< ETB core user ID*/\r
+    uint8_t dnum;          /*!< Detected CPU ID*/\r
+    ETB_errorCallback pCallBack; /*!< ETB error callback*/\r
+\r
+#if defined(C6657) || defined(C66AK2Hxx) || defined(C66AK2Exx) || defined(C66AK2Hxx_CSSTM_ETB) || defined(C66AK2Exx_CSSTM_ETB)\r
+\r
+       DMAConfigInt *pDmaConfig; /*!< ETB DMA pointer, NULL when dma not used */\r
+\r
+#else\r
+\r
+    DMAConfig *pDmaConfig; /*!< ETB DMA pointer, NULL when dma not used */\r
+\r
+#endif\r
+\r
+    DMAStatus dmaStatus;   /*!< Copy of ETB DMA status, populated when\r
+                                 ETB_flush_dma is called, used during ETB_read\r
+                                 calls.\r
+                            */\r
+};\r
+\r
+#ifdef __linux\r
+static uint32_t virtural_ETB_BaseAddress[NUM_ETB_INSTANCES] = {0};\r
+static uint32_t virtural_DTF_BaseAddress[NUM_ETB_INSTANCES] = {0};\r
+static uint32_t virtural_PSC_BaseAddress = 0;    \r
+#endif\r
+\r
+// Max timeout for ETB DMA transfers to complete\r
+#define ETB_DMA_TIMEOUT 100000\r
+\r
+/* ETB module access handle - virual for this library */\r
+static ETBHandle stHandle[NUM_ETB_INSTANCES];\r
+\r
+/* Enumeration to define the options available to the internal flush function */\r
+typedef enum _eETB_Options\r
+{\r
+    eETB_OPT_NONE = 0,    /*!< No options selected */\r
+    eETB_STOP_FORMATTER   /*!< Stop the formatter once a flush has completed */\r
+} eETB_OPTIONS;\r
+\r
+/* Enumeration for ETB and TBR types */\r
+typedef enum _ETB_Type\r
+{\r
+       TBR_TYPE = 0,     /*!< TBR type */\r
+       ETB_TYPE          /*!< ETB type */\r
+}ETB_Type;\r
+\r
+/* Internal ETB flush function used by API function for common purposes */\r
+static eETB_Error flush(ETBHandle *pHandle, eETB_OPTIONS options);\r
+\r
+/*! RETURN_ETB_CALLBACK\r
+    ImplementaMacro to return API error.\r
+*/\r
+#define RETURN_ETB_CALLBACK(id,retValue) \\r
+    if ( 0 != stHandle[id].pCallBack ) stHandle[id].pCallBack(retValue); return retValue\r
+       \r
+// ETBLib symbols for CCS ETB Receiver (Trace capture and decoding)\r
+// ETBLib symbols need to be placed in external memory (MSMC or DDR3)\r
+// for STM driver to read from these symbols\r
+\r
+#pragma DATA_SECTION(etbLib_buffer_start_addr,"ETBLib_ExtMem");\r
+#pragma DATA_SECTION(etbLib_buffer_size,"ETBLib_ExtMem");\r
+#pragma DATA_SECTION(etbLib_buffer_data_start,"ETBLib_ExtMem");\r
+volatile uint32_t etbLib_buffer_start_addr[NUM_ETB_INSTANCES]; //start of ETB buffer\r
+volatile uint32_t etbLib_buffer_size[NUM_ETB_INSTANCES]; //number of Bytes\r
+volatile uint32_t etbLib_buffer_data_start[NUM_ETB_INSTANCES]; //address after circular buffer wrap point, where oldest data starts\r
+\r
+#if SYSETB_PRESENT\r
+\r
+#pragma DATA_SECTION(etbLib_sys_etb_index,"ETBLib_ExtMem");\r
+volatile uint32_t etbLib_sys_etb_index = SYS_ETB_ID; //symbol for SYS_ETB index\r
+\r
+#endif\r
+\r
+/*****************************************************************\r
+ * Data that will be accessed by EDMA3 HW.\r
+ * Application should link this data into appropriate memory so\r
+ * that interference to the application is minimized\r
+ *****************************************************************/\r
+/*\r
+ * If this data section is located in MSMC or DDR3 memory, it should\r
+ *  be put in a non-cacheable region.\r
+ */\r
+#ifdef DMA_SUPPORT\r
+\r
+#pragma DATA_SECTION(etbLib_bufferWrapped,"ETBLib_dmaData");\r
+\r
+#if defined(C6670)\r
+\r
+#pragma DATA_SECTION(etbLib_cpCicEventClearValue,"ETBLib_dmaData");\r
+#pragma DATA_SECTION(etbLib_cpCicEventClearIndexReg,"ETBLib_dmaData");\r
+\r
+static uint32_t etbLib_cpCicEventClearValue[2][NUM_ETB_INSTANCES][2] = {\r
+{\r
+       {CIC1_EVT_TETBHFULLINT0, CIC1_EVT_TETBFULLINT0},\r
+       {CIC1_EVT_TETBHFULLINT1, CIC1_EVT_TETBFULLINT1},\r
+       {CIC1_EVT_TETBHFULLINT2, CIC1_EVT_TETBFULLINT2},\r
+       {CIC1_EVT_TETBHFULLINT3, CIC1_EVT_TETBFULLINT3},\r
+       {0, 0},\r
+       {0, 0},\r
+       {0, 0},\r
+       {0, 0},\r
+       {CIC1_EVT_TETBHFULLINT, CIC1_EVT_TETBFULLINT}\r
+},\r
+{\r
+       {CIC2_EVT_TETBHFULLINT0, CIC2_EVT_TETBFULLINT0},\r
+       {CIC2_EVT_TETBHFULLINT1, CIC2_EVT_TETBFULLINT1},\r
+       {CIC2_EVT_TETBHFULLINT2, CIC2_EVT_TETBFULLINT2},\r
+       {CIC2_EVT_TETBHFULLINT3, CIC2_EVT_TETBFULLINT3},\r
+       {0, 0},\r
+       {0, 0},\r
+       {0, 0},\r
+       {0, 0},\r
+       {CIC2_EVT_TETBHFULLINT, CIC2_EVT_TETBFULLINT}\r
+}\r
+};\r
+\r
+static uint32_t etbLib_cpCicEventClearIndexReg[2] = {CIC1_STATUS_CLR_INDEX_REG, CIC2_STATUS_CLR_INDEX_REG};\r
+\r
+#elif defined(C6678)\r
+\r
+#pragma DATA_SECTION(etbLib_cpCicEventClearValue,"ETBLib_dmaData");\r
+#pragma DATA_SECTION(etbLib_cpCicEventClearIndexReg,"ETBLib_dmaData");\r
+\r
+static uint32_t etbLib_cpCicEventClearValue[2][NUM_ETB_INSTANCES][2] =\r
+{\r
+       {\r
+               {CIC2_EVT_TETBHFULLINT0, CIC2_EVT_TETBFULLINT0},\r
+               {CIC2_EVT_TETBHFULLINT1, CIC2_EVT_TETBFULLINT1},\r
+               {CIC2_EVT_TETBHFULLINT2, CIC2_EVT_TETBFULLINT2},\r
+               {CIC2_EVT_TETBHFULLINT3, CIC2_EVT_TETBFULLINT3},\r
+               {CIC2_EVT_TETBHFULLINT4, CIC2_EVT_TETBFULLINT4},\r
+               {CIC2_EVT_TETBHFULLINT5, CIC2_EVT_TETBFULLINT5},\r
+               {CIC2_EVT_TETBHFULLINT6, CIC2_EVT_TETBFULLINT6},\r
+               {CIC2_EVT_TETBHFULLINT7, CIC2_EVT_TETBFULLINT7},\r
+               {CIC2_EVT_TETBHFULLINT, CIC2_EVT_TETBFULLINT}\r
+       },\r
+       {\r
+               {CIC3_EVT_TETBHFULLINT0, CIC3_EVT_TETBFULLINT0},\r
+               {CIC3_EVT_TETBHFULLINT1, CIC3_EVT_TETBFULLINT1},\r
+               {CIC3_EVT_TETBHFULLINT2, CIC3_EVT_TETBFULLINT2},\r
+               {CIC3_EVT_TETBHFULLINT3, CIC3_EVT_TETBFULLINT3},\r
+               {CIC3_EVT_TETBHFULLINT4, CIC3_EVT_TETBFULLINT4},\r
+               {CIC3_EVT_TETBHFULLINT5, CIC3_EVT_TETBFULLINT5},\r
+               {CIC3_EVT_TETBHFULLINT6, CIC3_EVT_TETBFULLINT6},\r
+               {CIC3_EVT_TETBHFULLINT7, CIC3_EVT_TETBFULLINT7},\r
+               {CIC3_EVT_TETBHFULLINT, CIC3_EVT_TETBFULLINT}\r
+       }\r
+};\r
+\r
+static uint32_t etbLib_cpCicEventClearIndexReg[2] = {CIC2_STATUS_CLR_INDEX_REG, CIC3_STATUS_CLR_INDEX_REG};\r
+\r
+#endif\r
+\r
+static uint32_t etbLib_bufferWrapped[NUM_ETB_INSTANCES][2];\r
+\r
+#pragma DATA_SECTION(etb_disable,"ETBLib_dmaData");\r
+static uint32_t etb_disable = 0x0;\r
+\r
+#endif  //#ifdef DMA_SUPPORT\r
+\r
+/**\r
+* Normalize_ID(uint32_t id) - Normalize core/sys ETB ID\r
+*/\r
+static uint32_t Normalize_ID(uint32_t id)\r
+{\r
+#if SYSETB_PRESENT\r
+    if(id == SYS_ETB || id == SYS_ETB_ID)\r
+    {\r
+        id = SYS_ETB_ID;\r
+    }\r
+#endif\r
+    return id;\r
+}\r
+\r
+/**\r
+* Handle_index(uint32_t id) - Get handle id for the core/sys ETB\r
+*/\r
+static uint32_t Handle_index(uint32_t id)\r
+{\r
+#if SYSETB_PRESENT\r
+    if(id == SYS_ETB || id == SYS_ETB_ID)\r
+    {\r
+        id = NUM_ETB_INSTANCES -1;\r
+    }\r
+#endif\r
+    return id;\r
+}\r
+\r
+/**\r
+* Check whether the coreID passed is associated with a TI-ETB or TBR implementation\r
+* returns TBR_TYPE = 0 - for TBR implementation and ETB_TYPE = 1 - for TI-ETB implementation\r
+*/\r
+static ETB_Type check_etb_type(uint32_t id)\r
+{\r
+       uint32_t dev_id;\r
+       // Read ETB device ID register\r
+       dev_id = *((volatile uint32_t*)ETB_DEVID(id));\r
+\r
+       if(dev_id == ETB_DEVICE_ID)\r
+       {\r
+               // Return TI-ETB type\r
+               return(ETB_TYPE);\r
+       }\r
+       else if(dev_id == TBR_DEVICE_ID)\r
+       {\r
+               //Return TBR type\r
+               return(TBR_TYPE);\r
+       }\r
+\r
+       //By default always return TI-ETB type\r
+       return(ETB_TYPE);\r
+}\r
+\r
+#if !defined(C66AK2Hxx_CSSTM_ETB) && !defined(C66AK2Exx_CSSTM_ETB) && !defined(_OMAP54xx)\r
+\r
+/**\r
+* Need_DTF(ETBHandle* pHandle) - Do we need to program DTF. Returns 1 (true) or 0 (false)\r
+*/\r
+static uint32_t Need_DTF(ETBHandle* pHandle)\r
+{\r
+#if SYSETB_PRESENT\r
+    if(pHandle->id == SYS_ETB || pHandle->id == SYS_ETB_ID)\r
+    {\r
+        return 0;\r
+    }\r
+#endif\r
+\r
+    if (pHandle->id != pHandle->dnum)\r
+    {\r
+        return 0;\r
+    }\r
+\r
+#if DTF_PRESENT\r
+    return 1;\r
+#else\r
+    return 0;\r
+#endif\r
+}\r
+\r
+/**\r
+* Workaround_portownership() - Work around to setup correct debug port ownership\r
+*/\r
+static void Workaround_portownership()\r
+{\r
+    uint32_t status=0;\r
+    status = *(volatile uint32_t*)0x1bc013c;\r
+    status= status | 01;\r
+    *(volatile uint32_t*)0x1bc013c = status;\r
+}\r
+\r
+\r
+/**\r
+* Program_Power_Sleep() - Work around to setup correct debug port ownership\r
+*/\r
+eETB_Error Program_Power_Sleep(uint8_t coreID)\r
+{\r
+    uint32_t status=0;\r
+    uint32_t ptcmdValue = 0;\r
+    uint32_t retry = 1000;\r
+\r
+    /* Program Power and Sleep Controls */\r
+#if defined(TCI6484)\r
+    /* Enable DEBUGSS */\r
+    *((volatile uint32_t*)PSC_MDCTL(6)) = 0x3;\r
+\r
+    /* Power domain Go transition command */\r
+    ptcmdValue = 0x1;\r
+\r
+#elif defined(C66x)\r
+    /* If etb powered up and both etb and debugss enabled then exit */\r
+       {\r
+               uint32_t etb_power_state;\r
+               uint32_t debugss_cptracers_enable;\r
+               uint32_t etb_enable;\r
+\r
+               etb_power_state = *((volatile uint32_t*)PSC_PDSTAT(1));\r
+\r
+               debugss_cptracers_enable = *((volatile uint32_t*)PSC_MDSTAT(5));\r
+\r
+               etb_enable = *((volatile uint32_t*)PSC_MDSTAT(6));\r
+\r
+               if ((etb_power_state & 1) && (debugss_cptracers_enable & 3) && (etb_enable & 3))\r
+               {\r
+                       return eETB_Success;\r
+               }\r
+       }\r
+\r
+       /* Enable TETB power domain*/\r
+\r
+    /* Power domain Go transition command for TETB power domain */\r
+    ptcmdValue = 0x2;\r
+\r
+    /* Power up DebugSS */\r
+    *((volatile uint32_t*)PSC_PDCTL(1)) = 0x1;\r
+\r
+    // Issue GO for the DebugSS power domain\r
+    *((volatile uint32_t*)PSC_PTCMD) = ptcmdValue;\r
+\r
+    //Wait for the domain transition to complete\r
+    do\r
+    {\r
+       status = *(volatile uint32_t*)PSC_PTSTAT;\r
+       retry--;\r
+    }  while( ( ( status & ptcmdValue ) != 0 ) && ( retry != 0 ) );\r
+    if ( retry == 0 ) return eETB_Error_Psc_Enabling;\r
+\r
+    /* Enable DEBUGSS subsystem */\r
+    *((volatile uint32_t*)PSC_MDCTL(5)) = 0x3;\r
+    /* Enable Per-core TETB and system TETB subsystem */\r
+    *((volatile uint32_t*)PSC_MDCTL(6)) = 0x3;\r
+\r
+#endif\r
+\r
+    /* Power domain Go transition command for enabled power domain */\r
+    *((volatile uint32_t*)PSC_PTCMD) = ptcmdValue;\r
+\r
+    //Wait for the domain transition to complete\r
+    retry = 1000;\r
+    do\r
+    {\r
+       status = *(volatile uint32_t*)PSC_PTSTAT;\r
+       retry--;\r
+    }  while( ( ( status & ptcmdValue ) != 0 ) && ( retry != 0 ) );\r
+    if ( retry == 0 ) return eETB_Error_Psc_Enabling;\r
+\r
+   /* Check that the modules have been properly enabled */\r
+#if defined(TCI6484)\r
+    if ((*((volatile uint32_t*)PSC_MDSTAT(6)) & 0x3F) != 0x3)\r
+        return eETB_Error_Psc_Enabling;\r
+\r
+    Workaround_portownership();\r
+\r
+#elif defined(C66x)\r
+    if ((*((volatile uint32_t*)PSC_MDSTAT(5)) & 0x3F) != 0x3 ||\r
+        (*((volatile uint32_t*)PSC_MDSTAT(6)) & 0x3F) != 0x3)\r
+        return eETB_Error_Psc_Enabling;\r
+    Workaround_portownership();\r
+\r
+#endif\r
+    return eETB_Success;\r
+}\r
+//#endif //#ifndef _OMAP54xx\r
+#endif\r
+\r
+#if defined(C6657) || defined(C66AK2Hxx) || defined(C66AK2Exx) || defined(C66AK2Hxx_CSSTM_ETB)\r
+\r
+static uint8_t get_edma_buffer_info (ETBHandle* pHandle, DMAStatus *pStatus, uint32_t paramAddress, uint16_t paramIdx, int32_t remWords)\r
+{\r
+       int32_t remBytes;\r
+\r
+       remBytes = (remWords * 4);\r
+\r
+       /* Check for buffer wrap */\r
+       if(etbLib_bufferWrapped[pHandle->id][0])\r
+       {\r
+               pStatus->availableWords    = pHandle->dmaStatus.dbufWords;\r
+               pStatus->startAddr = PARAM_DST_REG(paramAddress) + remBytes;\r
+               pStatus->isWrapped = 1;\r
+       }\r
+       else\r
+       {\r
+               pStatus->availableWords = (PARAM_DST_REG(paramAddress) -\r
+                                                       pHandle->pDmaConfig->dbufAddress) / 4;\r
+               pStatus->availableWords += remWords;\r
+               pStatus->startAddr = pHandle->pDmaConfig->dbufAddress;\r
+               pStatus->isWrapped = 0;\r
+       }\r
+\r
+       /* Copy the DMA status into the handle for later management. The status\r
+        *  value for the number of words may be different than what was in the\r
+        *  configuration structure. This value is set during configuration.\r
+        */\r
+       pStatus->dbufAddress = pHandle->pDmaConfig->dbufAddress;\r
+       pStatus->dbufWords   = pHandle->dmaStatus.dbufWords;\r
+       pStatus->flushRequired = pHandle->dmaStatus.flushRequired;\r
+       pHandle->dmaStatus   = *pStatus;\r
+\r
+       /* If the mode has been set to non-circular and the buffer wrapped flag\r
+        *  is set, then the memory buffer if full, otherwise continue the\r
+        *  configuration for the final DMA.\r
+        */\r
+       if((pHandle->pDmaConfig->mode == eDMA_Stop_Buffer) &&\r
+               (etbLib_bufferWrapped[pHandle->id][0]))\r
+       {\r
+               /* If the buffer wrapped, the startAddr value is incorrect from\r
+                *  above, set back to beginning of the buffer.\r
+                */\r
+               pStatus->startAddr = pHandle->pDmaConfig->dbufAddress;\r
+               pHandle->dmaStatus.startAddr = pHandle->pDmaConfig->dbufAddress;\r
+               return(1);\r
+       }\r
+\r
+       // Update the 3 symbols which are required for CCS ETB receiver\r
+       etbLib_buffer_start_addr[pHandle->id] = pHandle->pDmaConfig->dbufAddress; //CCS ETB receiver will always get a linearized buffer for the non-EDMA ETB drain case\r
+       etbLib_buffer_size[pHandle->id] = pStatus->availableWords * 4; //Number of bytes available\r
+       etbLib_buffer_data_start[pHandle->id] = pStatus->startAddr; //circular buffer wrap point\r
+\r
+       return(0);\r
+}\r
+\r
+#endif\r
+\r
+/**\r
+* ETB_open - open ETB programming module interface\r
+*/\r
+\r
+eETB_Error  ETB_open(ETB_errorCallback pErrCallBack, eETB_Mode mode, uint8_t coreID, ETBHandle** ppHandle, uint32_t* pETBSizeInWords)\r
+{\r
+    uint32_t dnum = 0;\r
+    uint32_t status, value;\r
+\r
+#if DTF_PRESENT\r
+    dnum = DNUM;\r
+#endif\r
+    coreID = Normalize_ID(coreID);\r
+   \r
+#if SYSETB_PRESENT \r
+    // populate SYS_ETB index symbol\r
+    if(coreID == SYS_ETB_ID)\r
+    {\r
+        etbLib_sys_etb_index = SYS_ETB_ID;\r
+    }\r
+       \r
+#endif\r
+\r
+    if(Handle_index(coreID) >= NUM_ETB_INSTANCES)\r
+    {\r
+        return eETB_Error_Bad_Param;\r
+    }\r
+\r
+    if ((ppHandle == 0 ) || ( pETBSizeInWords == 0) )\r
+    {\r
+        return eETB_Error_Bad_Param;\r
+    }\r
+\r
+#ifdef __linux\r
+    virtural_ETB_BaseAddress[coreID] = cTools_memMap(ETB_BaseAddress(coreID), SIZEOF_ETB_SPACE);\r
+    virtural_DTF_BaseAddress[coreID] = cTools_memMap(DTF_BaseAddress(coreID), SIZEOF_DTF_SPACE);\r
+    if (virtural_PSC_BaseAddress == 0)\r
+    {\r
+        virtural_PSC_BaseAddress = cTools_memMap(PSC_BaseAddress, SIZEOF_PSC_SPACE);\r
+    }\r
+#endif\r
+\r
+\r
+#if !defined(C66AK2Hxx_CSSTM_ETB) && !defined(C66AK2Exx_CSSTM_ETB) && !defined(_OMAP54xx)\r
+\r
+    eETB_Error retVal = eETB_Success;\r
+\r
+    retVal = Program_Power_Sleep(coreID);\r
+    if (retVal != eETB_Success)\r
+        return retVal;\r
+\r
+#endif\r
+\r
+    if(check_etb_type(coreID) == ETB_TYPE)\r
+    {\r
+        \r
+               // Reset the ETB\r
+               *((volatile uint32_t*)ETB_TI_CTL(coreID)) = *((volatile uint32_t*)ETB_TI_CTL(coreID)) | 0x4;\r
+\r
+               /* Unlock ETB in order to enable accesses to any ETB registers below. */\r
+               *((volatile uint32_t*)ETB_LOCK(coreID)) = ETB_UNLOCK_VAL;\r
+\r
+               /* Size of the ETB. ETB_RDP contains number of 32 bit wide words. */\r
+               *pETBSizeInWords = (*((volatile uint32_t*)ETB_RDP(coreID)));\r
+\r
+               /* Setup ETB mode */\r
+               if ((eETB_TI_Mode == mode) || (eETB_TI_Mode_AND_Stop_Buffer == mode))\r
+                       *((volatile uint32_t*)ETB_TI_CTL(coreID)) = TI_ETB_TI_MODE;\r
+\r
+               status = *((volatile uint32_t*)ETB_TI_CTL(coreID));\r
+               if((eETB_Stop_Buffer != mode) && (eETB_TI_Mode_AND_Stop_Buffer != mode))\r
+               {\r
+                       /* Set TI ETB for circular mode - clear the bit. */\r
+                       *((volatile uint32_t*)ETB_TI_CTL(coreID)) = status & ~(TI_ETB_CIRCULARMODE_BIT);\r
+               }\r
+               else\r
+               {\r
+                       /* Set TI ETB as stop buffer full mode - set the bit. */\r
+                       *((volatile uint32_t*)ETB_TI_CTL(coreID)) = status | TI_ETB_CIRCULARMODE_BIT;\r
+               }\r
+    }\r
+    else //TBR implementation\r
+    {\r
+               // Reset the ETB\r
+               *((volatile uint32_t*)ETB_CTL(coreID)) = *((volatile uint32_t*)ETB_CTL(coreID)) | 0x4;\r
+\r
+               //Read claim tag value and check if TBR is not already claimed\r
+               // Assumption here is that the debugger will set the claim bit to get ownership of the TBR\r
+               status = *((volatile uint32_t*)TBR_CLAIMCLR(coreID));\r
+\r
+               if(status != 0)\r
+               {\r
+                       return eETB_Error_Cannot_Own;\r
+               }\r
+\r
+        /* Unlock to enable accesses */\r
+               status = (*((volatile uint32_t*)ETB_LOCK_STATUS(coreID)));\r
+        if (status & LOCK_STATUS_IMP_BIT)\r
+        {\r
+            /* If this bit is set, it device access is locked, we need to unlock the device*/\r
+            if (status & LOCK_STATUS_STAT_BIT)\r
+            {\r
+               /* Unlock ETB in order to enable accesses to any ETB registers below. */\r
+               *((volatile uint32_t*)ETB_LOCK(coreID)) = ETB_UNLOCK_VAL;\r
+            }\r
+        }\r
+\r
+               /* Size of the ETB. ETB_RDP contains number of 32 bit wide words. */\r
+               value = (*((volatile uint32_t*)ETB_RDP(coreID)));\r
+               *pETBSizeInWords = (1 << (value-1)) << 10;\r
+\r
+               /* Setup TBR mode */\r
+               value = (*((volatile uint32_t*)ETB_FFCR(coreID)));\r
+\r
+               /* Setup TBR in buffer mode */\r
+           *((volatile uint32_t*)ETB_CTL(coreID)) &= TBR_BUFFER_MODE;\r
+\r
+               if((eETB_Stop_Buffer == mode) || (eETB_TI_Mode_AND_Stop_Buffer == mode))\r
+               {\r
+                       //Configure stop on Full mode\r
+                       (*((volatile uint32_t*)ETB_FFCR(coreID))) = value | TBR_STP_FULL;\r
+               }\r
+               else if((eETB_Circular == mode) || (eETB_TI_Mode == mode))\r
+               {\r
+                       //Configure circular mode\r
+                       (*((volatile uint32_t*)ETB_FFCR(coreID))) = value & (~(uint32_t)TBR_STP_FULL);\r
+               }\r
+    }\r
+\r
+    /* Set ETB context in the handle*/\r
+    stHandle[Handle_index(coreID)].ulContext = ETB_UNLOCK_VAL;\r
+    stHandle[Handle_index(coreID)].id = coreID;\r
+    stHandle[Handle_index(coreID)].dnum = dnum;\r
+    stHandle[Handle_index(coreID)].pCallBack = pErrCallBack;\r
+    stHandle[Handle_index(coreID)].pDmaConfig = 0;\r
+    stHandle[Handle_index(coreID)].dmaStatus.startAddr   = 0;\r
+    stHandle[Handle_index(coreID)].dmaStatus.availableWords      = 0;\r
+    stHandle[Handle_index(coreID)].dmaStatus.isWrapped   = 0;\r
+    stHandle[Handle_index(coreID)].dmaStatus.dbufAddress = 0;\r
+    stHandle[Handle_index(coreID)].dmaStatus.dbufWords   = 0;\r
+    stHandle[Handle_index(coreID)].dmaStatus.flushRequired = 1;\r
+\r
+    *ppHandle = &stHandle[Handle_index(coreID)];\r
+    return eETB_Success;\r
+}\r
+\r
+\r
+#if defined(TCI6484)\r
+/**\r
+* TCI6484_discard_nops- TCI6484 ADTF defecrt work around to flush the the stuck packet.\r
+*\r
+*/\r
+eETB_Error  TCI6484_nops(uint8_t coreID, uint8_t discard)\r
+{\r
+    uint32_t value = 0;\r
+\r
+    value = *(volatile uint32_t*)(DTF_CNTL(coreID));\r
+\r
+    if (discard == 1)\r
+    {\r
+        value = value |  (0x2);\r
+    }\r
+    else\r
+    {\r
+        value = value &  (~0x2);\r
+    }\r
+    value = value | (0x1<<4);\r
+\r
+    *(volatile uint32_t*)(DTF_CNTL(coreID)) = value;\r
+\r
+    return eETB_Success;\r
+}\r
+#endif\r
+\r
+#if !defined(C66AK2Hxx_CSSTM_ETB) && !defined(C66AK2Exx_CSSTM_ETB) && !defined(_OMAP54xx)\r
+\r
+/**\r
+* DTF_flush - Flush data from the ADTF\r
+*/\r
+eETB_Error  DTF_flush(uint8_t n)\r
+{\r
+    /* Only ADTF v2 support software flush. Thus, the first step is to read\r
+       version ID to verify to version number */\r
+\r
+    if ((*(volatile uint32_t*)(ID(n)) & DTF_ID_MAJOR_MASK) == DTF_ID_MAJOR_VER2)\r
+    {\r
+       /* The way the ADTFv2 flush work is to write 1 to the flush bit and then\r
+          clear it after that. That is because ADTF is looking for the rising edge of the signal. */\r
+        *(volatile uint32_t*)(DTF_CNTL(n)) = *(volatile uint32_t*)(DTF_CNTL(n)) | DTF_VER2_FLUSH_BIT;\r
+    }\r
+\r
+#if defined(TCI6484) /* ADTF bug work around in TCI6484 */\r
+        /* flush the ADTF */\r
+        TCI6484_nops(n, 0);\r
+        TCI6484_nops(n, 1);\r
+#endif\r
+        return eETB_Success;\r
+}\r
+\r
+#endif\r
+\r
+/**\r
+* ETB_enable- Enable ETB to capture trace data\r
+*/\r
+eETB_Error  ETB_enable(ETBHandle* pHandle, uint32_t triggerCount)\r
+{\r
+    uint32_t etbControl;\r
+    uint32_t waitCount = 1000;\r
+\r
+\r
+    if(!pHandle || pHandle->ulContext != ETB_UNLOCK_VAL)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+\r
+#if !defined(C66AK2Hxx_CSSTM_ETB) && !defined(C66AK2Exx_CSSTM_ETB) && !defined(_OMAP54xx)\r
+\r
+    /* Setup DTF, if available */\r
+    if(Need_DTF(pHandle))\r
+    {\r
+        uint32_t value;\r
+        /* Unlock to enable accesses */\r
+        value = *(volatile uint32_t*)(DTF_LOCK_STATUS(pHandle->id));\r
+        if (value & LOCK_STATUS_IMP_BIT)\r
+        {\r
+            /* If this bit is set, it device access is locked, we need to unlock the device*/\r
+            if (value & LOCK_STATUS_STAT_BIT)\r
+            {\r
+                *(volatile uint32_t*)(DTF_LOCK(pHandle->id)) = ETB_UNLOCK_VAL;\r
+            }\r
+        }\r
+        /* Claim Tag Set */\r
+        *(volatile uint32_t*)(TAGSET(pHandle->id)) = 0x1;\r
+\r
+        /* Enable ADTF    */\r
+        *(volatile uint32_t*)(DTF_CNTL(pHandle->id)) = *(volatile uint32_t*)(DTF_CNTL(pHandle->id)) | 0x1;\r
+    }\r
+\r
+#endif\r
+\r
+    /* Make sure that tracing is disabled or the write to the following\r
+     *  registers will not actually get written.\r
+     */\r
+    *((volatile uint32_t*)ETB_CTL(pHandle->id)) = *((volatile uint32_t*)ETB_CTL(pHandle->id)) & (~ETB_ENABLE);/* DISABLE TraceCaptEn */\r
+\r
+    if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+    {\r
+       /* ETB FIFO reset by writing 0 to ETB RAM Write Pointer Register. */\r
+               *((volatile uint32_t*)ETB_RWP(pHandle->id)) = 0;\r
+\r
+               /* Initialize RDP. */\r
+               *((volatile uint32_t*)ETB_RRP(pHandle->id)) = 0;\r
+       \r
+               /* Clear all interrupts before enabling trace, just to make sure nothing pending*/\r
+               *((volatile uint32_t*)ETB_ICST(pHandle->id)) = (TI_ETB_IRST_FULL |\r
+                                                                                                               TI_ETB_IRST_HALF_FULL |\r
+                                                                                                               TI_ETB_IRST_OVERFLOW |\r
+                                                                                                               TI_ETB_IRST_UNDERFLOW);\r
+    }\r
+    else\r
+    {\r
+       /* Clear all interrupts before enabling trace, just to make sure nothing pending*/\r
+               *((volatile uint32_t*)TBR_IRQSTATUS(pHandle->id)) = (TBR_IRST_DAV |\r
+                                                                                                                    TBR_IRST_AQCMP);\r
+    }\r
+\r
+    /* Disable formatting and put ETB formatter into bypass mode. */\r
+    /* Clear all control bits except STP_FULL */\r
+    *((volatile uint32_t*)ETB_FFCR(pHandle->id)) &= TBR_STP_FULL; /* For TI-ETB: EnFCont=0, EnFTC=0 */\r
+\r
+    if(check_etb_type(pHandle->id) == TBR_TYPE)\r
+    {\r
+       //Set ID period to 8. Artificial ID will be added, if there is no ID change for 8 TWP frames\r
+       *((volatile uint32_t*)TBR_IDPERIOD(pHandle->id)) = TBR_TWP_IDPERIOD;\r
+\r
+       *((volatile uint32_t*)TBR_SEQCNTL(pHandle->id)) = TBR_TWP_SEQATBID | TBR_TWP_SEQPERIOD;\r
+\r
+       //Always enable TBR TWP formatter\r
+        *((volatile uint32_t*)ETB_FFCR(pHandle->id)) = *((volatile uint32_t*)ETB_FFCR(pHandle->id)) | TBR_TWP_ENABLE;\r
+       //*((volatile uint32_t*)ETB_FFCR(pHandle->id)) = *((volatile uint32_t*)ETB_FFCR(pHandle->id)) & TBR_TWP_DISABLE;\r
+    }\r
+\r
+    /* Setup Trigger counter. */\r
+    *((volatile uint32_t*)ETB_TRIG(pHandle->id)) = triggerCount;\r
+\r
+#ifdef DMA_SUPPORT\r
+    /* If the DMA has been enabled, indicated by dma pointer non-null, enable\r
+     *  the ETB half-full and full interrupts.\r
+     */\r
+    if(pHandle->pDmaConfig != 0)\r
+    {\r
+       if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+       {\r
+               *((volatile uint32_t*)ETB_IER(pHandle->id))  = (TI_ETB_IRST_FULL |\r
+                                                            TI_ETB_IRST_HALF_FULL);\r
+       }\r
+    }\r
+#endif\r
+\r
+    /* Enable ETB data capture by writing ETB Control Register. */\r
+    *((volatile uint32_t*)ETB_CTL(pHandle->id)) = *((volatile uint32_t*)ETB_CTL(pHandle->id)) | ETB_ENABLE; /* TraceCaptEn =1 */\r
+\r
+    /* Put some delays in here - make sure we can read back. */\r
+    do\r
+    {\r
+        etbControl = *((volatile uint32_t*)ETB_CTL(pHandle->id));\r
+        waitCount--;\r
+    } while (((etbControl & 0x1) != ETB_ENABLE) && (waitCount > 0));\r
+\r
+    if(waitCount ==0)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+\r
+    return eETB_Success;\r
+}\r
+\r
+/**\r
+* ETB_disable - Disable ETB to stop capturing trace data\r
+*/\r
+eETB_Error  ETB_disable(ETBHandle* pHandle)\r
+{\r
+    eETB_Error  ret = eETB_Success;\r
+\r
+    if(!pHandle || pHandle->ulContext != ETB_UNLOCK_VAL)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+\r
+    /* Flush ETB, wait until after disabling data capture to check status.\r
+     * This function will not return until the flush has completed.\r
+     */\r
+        // Perform Flush + stop formatter only for non-EDMA examples. For EDMA examples \r
+     // the Flush + stop formatter is already done using the ETB_flush() API  \r
+       if(pHandle->pDmaConfig == 0)\r
+    {\r
+        ret = flush(pHandle, eETB_STOP_FORMATTER);\r
+       }\r
+\r
+#if !defined(C66AK2Hxx_CSSTM_ETB) && !defined(C66AK2Exx_CSSTM_ETB) && !defined(_OMAP54xx)\r
+\r
+    if(Need_DTF(pHandle))\r
+    {\r
+        /* Disable ADTF    */\r
+        *(volatile uint32_t*)(DTF_CNTL(pHandle->id)) = *(volatile uint32_t*)(DTF_CNTL(pHandle->id)) | (~0x1);\r
+    }\r
+\r
+#endif\r
+\r
+    /* Disable ETB data capture by writing ETB Control Register. */\r
+    *((volatile uint32_t*)ETB_CTL(pHandle->id)) = *((volatile uint32_t*)ETB_CTL(pHandle->id)) & (~ETB_ENABLE); /* TraceCaptEn =0 */\r
+\r
+    if(ret != eETB_Success)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, ret);\r
+    }\r
+\r
+    // Wait for ETB Acquisition Complete\r
+    /* ==> The code to check the ETB_STS register for ETB_STS_ACQCOMP bit\r
+     *      is not necessary if a manual flush has occurred and\r
+     *      completed. For the TBR case, the disable trace capture will\r
+     *      cause a flush, polling this bit would serve a purpose.\r
+     */\r
+\r
+#ifdef DMA_SUPPORT\r
+    /* If the DMA has been enabled, indicated by dma pointer non-null, disable\r
+     *  the ETB half-full and full interrupts.\r
+     */\r
+    if(pHandle->pDmaConfig != 0)\r
+    {\r
+       if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+       {\r
+               *((volatile uint32_t*)ETB_IECST(pHandle->id))  = (TI_ETB_IRST_FULL |\r
+                                                          TI_ETB_IRST_HALF_FULL);\r
+       }\r
+       else\r
+       {\r
+               *((volatile uint32_t*)TBR_IRQENABLE_CLR(pHandle->id)) = TBR_IRST_DAV;\r
+       }\r
+    }\r
+#endif\r
+    return ret;\r
+}\r
+\r
+\r
+/**\r
+* ETB_status- Get ETB status\r
+*\r
+    ETB status register .\r
+    STS:\r
+    RAMFull=1   [0], RAMEmpty=0     [0]\r
+    Triggered=1 [1], NotTriggered=0 [1]\r
+    AccqComp=1  [2], NotAccqComp=0  [2]\r
+    FtEmpty=1   [3], NotFtEmpty=0   [3]\r
+    x --> reserved\r
+    v --> read value\r
+    31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00\r
+    ________________________________________________________________________________________________\r
+    |x | x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| x| v| v| v| v|\r
+    |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|\r
+\r
+*/\r
+eETB_Error  ETB_status(ETBHandle* pHandle, ETBStatus* status)\r
+{\r
+    uint32_t etbStatus, etbControl=0, etb_size;\r
+\r
+    if(!pHandle || pHandle->ulContext != ETB_UNLOCK_VAL)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+\r
+    if(status == 0 )\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Bad_Param);\r
+    }\r
+\r
+    //Get ETB Trace capture enable status\r
+    status->ETB_TraceCaptureEn = *((volatile uint32_t*)ETB_CTL(pHandle->id));\r
+\r
+#ifdef DMA_SUPPORT\r
+    \r
+    if(pHandle->pDmaConfig != 0)\r
+    {\r
+        uint32_t paramAddress;\r
+        uint16_t paramIdx;\r
+        \r
+#if defined(C6657) || defined(C66AK2Hxx) || defined(C66AK2Exx)\r
+\r
+        paramIdx = (EDMA3_DCHMAP_REG(pHandle->pDmaConfig->cc,\r
+                                     pHandle->pDmaConfig->etbhalfChannel) >> 5);\r
+\r
+#elif defined(C6670) || defined(C6678)\r
+\r
+        paramIdx = (EDMA3_DCHMAP_REG(pHandle->pDmaConfig->cc,\r
+                                     pHandle->pDmaConfig->etbChannel) >> 5);\r
+#endif\r
+\r
+        paramAddress = EDMA_TPCC_PARAM_BASE_ADDR(pHandle->pDmaConfig->cc) +\r
+                                                    (0x20 * paramIdx);\r
+\r
+        /* Check for buffer wrap */\r
+        if(etbLib_bufferWrapped[pHandle->id][0])\r
+        {\r
+            status->availableWords = pHandle->dmaStatus.dbufWords;\r
+            status->isWrapped = 1;\r
+            status->canRead   = 1;\r
+        }\r
+        else\r
+        {\r
+            status->availableWords = (PARAM_DST_REG(paramAddress) -\r
+                                pHandle->pDmaConfig->dbufAddress) / 4;\r
+            status->isWrapped = 0;\r
+            status->canRead   = 1;\r
+        }\r
+    }\r
+    else\r
+#endif\r
+    {\r
+        status->canRead=0;\r
+        status->availableWords=0;\r
+        status->isWrapped=0;\r
+        status->overflow = 0;\r
+        etbStatus = *((volatile uint32_t*)ETB_STS(pHandle->id));\r
+\r
+        if (etbStatus & TI_ETB_IRST_OVERFLOW) \r
+        {\r
+            status->overflow = 1;\r
+        }\r
+\r
+        if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+        {\r
+                       if ((TI_ETB_TI_MODE & *((volatile uint32_t*)ETB_TI_CTL(pHandle->id))) ==\r
+                                       TI_ETB_TI_MODE)\r
+                       {\r
+                               /* In this case we must take into account the number of words already read */\r
+                               status->canRead = 1;\r
+                       }\r
+                       else\r
+                       {\r
+\r
+                               etbControl = *((volatile uint32_t*)ETB_CTL(pHandle->id));\r
+\r
+                               if(etbControl == ETB_ENABLE)\r
+                               {\r
+                                       return eETB_Success;\r
+                               }\r
+\r
+                               if((etbStatus & ETB_STS_ACQCOMP) == ETB_STS_ACQCOMP)\r
+                               {\r
+                                       status->canRead = 1;\r
+                               }\r
+                       }\r
+\r
+                       // get size of the ETB buffer in words\r
+                       etb_size = (*((volatile uint32_t*)ETB_RDP(pHandle->id)));\r
+        }\r
+        else\r
+        {\r
+                       etbControl = *((volatile uint32_t*)ETB_CTL(pHandle->id));\r
+\r
+                       if(etbControl == ETB_ENABLE)\r
+                       {\r
+                               return eETB_Success;\r
+                       }\r
+\r
+                       if((etbStatus & ETB_STS_ACQCOMP) == ETB_STS_ACQCOMP)\r
+                       {\r
+                               status->canRead = 1;\r
+                       }\r
+\r
+                       // get size of the TBR buffer in words\r
+                       etb_size = (*((volatile uint32_t*)ETB_RDP(pHandle->id)));\r
+                       etb_size = (1 << (etb_size-1)) << 10;\r
+        }\r
+\r
+        if ((etbStatus  & ETB_STS_FULL) == ETB_STS_FULL)\r
+        {\r
+            status->isWrapped = 1;\r
+            status->availableWords = etb_size;\r
+        }\r
+        else\r
+            status->availableWords = *((volatile uint32_t*)ETB_RWP(pHandle->id));\r
+    }\r
+    return eETB_Success;\r
+}\r
+\r
+\r
+/**\r
+* ETB_read- Read ETB data\r
+*\r
+*  Reference Diagram for DMA drain buffer parameters:\r
+*\r
+*    Wrapped buffer:                          Non-Wrapped buffer:\r
+*    _______________                          _______________\r
+*   |_______________| -> dbufStartAddr       |_______________| -> dbufStartAddr\r
+*   |               |                        |               |  && dataStartAddr\r
+*   |               |                        |               |\r
+*   //              //                       //              //\r
+*   |_______________|                        //              //\r
+*   |_______________| -> dataEndAddr         |_______________|\r
+*   |_______________| -> dataStartAddr       |_______________| -> dataEndAddr\r
+*   |               |                        |  \\\\\\\\\\\\ |\r
+*   |               |                        |  //////////// |  No data\r
+*   //              //                       // \\\\\\\\\\\\ //\r
+*   |_______________|                        |  //////////// |\r
+*   |_______________| -> dbufEndAddr         |_______________| -> dbufEndAddr\r
+*\r
+*/\r
+eETB_Error ETB_read(ETBHandle* pHandle,    uint32_t *pBuffer,\r
+                    uint32_t bufferLength, uint32_t startWord,\r
+                    uint32_t readLength, uint32_t* pRetLength)\r
+{\r
+    ETBStatus status;\r
+    uint32_t idx, startAddr, depth, value;\r
+\r
+    if(!pHandle || pHandle->ulContext != ETB_UNLOCK_VAL)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+    /* Check if we have proper buffer pointer */\r
+    if(pBuffer == 0)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Bad_Param);\r
+    }\r
+\r
+    *pRetLength =0;\r
+\r
+#ifdef DMA_SUPPORT\r
+    /* If the DMA has been configured to empty the ETB, then read from the memory\r
+     *  buffer instead of the ETB hardware registers.\r
+     */\r
+    if(pHandle->pDmaConfig != 0)\r
+    {\r
+        uint32_t *pDmaBuffer;\r
+        uint32_t dataStartAddr; // Start of data address in case of wrap\r
+        uint32_t dataEndAddr; // End of data address\r
+        uint32_t wordCnt;     // Number of words that will be copied\r
+        int32_t  remWords;    // Remaining words to read from drain buffer\r
+        uint32_t dbufEndAddr; // End of buffer address\r
+        uint32_t dbufStartAddr = pHandle->dmaStatus.dbufAddress;\r
+\r
+        /* Set/calculate address values */\r
+        dataStartAddr = pHandle->dmaStatus.startAddr;\r
+        dbufEndAddr = pHandle->dmaStatus.dbufAddress + (pHandle->dmaStatus.dbufWords*4) - 1;\r
+\r
+        /* If the data starting address is not equal to the buffer starting address,\r
+         *  then the buffer has wrapped, the ending data address will be\r
+         *  the previous word's address. Otherwise, it will be the starting address\r
+         *  plus the number of words written into the drain buffer.\r
+         */\r
+        if(dataStartAddr > dbufStartAddr)\r
+        {\r
+            dataEndAddr = dataStartAddr - sizeof(uint32_t);\r
+        }\r
+        else\r
+        {\r
+            dataEndAddr = dataStartAddr + ((pHandle->dmaStatus.availableWords-1) * 4);\r
+        }\r
+        /* The startWord variable is passed into this function as an offset for\r
+         *  this read request. The value is translated into bytes from words to\r
+         *  get the correct address value to start reading words from the drain\r
+         *  buffer.\r
+         */\r
+        startAddr   = dataStartAddr + (startWord * 4);\r
+\r
+        /* Check to see if the starting address is past the end of the buffer */\r
+    //    if(startAddr > dbufEndAddr)\r
+     //   {\r
+       //     /* Subtract 1 from the difference to account for 0-based counting */\r
+        //    startAddr = ((startAddr - dbufEndAddr) + dbufStartAddr) - 1;\r
+       // }\r
+\r
+        /* Initially set the total word count to the specified buffer length,\r
+         *  then check if the requested read length is less, then finally if\r
+         *  the remaining words left in the drain buffer is less.\r
+         */\r
+        wordCnt = bufferLength;\r
+        if(readLength < wordCnt)\r
+        {\r
+            wordCnt = readLength;\r
+        }\r
+\r
+        /* The following calculation is using the remaining words variable to calculate\r
+         *  byte address values. The conversion from bytes to words will occur after the\r
+         *  calculations have been completed.\r
+         */\r
+        remWords = dataEndAddr - startAddr;\r
+        if(remWords < 0)\r
+        {\r
+            if(pHandle->dmaStatus.isWrapped)\r
+            {\r
+                /* 1 is added back to the end address to use the size vs. address */\r
+                remWords = ((dbufEndAddr+1) - startAddr) + (dataEndAddr - dbufStartAddr);\r
+            }\r
+            else\r
+            {\r
+                remWords = 0;\r
+            }\r
+        }\r
+        /* Convert from bytes to words */\r
+        if(remWords != 0)\r
+        {\r
+            remWords /= 4;\r
+            remWords += 1; /* 1 added for 0-based counting */\r
+        }\r
+\r
+        if(remWords < wordCnt)\r
+        {\r
+            wordCnt = remWords;\r
+        }\r
+\r
+        /* Loop through and copy the data from the ETB buffer into the provided\r
+         *  buffer.\r
+         */\r
+        pDmaBuffer = (uint32_t *)startAddr;\r
+        for(idx = 0; idx < wordCnt; idx++)\r
+        {\r
+            /* Check for startAddr past the total words in the buffer and set\r
+             *  the pointer/address values to the buffer's starting address.\r
+             */\r
+            if(startAddr > dbufEndAddr)\r
+            {\r
+               pDmaBuffer = (uint32_t *)(pHandle->dmaStatus.dbufAddress + (startAddr - (dbufEndAddr+1)));\r
+                startAddr  = pHandle->dmaStatus.dbufAddress;\r
+            }\r
+            pBuffer[idx] = *pDmaBuffer++;\r
+\r
+            (*pRetLength)++;\r
+\r
+            startAddr += 4; /* Increment by full-word */\r
+        }\r
+    }\r
+    else\r
+#endif\r
+    {\r
+        /* Get the status of the ETB before we can start reading. */\r
+        if(eETB_Success == ETB_status(pHandle, &status))\r
+        {\r
+            if(status.canRead == 0)\r
+            {\r
+                RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Cannot_Read);\r
+            }\r
+                       \r
+                       // Update the 3 symbols which are required for CCS ETB receiver\r
+                       etbLib_buffer_start_addr[pHandle->id] = (uint32_t)pBuffer; //CCS ETB receiver will always get a linearized buffer for the non-EDMA ETB drain case\r
+            etbLib_buffer_size[pHandle->id] = status.availableWords * 4; //Number of bytes available \r
+            etbLib_buffer_data_start[pHandle->id] = etbLib_buffer_start_addr[pHandle->id]; //circular buffer wrap point, if equal to the start address, no unwrapping of the buffer is required \r
+\r
+            if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+            {\r
+                               /* ETB depth */\r
+                               depth = *((volatile uint32_t*)ETB_RDP(pHandle->id));\r
+            }\r
+            else\r
+            {\r
+               /* ETB depth */\r
+                               value = (*((volatile uint32_t*)ETB_RDP(pHandle->id)));\r
+                               depth = (1 << (value-1)) << 10;\r
+            }\r
+\r
+            /* Check if the buffer is wrapped or not; set read pointers\r
+             *  accordingly.\r
+             */\r
+            if(status.isWrapped == 1)\r
+            {\r
+                startAddr =\r
+                    *((volatile uint32_t*)ETB_RWP(pHandle->id)) + startWord;\r
+            }\r
+            else\r
+            {\r
+                startAddr = 0x0 + startWord;\r
+            }\r
+\r
+            /* Adjust the read size for the available user buffer and requested\r
+             *  data.\r
+             */\r
+            if(bufferLength < status.availableWords)\r
+                status.availableWords = bufferLength;\r
+\r
+            if(readLength < status.availableWords)\r
+                status.availableWords = readLength;\r
+\r
+            /* Adjust to accomodate the start word. */\r
+            if(startWord < status.availableWords)\r
+                status.availableWords = status.availableWords - startWord;\r
+            else\r
+                status.availableWords =0;\r
+\r
+            if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+            {\r
+                               // Not valid to write the RRP if TIETB has not wrapped\r
+                               if(status.isWrapped == 1)\r
+                               {\r
+                                       /* Initialize the ETB RAM read pointer register with startAddr*/\r
+                                       *((volatile uint32_t*)ETB_RRP(pHandle->id)) = startAddr;\r
+\r
+                                       /* Clear the overflow flag*/\r
+                                       *((volatile uint32_t*)ETB_ICST(pHandle->id)) = TI_ETB_IRST_OVERFLOW;\r
+                               }\r
+            }\r
+            else\r
+            {\r
+               /* Initialize the ETB RAM read pointer register with startAddr*/\r
+               *((volatile uint32_t*)ETB_RRP(pHandle->id)) = startAddr;\r
+            }\r
+\r
+            /* Now read trace data out of ETB */\r
+            for (idx = 0; idx < status.availableWords; idx++)\r
+            {\r
+                /* Read the ETB RAM read data register to retrieve trace data.\r
+                 *  This would cause the read pointer register value to\r
+                 *  auto-increment.\r
+                 */\r
+                pBuffer[idx] = *((volatile uint32_t*)ETB_RRD(pHandle->id));\r
+\r
+                (*pRetLength)++;\r
+\r
+                startAddr++;\r
+\r
+                if(startAddr == depth)\r
+                {\r
+                    /*Now wrap from begining */\r
+                    startAddr = 0x0;\r
+                    *((volatile uint32_t*)ETB_RRP(pHandle->id)) = startAddr;\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    return eETB_Success;\r
+}\r
+\r
+\r
+/**\r
+* ETB_close- Close ETB programming module interface\r
+*/\r
+eETB_Error  ETB_close(ETBHandle* pHandle)\r
+{\r
+     if(!pHandle || pHandle->ulContext != ETB_UNLOCK_VAL)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+\r
+#if !defined(C66AK2Hxx_CSSTM_ETB) && !defined(C66AK2Exx_CSSTM_ETB) && !defined(_OMAP54xx)\r
+\r
+    /* Disable DTF, if available */\r
+    if(Need_DTF(pHandle))\r
+    {\r
+        // Claim Tag Clear\r
+        *(volatile uint32_t*)(TAGCLR(pHandle->id)) = 0x1;\r
+\r
+        /* Disable ADTF    */\r
+        *(volatile uint32_t*)(DTF_CNTL(pHandle->id)) = *(volatile uint32_t*)(DTF_CNTL(pHandle->id)) & (~0x1);\r
+    }\r
+\r
+#endif\r
+\r
+    if(pHandle->ulContext == ETB_UNLOCK_VAL)\r
+    {\r
+        pHandle->ulContext = 0;\r
+    }\r
+\r
+#ifdef __linux\r
+    {\r
+        int i;\r
+        cTools_memUnMap(virtural_ETB_BaseAddress[pHandle->id], SIZEOF_ETB_SPACE);\r
+        cTools_memUnMap(virtural_DTF_BaseAddress[pHandle->id], SIZEOF_DTF_SPACE);\r
+        virtural_ETB_BaseAddress[pHandle->id] = 0;\r
+        virtural_DTF_BaseAddress[pHandle->id] = 0;\r
+\r
+        /* Only close the PSC if no other instances of ETBs are open */\r
+        for (i = 0; i < NUM_ETB_INSTANCES; i++) {\r
+            if (virtural_ETB_BaseAddress[pHandle->id] != 0) break;\r
+        }\r
+        if ( i == NUM_ETB_INSTANCES) \r
+        { \r
+            cTools_memUnMap(virtural_PSC_BaseAddress, SIZEOF_PSC_SPACE);\r
+            virtural_PSC_BaseAddress = 0;\r
+        }\r
+    }\r
+#endif\r
+\r
+    return eETB_Success;\r
+}\r
+\r
+/**\r
+* ETB_flush - Flush the ETB and ADTF in c6484 case\r
+*/\r
+eETB_Error  ETB_flush(ETBHandle* pHandle)\r
+{\r
+    eETB_Error  ret;\r
+\r
+    if(!pHandle || pHandle->ulContext != ETB_UNLOCK_VAL)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+\r
+#ifdef DMA_SUPPORT\r
+       // Stop the formatter + Flush to the ETB, if EDMA mode is enabled or its a STM-ETB\r
+       if((pHandle->pDmaConfig != 0) || (pHandle->id == SYS_ETB_ID))\r
+    {\r
+        ret = flush(pHandle, eETB_STOP_FORMATTER);\r
+       }\r
+       else // Only Flush to the ETB, if EDMA mode is disabled\r
+#endif\r
+       {\r
+           ret = flush(pHandle, eETB_OPT_NONE);\r
+       }\r
+\r
+    return ret;\r
+}\r
+\r
+/**\r
+* flush - internal function used to flush the ETB from both the ETB_Disable API\r
+*         and the ETB_flush API.\r
+*/\r
+static eETB_Error flush(ETBHandle *pHandle, eETB_OPTIONS options)\r
+{\r
+    eETB_Error  ret = eETB_Success;\r
+    uint32_t etbControl;\r
+    uint32_t status;\r
+    uint32_t retry;\r
+#if defined(C6670) || defined(C6678)\r
+\r
+#ifdef DMA_SUPPORT\r
\r
+    uint32_t rrp;\r
+    uint32_t cntr = 0;\r
+   \r
+    if(pHandle->pDmaConfig != 0)\r
+    {\r
+               // Check for both Stop On Full mode is enabled and ETBLib buffer is wrapped\r
+               if((etbLib_bufferWrapped[pHandle->id][0] == 1) && (pHandle->pDmaConfig->mode == eDMA_Stop_Buffer))\r
+               {\r
+                       // Re-enable the ETB trace as the ETB trace was disabled by EDMA on buffer full\r
+                       /* Enable ETB data capture by writing ETB Control Register. */\r
+            *((volatile uint32_t*)ETB_CTL(pHandle->id)) |= ETB_ENABLE; /* TraceCaptEn =1 */\r
+               }\r
+    }\r
+\r
+    /* If using DMA to drain the ETB, disable the event coming from the ETB\r
+     *  interrupts in case the flush causes the ETB to cross the half-full or\r
+     *  full threshold. If this were to occur and start a DMA transaction the\r
+     *  data or PaRAM could get corrupted when the ETB_flush_dma function is\r
+     *  called. After the flush occurs the read from the Event Register will\r
+     *  identify if an interrupt occurred from the ETB.\r
+     *\r
+     * This code will only get executed on the 1st call, it is expected this\r
+     *  function is called directly before calling the DMA flush function.\r
+     *  Afterwards the ETB read pointer will not be on an even half or full\r
+     *  boundary and the while loop below would timeout. The configuration\r
+     *  function will need to get called before another capture can occur.\r
+     */\r
+    if((pHandle->pDmaConfig != 0) && (pHandle->dmaStatus.flushRequired))\r
+    {\r
+        uint32_t etbHalfSize;\r
+\r
+        /* By this point the ETB read register should be stable and at 0 or half\r
+         *  the ETB size, if not, then wait for the previous DMA to complete.\r
+         */\r
+        rrp = *((volatile uint32_t*)ETB_RRP(pHandle->id));\r
+        etbHalfSize = *((volatile uint32_t*)ETB_RDP(pHandle->id));\r
+        etbHalfSize /= 2;\r
+        while((rrp != 0) && (rrp != etbHalfSize))\r
+        {\r
+            rrp = *((volatile uint32_t*)ETB_RRP(pHandle->id));\r
+            if(cntr++ > ETB_DMA_TIMEOUT)\r
+                break;\r
+        }\r
+\r
+        /* Disable Event Register */\r
+        if(pHandle->pDmaConfig->clrChannel > 31)\r
+        {\r
+            EDMA3_EECRH_REG(pHandle->pDmaConfig->cc) =\r
+                                    (1 << (pHandle->pDmaConfig->clrChannel-32));\r
+        }\r
+        else\r
+        {\r
+            EDMA3_EECR_REG(pHandle->pDmaConfig->cc) =\r
+                                    (1 << pHandle->pDmaConfig->clrChannel);\r
+        }\r
+\r
+        /* Clear Interrupt Pending register for ETB channel */\r
+        if(pHandle->pDmaConfig->etbChannel > 31)\r
+        {\r
+            EDMA3_ICRH_REG(pHandle->pDmaConfig->cc) =\r
+                                (1 << (pHandle->pDmaConfig->etbChannel - 32));\r
+        }\r
+        else\r
+        {\r
+            EDMA3_ICR_REG(pHandle->pDmaConfig->cc) =\r
+                                (1 << pHandle->pDmaConfig->etbChannel);\r
+        }\r
+    }\r
+\r
+#endif\r
+       \r
+#elif defined(C6657) || defined(C66AK2Hxx) || defined(C66AK2Exx)\r
+\r
+#ifdef DMA_SUPPORT\r
+\r
+    uint32_t rrp;\r
+    uint32_t cntr = 0;\r
+   \r
+    if(pHandle->pDmaConfig != 0)\r
+    {\r
+               // Check for both Stop On Full mode is enabled and ETBLib buffer is wrapped\r
+               if((etbLib_bufferWrapped[pHandle->id][0] == 1) && (pHandle->pDmaConfig->mode == eDMA_Stop_Buffer))\r
+               {\r
+                       // Re-enable the ETB trace as the ETB trace was disabled by EDMA on buffer full\r
+                       /* Enable ETB data capture by writing ETB Control Register. */\r
+            *((volatile uint32_t*)ETB_CTL(pHandle->id)) |= ETB_ENABLE; /* TraceCaptEn =1 */\r
+               }\r
+    }\r
+\r
+    if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+    {\r
+\r
+               /* If using DMA to drain the ETB, disable the event coming from the ETB\r
+                *  interrupts in case the flush causes the ETB to cross the half-full or\r
+                *  full threshold. If this were to occur and start a DMA transaction the\r
+                *  data or PaRAM could get corrupted when the ETB_flush_dma function is\r
+                *  called. After the flush occurs the read from the Event Register will\r
+                *  identify if an interrupt occurred from the ETB.\r
+                *\r
+                * This code will only get executed on the 1st call, it is expected this\r
+                *  function is called directly before calling the DMA flush function.\r
+                *  Afterwards the ETB read pointer will not be on an even half or full\r
+                *  boundary and the while loop below would timeout. The configuration\r
+                *  function will need to get called before another capture can occur.\r
+                */\r
+               if((pHandle->pDmaConfig != 0) && (pHandle->dmaStatus.flushRequired))\r
+               {\r
+                       uint32_t etbHalfSize;\r
+\r
+                       /* By this point the ETB read register should be stable and at 0 or half\r
+                        *  the ETB size, if not, then wait for the previous DMA to complete.\r
+                        */\r
+                       rrp = *((volatile uint32_t*)ETB_RRP(pHandle->id));\r
+                       etbHalfSize = *((volatile uint32_t*)ETB_RDP(pHandle->id));\r
+                       etbHalfSize /= 2;\r
+                       while((rrp != 0) && (rrp != etbHalfSize))\r
+                       {\r
+                               rrp = *((volatile uint32_t*)ETB_RRP(pHandle->id));\r
+                               if(cntr++ > ETB_DMA_TIMEOUT)\r
+                                       break;\r
+                       }\r
+\r
+                       /* Disable etbhalf Event Register */\r
+                       if(pHandle->pDmaConfig->etbhalfChannel > 31)\r
+                       {\r
+                               EDMA3_EECRH_REG(pHandle->pDmaConfig->cc) =\r
+                                                                               (1 << (pHandle->pDmaConfig->etbhalfChannel-32));\r
+                       }\r
+                       else\r
+                       {\r
+                               EDMA3_EECR_REG(pHandle->pDmaConfig->cc) =\r
+                                                                               (1 << pHandle->pDmaConfig->etbhalfChannel);\r
+                       }\r
+\r
+                       /* Disable etbfull Event Register */\r
+                       if(pHandle->pDmaConfig->etbfullChannel > 31)\r
+                       {\r
+                               EDMA3_EECRH_REG(pHandle->pDmaConfig->cc) =\r
+                                                                               (1 << (pHandle->pDmaConfig->etbfullChannel-32));\r
+                       }\r
+                       else\r
+                       {\r
+                               EDMA3_EECR_REG(pHandle->pDmaConfig->cc) =\r
+                                                                               (1 << pHandle->pDmaConfig->etbfullChannel);\r
+                       }\r
+\r
+                       /* Clear Interrupt Pending register for ETB half channel */\r
+                       if(pHandle->pDmaConfig->etbhalfChannel > 31)\r
+                       {\r
+                               EDMA3_ICRH_REG(pHandle->pDmaConfig->cc) =\r
+                                                                       (1 << (pHandle->pDmaConfig->etbhalfChannel - 32));\r
+                       }\r
+                       else\r
+                       {\r
+                               EDMA3_ICR_REG(pHandle->pDmaConfig->cc) =\r
+                                                                       (1 << pHandle->pDmaConfig->etbhalfChannel);\r
+                       }\r
+               }\r
+    }\r
+       \r
+#endif\r
+#endif\r
+\r
+#ifdef TCI6484\r
+    /* In the TCI6484 case the DTF flush is not integrated so we must do a manual flush */\r
+    if(Need_DTF(pHandle))\r
+    {\r
+        ret = DTF_flush(pHandle->id);\r
+        if ( eETB_Success != ret )\r
+        {\r
+            RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+        }\r
+    }\r
+#endif\r
+    /* Flush ETB and DTF*/\r
+    etbControl = *((volatile uint32_t*)ETB_FFCR(pHandle->id));\r
+\r
+    if(options == eETB_STOP_FORMATTER)\r
+    {\r
+        etbControl |= (1 << 12);  /* Stop Formatter bit */\r
+    }\r
+    *((volatile uint32_t*)ETB_FFCR(pHandle->id)) = etbControl;\r
+\r
+    etbControl |= (1<<6); /* Manual flush */\r
+    *((volatile uint32_t*)ETB_FFCR(pHandle->id)) = etbControl;\r
+\r
+    // Wait for the flush to complete\r
+    retry = 1000;\r
+    do\r
+    {\r
+       status = *(volatile uint32_t*)ETB_FFSR(pHandle->id);\r
+       retry--;\r
+    }  while( ( ( status & ETB_FLUSH_INPROGRESS ) != 0 ) && ( retry != 0 ) );\r
+\r
+#if defined(C6670) || defined(C6678)\r
+\r
+#ifdef DMA_SUPPORT\r
+\r
+    /* If using the DMA to drain the ETB, will need to check if the flush caused\r
+     *  a threshold interrupt from the ETB.\r
+     */\r
+    if((pHandle->pDmaConfig != 0) && (pHandle->dmaStatus.flushRequired))\r
+    {\r
+        uint32_t regValue;\r
+\r
+        /* Read the event register, check for an event, then start and wait for\r
+         *  the DMA to complete before continuing.\r
+         */\r
+        if(pHandle->pDmaConfig->clrChannel > 31)\r
+        {\r
+            regValue = EDMA3_ERH_REG(pHandle->pDmaConfig->cc) &\r
+                        (1 << (pHandle->pDmaConfig->clrChannel-32));\r
+            EDMA3_EESRH_REG(pHandle->pDmaConfig->cc) =\r
+                                    (1 << (pHandle->pDmaConfig->clrChannel-32));\r
+        }\r
+        else\r
+        {\r
+            regValue = EDMA3_ER_REG(pHandle->pDmaConfig->cc) &\r
+                            (1 << pHandle->pDmaConfig->clrChannel);\r
+            EDMA3_EESR_REG(pHandle->pDmaConfig->cc) =\r
+                                        (1 << pHandle->pDmaConfig->clrChannel);\r
+        }\r
+\r
+        if(regValue)\r
+        {\r
+            cntr = 0;\r
+            if(pHandle->pDmaConfig->etbChannel > 31)\r
+            {\r
+                while((EDMA3_IPRH_REG(pHandle->pDmaConfig->cc) &\r
+                        (1 << (pHandle->pDmaConfig->etbChannel - 32))) == 0)\r
+                {\r
+                    if(cntr++ > ETB_DMA_TIMEOUT)\r
+                        break;\r
+                }\r
+                EDMA3_ICRH_REG(pHandle->pDmaConfig->cc) =\r
+                                    (1 << (pHandle->pDmaConfig->etbChannel - 32));\r
+            }\r
+            else\r
+            {\r
+                while((EDMA3_IPR_REG(pHandle->pDmaConfig->cc) &\r
+                        (1 << pHandle->pDmaConfig->etbChannel)) == 0)\r
+                {\r
+                    if(cntr++ > ETB_DMA_TIMEOUT)\r
+                        break;\r
+                }\r
+                EDMA3_ICR_REG(pHandle->pDmaConfig->cc) =\r
+                                    (1 << pHandle->pDmaConfig->etbChannel);\r
+            }\r
+        }\r
+    \r
+        /* Clear flag indicating not to excercise DMA code for any consecutive calls\r
+           to this function.\r
+        */\r
+        pHandle->dmaStatus.flushRequired = 0;\r
+    }\r
+\r
+#endif\r
+       \r
+#elif defined(C6657) || defined(C66AK2Hxx) || defined(C66AK2Exx)\r
+\r
+#ifdef DMA_SUPPORT\r
+\r
+    if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+    {\r
+               /* If using the DMA to drain the ETB, will need to check if the flush caused\r
+                *  a threshold interrupt from the ETB.\r
+                */\r
+               if((pHandle->pDmaConfig != 0) && (pHandle->dmaStatus.flushRequired))\r
+               {\r
+                       uint32_t regValue1, regValue2;\r
+\r
+                       /* Read the event register, check for a etbhalf or etbfull event, then start and wait for\r
+                        *  the DMA to complete before continuing.\r
+                        */\r
+                       if(pHandle->pDmaConfig->etbhalfChannel > 31)\r
+                       {\r
+                               regValue1 = EDMA3_ERH_REG(pHandle->pDmaConfig->cc) &\r
+                                                       (1 << (pHandle->pDmaConfig->etbhalfChannel-32));\r
+                               EDMA3_EESRH_REG(pHandle->pDmaConfig->cc) =\r
+                                                                               (1 << (pHandle->pDmaConfig->etbhalfChannel-32));\r
+                       }\r
+                       else\r
+                       {\r
+                               regValue1 = EDMA3_ER_REG(pHandle->pDmaConfig->cc) &\r
+                                                               (1 << pHandle->pDmaConfig->etbhalfChannel);\r
+                               EDMA3_EESR_REG(pHandle->pDmaConfig->cc) =\r
+                                                                                       (1 << pHandle->pDmaConfig->etbhalfChannel);\r
+                       }\r
+\r
+                       if(pHandle->pDmaConfig->etbfullChannel > 31)\r
+                       {\r
+                               regValue2 = EDMA3_ERH_REG(pHandle->pDmaConfig->cc) &\r
+                                                       (1 << (pHandle->pDmaConfig->etbfullChannel-32));\r
+                               EDMA3_EESRH_REG(pHandle->pDmaConfig->cc) =\r
+                                                                               (1 << (pHandle->pDmaConfig->etbfullChannel-32));\r
+                       }\r
+                       else\r
+                       {\r
+                               regValue2 = EDMA3_ER_REG(pHandle->pDmaConfig->cc) &\r
+                                                               (1 << pHandle->pDmaConfig->etbfullChannel);\r
+                               EDMA3_EESR_REG(pHandle->pDmaConfig->cc) =\r
+                                                                                       (1 << pHandle->pDmaConfig->etbfullChannel);\r
+                       }\r
+\r
+                       if((regValue1 != 0) || (regValue2 != 0))\r
+                       {\r
+                               cntr = 0;\r
+                               if(pHandle->pDmaConfig->etbhalfChannel > 31)\r
+                               {\r
+                                       while((EDMA3_IPRH_REG(pHandle->pDmaConfig->cc) &\r
+                                                       (1 << (pHandle->pDmaConfig->etbhalfChannel - 32))) == 0)\r
+                                       {\r
+                                               if(cntr++ > ETB_DMA_TIMEOUT)\r
+                                                       break;\r
+                                       }\r
+                                       EDMA3_ICRH_REG(pHandle->pDmaConfig->cc) =\r
+                                                                               (1 << (pHandle->pDmaConfig->etbhalfChannel - 32));\r
+                               }\r
+                               else\r
+                               {\r
+                                       while((EDMA3_IPR_REG(pHandle->pDmaConfig->cc) &\r
+                                                       (1 << pHandle->pDmaConfig->etbhalfChannel)) == 0)\r
+                                       {\r
+                                               if(cntr++ > ETB_DMA_TIMEOUT)\r
+                                                       break;\r
+                                       }\r
+                                       EDMA3_ICR_REG(pHandle->pDmaConfig->cc) =\r
+                                                                               (1 << pHandle->pDmaConfig->etbhalfChannel);\r
+                               }\r
+                       }\r
+               \r
+                       /* Clear flag indicating not to excercise DMA code for any consecutive calls\r
+                          to this function.\r
+                       */\r
+                       pHandle->dmaStatus.flushRequired = 0;\r
+               }\r
+\r
+               *((volatile uint32_t*)ETB_FFCR(pHandle->id)) = 0;\r
+    }\r
+       \r
+#endif\r
+#endif\r
+\r
+    if ( retry == 0 )\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+\r
+    return ret;\r
+}\r
+\r
+#ifdef DMA_SUPPORT\r
+/******************************************************************************/\r
+/*! \copydoc ETB_config_dma\r
+ */\r
+eETB_Error  ETB_config_dma(ETBHandle* pHandle, const DMAConfig *pConfig)\r
+{\r
+#if defined(C6670) || defined(C6678)\r
+       \r
+       uint32_t paramBase;\r
+    uint16_t paramIdx;\r
+    uint32_t etbSize;\r
+    uint32_t etbHalfSize;\r
+    uint32_t clr1param;\r
+    uint32_t clr2param;\r
+    uint32_t etb1param;\r
+    uint32_t etb2param;\r
+    uint32_t etb3param;\r
+    struct edma3_param param;\r
+    /* Fixed location to store DMA configuration parameters */\r
+    static DMAConfig dmaConfig[NUM_ETB_INSTANCES];\r
+\r
+    // For C6678, Index = 0 (CIC2), Index = 1 (CIC3)\r
+    // For C6670, Index = 0 (CIC1), Index = 1 (CIC2)\r
+    uint8_t cic_index = 0;\r
+\r
+    if(!pHandle || (pHandle->ulContext != ETB_UNLOCK_VAL) || !pConfig)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+\r
+    if ((TI_ETB_TI_MODE & *((volatile uint32_t*)ETB_TI_CTL(pHandle->id))) != TI_ETB_TI_MODE )\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+\r
+    #if defined(C6670)\r
+       if(!(pConfig->cic == eCIC_1 || pConfig->cic == eCIC_2))\r
+       {\r
+               RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+       }\r
+\r
+       #elif defined(C6678)\r
+       if(!(pConfig->cic == eCIC_2 || pConfig->cic == eCIC_3))\r
+       {\r
+               RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+       }\r
+       \r
+       #endif\r
+\r
+    /* Validate the Channel Controller value and set the Parameter RAM base\r
+     *  address value\r
+     */\r
+    switch(pConfig->cc)\r
+    {\r
+        case 0:\r
+            paramBase = EDMA_TPCC_PARAM_BASE_ADDR(0);\r
+            break;\r
+        case 1:\r
+            paramBase = EDMA_TPCC_PARAM_BASE_ADDR(1);\r
+            break;\r
+        case 2:\r
+            paramBase = EDMA_TPCC_PARAM_BASE_ADDR(2);\r
+            break;\r
+        default:\r
+            RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+\r
+    /* Calculate the address values for the specific PaRAM's. The PaRAM numbers\r
+     *  for the DMA channels provided are determined by reading the DMA to\r
+     *  PaRAM mapping registers.\r
+     */\r
+    paramIdx  = (EDMA3_DCHMAP_REG(pConfig->cc,pConfig->clrChannel) >> 5);\r
+    clr1param = paramBase + (0x20 * paramIdx);\r
+    clr2param = paramBase + (0x20 * pConfig->linkparam[0]);\r
+    paramIdx  = (EDMA3_DCHMAP_REG(pConfig->cc,pConfig->etbChannel) >> 5);\r
+    etb1param = paramBase + (0x20 * paramIdx);\r
+    etb2param = paramBase + (0x20 * pConfig->linkparam[1]);\r
+    etb3param = paramBase + (0x20 * pConfig->linkparam[2]);\r
+\r
+    etbLib_bufferWrapped[pHandle->id][0] = 0;\r
+    etbLib_bufferWrapped[pHandle->id][1] = 1;\r
+       \r
+       /* Store configuration information */\r
+    dmaConfig[Handle_index(pHandle->id)].cc           = pConfig->cc;\r
+    dmaConfig[Handle_index(pHandle->id)].clrChannel   = pConfig->clrChannel;\r
+    dmaConfig[Handle_index(pHandle->id)].etbChannel   = pConfig->etbChannel;\r
+    dmaConfig[Handle_index(pHandle->id)].linkparam[0] = pConfig->linkparam[0];\r
+    dmaConfig[Handle_index(pHandle->id)].linkparam[1] = pConfig->linkparam[1];\r
+    dmaConfig[Handle_index(pHandle->id)].linkparam[2] = pConfig->linkparam[2];\r
+    dmaConfig[Handle_index(pHandle->id)].dbufAddress  = pConfig->dbufAddress;\r
+    dmaConfig[Handle_index(pHandle->id)].dbufWords    = pConfig->dbufWords;\r
+    dmaConfig[Handle_index(pHandle->id)].mode         = pConfig->mode;\r
+    dmaConfig[Handle_index(pHandle->id)].cic          = pConfig->cic;\r
+    pHandle->pDmaConfig = &dmaConfig[Handle_index(pHandle->id)];\r
+\r
+    /* Get the size of the ETB for this instance to determine the count values\r
+     *  required for the EDMA parameter ram (PaRAM) configuration. The size if\r
+     *  provided in words, convert to bytes for calculations. The count values\r
+     *  for the EDMA are in bytes.\r
+     */\r
+    etbSize = *((volatile uint32_t*)ETB_RDP(pHandle->id));\r
+    etbSize *= 4;\r
+    etbHalfSize = etbSize / 2;\r
+\r
+       #if defined(C6670)\r
+\r
+    cic_index = pHandle->pDmaConfig->cic - 1;\r
+\r
+    #elif defined(C6678)\r
+\r
+    cic_index = pHandle->pDmaConfig->cic - 2;\r
+\r
+       #endif\r
+\r
+    /* The following 2 PaRAM's are used to clear the INTC1 event register. When\r
+     *  the bit for the specific event in the register is set, no other incoming\r
+     *  events will get forwarded to its corresponding output until the event\r
+     *  has been cleared.\r
+     * The early completion is used to chain to the start of the ETB transfer\r
+     *  PaRAM.\r
+     */\r
+    param.options   = (PARAM_OPT_TCCHEN |\r
+                       PARAM_OPT_TCC(pConfig->etbChannel) |\r
+                       PARAM_OPT_TCC_EARLY|\r
+                       PARAM_OPT_AB_SYNC);\r
+    param.src_addr  = GET_GLOBAL_ADDR(&etbLib_cpCicEventClearValue[cic_index][pHandle->id][0]);\r
+    param.ab_cnt    = (PARAM_BCNT(2) | PARAM_ACNT(4));\r
+    param.dst_addr  = etbLib_cpCicEventClearIndexReg[cic_index];\r
+    param.srcdst_bidx = 4;\r
+    param.link_bcnt = PARAM_LINK(clr2param);\r
+    param.srcdst_cidx = 0;\r
+    param.ccnt        = 1;\r
+\r
+    /* Copy local structure to actual PaRAM memory locations */\r
+    *(struct edma3_param *)clr1param = param;\r
+    *(struct edma3_param *)clr2param = param;\r
+\r
+    /* Create the PaRAM entries that will be used to transfer data from ETB RAM\r
+     *  Burst Data Read Register locations to a drain buffer in memory. The\r
+     *  second PaRAM is used once to transfer a buffer wrapped flag that is used\r
+     *  to indicate the drain buffer has wrapped. It is linked to the 3rd PaRAM\r
+     *  that is used to reload with initial values to tranfer data from ETB.\r
+     */\r
+    param.options   = (PARAM_OPT_ITCINTEN | PARAM_OPT_TCINTEN |\r
+                       PARAM_OPT_TCCHEN   |\r
+                       PARAM_OPT_TCC(pConfig->etbChannel) |\r
+                       PARAM_OPT_AB_SYNC);\r
+    param.src_addr  = ETB_RBD(pHandle->id);\r
+    param.ab_cnt    = PARAM_BCNT(etbHalfSize / ETB_BURST_SIZE) | PARAM_ACNT(ETB_BURST_SIZE);\r
+    param.dst_addr  = pConfig->dbufAddress;\r
+    param.srcdst_bidx = PARAM_DST_BIDX(ETB_BURST_SIZE);\r
+    param.link_bcnt   = PARAM_LINK(etb2param);\r
+    param.srcdst_cidx = PARAM_DST_CIDX(etbHalfSize);\r
+    param.ccnt        = (pConfig->dbufWords*4) / etbHalfSize;\r
+\r
+    /* Set the DMA status to the actual number of words used in the provided\r
+     *  buffer, also reset any previous status settings.\r
+     */\r
+    pHandle->dmaStatus.startAddr      = 0;\r
+    pHandle->dmaStatus.availableWords = 0;\r
+    pHandle->dmaStatus.isWrapped      = 0;\r
+    pHandle->dmaStatus.dbufAddress    = 0;\r
+    pHandle->dmaStatus.flushRequired  = 1;\r
+    pHandle->dmaStatus.dbufWords = (param.ccnt * etbHalfSize) / 4;\r
+\r
+    /* Copy local structure to actual PaRAM memory locations */\r
+    *(struct edma3_param *)etb1param = param;\r
+\r
+    if(pConfig->mode != eDMA_Stop_Buffer)\r
+    {\r
+\r
+               /* Change the 3rd PaRAM to not link to 2nd for wrap processing, just\r
+                *  link to self for reloading purposes, Transfer chaining completion is\r
+                *  also not needed except for the 1st occurance.\r
+                */\r
+               param.options   = PARAM_OPT_ITCINTEN | PARAM_OPT_TCINTEN | PARAM_OPT_AB_SYNC;\r
+               param.link_bcnt = PARAM_LINK(etb3param);\r
+       }\r
+       else\r
+       {\r
+           /* If the DMA mode has been configured as non-circular, configure etbparam3 to disable ETB trace\r
+            *  set the link value to a NULL after disabling ETB trace.\r
+         */\r
+                \r
+               param.options   = PARAM_OPT_TCC_EARLY;\r
+               param.src_addr  = GET_GLOBAL_ADDR(&etb_disable);\r
+        param.ab_cnt    = (PARAM_BCNT(1) | PARAM_ACNT(4));\r
+               param.dst_addr  = ETB_CTL(pHandle->id);\r
+        param.srcdst_bidx = 0;\r
+        param.link_bcnt = PARAM_LINK(0xffff);\r
+        param.srcdst_cidx = 0;\r
+               param.ccnt        = 1;\r
+       }\r
+       \r
+       *(struct edma3_param *)etb3param = param;\r
+       \r
+       if(pConfig->mode != eDMA_Stop_Buffer)\r
+    { \r
+        /* 2nd PaRAM configuration, no transfer chaining completion, but an early\r
+         *  link completion.\r
+         */\r
+               param.options   = PARAM_OPT_TCC_EARLY;\r
+    }\r
+    else\r
+    {\r
+           /* For Stop on full buffer mode, link to etb3param which disables ETB trace capture */\r
+        param.options   = (PARAM_OPT_TCC_EARLY | PARAM_OPT_ITCINTEN | PARAM_OPT_TCINTEN |\r
+                           PARAM_OPT_TCCHEN   |\r
+                           PARAM_OPT_TCC(pConfig->etbChannel));\r
+    } \r
+                   \r
+    param.src_addr  = GET_GLOBAL_ADDR(&etbLib_bufferWrapped[pHandle->id][1]);\r
+    param.ab_cnt    = PARAM_BCNT(1) | PARAM_ACNT(4);\r
+    param.dst_addr  = GET_GLOBAL_ADDR(&etbLib_bufferWrapped[pHandle->id][0]);\r
+    param.srcdst_bidx = 0;\r
+    param.link_bcnt   = PARAM_LINK(etb3param);\r
+    param.srcdst_cidx = 0;\r
+    param.ccnt        = 1;\r
+\r
+    /* Copy local structure to actual PaRAM memory locations */\r
+    *(struct edma3_param *)etb2param = param;\r
+\r
+    /* Enable event for specific channel that is used to clear the INTCx\r
+     *  interrupt status. This is the EDMA event that is used to start the DMA\r
+     *  transactions.\r
+     */\r
+    if(pConfig->clrChannel > 31)\r
+    {\r
+        EDMA3_EESRH_REG(pConfig->cc) = (1 << (pConfig->clrChannel-32));\r
+    }\r
+    else\r
+    {\r
+        EDMA3_EESR_REG(pConfig->cc) = (1 << pConfig->clrChannel);\r
+    }\r
+       \r
+#elif defined(C6657) || defined(C66AK2Hxx) || defined(C66AK2Exx)\r
+       \r
+       uint32_t paramBase;\r
+    uint32_t etbSize;\r
+    uint32_t etbHalfSize;\r
+    uint32_t etb1param;\r
+    uint32_t etb2param;\r
+    uint32_t etb3param;\r
+    struct edma3_param param;\r
+       \r
+    /* Fixed location to store DMA configuration parameters */\r
+    static DMAConfigInt dmaConfig[NUM_ETB_INSTANCES];\r
+\r
+    if(!pHandle || (pHandle->ulContext != ETB_UNLOCK_VAL) || !pConfig)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+\r
+       if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+       {\r
+               if ((TI_ETB_TI_MODE & *((volatile uint32_t*)ETB_TI_CTL(pHandle->id))) != TI_ETB_TI_MODE )\r
+               {\r
+                       RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+               }\r
+       }\r
+\r
+       /* Store configuration information */\r
+       \r
+#if defined(C6657)\r
+       \r
+    dmaConfig[Handle_index(pHandle->id)].cc           = 2; //The ETB half-full and full events are directly connected to EDMA CC in C6657\r
+       if(pHandle->id == SYS_ETB_ID)\r
+       {\r
+           dmaConfig[Handle_index(pHandle->id)].etbhalfChannel   = EDMACC_TETBHFULLINT; //ETB half-full event\r
+               dmaConfig[Handle_index(pHandle->id)].etbfullChannel   = EDMACC_TETBFULLINT; //ETB full event\r
+       }\r
+       else\r
+       {\r
+           dmaConfig[Handle_index(pHandle->id)].etbhalfChannel   = EDMACC_TETBHFULLINT0 + pHandle->id; //ETB half-full event\r
+               dmaConfig[Handle_index(pHandle->id)].etbfullChannel   = EDMACC_TETBFULLINT0 + pHandle->id; //ETB full event\r
+       }\r
+       \r
+#endif\r
+\r
+#if defined(C66AK2Hxx)\r
+       \r
+       if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+       {\r
+               if(pHandle->id < 4)\r
+               {\r
+                       dmaConfig[Handle_index(pHandle->id)].cc           = 3; //The core 0-3 ETB half-full and full events are directly connected to EDMA CC # 3 in 6AK2Hxx\r
+               }\r
+               else\r
+               {\r
+                       dmaConfig[Handle_index(pHandle->id)].cc           = 2; //The core 4-7 ETB half-full and full events are directly connected to EDMA CC # 2 in 6AK2Hxx\r
+               }\r
+\r
+               if(pHandle->id < 4)\r
+               {\r
+                       dmaConfig[Handle_index(pHandle->id)].etbhalfChannel   = EDMACC3_TETBHFULLINT0 + (pHandle->id * 2); //ETB half-full event\r
+                       dmaConfig[Handle_index(pHandle->id)].etbfullChannel   = EDMACC3_TETBFULLINT0 + (pHandle->id * 2); //ETB full event\r
+               }\r
+               else\r
+               {\r
+                       dmaConfig[Handle_index(pHandle->id)].etbhalfChannel   = EDMACC2_TETBHFULLINT4 + ((pHandle->id-4) * 2); //ETB half-full event\r
+                       dmaConfig[Handle_index(pHandle->id)].etbfullChannel   = EDMACC2_TETBFULLINT4 + ((pHandle->id-4) * 2); //ETB full event\r
+               }\r
+       }\r
+       else\r
+       {\r
+               //Setup SYS ETB or CSSTM ETB for DMA drain mode\r
+               //TBR system bridge operation\r
+\r
+               // Setup TBR in system bridge (DMA) mode\r
+               *((volatile uint32_t*)ETB_CTL(pHandle->id)) |= TBR_BRIDGE_MODE;\r
+\r
+               dmaConfig[Handle_index(pHandle->id)].cc           = 4; //The DebugSS TBR and Tetris TBR DMA events are directly connected to EDMA CC # 3 in 6AK2Hxx\r
+\r
+#if defined(C66AK2Hxx_CSSTM_ETB)\r
+\r
+               dmaConfig[Handle_index(pHandle->id)].etbhalfChannel   = EDMACC4_TETRISTBR_DMAINT; //TBR DMA event\r
+\r
+#else\r
+\r
+               dmaConfig[Handle_index(pHandle->id)].etbhalfChannel   = EDMACC4_DBGTBR_DMAINT; //TBR DMA event\r
+\r
+#endif\r
+               //Setup DMA trigger thresholds\r
+               *((volatile uint32_t*)TBR_OUTLVL(pHandle->id)) = ((TBR_NUMBLOCK << 8) | TBR_BLOCKSZ);\r
+\r
+               //Enable DMA trigger\r
+               *((volatile uint32_t*)TBR_IRQENABLE_SET(pHandle->id)) = TBR_IRST_DAV;\r
+\r
+       }\r
+       \r
+#endif\r
+    \r
+    dmaConfig[Handle_index(pHandle->id)].linkparam[0] = pConfig->linkparam[0];\r
+    dmaConfig[Handle_index(pHandle->id)].linkparam[1] = pConfig->linkparam[1];\r
+    dmaConfig[Handle_index(pHandle->id)].linkparam[2] = pConfig->linkparam[2];\r
+    dmaConfig[Handle_index(pHandle->id)].dbufAddress  = pConfig->dbufAddress;\r
+    dmaConfig[Handle_index(pHandle->id)].dbufWords    = pConfig->dbufWords;\r
+    dmaConfig[Handle_index(pHandle->id)].mode         = pConfig->mode;\r
+    pHandle->pDmaConfig = &dmaConfig[Handle_index(pHandle->id)];\r
+       \r
+    /* Validate the Channel Controller value and set the Parameter RAM base\r
+     *  address value\r
+     */\r
+    switch(pHandle->pDmaConfig->cc)\r
+    {\r
+        case 0:\r
+            paramBase = EDMA_TPCC_PARAM_BASE_ADDR(0);\r
+            break;\r
+        case 1:\r
+            paramBase = EDMA_TPCC_PARAM_BASE_ADDR(1);\r
+            break;\r
+        case 2:\r
+            paramBase = EDMA_TPCC_PARAM_BASE_ADDR(2);\r
+            break;\r
+               case 3:\r
+            paramBase = EDMA_TPCC_PARAM_BASE_ADDR(3);\r
+            break;\r
+               case 4:\r
+            paramBase = EDMA_TPCC_PARAM_BASE_ADDR(4);\r
+            break;\r
+        default:\r
+            RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+       \r
+       // Mapping linkparam[0] to the ETB half channel\r
+       EDMA3_DCHMAP_REG(pHandle->pDmaConfig->cc,pHandle->pDmaConfig->etbhalfChannel) = (pHandle->pDmaConfig->linkparam[0] << 5);\r
+\r
+       if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+       {\r
+               // Mapping ETB full channel is only required for TI-ETB\r
+               // Mapping linkparam[0] to the ETB full channel\r
+               EDMA3_DCHMAP_REG(pHandle->pDmaConfig->cc,pHandle->pDmaConfig->etbfullChannel) = (pHandle->pDmaConfig->linkparam[0] << 5);\r
+       }\r
+\r
+    /* Calculate the param address for etb1param, etb2param and etb3param\r
+     */\r
+\r
+    etb1param = paramBase + (0x20 * pConfig->linkparam[0]);\r
+    etb2param = paramBase + (0x20 * pConfig->linkparam[1]);\r
+    etb3param = paramBase + (0x20 * pConfig->linkparam[2]);\r
+\r
+    etbLib_bufferWrapped[pHandle->id][0] = 0;\r
+    etbLib_bufferWrapped[pHandle->id][1] = 1;\r
+\r
+    /* Create the PaRAM entries that will be used to transfer data from ETB RAM\r
+     *  Burst Data Read Register locations to a drain buffer in memory. The\r
+     *  second PaRAM is used once to transfer a buffer wrapped flag that is used\r
+     *  to indicate the drain buffer has wrapped. It is linked to the 3rd PaRAM\r
+     *  that is used to reload with initial values to transfer data from ETB.\r
+     */\r
+    param.options   = (PARAM_OPT_ITCINTEN | PARAM_OPT_TCINTEN |\r
+                       PARAM_OPT_TCCHEN   |\r
+                       PARAM_OPT_TCC(pHandle->pDmaConfig->etbhalfChannel) |\r
+                       PARAM_OPT_AB_SYNC);\r
+\r
+    /* Get the size of the ETB for this instance to determine the count values\r
+     *  required for the EDMA parameter ram (PaRAM) configuration. The size if\r
+     *  provided in words, convert to bytes for calculations. The count values\r
+     *  for the EDMA are in bytes.\r
+     */\r
+\r
+    if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+    {\r
+       // get ETB buffer size\r
+       etbSize = *((volatile uint32_t*)ETB_RDP(pHandle->id));\r
+\r
+       // get starting address of the ETB buffer\r
+       param.src_addr  = ETB_RBD(pHandle->id);\r
+    }\r
+    else\r
+    {\r
+       // get TBR buffer size\r
+       etbSize = (*((volatile uint32_t*)ETB_RDP(pHandle->id)));\r
+       etbSize = (1 << (etbSize-1)) << 10;\r
+\r
+               // get starting address of the TBR buffer\r
+               param.src_addr  = TBR_RBD;\r
+    }\r
+\r
+    etbSize *= 4;\r
+       etbHalfSize = etbSize / 2;\r
+\r
+       param.ab_cnt    = PARAM_BCNT(etbHalfSize / ETB_BURST_SIZE) | PARAM_ACNT(ETB_BURST_SIZE);\r
+       param.dst_addr  = pConfig->dbufAddress;\r
+       param.srcdst_bidx = PARAM_DST_BIDX(ETB_BURST_SIZE);\r
+       param.link_bcnt   = PARAM_LINK(etb2param);\r
+       param.srcdst_cidx = PARAM_DST_CIDX(etbHalfSize);\r
+       param.ccnt        = (pConfig->dbufWords*4) / etbHalfSize;\r
+\r
+    /* Set the DMA status to the actual number of words used in the provided\r
+     *  buffer, also reset any previous status settings.\r
+     */\r
+    pHandle->dmaStatus.startAddr      = 0;\r
+    pHandle->dmaStatus.availableWords = 0;\r
+    pHandle->dmaStatus.isWrapped      = 0;\r
+    pHandle->dmaStatus.dbufAddress    = 0;\r
+    pHandle->dmaStatus.flushRequired  = 1;\r
+    pHandle->dmaStatus.dbufWords = (param.ccnt * etbHalfSize) / 4;\r
+\r
+    /* Copy local structure to actual PaRAM memory locations */\r
+    *(struct edma3_param *)etb1param = param;\r
+\r
+    if(pConfig->mode != eDMA_Stop_Buffer)\r
+    {\r
+\r
+               /* Change the 3rd PaRAM to not link to 2nd for wrap processing, just\r
+                *  link to self for reloading purposes, Transfer chaining completion is\r
+                *  also not needed except for the 1st occurance.\r
+                */\r
+               param.options   = PARAM_OPT_ITCINTEN | PARAM_OPT_TCINTEN | PARAM_OPT_AB_SYNC;\r
+               param.link_bcnt = PARAM_LINK(etb3param);\r
+       }\r
+       else\r
+       {\r
+           /* If the DMA mode has been configured as non-circular, configure etbparam3 to disable ETB trace\r
+            *  set the link value to a NULL after disabling ETB trace.\r
+         */\r
+                \r
+               param.options   = PARAM_OPT_TCC_EARLY;\r
+               param.src_addr  = GET_GLOBAL_ADDR(&etb_disable);\r
+        param.ab_cnt    = (PARAM_BCNT(1) | PARAM_ACNT(4));\r
+               param.dst_addr  = ETB_CTL(pHandle->id);\r
+        param.srcdst_bidx = 0;\r
+        param.link_bcnt = PARAM_LINK(0xffff);\r
+        param.srcdst_cidx = 0;\r
+               param.ccnt        = 1;\r
+       }\r
+       \r
+       *(struct edma3_param *)etb3param = param;\r
+       \r
+       if(pConfig->mode != eDMA_Stop_Buffer)\r
+    { \r
+        /* 2nd PaRAM configuration, no transfer chaining completion, but an early\r
+         *  link completion.\r
+         */\r
+               param.options   = PARAM_OPT_TCC_EARLY;\r
+    }\r
+    else\r
+    {\r
+           /* For Stop on full buffer mode, link to etb3param which disables ETB trace capture */\r
+        param.options   = (PARAM_OPT_TCC_EARLY | PARAM_OPT_ITCINTEN | PARAM_OPT_TCINTEN |\r
+                           PARAM_OPT_TCCHEN   |\r
+                           PARAM_OPT_TCC(pHandle->pDmaConfig->etbhalfChannel));\r
+    } \r
+                   \r
+    param.src_addr  = GET_GLOBAL_ADDR(&etbLib_bufferWrapped[pHandle->id][1]);\r
+    param.ab_cnt    = PARAM_BCNT(1) | PARAM_ACNT(4);\r
+    param.dst_addr  = GET_GLOBAL_ADDR(&etbLib_bufferWrapped[pHandle->id][0]);\r
+    param.srcdst_bidx = 0;\r
+    param.link_bcnt   = PARAM_LINK(etb3param);\r
+    param.srcdst_cidx = 0;\r
+    param.ccnt        = 1;\r
+\r
+    /* Copy local structure to actual PaRAM memory locations */\r
+    *(struct edma3_param *)etb2param = param;\r
+\r
+    /* Enable event for etb half and etb full channel that. This is the EDMA event that is used to start the DMA\r
+     *  transactions.\r
+     */\r
+    if(pHandle->pDmaConfig->etbhalfChannel > 31)\r
+    {\r
+        EDMA3_EESRH_REG(pHandle->pDmaConfig->cc) = (1 << (pHandle->pDmaConfig->etbhalfChannel-32));\r
+    }\r
+    else\r
+    {\r
+        EDMA3_EESR_REG(pHandle->pDmaConfig->cc) = (1 << pHandle->pDmaConfig->etbhalfChannel);\r
+    }\r
+       \r
+       if(pHandle->pDmaConfig->etbfullChannel > 31)\r
+    {\r
+        EDMA3_EESRH_REG(pHandle->pDmaConfig->cc) = (1 << (pHandle->pDmaConfig->etbfullChannel-32));\r
+    }\r
+    else\r
+    {\r
+        EDMA3_EESR_REG(pHandle->pDmaConfig->cc) = (1 << pHandle->pDmaConfig->etbfullChannel);\r
+    }\r
+       \r
+#endif\r
+\r
+    return eETB_Success;\r
+}\r
+\r
+/******************************************************************************/\r
+/*! \copydoc ETB_flush_dma\r
+ */\r
+eETB_Error  ETB_flush_dma(ETBHandle* pHandle, DMAStatus *pStatus)\r
+{\r
+#if defined(C6670) || defined(C6678)\r
+       \r
+       int32_t remWords;\r
+    uint32_t rwp;\r
+    uint32_t rrp;\r
+    uint16_t paramIdx;\r
+    uint32_t paramAddress;\r
+    volatile uint32_t cntr = 0;\r
+\r
+    // For C6678, Index = 0 (CIC2), Index = 1 (CIC3)\r
+       // For C6670, Index = 0 (CIC1), Index = 1 (CIC2)\r
+       uint8_t cic_index = 0;\r
+\r
+    if(!pHandle || !pStatus)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+    if(!pHandle->pDmaConfig)\r
+    {\r
+        RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+    }\r
+\r
+    #if defined(C6670)\r
+       if(!(pHandle->pDmaConfig->cic == eCIC_1 || pHandle->pDmaConfig->cic == eCIC_2))\r
+       {\r
+               RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+       }\r
+\r
+       #elif defined(C6678)\r
+       if(!(pHandle->pDmaConfig->cic == eCIC_2 || pHandle->pDmaConfig->cic == eCIC_3))\r
+       {\r
+               RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+       }\r
+       \r
+       #endif\r
+\r
+       #if defined(C6670)\r
+\r
+    cic_index = pHandle->pDmaConfig->cic - 1;\r
+\r
+    #elif defined(C6678)\r
+\r
+    cic_index = pHandle->pDmaConfig->cic - 2;\r
+\r
+       #endif\r
+\r
+    rwp = *((volatile uint32_t*)ETB_RWP(pHandle->id));\r
+    rrp = *((volatile uint32_t*)ETB_RRP(pHandle->id));\r
+\r
+    remWords = rwp - rrp;\r
+//    printf(" rwp: %x, rrp: %x, diff: %d\n", rwp, rrp, remWords);\r
+\r
+    if(remWords > 0)\r
+    {\r
+        int32_t remBytes;\r
+        uint16_t clrParamIdx;\r
+\r
+        remBytes = (remWords * 4);\r
+        /* Change the PaRAM set value for the DMA channel that handles the ETB\r
+         *  event to the drain PaRAM. This method is more efficient than copying\r
+         *  the PaRAM contents.\r
+         */\r
+        paramIdx = (EDMA3_DCHMAP_REG(pHandle->pDmaConfig->cc,\r
+                                     pHandle->pDmaConfig->etbChannel) >> 5);\r
+        clrParamIdx = (EDMA3_DCHMAP_REG(pHandle->pDmaConfig->cc,\r
+                                     pHandle->pDmaConfig->clrChannel) >> 5);\r
+        EDMA3_DCHMAP_REG(pHandle->pDmaConfig->cc,\r
+                         pHandle->pDmaConfig->clrChannel) = (paramIdx<<5);\r
+        paramAddress = EDMA_TPCC_PARAM_BASE_ADDR(pHandle->pDmaConfig->cc) +\r
+                                                    (0x20 * paramIdx);\r
+\r
+        /* Check for buffer wrap */\r
+        if(etbLib_bufferWrapped[pHandle->id][0])\r
+        {\r
+            pStatus->availableWords    = pHandle->dmaStatus.dbufWords;\r
+            pStatus->startAddr = PARAM_DST_REG(paramAddress) + remBytes;\r
+            pStatus->isWrapped = 1;\r
+        }\r
+        else\r
+        {\r
+            pStatus->availableWords = (PARAM_DST_REG(paramAddress) -\r
+                                pHandle->pDmaConfig->dbufAddress) / 4;\r
+            pStatus->availableWords += remWords;\r
+            pStatus->startAddr = pHandle->pDmaConfig->dbufAddress;\r
+            pStatus->isWrapped = 0;\r
+        }\r
+\r
+        /* Copy the DMA status into the handle for later management. The status\r
+         *  value for the number of words may be different than what was in the\r
+         *  configuration structure. This value is set during configuration.\r
+         */\r
+        pStatus->dbufAddress = pHandle->pDmaConfig->dbufAddress;\r
+        pStatus->dbufWords   = pHandle->dmaStatus.dbufWords;\r
+        pStatus->flushRequired = pHandle->dmaStatus.flushRequired;\r
+        pHandle->dmaStatus   = *pStatus;\r
+\r
+        /* If the mode has been set to non-circular and the buffer wrapped flag\r
+         *  is set, then the memory buffer if full, otherwise continue the\r
+         *  configuration for the final DMA.\r
+         */\r
+        if((pHandle->pDmaConfig->mode == eDMA_Stop_Buffer) &&\r
+            (etbLib_bufferWrapped[pHandle->id][0]))\r
+        {\r
+            /* If the buffer wrapped, the startAddr value is incorrect from\r
+             *  above, set back to beginning of the buffer.\r
+             */\r
+            pStatus->startAddr = pHandle->pDmaConfig->dbufAddress;\r
+            pHandle->dmaStatus.startAddr = pHandle->pDmaConfig->dbufAddress;\r
+            return eETB_Success;\r
+        }\r
+               \r
+               // Update the 3 symbols which are required for CCS ETB receiver\r
+               etbLib_buffer_start_addr[pHandle->id] = pHandle->pDmaConfig->dbufAddress; //CCS ETB receiver will always get a linearized buffer for the non-EDMA ETB drain case\r
+        etbLib_buffer_size[pHandle->id] = pStatus->availableWords * 4; //Number of bytes available \r
+        etbLib_buffer_data_start[pHandle->id] = pStatus->startAddr; //circular buffer wrap point\r
+\r
+        if(remBytes > ETB_BURST_SIZE)\r
+        {\r
+            uint16_t transCnt;\r
+            \r
+            /* Split the transfer into burst transactions.\r
+             *  Any remaining data beyond an even multiple of burst size bytes\r
+             *  will get linked for a single remaining transaction.\r
+             */\r
+            transCnt = remBytes / ETB_BURST_SIZE;\r
+            PARAM_AB_CNT_REG(paramAddress) &= ~PARAM_BCNT_MASK;\r
+            PARAM_AB_CNT_REG(paramAddress) |= PARAM_BCNT(transCnt);\r
+            PARAM_CCNT_REG(paramAddress) = 1;\r
+            \r
+            /* Adjust the remaining byte count */\r
+            remBytes -= (transCnt * ETB_BURST_SIZE);\r
+        }\r
+        else\r
+        {\r
+            PARAM_AB_CNT_REG(paramAddress) = PARAM_BCNT(1) | PARAM_ACNT(remBytes);\r
+            PARAM_CCNT_REG(paramAddress) = 1;\r
+            remBytes = 0;\r
+        }\r
+        /* If there are remaining bytes to transfer, setup link param for final\r
+         *  transaction.\r
+         */\r
+        if(remBytes > 0)\r
+        {\r
+            uint32_t etb3param;\r
+\r
+            etb3param = EDMA_TPCC_PARAM_BASE_ADDR(pHandle->pDmaConfig->cc) +\r
+                        (0x20 * pHandle->pDmaConfig->linkparam[2]);\r
+            \r
+            /* Further ETB PaRAM modifications */\r
+            PARAM_OPT_REG(paramAddress) = (PARAM_OPT_TCCHEN |\r
+                                PARAM_OPT_TCC(pHandle->pDmaConfig->clrChannel) |\r
+                                PARAM_OPT_AB_SYNC);\r
+            PARAM_LINK_REG(paramAddress) &= ~PARAM_LINK_MASK;\r
+            PARAM_LINK_REG(paramAddress) |= PARAM_LINK(etb3param);\r
+            \r
+            /* ETB linked PaRAM modifications */\r
+            PARAM_OPT_REG(etb3param) = (PARAM_OPT_TCINTEN |\r
+                                PARAM_OPT_TCC(pHandle->pDmaConfig->clrChannel) |\r
+                                PARAM_OPT_AB_SYNC);\r
+            PARAM_AB_CNT_REG(etb3param) = PARAM_BCNT(1) | PARAM_ACNT(remBytes);\r
+            PARAM_DST_REG(etb3param)  = PARAM_DST_REG(paramAddress) +\r
+                                        (PARAM_BCNT_VALUE(paramAddress) * ETB_BURST_SIZE);\r
+            PARAM_CCNT_REG(etb3param) = 1;\r
+            PARAM_LINK_REG(etb3param) &= ~PARAM_LINK_MASK;\r
+            PARAM_LINK_REG(etb3param) |= PARAM_LINK(0xffff);\r
+        }\r
+        else\r
+        {\r
+            PARAM_OPT_REG(paramAddress) = (PARAM_OPT_TCINTEN |\r
+                                PARAM_OPT_TCC(pHandle->pDmaConfig->clrChannel) |\r
+                                PARAM_OPT_AB_SYNC);\r
+        }\r
+\r
+        CIC_STATUS_CLR_INDEX_REG(pHandle->pDmaConfig->cic) = etbLib_cpCicEventClearValue[cic_index][pHandle->id][0];\r
+        CIC_STATUS_CLR_INDEX_REG(pHandle->pDmaConfig->cic) = etbLib_cpCicEventClearValue[cic_index][pHandle->id][1];\r
+\r
+        if(pHandle->pDmaConfig->clrChannel > 31)\r
+        {\r
+            EDMA3_ICRH_REG(pHandle->pDmaConfig->cc) =\r
+                                (1 << (pHandle->pDmaConfig->clrChannel - 32));\r
+        }\r
+        else\r
+        {\r
+            EDMA3_ICR_REG(pHandle->pDmaConfig->cc) =\r
+                                (1 << pHandle->pDmaConfig->clrChannel);\r
+        }\r
+\r
+        /* Force an event manually from the ETB interrupt register */\r
+        *((volatile uint32_t*)ETB_IRST(pHandle->id)) = 1;\r
+\r
+        /* Poll the interrupt pending bit for transaction completion */\r
+        cntr = 0;\r
+        if(pHandle->pDmaConfig->clrChannel > 31)\r
+        {\r
+            while((EDMA3_IPRH_REG(pHandle->pDmaConfig->cc) &\r
+                    (1 << (pHandle->pDmaConfig->clrChannel - 32))) == 0)\r
+            {\r
+                if(cntr++ > ETB_DMA_TIMEOUT)\r
+                    break;\r
+            }\r
+\r
+            CIC_STATUS_CLR_INDEX_REG(pHandle->pDmaConfig->cic) = etbLib_cpCicEventClearValue[cic_index][pHandle->id][0];\r
+            CIC_STATUS_CLR_INDEX_REG(pHandle->pDmaConfig->cic) = etbLib_cpCicEventClearValue[cic_index][pHandle->id][1];\r
+\r
+            EDMA3_ICRH_REG(pHandle->pDmaConfig->cc) =\r
+                                (1 << (pHandle->pDmaConfig->clrChannel - 32));\r
+        }\r
+        else\r
+        {\r
+            while((EDMA3_IPR_REG(pHandle->pDmaConfig->cc) &\r
+                    (1 << pHandle->pDmaConfig->clrChannel)) == 0)\r
+            {\r
+                if(cntr++ > ETB_DMA_TIMEOUT)\r
+                    break;\r
+            }\r
+\r
+            CIC_STATUS_CLR_INDEX_REG(pHandle->pDmaConfig->cic) = etbLib_cpCicEventClearValue[cic_index][pHandle->id][0];\r
+            CIC_STATUS_CLR_INDEX_REG(pHandle->pDmaConfig->cic) = etbLib_cpCicEventClearValue[cic_index][pHandle->id][1];\r
+\r
+            EDMA3_ICR_REG(pHandle->pDmaConfig->cc) =\r
+                                (1 << pHandle->pDmaConfig->clrChannel);\r
+        }\r
+        \r
+        /* Restore DMA Channel map for Clear Channel PaRAM index */\r
+        EDMA3_DCHMAP_REG(pHandle->pDmaConfig->cc,\r
+                         pHandle->pDmaConfig->clrChannel) = (clrParamIdx<<5);\r
+        \r
+ //       printf("Pending Cntr: %d\n", cntr);\r
+    }\r
+    else if(remWords < 0)\r
+    {\r
+//        printf(" *** remWords < 0, %d\n",remWords);\r
+        /* Report error if < 0, otherwise nothing to read from ETB */\r
+        return eETB_Overflow;\r
+\r
+    }\r
+       \r
+#elif defined(C6657) || defined(C66AK2Hxx) || defined(C66AK2Exx)\r
+\r
+       int32_t remWords, remBytes;\r
+       uint32_t rwp;\r
+       uint32_t rrp;\r
+       uint32_t paramAddress;\r
+       uint16_t paramIdx;\r
+       uint32_t retry, status;\r
+       volatile uint32_t cntr = 0;\r
+\r
+       if(!pHandle || !pStatus)\r
+       {\r
+               RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+       }\r
+       if(!pHandle->pDmaConfig)\r
+       {\r
+               RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+       }\r
+\r
+       /* Change the PaRAM set value for the DMA channel that handles the ETB\r
+        *  event to the drain PaRAM. This method is more efficient than copying\r
+        *  the PaRAM contents.\r
+        */\r
+       paramIdx = (EDMA3_DCHMAP_REG(pHandle->pDmaConfig->cc,\r
+                                                                pHandle->pDmaConfig->etbhalfChannel) >> 5);\r
+       paramAddress = EDMA_TPCC_PARAM_BASE_ADDR(pHandle->pDmaConfig->cc) +\r
+                                                                                               (0x20 * paramIdx);\r
+\r
+    if(check_etb_type(pHandle->id) == ETB_TYPE)\r
+    {\r
+               rwp = *((volatile uint32_t*)ETB_RWP(pHandle->id));\r
+               rrp = *((volatile uint32_t*)ETB_RRP(pHandle->id));\r
+\r
+               remWords = rwp - rrp;\r
+       //    printf(" rwp: %x, rrp: %x, diff: %d\n", rwp, rrp, remWords);\r
+\r
+               if(remWords > 0)\r
+               {\r
+                   remBytes = (remWords * 4);\r
+\r
+                       //Get EDMA buffer information\r
+                       if(get_edma_buffer_info(pHandle, pStatus, paramAddress, paramIdx, remWords))\r
+                       {\r
+                               return eETB_Success;\r
+                       }\r
+\r
+                       if(remBytes > ETB_BURST_SIZE)\r
+                       {\r
+                               uint16_t transCnt;\r
+\r
+                               /* Split the transfer into burst transactions.\r
+                                *  Any remaining data beyond an even multiple of burst size bytes\r
+                                *  will get linked for a single remaining transaction.\r
+                                */\r
+                               transCnt = remBytes / ETB_BURST_SIZE;\r
+                               PARAM_AB_CNT_REG(paramAddress) &= ~PARAM_BCNT_MASK;\r
+                               PARAM_AB_CNT_REG(paramAddress) |= PARAM_BCNT(transCnt);\r
+                               PARAM_CCNT_REG(paramAddress) = 1;\r
+\r
+                               /* Adjust the remaining byte count */\r
+                               remBytes -= (transCnt * ETB_BURST_SIZE);\r
+                       }\r
+                       else\r
+                       {\r
+                               PARAM_AB_CNT_REG(paramAddress) = PARAM_BCNT(1) | PARAM_ACNT(remBytes);\r
+                               PARAM_CCNT_REG(paramAddress) = 1;\r
+                               remBytes = 0;\r
+                       }\r
+                       /* If there are remaining bytes to transfer, setup link param for final\r
+                        *  transaction.\r
+                        */\r
+                       if(remBytes > 0)\r
+                       {\r
+                               uint32_t etb3param;\r
+\r
+                               etb3param = EDMA_TPCC_PARAM_BASE_ADDR(pHandle->pDmaConfig->cc) +\r
+                                                       (0x20 * pHandle->pDmaConfig->linkparam[2]);\r
+\r
+                               /* Further ETB PaRAM modifications */\r
+                               PARAM_OPT_REG(paramAddress) = (PARAM_OPT_TCCHEN |\r
+                                                                       PARAM_OPT_TCC(pHandle->pDmaConfig->etbhalfChannel) |\r
+                                                                       PARAM_OPT_AB_SYNC);\r
+                               PARAM_LINK_REG(paramAddress) &= ~PARAM_LINK_MASK;\r
+                               PARAM_LINK_REG(paramAddress) |= PARAM_LINK(etb3param);\r
+\r
+                               /* ETB linked PaRAM modifications */\r
+                               PARAM_OPT_REG(etb3param) = (PARAM_OPT_TCINTEN |\r
+                                                                       PARAM_OPT_TCC(pHandle->pDmaConfig->etbhalfChannel) |\r
+                                                                       PARAM_OPT_AB_SYNC);\r
+                               PARAM_AB_CNT_REG(etb3param) = PARAM_BCNT(1) | PARAM_ACNT(remBytes);\r
+                               PARAM_DST_REG(etb3param)  = PARAM_DST_REG(paramAddress) +\r
+                                                                                       (PARAM_BCNT_VALUE(paramAddress) * ETB_BURST_SIZE);\r
+                               PARAM_CCNT_REG(etb3param) = 1;\r
+                               PARAM_LINK_REG(etb3param) &= ~PARAM_LINK_MASK;\r
+                               PARAM_LINK_REG(etb3param) |= PARAM_LINK(0xffff);\r
+                       }\r
+                       else\r
+                       {\r
+                               PARAM_OPT_REG(paramAddress) = (PARAM_OPT_TCINTEN |\r
+                                                                       PARAM_OPT_TCC(pHandle->pDmaConfig->etbhalfChannel) |\r
+                                                                       PARAM_OPT_AB_SYNC);\r
+                       }\r
+\r
+                       if(pHandle->pDmaConfig->etbhalfChannel > 31)\r
+                       {\r
+                               EDMA3_ICRH_REG(pHandle->pDmaConfig->cc) =\r
+                                                                       (1 << (pHandle->pDmaConfig->etbhalfChannel - 32));\r
+                       }\r
+                       else\r
+                       {\r
+                               EDMA3_ICR_REG(pHandle->pDmaConfig->cc) =\r
+                                                                       (1 << pHandle->pDmaConfig->etbhalfChannel);\r
+                       }\r
+\r
+                       /* Force an event manually from the ETB interrupt register */\r
+                       *((volatile uint32_t*)ETB_IRST(pHandle->id)) = 1;\r
+\r
+                       /* Poll the interrupt pending bit for transaction completion */\r
+                       cntr = 0;\r
+                       if(pHandle->pDmaConfig->etbhalfChannel > 31)\r
+                       {\r
+                               while((EDMA3_IPRH_REG(pHandle->pDmaConfig->cc) &\r
+                                               (1 << (pHandle->pDmaConfig->etbhalfChannel - 32))) == 0)\r
+                               {\r
+                                       if(cntr++ > ETB_DMA_TIMEOUT)\r
+                                               break;\r
+                               }\r
+\r
+                               EDMA3_ICRH_REG(pHandle->pDmaConfig->cc) =\r
+                                                                       (1 << (pHandle->pDmaConfig->etbhalfChannel - 32));\r
+                       }\r
+                       else\r
+                       {\r
+                               while((EDMA3_IPR_REG(pHandle->pDmaConfig->cc) &\r
+                                               (1 << pHandle->pDmaConfig->etbhalfChannel)) == 0)\r
+                               {\r
+                                       if(cntr++ > ETB_DMA_TIMEOUT)\r
+                                               break;\r
+                               }\r
+\r
+                               EDMA3_ICR_REG(pHandle->pDmaConfig->cc) =\r
+                                                                       (1 << pHandle->pDmaConfig->etbhalfChannel);\r
+                       }\r
+               }\r
+               else if(remWords < 0)\r
+               {\r
+       //        printf(" *** remWords < 0, %d\n",remWords);\r
+                       /* Report error if < 0, otherwise nothing to read from ETB */\r
+                       return eETB_Overflow;\r
+\r
+               }\r
+    }\r
+    else\r
+    {\r
+       //Perform an Output flush from the TBR\r
+       // Wait for any previous output flush to complete\r
+        retry = 50000; // Give enough time for a DMA transfer equal to half the size of the TBR\r
+        do\r
+        {\r
+           status = *(volatile uint32_t*)ETB_FFCR(pHandle->id);\r
+           retry--;\r
+        }while( ( ( status & TBR_OUTFLUSH_INPROGRESS ) != 0 ) && ( retry != 0 ) );\r
+\r
+        // Return error if timeout occurs on the above operation\r
+               if (retry == 0)\r
+               {\r
+                       RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+               }\r
+\r
+        // Issue an output flush\r
+        status = *(volatile uint32_t*)ETB_FFCR(pHandle->id);\r
+        *(volatile uint32_t*)ETB_FFCR(pHandle->id) = status | TBR_OUTFLUSH_START;\r
+\r
+        // Wait for output flush to complete\r
+        retry = 50000;\r
+               do\r
+               {\r
+                  status = *(volatile uint32_t*)ETB_FFCR(pHandle->id);\r
+                  retry--;\r
+               }while(((status & TBR_OUTFLUSH_INPROGRESS) != 0 ) && (retry != 0));\r
+\r
+               // Return error if timeout occurs on the above operation\r
+               if (retry == 0)\r
+               {\r
+                       RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+               }\r
+\r
+               // Wait for final DMA transfer to complete\r
+               //retry = 50000; // Give enough time for a DMA transfer equal to half the size of the TBR\r
+               retry = 500;\r
+               do\r
+               {\r
+                  status = *((volatile uint32_t*)ETB_STS(pHandle->id));\r
+                  retry--;\r
+               }while(((status & TBR_DRAIN_INPROGRESS) != TBR_DRAIN_INPROGRESS) && ( retry != 0 ));\r
+\r
+               // Return error if timeout occurs on the above operation\r
+               if (retry == 0)\r
+               {\r
+                       RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+               }\r
+\r
+               //Make sure there are no pending read requests on the TBR slave port\r
+               retry = 50000;\r
+               do\r
+               {\r
+                  status = *((volatile uint32_t*)TBR_SICTRL(pHandle->id));\r
+                  retry--;\r
+               }while(((status & TBR_READ_REQ_PENDING) != 0) && ( retry != 0 ));\r
+\r
+               // Return error if timeout occurs on the above operation\r
+               if (retry == 0)\r
+               {\r
+                       RETURN_ETB_CALLBACK(pHandle->id, eETB_Error_Program);\r
+               }\r
+\r
+               //Get EDMA buffer information\r
+               if(get_edma_buffer_info(pHandle, pStatus, paramAddress, paramIdx, 0))\r
+               {\r
+                       return eETB_Success;\r
+               }\r
+    }\r
+       \r
+#endif\r
+       \r
+    return eETB_Success;\r
+}\r
+\r
+/******************************************************************************/\r
+/*! \copydoc ETB_setDmaStatus\r
+ */\r
+void ETB_setDmaStatus(ETBHandle* pHandle, DMAStatus *pStatus)\r
+{\r
+    if(!pHandle || !pStatus)\r
+    {\r
+        return;\r
+    }\r
+    if(!pHandle->pDmaConfig)\r
+    {\r
+        return;\r
+    }\r
+    pHandle->dmaStatus = *pStatus;\r
+}\r
+#endif\r
+\r
+/******************************************************************************/\r
+/*! \copydoc ETB_getProperties\r
+ */\r
+void ETB_getProperties(ETBProperties *pProperties)\r
+{\r
+\r
+#ifdef DMA_SUPPORT\r
+\r
+       pProperties->is_dma_supported = 1;\r
+\r
+#else\r
+\r
+       pProperties->is_dma_supported = 0;\r
+\r
+#endif\r
+\r
+       return;\r
+}\r
diff --git a/server/command_handler.c b/server/command_handler.c
new file mode 100644 (file)
index 0000000..e8b0780
--- /dev/null
@@ -0,0 +1,653 @@
+/*
+ * command_handler.c
+ *
+ * Ctools Profiler Server Implementation
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdint.h>
+#include "error_handler.h"
+#include "logging.h"
+#include "socket.h"
+#include "remote_commands.h"
+
+/***************************************************************************** 
+ *  Internal Function Prototypes 
+ *  - See Private Function section below for implementations )
+ *****************************************************************************/
+static inline uint8_t calculate_checksum( uint8_t *buf, unsigned int len );
+static inline uint8_t int_to_hexdigit(unsigned val);
+static inline void send_response(uint8_t * response);
+static void command_dispatch(char * cmd, int cmd_len, char * response, size_t rsp_size);
+static void command_clr_buf(uint8_t * pbuf);
+
+static void get_memory_arguments(char * cbuf, uint32_t * addr, size_t * len, char ** data);
+static void process_memory_write(char * cbuf, char * rbuf, size_t rsp_size);
+static void process_memory_read(char * cbuf, char * rbuf, size_t rsp_size);
+static void process_remote(char * cbuf, char * rbuf, size_t rsp_size);
+static void process_disable_ack(char * cbuf, char * rbuf, size_t rsp_size);
+
+/***************************************************************************** 
+ *  Remote Serial Protocol (RSP) Definitions 
+ *  - RSP commands consists of remote commands and target commands (memory read 
+ *    and memory write.
+ *  
+ *****************************************************************************/
+
+/* RSP Commands */
+typedef enum {
+    READ_MEMORY_CMD,
+    WRITE_MEMORY_CMD,
+    REMOTE_CMD,
+    DISABLE_ACK_CMD
+} rsp_cmd_t;
+
+typedef void (* proc_func_t)(char * cbuf, char * rbuf, size_t rbuf_size);
+
+struct rsp_command_table_t {
+    char * cmd;
+    proc_func_t process;
+};
+
+static struct rsp_command_table_t rsp_command_table[] = {
+    [READ_MEMORY_CMD] = {"m", process_memory_read},
+    [WRITE_MEMORY_CMD] = {"M", process_memory_write},
+    [REMOTE_CMD] = {"qRcmd,", process_remote},
+    [DISABLE_ACK_CMD] = {"QStartNoAckMode", process_disable_ack}
+};
+
+/* RSP remote command table */
+typedef void (* rmt_func_t)(int argc, char *argv[], char * rbuf, size_t rsp_size);
+
+struct remote_command_table_t {
+    char * cmd;
+    rmt_func_t process;
+};
+
+/* The commands from this table are provided from remote_commands.h */
+static struct remote_command_table_t remote_command_table[] = {
+    {"set", set_command_handler},
+    {"mmap", mmap_command_handler},
+    {"ummap", ummap_command_handler},
+    {"version", version_command_handler},
+    {"arm", modcntl_add_command_handler},
+    {"disarm", modcntl_add_command_handler},
+    {"rm_arm", modcntl_remove_command_handler},
+    {"rm_disarm", modcntl_remove_command_handler},
+    {"start", start_command_handler},
+    {"end", end_command_handler},
+    {"status", status_command_handler}
+};
+
+/* RSP constants */
+static bool rsp_ack_enabled = true;
+static const char *ACK  = "+";
+static const char *NACK  = "-";
+static const char *rsp_msg_ok = "OK";
+
+/* RSP State */
+typedef enum {AWAITING_COMMAND, AWAITING_ACK} command_state_t;
+static command_state_t command_state = AWAITING_COMMAND;
+
+/* RSP buffers*/
+#define MAX_COMMAND_SIZE 256
+static uint8_t cmd_buf[MAX_COMMAND_SIZE];
+static uint8_t rsp_buf[MAX_COMMAND_SIZE];
+
+/***************************************************************************** 
+ *  Statics 
+ *  
+ *****************************************************************************/
+static int cmd_socket;
+
+/***************************************************************************** 
+ *  Public Functions
+ *  
+ *****************************************************************************/
+/***************************************************************************** 
+ *  command_init()
+ *
+ *  Initialize the client command handler with a socket.
+ *  
+ *****************************************************************************/
+void command_init(int socket)
+{
+    LOGFUNC();
+    cmd_socket = socket;
+    command_clr_buf(cmd_buf);
+
+    command_state = AWAITING_COMMAND;
+    rsp_ack_enabled = true;
+}
+
+/***************************************************************************** 
+ *  command_process()
+ *
+ *  This is where all client commands are received and executed.
+ *
+ *  - RSP packet definition is:
+ *      $packet-data#checksum
+ *
+ *  Where checksum is a 2 digit module 256 sum (in hex) of the packet-data.
+ *  Initial response from the server is “+/-“ where “+” indicates the packet-data
+ *  transmitted successfully, and “-“ indicates the packet-data needs to be resent.
+ *  All values are sent in HEX format without leading “0x”.
+ *
+ *  Examples:
+ *    $Maddr,length:data#checksum - Write length bytes of memory starting at addr.
+ *    $maddr,length#checksum - Read length bytes of memory starting at addr.  
+ *    $qRcmd,mmap addr,size#checksum  - Map memory block at addr of size in bytes.
+ * 
+ *****************************************************************************/ 
+void command_process()
+{
+    uint8_t * pbuf = cmd_buf;
+    uint8_t * cksum_marker;
+    int retry;
+    size_t cmd_len;
+
+    LOGFUNC();
+
+    /* Provide size of receive buffer as MAX_COMMAND_SIZE -1
+     * because we want room for at least one NULL character in the buffer. 
+     */ 
+    retry = socket_recv_data(cmd_socket, cmd_buf, MAX_COMMAND_SIZE - 1, 0, 
+                             &cmd_len);
+
+    if ((retry) || (cmd_len == 0)) {
+        return;
+    }
+
+    LOGMSG1("%s:Received msg length %d, message is:%s, command state is %d",
+            __func__, cmd_len, cmd_buf, command_state);
+
+    /* Note: Since the server is non-blocking the ACK (if AWAITING_ACK set) 
+     *  and the next command can be combined into a single message.
+     */
+    if (command_state == AWAITING_ACK) {
+        if (cmd_buf[0] == '+') {
+            command_state = AWAITING_COMMAND;
+            LOGMSG1("%s:Processed ACK", __func__);
+
+            if (cmd_len > 1) {
+                pbuf++;
+            } else {
+                command_clr_buf(cmd_buf);
+                command_clr_buf(rsp_buf);
+                return;
+            }
+
+        }
+        if (cmd_buf[0] == '-') {
+            send_response(rsp_buf);
+            LOGMSG1("%s:Processed NACK", __func__);
+            return;
+        }
+    }
+
+    /* First character of RSP commands must be $ */
+    if (('$' != pbuf[0]) || !( cksum_marker = (uint8_t *)strchr((char *)pbuf, '#'))) {
+        err_handler(ERR_TYPE_LOCAL, ERR_RSP_INVALID);
+    }
+
+    /* get past first character and determine the actual command length */
+    pbuf++;     
+    cmd_len = cksum_marker - pbuf;
+
+    /* Validate checksum */
+    if (rsp_ack_enabled == true) {
+        uint8_t ck_sum = calculate_checksum( pbuf, cmd_len );
+        uint8_t c1 = pbuf[cmd_len+1];
+        uint8_t c2 = pbuf[cmd_len+2];
+
+        if ((c1 != int_to_hexdigit(ck_sum >> 4)) ||
+            (c2 != int_to_hexdigit(ck_sum & 0xf ))) {
+            /* Simply means resend command*/
+            send_response((uint8_t *)NACK);
+            return;
+        }
+        else {
+            send_response((uint8_t *)ACK);
+        }
+        
+    }
+
+    /* Replace the # with 0 so it looks like the end of the string */
+    *cksum_marker = 0;
+
+    LOGMSG1("%s:Received command from client:%s", __func__, pbuf);
+
+    /* Execute the command */
+    {
+        uint8_t * rsp_p = rsp_buf;
+        uint8_t ck_sum = 0; 
+        int rsp_len;
+
+        command_clr_buf(rsp_buf);
+        rsp_p[0] = '$';
+        rsp_p++;          
+
+        command_dispatch((char *)pbuf, cmd_len, (char *)rsp_p, sizeof(rsp_buf)-1);
+
+        rsp_len = strlen((char *)rsp_p);
+        
+        if (rsp_ack_enabled == true) {
+            ck_sum = calculate_checksum(rsp_p, rsp_len);
+        }
+
+        rsp_p[rsp_len] = '#';
+        rsp_p[rsp_len+1] = int_to_hexdigit(ck_sum >> 4);
+        rsp_p[rsp_len+2] = int_to_hexdigit(ck_sum & 0xf);
+        
+        send_response(rsp_buf);
+
+        LOGMSG1("%s:Sent response to client:%s", __func__, rsp_buf);
+
+        if (rsp_ack_enabled == true) {
+            command_state = AWAITING_ACK;
+        } else {
+            command_clr_buf(cmd_buf);
+        }
+     } 
+
+}
+
+/***************************************************************************** 
+ *  Private functions
+ *  
+ *****************************************************************************/
+/***************************************************************************** 
+ *  command_clr_buf()
+ *
+ * Fill the command buffer with the NULL character.
+ * Note: This is done so strchr will not have problems if a non-conforming rsp
+ *       command is received.
+ *  
+ *****************************************************************************/ 
+void command_clr_buf(uint8_t * pbuf)
+{
+    memset((char *)pbuf, '\0', MAX_COMMAND_SIZE);
+}
+
+/***************************************************************************** 
+ *  calculate_checksum()
+ *
+ *  Calculate the RSP checksum
+ *  
+ *****************************************************************************/ 
+static inline uint8_t calculate_checksum( uint8_t *buf, unsigned int len ) 
+{
+    unsigned checksum = 0;
+    while ( len-- > 0 ) {
+        checksum += *buf++;
+    }     
+    return checksum & 0xFF;
+}
+
+/***************************************************************************** 
+ *  int_to_hexdigit()
+ *
+ *  Convert a int digit to a hex ascii value.
+ *  
+ *****************************************************************************/ 
+static const uint8_t inttohex_table[] = {
+    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' 
+};
+
+static inline uint8_t int_to_hexdigit(unsigned int val)
+{
+    if ( val > 0xF) {
+        err_handler(ERR_TYPE_LOCAL, ERR_RSP_INVALID);
+    }
+    return inttohex_table[val];
+}
+
+/***************************************************************************** 
+ *  send_response()
+ *
+ *  Once the command is processed this function is used to send the response
+ *  back to the client.
+ *  
+ *****************************************************************************/
+static inline void send_response(uint8_t * response)
+{
+    size_t send_offset = 0;
+    size_t retlen;
+    int retval;
+
+    /* The command socket is non-blocking so must check for EAGAIN */
+    do {
+        retval =  socket_send_data(cmd_socket, response, 
+                                   strlen((char *)response), send_offset, &retlen);
+    } while(retval);
+}
+
+/***************************************************************************** 
+ *  command_dispatch()
+ *
+ *  - Search the rsp_command_table for a known cmd that matches the received cmd
+ *  - Use the command index to execute the rsp command handler.
+ *  
+ *****************************************************************************/
+void command_dispatch(char * cmd, int cmd_len, char * response, size_t rsp_size)
+{
+    int rsp_cmd_elements = sizeof(rsp_command_table)/sizeof(struct rsp_command_table_t);
+    int cmd_index;
+    char * pcmd = cmd;
+
+    LOGFUNC();
+
+    /* Search the rsp_command_table for a known cmd that matches the received cmd. */
+    for ( cmd_index = 0; cmd_index < rsp_cmd_elements; cmd_index++) {
+        
+        char *rsp_cmd = strstr(cmd, rsp_command_table[cmd_index].cmd);
+        if (rsp_cmd == cmd) {
+            pcmd += strlen(rsp_command_table[cmd_index].cmd);
+
+            LOGMSG1("%s:RSP Command match found:%s", __func__, 
+                    rsp_command_table[cmd_index].cmd);
+
+            break;
+        }
+    }
+
+    if (cmd_index == rsp_cmd_elements) {
+        err_handler(ERR_TYPE_LOCAL, ERR_RSP_INVALID);
+    }
+
+
+    /* Process the command */
+    rsp_command_table[cmd_index].process(pcmd, response, rsp_size);
+}
+
+/***************************************************************************** 
+ *  get_memory_arguments()
+ *
+ *  Convert ascii memory command arguments (addr, len, and data) and into
+ *  values.
+ *
+ *  Note - data is not converted to value in this function. It simply returns
+ *         a char * to the data value if this is a write, else NULL is returned.
+ *  
+ *****************************************************************************/
+static void get_memory_arguments(char * cbuf, uint32_t * addr, size_t * len, char ** data)
+{
+    char * tokins = ",:";
+    /* arg[0] used to hold the char * to the address */
+    /* arg[1] used to hold the char * to the length in bytes */
+    /* arg[2] used to hold a char * to the data if this is a write */
+    char * arg[3] = {NULL,NULL,NULL};
+    char addr_str[] = "0x00000000";
+    char len_str[] = "0x00000000";
+    int starting_digit;
+
+    int i = 0;
+    arg[i] = strtok(cbuf, tokins);
+    while (arg[i] != NULL) {        
+#if DEBUG
+        if ((strlen(arg[i]) == 0) || (strlen(arg[i]) > 8)) {
+            err_handler(ERR_TYPE_LOCAL, ERR_DEBUG);
+        }
+#endif
+        arg[++i] = strtok(NULL, tokins);
+        /* Don't overflow the arg array */
+        if (i == 2) break;
+    }
+
+#if DEBUG
+    if ( (arg[0] == NULL) || (arg[1] == NULL)) {
+        err_handler(ERR_TYPE_LOCAL, ERR_DEBUG);
+    }
+
+#endif
+
+    starting_digit = 10 - strlen(arg[0]);
+    strcpy(&addr_str[starting_digit], arg[0]);
+
+    starting_digit = 10 - strlen(arg[1]);
+    strcpy(&len_str[starting_digit], arg[1]);
+
+    *addr = strtoul(addr_str, NULL, 16);
+    *len = strtoul(len_str, NULL, 16);  /* in bytes */
+    *data = arg[2];
+    
+}
+
+/***************************************************************************** 
+ *  process_memory_write()
+ *
+ *  RSP target memory write command.
+ *
+ *  Note - data is restricted to N 32-bit hex values.
+ *  
+ *****************************************************************************/
+static void process_memory_write(char * cbuf, char * rbuf, size_t rsp_size)
+{
+    uint32_t addr;
+    size_t len;
+    char * data_str;
+
+    get_memory_arguments(cbuf, &addr, &len, &data_str);
+#if DEBUG
+    if ((data_str == NULL) || (len % 4 != 0) || (addr & 0x3)) {
+        err_handler(ERR_TYPE_LOCAL, ERR_DEBUG);
+    }
+#endif
+
+    /* Client must send 8 hex digits per word */
+    do {
+        /* Do a 32-bit write */
+        uint32_t data;
+        int offset = 0;            
+        char word[] = "0x00000000";   /* data_str is in byte order 78563412 for 0x12345678*/
+        
+        int num_digits = strlen(data_str + offset);
+        if (num_digits > 8) {
+            num_digits = 8;
+        }
+
+        for (int i = 0; i < num_digits; i += 2) {
+            word[8 - i] = data_str[offset + i];
+            word[9 - i] = data_str[offset + i + 1];   
+        }
+
+        data =  strtoul(word, NULL, 16); 
+
+        remote_memory_write( addr, sizeof(uint32_t), &data);
+
+        offset += 8;
+        len -= 4;
+    } while (len != 0);
+
+#if DEBUG
+    if (strlen(rsp_msg_ok) > rsp_size) {
+        err_handler(ERR_TYPE_LOCAL, ERR_DEBUG);
+    }
+#endif
+    strcpy(rbuf, rsp_msg_ok);
+
+}
+
+/***************************************************************************** 
+ *  process_memory_read()
+ *
+ *  RSP target memory read command.
+ *
+ *  Note - data is restricted to N 32-bit hex values.
+ *  
+ *****************************************************************************/
+static void process_memory_read(char * cbuf, char * rbuf, size_t rsp_size)
+{
+    uint32_t addr;
+    size_t len;
+    char * rsp = rbuf;
+    char * data_str;
+#if DEBUG 
+    int digit_cnt = 0;
+#endif
+
+    get_memory_arguments(cbuf, &addr, &len, &data_str);
+
+#if DEBUG
+    /* data_str only valid for write, not read */
+    if ((data_str != NULL) || (len % 4 != 0)  || (addr & 0x3)) {
+        err_handler(ERR_TYPE_LOCAL, ERR_DEBUG);
+    }
+#endif
+
+    /* Will send 8 hex digits per word */
+    do {
+        /* Do a 32-bit write */
+        uint32_t data, adj_data, mask;
+        int num_digits;
+
+#if DEBUG        
+        if (digit_cnt > rsp_size) {
+            err_handler(ERR_TYPE_LOCAL, ERR_DEBUG);
+        }
+#endif
+
+        remote_memory_read(addr, sizeof(uint32_t), &data);
+
+        /* when len < 4 bytes suppress leading zeros */
+        if (len > 4) {
+            num_digits = 8;
+        } else {
+            if (data < 256) num_digits = 2;
+            else if ((data > 255) && (data < 65536)) num_digits = 4;
+            else if ((data > 65535) && ( data < 16777216)) num_digits = 6;
+            else if (data > 16777215) num_digits = 8;
+        }
+
+        for (int i = 0; i < num_digits; i += 2) {
+            adj_data = data >> (i * 4);
+            mask = 0xf0;
+            *rsp++ = int_to_hexdigit((adj_data & mask) >> 4);
+            *rsp++ = int_to_hexdigit(adj_data & (mask >> 4));
+        }
+
+#if DEBUG 
+        digit_cnt += num_digits;
+#endif
+        len -= sizeof(uint32_t);
+    } while (len != 0);
+
+}
+
+/***************************************************************************** 
+ *  process_remote()
+ *
+ *  Process remote RSP commands
+ *
+ *  - Search the remote_command_table for a known cmd that matches the received cmd.
+ *  - Tokenize the remote command into argv argc pair.
+ *  - Execute the command from the remote command table.
+ *
+ *****************************************************************************/
+static void process_remote(char * cbuf, char * rbuf, size_t rsp_size)
+{
+
+    int remote_element_cnt = sizeof(remote_command_table)/sizeof(struct remote_command_table_t);
+    int op_index;
+
+    LOGFUNC();
+
+    /* Search the remote_command_table for a known cmd that matches the received cmd */
+    for ( op_index = 0; op_index < remote_element_cnt; op_index++) {
+        /* Search the cmd string for the rsp command prefix */
+        char *rsp_cmd = strstr(cbuf, remote_command_table[op_index].cmd);
+
+        if (rsp_cmd == cbuf) {
+            LOGMSG1("%s:Remote command match found:%s", __func__,
+                    remote_command_table[op_index].cmd);
+            break;
+        }
+    }
+
+    if (op_index == remote_element_cnt) {
+        err_handler(ERR_TYPE_LOCAL, ERR_RSP_INVALID);
+    }
+
+    /* Tokenize the remote command into argv argc pair. */
+    {    
+        #define MAX_REMOTE_ARGS 6
+        char * argv[MAX_REMOTE_ARGS];
+        int argc = 0;
+        char * tokins = " ,"; /* Space and comma */
+    
+        argv[argc] = strtok(cbuf, tokins); 
+        while (argv[argc]) {
+            argc++;
+#if DEBUG
+            if ( argc == MAX_REMOTE_ARGS) {
+                err_handler(ERR_TYPE_LOCAL, ERR_DEBUG);
+            }
+#endif
+            argv[argc] = strtok(NULL, tokins);
+        }
+
+        /* Process the command */
+
+        IF_LOGGING_ENABLED {
+            for (int i = 0; i < argc; i++) {
+                LOGMSG1("%s: argv[%d] is:%s", __func__, i, argv[i]);
+            }
+        }
+
+        remote_command_table[op_index].process(argc, argv, rbuf, rsp_size);
+
+        LOGMSG1("%s:Remote command complete, responding with:%s", __func__, rbuf);
+
+    }
+
+}
+
+static void process_disable_ack(char * cbuf, char * rbuf, size_t rsp_size)
+{
+    rsp_ack_enabled = false;
+        
+#if DEBUG
+    if (strlen(rsp_msg_ok) > rsp_size) {
+        err_handler(ERR_TYPE_LOCAL, ERR_DEBUG);
+    }
+#endif
+    strcpy(rbuf, rsp_msg_ok);
+}
+
diff --git a/server/command_handler.h b/server/command_handler.h
new file mode 100644 (file)
index 0000000..1a191cb
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * command_handler.h
+ *
+ * Ctools Profiler Server Implementation
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+#ifndef COMMAND_HANDLER_H
+#define COMMAND_HANDLER_H
+
+void command_init(int socket);
+void command_process();
+
+#endif
diff --git a/server/ctoolsprof.h b/server/ctoolsprof.h
new file mode 100644 (file)
index 0000000..0674057
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * ctoolsprof.h
+ *
+ * Ctools Profiler Server Implementation
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+#ifndef CTOOLSPROF_H
+#define CTOOLSPROF_H
+
+/* Define ctoolsprof gloabls */
+extern const int g_major_version;
+extern const int g_minor_version;
+extern const int g_copyright_year;
+
+extern FILE *g_stdout;
+//extern FILE *g_logout;
+extern FILE *g_stderr;
+extern char * g_whoami;
+
+extern bool g_fifo_used;
+extern bool g_fifo_enabled;
+extern int g_fifo_fd;
+
+extern bool g_interactive_mode;
+
+/* State definitions
+ * Uninitialized - have nerver called the start_command_handler().
+ * Waiting - Called start_command_handler but recording may be delayed or need a signal from the user app.
+ * Stopped - Was recording, but now stopped.
+ * Recording - Obviously the receiver is recording.
+ */
+typedef enum {
+    STATE_UNINITIALIZED,
+    STATE_WAITING,
+    STATE_STOPPED,
+    STATE_RECORDING
+} recording_state_t;
+
+typedef enum {
+    ETB_MODE_ONESHOT_FIXED,
+    ETB_MODE_ONESHOT_CIRCULAR,
+    ETB_MODE_DRAIN,
+    ETB_MODE_LAST
+} etb_mode_t;
+
+typedef struct {
+    bool delay_active;
+    bool duration_active;
+    bool signal_active;
+    bool etb_active;
+    bool socket_disconnect;
+    etb_mode_t etb_mode;
+    recording_state_t recording;
+} monitor_state_t;
+
+extern monitor_state_t global_state;
+
+void clean_up();
+
+#endif
diff --git a/server/ctoolsprof_srv_main.c b/server/ctoolsprof_srv_main.c
new file mode 100644 (file)
index 0000000..c5c79d9
--- /dev/null
@@ -0,0 +1,439 @@
+/*
+ * ctoolsprof_srv_main.c
+ *
+ * Ctools Profiler Server Implementation
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ 
+ * 
+ * 
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met:
+ *
+ *    Redistributions of source code must retain the above copyright 
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the 
+ *    documentation and/or other materials provided with the   
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF