Merge remote-tracking branch 'vincent-ext/3.00.00.13_eng' into 12_eng
authorChris Ring <cring@ti.com>
Sun, 17 Mar 2013 18:13:22 +0000 (11:13 -0700)
committerChris Ring <cring@ti.com>
Sun, 17 Mar 2013 18:13:22 +0000 (11:13 -0700)
85 files changed:
ipc-qnx.mak [new file with mode: 0644]
products.mak
qnx/Makefile [new file with mode: 0644]
qnx/include/Std.h [new file with mode: 0644]
qnx/include/TiIpcFxns.h [new file with mode: 0644]
qnx/include/_IpcLog.h [new file with mode: 0644]
qnx/include/_MessageQ.h [new file with mode: 0644]
qnx/include/_MultiProc.h [new file with mode: 0644]
qnx/include/_NameServer.h [new file with mode: 0644]
qnx/include/_NameServerRemoteRpmsg.h [new file with mode: 0644]
qnx/src/api/Ipc.c [new file with mode: 0644]
qnx/src/api/Makefile [new file with mode: 0644]
qnx/src/api/MessageQ.c [new file with mode: 0644]
qnx/src/api/NameServer.c [new file with mode: 0644]
qnx/src/api/arm/Makefile [new file with mode: 0644]
qnx/src/api/arm/a.g.le.v7/Makefile [new file with mode: 0644]
qnx/src/api/arm/a.le.v7/Makefile [new file with mode: 0644]
qnx/src/api/common.mk [new file with mode: 0644]
qnx/src/family/Makefile [new file with mode: 0644]
qnx/src/family/SystemCfg_omap5432.c [new file with mode: 0644]
qnx/src/family/arm/Makefile [new file with mode: 0644]
qnx/src/family/arm/a.g.le.v7/Makefile [new file with mode: 0644]
qnx/src/family/arm/a.le.v7/Makefile [new file with mode: 0644]
qnx/src/family/common.mk [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/common.mk
qnx/src/ipc3x_dev/ti/syslink/build/Qnx/resmgr/common.mk
qnx/src/ipc3x_dev/ti/syslink/build/Qnx/resmgr/dcmd_syslink.h [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/build/Qnx/resmgr/proto.h
qnx/src/ipc3x_dev/ti/syslink/build/Qnx/resmgr/syslink_devctl.c
qnx/src/ipc3x_dev/ti/syslink/build/Qnx/resmgr/syslink_main.c
qnx/src/ipc3x_dev/ti/syslink/inc/IoctlDefs.h [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/inc/MessageQDrvDefs.h [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/inc/NameServerDrvDefs.h [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/inc/usr/Qnx/IpcDrv.h [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/inc/usr/Qnx/MessageQDrv.h [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/inc/usr/Qnx/NameServerDrv.h [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/knl/MessageQ_daemon.c [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/knl/Qnx/messageq_devctl.c [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/knl/_MessageQCopyDefs.h
qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/usr/Qnx/IpcDrv.c [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/usr/Qnx/MessageQDrv.c [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/ti-ipc/ti-ipc.c
qnx/src/ipc3x_dev/ti/syslink/utils/hlos/knl/NameServer_daemon.c [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/utils/hlos/knl/Qnx/Nameserver_devctl.c [new file with mode: 0644]
qnx/src/ipc3x_dev/ti/syslink/utils/hlos/usr/Qnx/NameServerDrv.c [new file with mode: 0644]
qnx/src/tests/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQApp/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQApp/MessageQApp.c [new file with mode: 0644]
qnx/src/tests/MessageQApp/MessageQApp.use [new file with mode: 0644]
qnx/src/tests/MessageQApp/arm/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQApp/arm/o.g.le.v7/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQApp/arm/o.le.v7/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQApp/common.mk [new file with mode: 0644]
qnx/src/tests/MessageQBench/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQBench/MessageQBench.c [new file with mode: 0644]
qnx/src/tests/MessageQBench/MessageQBench.use [new file with mode: 0644]
qnx/src/tests/MessageQBench/arm/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQBench/arm/o.g.le.v7/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQBench/arm/o.le.v7/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQBench/common.mk [new file with mode: 0644]
qnx/src/tests/MessageQMulti/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQMulti/MessageQMulti.c [new file with mode: 0644]
qnx/src/tests/MessageQMulti/MessageQMulti.use [new file with mode: 0644]
qnx/src/tests/MessageQMulti/arm/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQMulti/arm/o.g.le.v7/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQMulti/arm/o.le.v7/Makefile [new file with mode: 0644]
qnx/src/tests/MessageQMulti/common.mk [new file with mode: 0644]
qnx/src/tests/MessageQMulti/multi_process.sh [new file with mode: 0644]
qnx/src/tests/NameServerApp/Makefile [new file with mode: 0644]
qnx/src/tests/NameServerApp/NameServerApp.c [new file with mode: 0644]
qnx/src/tests/NameServerApp/NameServerApp.use [new file with mode: 0644]
qnx/src/tests/NameServerApp/arm/Makefile [new file with mode: 0644]
qnx/src/tests/NameServerApp/arm/o.g.le.v7/Makefile [new file with mode: 0644]
qnx/src/tests/NameServerApp/arm/o.le.v7/Makefile [new file with mode: 0644]
qnx/src/tests/NameServerApp/common.mk [new file with mode: 0644]
qnx/src/tests/NameServerApp/multi_process.sh [new file with mode: 0644]
qnx/src/tests/NameServerApp/multi_process_debug.sh [new file with mode: 0644]
qnx/src/utils/IpcLog.c [new file with mode: 0644]
qnx/src/utils/Makefile [new file with mode: 0644]
qnx/src/utils/MultiProc.c [new file with mode: 0644]
qnx/src/utils/TiIpcFxns.c [new file with mode: 0644]
qnx/src/utils/arm/Makefile [new file with mode: 0644]
qnx/src/utils/arm/a.g.le.v7/Makefile [new file with mode: 0644]
qnx/src/utils/arm/a.le.v7/Makefile [new file with mode: 0644]
qnx/src/utils/common.mk [new file with mode: 0644]

diff --git a/ipc-qnx.mak b/ipc-qnx.mak
new file mode 100644 (file)
index 0000000..ca23b37
--- /dev/null
@@ -0,0 +1,77 @@
+#
+#   Copyright (c) 2012-2013, Texas Instruments Incorporated
+#
+#   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.
+#
+#  ======== ipc-qnx.mak ========
+#
+
+#
+# Where to export the binaries
+#
+DESTDIR ?= <UNDEFINED>
+
+include ./products.mak
+
+# Setup QNX paths
+ifneq ($(wildcard $(QNX_INSTALL_DIR)),)
+    QNX_PATH := $(QNX_INSTALL_DIR)/host/linux/x86/usr/bin
+    QNX_PATH := $(QNX_PATH):$(QNX_INSTALL_DIR)/host/linux/x86/bin
+    QNX_PATH := $(QNX_PATH):$(QNX_INSTALL_DIR)/host/linux/x86/sbin
+    QNX_PATH := $(QNX_PATH):$(QNX_INSTALL_DIR)/host/linux/x86/usr/sbin
+    QNX_PATH := $(QNX_PATH):$(QNX_INSTALL_DIR)/linux/x86/usr/photon/appbuilder
+
+    export QNX_CONFIGURATION?=$(QNX_INSTALL_DIR)/etc/qnx
+    export QNX_HOST?=$(QNX_INSTALL_DIR)/host/linux/x86
+    export QNX_TARGET?=$(QNX_INSTALL_DIR)/target/qnx6
+    export MAKEFLAGS=-I$(QNX_INSTALL_DIR)/target/qnx6/usr/include
+    export LD_LIBRARY_PATH=$(QNX_INSTALL_DIR)/host/linux/x86/usr/lib
+endif
+
+all: .qnx
+
+.qnx: .qnx,omap5432
+
+.qnx,%: PATH:=$(QNX_PATH):$(PATH)
+.qnx,%:
+       @echo "building Qnx user libraries for" $(*:.qnx,=) "..."
+       @make -C qnx \
+                IPC_REPO=`pwd` \
+                PLATFORM=$(*:.qnx,=)
+
+clean:
+       @echo "cleaning Qnx user libraries ..."
+       @make -C qnx clean
+
+#TODO: Implement Install goal
+#install:
+#      @ echo installing binaries to $(DESTDIR) ...
+#      @ mkdir -p $(DESTDIR)/$(prefix)/$(docdir)
+#      @ cp -rf $(wildcard ipc_*_release_notes.html) docs/* $(DESTDIR)/$(prefix)/$(docdir)
+#      @ mkdir -p $(DESTDIR)/$(prefix)/$(includedir)/ti/ipc
+#      @ cp -rf packages/ti/ipc/*.h $(DESTDIR)/$(prefix)/$(includedir)/ti/ipc
index ad22d5396e493fdf39d84da858dc660c43e6c93e..110066513578fcc5f3eba1ff009ee8f3d00b3f87 100644 (file)
@@ -49,6 +49,12 @@ PLATFORM ?=
 # Path to TI Linux Utils package to locate the pre-built CMEM libraries (optional):
 CMEM_INSTALL_DIR ?=
 
+#################### IPC QNX ####################
+
+# Set up path to QNX tools installation
+QNX_INSTALL_DIR ?=
+
+
 #################### IPC Bios ####################
 
 # Set up required dependencies for IPC Bios builds
diff --git a/qnx/Makefile b/qnx/Makefile
new file mode 100644 (file)
index 0000000..cfd81dd
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+
+all:  utils ipc3x_dev libs tests
+
+libs: ipc3x_dev
+       @cd src/api; make install
+       @cd src/family; make install
+
+utils:
+       @cd src/utils; make install
+
+tests: libs
+       @cd src/tests; make install
+
+ipc3x_dev: utils
+       @cd src/ipc3x_dev; make SYSLINK_PLATFORM=omap5430 TILER_PLATFORM=omap5430 SMP=1
+
+clean:
+       @cd src/family; make clean
+       @cd src/api; make clean
+       @cd src/utils; make clean
+       @cd src/tests; make clean
+       @cd src/ipc3x_dev; make clean SYSLINK_PLATFORM=omap5430 TILER_PLATFORM=omap5430 SMP=1
diff --git a/qnx/include/Std.h b/qnx/include/Std.h
new file mode 100644 (file)
index 0000000..63adabf
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ *  Copyright (c) 2008-2013, Texas Instruments Incorporated
+ *  All rights reserved.
+ *
+ *  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.
+ */
+/** ============================================================================
+ *  @file   Std.h
+ *
+ *  @brief      This will have definitions of standard data types for
+ *              platform abstraction.
+ *
+ *  ============================================================================
+ */
+
+#if !defined(STD_H)
+#define STD_H
+
+#ifdef SYSLINK_BUILDOS_LINUX
+#include <std_linux.h>
+#endif
+#include <unistd.h>
+#include <stdbool.h>
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+typedef char              Char;
+typedef unsigned char     UChar;
+typedef short             Short;
+typedef unsigned short    UShort;
+typedef int               Int;
+typedef unsigned int      UInt;
+typedef long              Long;
+typedef unsigned long     ULong;
+typedef float             Float;
+typedef double            Double;
+typedef long double       LDouble;
+typedef void              Void;
+
+
+typedef bool              Bool;
+typedef void            * Ptr;       /* data pointer */
+typedef void            * Handle;    /* data pointer */
+typedef char            * String;    /* null terminated string */
+
+
+typedef int            *  IArg;
+typedef unsigned int   *  UArg;
+typedef char              Int8;
+typedef short             Int16;
+typedef int               Int32;
+
+typedef unsigned char     UInt8;
+typedef unsigned short    UInt16;
+typedef unsigned int      UInt32;
+typedef unsigned int      SizeT;
+typedef unsigned char     Bits8;
+typedef unsigned short    Bits16;
+typedef UInt32            Bits32;
+
+/* taken from bridge */
+typedef void           *PVOID;          /* p    */
+typedef PVOID           HANDLE;         /* h    */
+
+#define TRUE              1
+#define FALSE             0
+#define FAIL   -1
+//#define NULL            '\0'
+
+#if defined (__cplusplus)
+}
+#endif
+
+#endif
diff --git a/qnx/include/TiIpcFxns.h b/qnx/include/TiIpcFxns.h
new file mode 100644 (file)
index 0000000..8b81b86
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+extern int Connect(int fd, UInt16 procId, int dst);
+extern int BindAddr(int fd, UInt32 localAddr);
diff --git a/qnx/include/_IpcLog.h b/qnx/include/_IpcLog.h
new file mode 100644 (file)
index 0000000..1319bce
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/*
+ *  ======== _IpcLog.h ========
+ */
+
+#ifndef _IpcLog_
+#define _IpcLog_
+
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern Bool IpcLog_logFile;
+extern FILE * IpcLog_logPtr;
+
+/* macros for writing to log file: */
+#define LOG0(a)  \
+    if (IpcLog_logFile == TRUE) \
+        {  fprintf(IpcLog_logPtr, a); fflush(IpcLog_logPtr); }
+
+#define LOG1(a, b)  \
+    if (IpcLog_logFile == TRUE) \
+        {  fprintf(IpcLog_logPtr, a, b); fflush(IpcLog_logPtr); }
+
+#define LOG2(a, b, c)  \
+    if (IpcLog_logFile == TRUE) \
+        {  fprintf(IpcLog_logPtr, a, b, c); fflush(IpcLog_logPtr); }
+
+
+/* macros for generating verbose output: */
+#define PRINTVERBOSE0(a)  \
+    if (verbose == TRUE) {  printf(a); }
+
+#define PRINTVERBOSE1(a, b)  \
+    if (verbose == TRUE) {  printf(a, b); }
+
+#define PRINTVERBOSE2(a, b, c)  \
+    if (verbose == TRUE) {  printf(a, b, c); }
+
+#define PRINTVERBOSE3(a, b, c, d)  \
+    if (verbose == TRUE) {  printf(a, b, c, d); }
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/qnx/include/_MessageQ.h b/qnx/include/_MessageQ.h
new file mode 100644 (file)
index 0000000..acf006d
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ *  Copyright (c) 2008-2013, Texas Instruments Incorporated
+ *  All rights reserved.
+ *
+ *  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.
+ */
+/** ============================================================================
+ *  @file   _MessageQ.h
+ *
+ *  @brief  Defines MessageQ module.
+ *  ============================================================================
+ */
+
+
+#ifndef MESSAGEQ_H_0xded2
+#define MESSAGEQ_H_0xded2
+
+/* Utilities headers */
+#include <ti/ipc/NameServer.h>
+
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+
+/*!
+ *  @def    MessageQ_MODULEID
+ *  @brief  Unique module ID.
+ */
+#define MessageQ_MODULEID               (0xded2)
+
+/*!
+ *  @def    MessageQ_ALLOWGROWTH
+ *  @brief  Allow runtime growth
+ */
+#define MessageQ_ALLOWGROWTH             NameServer_ALLOWGROWTH
+
+/*! @brief Number of queues */
+#define MessageQ_NUM_PRIORITY_QUEUES  2
+
+/*
+ *  Used to denote a message that was initialized
+ *  with the #MessageQ_staticMsgInit function.
+ */
+#define MessageQ_STATICMSG              0xFFFF
+
+/*! Version setting */
+#define MessageQ_HEADERVERSION   (UInt) 0x2000
+
+/*! Mask to extract Trace setting */
+#define MessageQ_TRACEMASK       (UInt) 0x1000
+
+/*! Shift for Trace setting */
+#define MessageQ_TRACESHIFT      (UInt) 12
+
+
+/*!
+ *  @brief  Structure defining config parameters for the MessageQ Buf module.
+ */
+typedef struct MessageQ_Config_tag {
+    Bool   traceFlag;
+    /*!< Trace flag
+     *  This flag allows the configuration of the default module trace
+     *  settings.
+     */
+    UInt maxRuntimeEntries;
+    /*!< Maximum number of MessageQs that can be dynamically created */
+    UInt maxNameLen;
+    /*!< Maximum length for Message queue names */
+} MessageQ_Config;
+
+/* =============================================================================
+ *  APIs
+ * =============================================================================
+ */
+/*!
+ *  @brief      Function to get the default configuration for the MessageQ
+ *              module.
+ *
+ *              This function can be called by the application to get their
+ *              configuration parameter to MessageQ_setup filled in by the
+ *              MessageQ module with the default parameters. If the user does
+ *              not wish to make any change in the default parameters, this API
+ *              is not required to be called.
+ *
+ *  @param      cfg     Pointer to the MessageQ module configuration structure
+ *                      in which the default config is to be returned.
+ *
+ *  @sa         MessageQ_setup
+ */
+Void MessageQ_getConfig (MessageQ_Config * cfg);
+
+/*!
+ *  @brief      Function to setup the MessageQ module.
+ *
+ *              This function sets up the MessageQ module. This function must
+ *              be called before any other instance-level APIs can be invoked.
+ *              Module-level configuration needs to be provided to this
+ *              function. If the user wishes to change some specific config
+ *              parameters, then MessageQ_getConfig can be called to get the
+ *              configuration filled with the default values. After this, only
+ *              the required configuration values can be changed. If the user
+ *              does not wish to make any change in the default parameters, the
+ *              application can simply call MessageQ with NULL parameters.
+ *              The default parameters would get automatically used.
+ *
+ *  @param      cfg   Optional MessageQ module configuration. If provided as
+ *                    NULL, default configuration is used.
+ *
+ *  @sa         MessageQ_destroy
+ *              NameServer_create
+ *              GateSpinlock_create
+ *              Memory_alloc
+ */
+Int MessageQ_setup (const MessageQ_Config * cfg);
+
+/* Function to destroy the MessageQ module. */
+Int MessageQ_destroy (void);
+
+/* Returns the amount of shared memory used by one transport instance.
+ *
+ *  The MessageQ module itself does not use any shared memory but the
+ *  underlying transport may use some shared memory.
+ */
+SizeT MessageQ_sharedMemReq (Ptr sharedAddr);
+
+/* Calls the SetupProxy function to setup the MessageQ transports. */
+Int MessageQ_attach (UInt16 remoteProcId, Ptr sharedAddr);
+
+/* Calls the SetupProxy function to detach the MessageQ transports. */
+Int MessageQ_detach (UInt16 remoteProcId);
+
+NameServer_Handle MessageQ_getNameServerHandle(void);
+
+Void MessageQ_setQueueOwner(MessageQ_Handle handle, Int pid);
+
+Void MessageQ_cleanupOwner(Int pid);
+
+Void MessageQ_msgInit(MessageQ_Msg msg);
+
+#if defined (__cplusplus)
+}
+#endif /* defined (__cplusplus) */
+
+
+#endif /* MESSAGEQ_H_0xded2 */
diff --git a/qnx/include/_MultiProc.h b/qnx/include/_MultiProc.h
new file mode 100644 (file)
index 0000000..75a49ae
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ *  Copyright (c) 2008-2013, Texas Instruments Incorporated
+ *  All rights reserved.
+ *
+ *  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.
+ */
+/** ============================================================================
+ *  @file   _MultiProc.h
+ *
+ *  @brief  Header file for_MultiProc on HLOS side
+ *  ============================================================================
+ */
+
+
+#ifndef _MULTIPROC_H_0XB522
+#define _MULTIPROC_H_0XB522
+
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+
+/*!
+ *  @brief  Max name length for a processor name.
+ */
+#define MultiProc_MAXNAMELENGTH 32
+
+/*!
+ *  @brief  Max number of processors supported.
+ */
+#define MultiProc_MAXPROCESSORS 10
+
+
+/*!
+ *  @brief  Configuration structure for MultiProc module
+ */
+typedef struct MultiProc_Config_tag {
+    Int32  numProcessors;
+    /*!< Max number of procs for particular system */
+    Char   nameList [MultiProc_MAXPROCESSORS][MultiProc_MAXNAMELENGTH];
+    /*!< Name List for processors in the system */
+    UInt16 id;
+    /*!< Local Proc ID. This needs to be set before calling any other APIs */
+} MultiProc_Config;
+
+/* This exported from family/<PLATFORM_DIR>/SystemCfg.c: */
+extern MultiProc_Config _MultiProc_cfg;
+
+#if defined (__cplusplus)
+}
+#endif
+
+#endif
diff --git a/qnx/include/_NameServer.h b/qnx/include/_NameServer.h
new file mode 100644 (file)
index 0000000..8f25b35
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/*!
+ *  @file       _NameServer.h
+ *
+ *  @brief      HLOS-specific NameServer header
+ *
+ */
+
+
+#ifndef NameServer_H_0XF414
+#define NameServer_H_0XF414
+
+/* Utilities headers */
+#include <ti/ipc/NameServer.h>
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+
+/* =============================================================================
+ * Macros & Defines
+ * =============================================================================
+ */
+
+/*
+ * This must match on BIOS side. This will occupy queueIndex 0 of the MessageQ
+ * module queues array, forcing MessageQ indicies to start from 1.
+ */
+#define NAME_SERVER_RPMSG_ADDR 0
+
+/* =============================================================================
+ * APIs
+ * =============================================================================
+ */
+/*!
+ *  @brief      Function to setup the nameserver module.
+ *
+ *  @sa         NameServer_destroy
+ */
+Int NameServer_setup (Void);
+
+/*!
+ *  @brief      Function to destroy the nameserver module.
+ *
+ *  @sa         NameServer_setup
+ */
+Int NameServer_destroy (void);
+
+#if defined (__cplusplus)
+}
+#endif
+
+#endif
diff --git a/qnx/include/_NameServerRemoteRpmsg.h b/qnx/include/_NameServerRemoteRpmsg.h
new file mode 100644 (file)
index 0000000..b7abd4b
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#define NAMESERVER_REQUEST    0
+#define NAMESERVER_RESPONSE   1
+
+#define NAME_SERVER_RPMSG_ADDR  0
+
+#define MAXNAMEINCHAR 80
+#define NAMEARRAYSZIE   (((MAXNAMEINCHAR - 1) / sizeof(Bits32)) + 1)
+
+#define NAMESERVER_GET_TIMEOUT  10 /* Seconds */
+
+#define NAMESERVER_MSG_TOKEN   0x5678abcd
+
+/* message sent to remote procId */
+typedef struct NameServerMsg {
+    Bits32  reserved;           /* reserved field: must be first!   */
+    Bits32  value;              /* holds value                      */
+    Bits32  request;            /* whether its a request/response   */
+    Bits32  requestStatus;      /* status of request                */
+                                /* name of NameServer instance      */
+    Bits32  instanceName[NAMEARRAYSZIE];
+                                /* name of NameServer entry         */
+    Bits32  name[NAMEARRAYSZIE];
+} NameServerMsg;
diff --git a/qnx/src/api/Ipc.c b/qnx/src/api/Ipc.c
new file mode 100644 (file)
index 0000000..1610e9e
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/*!
+ *  @file       Ipc.c
+ *
+ *  @brief      Starts and stops user side Ipc
+ *              All setup/destroy APIs on user side will be call from this
+ *              module.
+ *
+ *  @ver        0002
+ *
+ */
+
+/* Standard headers */
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <Std.h>
+
+/* Common IPC headers: */
+#include <ti/ipc/Ipc.h>
+#include <ti/ipc/NameServer.h>
+
+/* User side headers */
+#include <ti/syslink/inc/usr/Qnx/IpcDrv.h>
+
+/* IPC startup/shutdown stuff: */
+#include <ti/ipc/MultiProc.h>
+#include <ti/ipc/MessageQ.h>
+#include <ti/ipc/NameServer.h>
+#include <_MessageQ.h>
+#include <_NameServer.h>
+
+static void cleanup(int arg);
+
+/** ============================================================================
+ *  Functions
+ *  ============================================================================
+ */
+/* Function to start Ipc */
+Int Ipc_start (Void)
+{
+    MessageQ_Config   msgqCfg;
+    Int32             status = Ipc_S_SUCCESS;
+    UInt16            rprocId;
+
+    /* Catch ctrl-C, and cleanup: */
+    (void) signal(SIGINT, cleanup);
+
+    status = IpcDrv_open();
+    if (status < 0) {
+        printf("Ipc_start: IpcDrv_open() failed: %d\n", status);
+        status = Ipc_E_FAIL;
+        goto exit;
+    }
+
+    status = NameServer_setup();
+    if (status >= 0) {
+        MessageQ_getConfig(&msgqCfg);
+        MessageQ_setup(&msgqCfg);
+
+        /* Now attach to all remote processors, assuming they are up. */
+        for (rprocId = 0;
+             (rprocId < MultiProc_getNumProcessors()) && (status >= 0);
+             rprocId++) {
+           if (0 == rprocId) {
+               /* Skip host, which should always be 0th entry. */
+               continue;
+           }
+           status = MessageQ_attach (rprocId, NULL);
+           if (status < 0) {
+              printf("Ipc_start: MessageQ_attach(%d) failed: %d\n",
+                     rprocId, status);
+              status = Ipc_E_FAIL;
+           }
+        }
+    }
+    else {
+        printf("Ipc_start: NameServer_setup() failed: %d\n", status);
+        status = Ipc_E_FAIL;
+    }
+
+exit:
+    return (status);
+}
+
+
+/* Function to stop Ipc */
+Int Ipc_stop (Void)
+{
+    Int32             status = Ipc_S_SUCCESS;
+    UInt16            rprocId;
+
+    /* Now detach from all remote processors, assuming they are up. */
+    for (rprocId = 0;
+         (rprocId < MultiProc_getNumProcessors()) && (status >= 0);
+         rprocId++) {
+       if (0 == rprocId) {
+          /* Skip host, which should always be 0th entry. */
+          continue;
+       }
+       status = MessageQ_detach(rprocId);
+       if (status < 0) {
+            printf("Ipc_stop: MessageQ_detach(%d) failed: %d\n",
+                 rprocId, status);
+            status = Ipc_E_FAIL;
+            goto exit;
+       }
+    }
+
+    status = MessageQ_destroy();
+    if (status < 0) {
+        printf("Ipc_stop: MessageQ_destroy() failed: %d\n", status);
+        status = Ipc_E_FAIL;
+        goto exit;
+    }
+
+    status = NameServer_destroy();
+    if (status < 0) {
+        printf("Ipc_stop: NameServer_destroy() failed: %d\n", status);
+        status = Ipc_E_FAIL;
+        goto exit;
+    }
+
+    IpcDrv_close();
+
+exit:
+    return (status);
+}
+
+static void cleanup(int arg)
+{
+    printf("Ipc: Caught SIGINT, calling Ipc_stop...\n");
+    Ipc_stop();
+    exit(0);
+}
diff --git a/qnx/src/api/Makefile b/qnx/src/api/Makefile
new file mode 100644 (file)
index 0000000..02aa99c
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=CPU
+include recurse.mk
diff --git a/qnx/src/api/MessageQ.c b/qnx/src/api/MessageQ.c
new file mode 100644 (file)
index 0000000..8ac43db
--- /dev/null
@@ -0,0 +1,970 @@
+/*
+ * Copyright (c) 2012-2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/*============================================================================
+ *  @file   MessageQ.c
+ *
+ *  @brief  MessageQ module "client" implementation
+ *
+ *  This implementation is geared for use in a "client/server" model, whereby
+ *  system-wide data is maintained in a "server" component and process-
+ *  specific data is handled here.  At the moment, this implementation
+ *  connects and communicates with LAD for the server connection.
+ *
+ *  The MessageQ module supports the structured sending and receiving of
+ *  variable length messages. This module can be used for homogeneous or
+ *  heterogeneous multi-processor messaging.
+ *
+ *  MessageQ provides more sophisticated messaging than other modules. It is
+ *  typically used for complex situations such as multi-processor messaging.
+ *
+ *  The following are key features of the MessageQ module:
+ *  -Writers and readers can be relocated to another processor with no
+ *   runtime code changes.
+ *  -Timeouts are allowed when receiving messages.
+ *  -Readers can determine the writer and reply back.
+ *  -Receiving a message is deterministic when the timeout is zero.
+ *  -Messages can reside on any message queue.
+ *  -Supports zero-copy transfers.
+ *  -Can send and receive from any type of thread.
+ *  -Notification mechanism is specified by application.
+ *  -Allows QoS (quality of service) on message buffer pools. For example,
+ *   using specific buffer pools for specific message queues.
+ *
+ *  Messages are sent and received via a message queue. A reader is a thread
+ *  that gets (reads) messages from a message queue. A writer is a thread that
+ *  puts (writes) a message to a message queue. Each message queue has one
+ *  reader and can have many writers. A thread may read from or write to multiple
+ *  message queues.
+ *
+ *  Conceptually, the reader thread owns a message queue. The reader thread
+ *  creates a message queue. Writer threads  a created message queues to
+ *  get access to them.
+ *
+ *  Message queues are identified by a system-wide unique name. Internally,
+ *  MessageQ uses the NameServermodule for managing
+ *  these names. The names are used for opening a message queue. Using
+ *  names is not required.
+ *
+ *  Messages must be allocated from the MessageQ module. Once a message is
+ *  allocated, it can be sent on any message queue. Once a message is sent, the
+ *  writer loses ownership of the message and should not attempt to modify the
+ *  message. Once the reader receives the message, it owns the message. It
+ *  may either free the message or re-use the message.
+ *
+ *  Messages in a message queue can be of variable length. The only
+ *  requirement is that the first field in the definition of a message must be a
+ *  MsgHeader structure. For example:
+ *  typedef struct MyMsg {
+ *      MessageQ_MsgHeader header;
+ *      ...
+ *  } MyMsg;
+ *
+ *  The MessageQ API uses the MessageQ_MsgHeader internally. Your application
+ *  should not modify or directly access the fields in the MessageQ_MsgHeader.
+ *
+ *  All messages sent via the MessageQ module must be allocated from a
+ *  Heap implementation. The heap can be used for
+ *  other memory allocation not related to MessageQ.
+ *
+ *  An application can use multiple heaps. The purpose of having multiple
+ *  heaps is to allow an application to regulate its message usage. For
+ *  example, an application can allocate critical messages from one heap of fast
+ *  on-chip memory and non-critical messages from another heap of slower
+ *  external memory
+ *
+ *  MessageQ does support the usage of messages that allocated via the
+ *  alloc function. Please refer to the staticMsgInit
+ *  function description for more details.
+ *
+ *  In a multiple processor system, MessageQ communications to other
+ *  processors via MessageQTransport instances. There must be one and
+ *  only one MessageQTransport instance for each processor where communication
+ *  is desired.
+ *  So on a four processor system, each processor must have three
+ *  MessageQTransport instance.
+ *
+ *  The user only needs to create the MessageQTransport instances. The instances
+ *  are responsible for registering themselves with MessageQ.
+ *  This is accomplished via the registerTransport function.
+ *
+ *  ============================================================================
+ */
+
+
+/* Standard headers */
+#include <Std.h>
+
+/* Linux specific header files, replacing OSAL: */
+#include <pthread.h>
+
+/* Module level headers */
+#include <ti/ipc/NameServer.h>
+#include <ti/ipc/MultiProc.h>
+#include <_MultiProc.h>
+#include <ti/ipc/MessageQ.h>
+#include <_MessageQ.h>
+#include <_IpcLog.h>
+#include <ti/syslink/inc/MessageQDrvDefs.h>
+
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/param.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <assert.h>
+#include <fcntl.h>
+
+#include <ti/syslink/inc/usr/Qnx/MessageQDrv.h>
+
+/* TI IPC utils: */
+#include <TiIpcFxns.h>
+
+#include <ti/syslink/inc/ti/ipc/ti_ipc.h>
+
+/* =============================================================================
+ * Macros/Constants
+ * =============================================================================
+ */
+
+/*!
+ *  @brief  Name of the reserved NameServer used for MessageQ.
+ */
+#define MessageQ_NAMESERVER  "MessageQ"
+
+/* More magic rpmsg port numbers: */
+#define MESSAGEQ_RPMSG_PORT       61
+#define MESSAGEQ_RPMSG_MAXSIZE   512
+#define RPMSG_RESERVED_ADDRESSES  (1024)
+
+/* Trace flag settings: */
+#define TRACESHIFT    12
+#define TRACEMASK     0x1000
+
+/* =============================================================================
+ * Structures & Enums
+ * =============================================================================
+ */
+
+/* structure for MessageQ module state */
+typedef struct MessageQ_ModuleObject {
+    Int                 refCount;
+    /*!< Reference count */
+    NameServer_Handle   nameServer;
+    /*!< Handle to the local NameServer used for storing GP objects */
+    pthread_mutex_t     gate;
+    /*!< Handle of gate to be used for local thread safety */
+    MessageQ_Params     defaultInstParams;
+    /*!< Default instance creation parameters */
+    int                 ipcFd[MultiProc_MAXPROCESSORS];
+    /*!< File Descriptors for sending to each remote processor */
+    int                 seqNum;
+    /*!< Process-specific sequence number */
+} MessageQ_ModuleObject;
+
+/*!
+ *  @brief  Structure for the Handle for the MessageQ.
+ */
+typedef struct MessageQ_Object_tag {
+    MessageQ_Params         params;
+    /*! Instance specific creation parameters */
+    MessageQ_QueueId        queue;
+    /* Unique id */
+    int                     ipcFd;
+    /* File Descriptors to receive from a message queue. */
+    int                     unblockFdW;
+    /* Write this fd to unblock the select() call in MessageQ _get() */
+    int                     unblockFdR;
+     /* File Descriptor to block on to listen to unblockFdW. */
+    void                    *serverHandle;
+} MessageQ_Object;
+
+static Bool verbose = FALSE;
+
+/* =============================================================================
+ *  Globals
+ * =============================================================================
+ */
+static MessageQ_ModuleObject MessageQ_state =
+{
+    .refCount               = 0,
+    .nameServer             = NULL,
+};
+
+/*!
+ *  @var    MessageQ_module
+ *
+ *  @brief  Pointer to the MessageQ module state.
+ */
+MessageQ_ModuleObject * MessageQ_module = &MessageQ_state;
+
+
+/* =============================================================================
+ * Forward declarations of internal functions
+ * =============================================================================
+ */
+
+/* This is a helper function to initialize a message. */
+static Int transportCreateEndpoint(int * fd, UInt16 queueIndex);
+static Int transportCloseEndpoint(int fd);
+static Int transportGet(int fd, MessageQ_Msg * retMsg);
+static Int transportPut(MessageQ_Msg msg, UInt16 dstId, UInt16 dstProcId);
+
+/* =============================================================================
+ * APIS
+ * =============================================================================
+ */
+/* Function to get default configuration for the MessageQ module.
+ *
+ */
+Void MessageQ_getConfig (MessageQ_Config * cfg)
+{
+    Int status;
+    MessageQDrv_CmdArgs cmdArgs;
+
+    assert (cfg != NULL);
+
+    cmdArgs.args.getConfig.config = cfg;
+    status = MessageQDrv_ioctl (CMD_MESSAGEQ_GETCONFIG, &cmdArgs);
+
+    if (status < 0) {
+        PRINTVERBOSE1("MessageQ_getConfig: API (through IOCTL) failed, \
+            status=%d\n", status)
+    }
+
+    return;
+}
+
+/* Function to setup the MessageQ module. */
+Int MessageQ_setup (const MessageQ_Config * cfg)
+{
+    Int status;
+    MessageQDrv_CmdArgs cmdArgs;
+
+    Int i;
+
+    cmdArgs.args.setup.config = (MessageQ_Config *) cfg;
+    status = MessageQDrv_ioctl(CMD_MESSAGEQ_SETUP, &cmdArgs);
+    if (status < 0) {
+        PRINTVERBOSE1("MessageQ_setup: API (through IOCTL) failed, \
+            status=%d\n", status)
+        return status;
+    }
+
+    MessageQ_module->nameServer = cmdArgs.args.setup.nameServerHandle;
+    MessageQ_module->seqNum = 0;
+
+    /* Create a default local gate. */
+    pthread_mutex_init (&(MessageQ_module->gate), NULL);
+
+    /* Clear ipcFd array. */
+    for (i = 0; i < MultiProc_MAXPROCESSORS; i++) {
+       MessageQ_module->ipcFd[i]      = -1;
+    }
+
+    return status;
+}
+
+/*
+ * Function to destroy the MessageQ module.
+ */
+Int MessageQ_destroy (void)
+{
+    Int status;
+    MessageQDrv_CmdArgs    cmdArgs;
+
+    status = MessageQDrv_ioctl (CMD_MESSAGEQ_DESTROY, &cmdArgs);
+    if (status < 0) {
+        PRINTVERBOSE1("MessageQ_destroy: API (through IOCTL) failed, \
+            status=%d\n", status)
+    }
+
+    return status;
+}
+
+/* Function to initialize the parameters for the MessageQ instance. */
+Void MessageQ_Params_init (MessageQ_Params * params)
+{
+    memcpy (params, &(MessageQ_module->defaultInstParams),
+            sizeof (MessageQ_Params));
+
+    return;
+}
+
+/*
+ *   Function to create a MessageQ object for receiving.
+ *
+ *   Create a file descriptor and bind the source address
+ *   (local ProcId/MessageQ ID) in
+ *   order to get messages dispatched to this messageQ.
+ */
+MessageQ_Handle MessageQ_create (String name, const MessageQ_Params * params)
+{
+    Int                   status    = MessageQ_S_SUCCESS;
+    MessageQ_Object *     obj    = NULL;
+    UInt16                queueIndex = 0u;
+    UInt16                procId;
+    MessageQDrv_CmdArgs   cmdArgs;
+    int                   fildes[2];
+
+    cmdArgs.args.create.params = (MessageQ_Params *) params;
+    cmdArgs.args.create.name = name;
+    if (name != NULL) {
+        cmdArgs.args.create.nameLen = (strlen (name) + 1);
+    }
+    else {
+        cmdArgs.args.create.nameLen = 0;
+    }
+
+    status = MessageQDrv_ioctl (CMD_MESSAGEQ_CREATE, &cmdArgs);
+    if (status < 0) {
+        PRINTVERBOSE1("MessageQ_create: API (through IOCTL) failed, \
+            status=%d\n", status)
+        return NULL;
+    }
+
+    /* Create the generic obj */
+    obj = (MessageQ_Object *)calloc(1, sizeof (MessageQ_Object));
+
+    if (params != NULL) {
+       /* Populate the params member */
+        memcpy((Ptr) &obj->params, (Ptr)params, sizeof (MessageQ_Params));
+    }
+
+    procId = MultiProc_self();
+    queueIndex = (MessageQ_QueueIndex)cmdArgs.args.create.queueId;
+    obj->queue = cmdArgs.args.create.queueId;
+    obj->serverHandle = cmdArgs.args.create.handle;
+
+    PRINTVERBOSE2("MessageQ_create: creating endpoint for: %s, \
+       queueIndex: %d\n", name, queueIndex)
+    status = transportCreateEndpoint(&obj->ipcFd, queueIndex);
+    if (status < 0) {
+       goto cleanup;
+    }
+
+    /*
+     * Now, to support MessageQ_unblock() functionality, create an event object.
+     * Writing to this event will unblock the select() call in MessageQ_get().
+     */
+    if (pipe(fildes) == -1) {
+        printf ("MessageQ_create: pipe creation failed: %d, %s\n",
+                   errno, strerror(errno));
+        status = MessageQ_E_FAIL;
+    }
+    obj->unblockFdW = fildes[1];
+    obj->unblockFdR = fildes[0];
+
+cleanup:
+    /* Cleanup if fail: */
+    if (status < 0) {
+        MessageQ_delete((MessageQ_Handle *)&obj);
+    }
+
+    return ((MessageQ_Handle) obj);
+}
+
+/*
+ * Function to delete a MessageQ object for a specific slave processor.
+ *
+ * Deletes the file descriptors associated with this MessageQ object.
+ */
+Int MessageQ_delete (MessageQ_Handle * handlePtr)
+{
+    Int               status    = MessageQ_S_SUCCESS;
+    MessageQ_Object * obj       = NULL;
+    MessageQDrv_CmdArgs cmdArgs;
+
+    obj = (MessageQ_Object *) (*handlePtr);
+
+    cmdArgs.args.deleteMessageQ.handle = obj->serverHandle;
+    status = MessageQDrv_ioctl (CMD_MESSAGEQ_DELETE, &cmdArgs);
+    if (status < 0) {
+        PRINTVERBOSE1("MessageQ_delete: API (through IOCTL) failed, \
+            status=%d\n", status)
+    }
+
+    /* Close the fds used for MessageQ_unblock(): */
+    close(obj->unblockFdW);
+    close(obj->unblockFdR);
+
+    /* Close the communication endpoint: */
+    status = transportCloseEndpoint(obj->ipcFd);
+
+    /* Now free the obj */
+    free (obj);
+    *handlePtr = NULL;
+
+    return (status);
+}
+
+/*
+ *  Opens an instance of MessageQ for sending.
+ *
+ *  We need not create a tiipc file descriptor here; the file descriptors for
+ *  all remote processors were created during MessageQ_attach(), and will be
+ *  retrieved during MessageQ_put().
+ */
+Int MessageQ_open (String name, MessageQ_QueueId * queueId)
+{
+    Int status = MessageQ_S_SUCCESS;
+
+    status = NameServer_getUInt32 (MessageQ_module->nameServer,
+                                     name, queueId, NULL);
+
+    if (status == NameServer_E_NOTFOUND) {
+        /* Set return queue ID to invalid. */
+        *queueId = MessageQ_INVALIDMESSAGEQ;
+        status = MessageQ_E_NOTFOUND;
+    }
+    else if (status >= 0) {
+        /* Override with a MessageQ status code. */
+        status = MessageQ_S_SUCCESS;
+    }
+    else {
+        /* Set return queue ID to invalid. */
+        *queueId = MessageQ_INVALIDMESSAGEQ;
+        /* Override with a MessageQ status code. */
+        if (status == NameServer_E_TIMEOUT) {
+            status = MessageQ_E_TIMEOUT;
+        }
+        else {
+            status = MessageQ_E_FAIL;
+        }
+    }
+
+    return (status);
+}
+
+/* Closes previously opened instance of MessageQ module. */
+Int MessageQ_close (MessageQ_QueueId * queueId)
+{
+    Int32 status = MessageQ_S_SUCCESS;
+
+    /* Nothing more to be done for closing the MessageQ. */
+    *queueId = MessageQ_INVALIDMESSAGEQ;
+
+    return (status);
+}
+
+/*
+ * Place a message onto a message queue.
+ *
+ * Calls TransportShm_put(), which handles the sending of the message using the
+ * appropriate kernel interface (socket, device ioctl) call for the remote
+ * procId encoded in the queueId argument.
+ *
+ */
+Int MessageQ_put (MessageQ_QueueId queueId, MessageQ_Msg msg)
+{
+    Int      status;
+    UInt16   dstProcId  = (UInt16)(queueId >> 16);
+    UInt16   queueIndex = (MessageQ_QueueIndex)(queueId & 0x0000ffff);
+
+    msg->dstId     = queueIndex;
+    msg->dstProc   = dstProcId;
+
+    status = transportPut(msg, queueIndex, dstProcId);
+
+    return (status);
+}
+
+/*
+ * Gets a message for a message queue and blocks if the queue is empty.
+ * If a message is present, it returns it.  Otherwise it blocks
+ * waiting for a message to arrive.
+ * When a message is returned, it is owned by the caller.
+ *
+ * We block using select() on the receiving tiipc file descriptor, then
+ * get the waiting message via a read.
+ * We use the file descriptors stored in the messageQ object via a previous
+ * call to MessageQ_create().
+ *
+ * Note: We currently do not support messages to be sent between threads on the
+ * lcoal processor.
+ *
+ */
+Int MessageQ_get (MessageQ_Handle handle, MessageQ_Msg * msg ,UInt timeout)
+{
+    Int     status = MessageQ_S_SUCCESS;
+    Int     tmpStatus;
+    MessageQ_Object * obj = (MessageQ_Object *) handle;
+    int     retval;
+    int     nfds;
+    fd_set  rfds;
+    struct  timeval tv;
+    void    *timevalPtr;
+    int     maxfd = 0;
+
+    /* Wait (with timeout) and retreive message */
+    FD_ZERO(&rfds);
+    FD_SET(obj->ipcFd, &rfds);
+    maxfd = obj->ipcFd;
+
+    /* Wait also on the event fd, which may be written by MessageQ_unblock(): */
+    FD_SET(obj->unblockFdR, &rfds);
+
+    if (timeout == MessageQ_FOREVER) {
+        timevalPtr = NULL;
+    }
+    else {
+        /* Timeout given in msec: convert:  */
+        tv.tv_sec = timeout / 1000;
+        tv.tv_usec = (timeout % 1000) * 1000;
+        timevalPtr = &tv;
+    }
+    /* Add one to last fd created: */
+    nfds = ((maxfd > obj->unblockFdR) ? maxfd : obj->unblockFdR) + 1;
+
+    retval = select(nfds, &rfds, NULL, NULL, timevalPtr);
+    if (retval)  {
+        if (FD_ISSET(obj->unblockFdR, &rfds))  {
+            /*
+             * Our event was signalled by MessageQ_unblock().
+             *
+             * This is typically done during a shutdown sequence, where
+             * the intention of the client would be to ignore (i.e. not fetch)
+             * any pending messages in the transport's queue.
+             * Thus, we shall not check for nor return any messages.
+             */
+            *msg = NULL;
+            status = MessageQ_E_UNBLOCKED;
+        }
+        else {
+            if (FD_ISSET(obj->ipcFd, &rfds)) {
+                /* Our transport's fd was signalled: Get the message: */
+                tmpStatus = transportGet(obj->ipcFd, msg);
+                if (tmpStatus < 0) {
+                    printf ("MessageQ_get: tranposrtshm_get failed.");
+                    status = MessageQ_E_FAIL;
+                }
+            }
+        }
+    }
+    else if (retval == 0) {
+        *msg = NULL;
+        status = MessageQ_E_TIMEOUT;
+    }
+
+    return (status);
+}
+
+/*
+ * Return a count of the number of messages in the queue
+ *
+ * TBD: To be implemented. Return -1 for now.
+ */
+Int MessageQ_count (MessageQ_Handle handle)
+{
+    Int               count = -1;
+    return (count);
+}
+
+/* Initializes a message not obtained from MessageQ_alloc. */
+Void MessageQ_staticMsgInit (MessageQ_Msg msg, UInt32 size)
+{
+    /* Fill in the fields of the message */
+    MessageQ_msgInit (msg);
+    msg->heapId  = MessageQ_STATICMSG;
+    msg->msgSize = size;
+}
+
+/*
+ * Allocate a message and initialize the needed fields (note some
+ * of the fields in the header are set via other APIs or in the
+ * MessageQ_put function,
+ */
+MessageQ_Msg MessageQ_alloc (UInt16 heapId, UInt32 size)
+{
+    MessageQ_Msg msg       = NULL;
+
+    /*
+     * heapId not used for local alloc (as this is over a copy transport), but
+     * we need to send to other side as heapId is used in BIOS transport:
+     */
+    msg = (MessageQ_Msg)calloc (1, size);
+    MessageQ_msgInit (msg);
+    msg->msgSize = size;
+    msg->heapId  = heapId;
+
+    return msg;
+}
+
+/* Frees the message back to the heap that was used to allocate it. */
+Int MessageQ_free (MessageQ_Msg msg)
+{
+    UInt32         status = MessageQ_S_SUCCESS;
+
+    /* Check to ensure this was not allocated by user: */
+    if (msg->heapId == MessageQ_STATICMSG)  {
+        status =  MessageQ_E_CANNOTFREESTATICMSG;
+    }
+    else {
+        free (msg);
+    }
+
+    return status;
+}
+
+/* Register a heap with MessageQ. */
+Int MessageQ_registerHeap (Ptr heap, UInt16 heapId)
+{
+    Int  status = MessageQ_S_SUCCESS;
+
+    /* Do nothing, as this uses a copy transport: */
+
+    return status;
+}
+
+/* Unregister a heap with MessageQ. */
+Int MessageQ_unregisterHeap (UInt16 heapId)
+{
+    Int  status = MessageQ_S_SUCCESS;
+
+    /* Do nothing, as this uses a copy transport: */
+
+    return status;
+}
+
+/* Unblocks a MessageQ */
+Void MessageQ_unblock (MessageQ_Handle handle)
+{
+    MessageQ_Object * obj   = (MessageQ_Object *) handle;
+    char         buf = 'n';
+    int          numBytes;
+
+    /* Write to pipe to awaken any threads blocked on this messageQ: */
+    numBytes = write(obj->unblockFdW, &buf, 1);
+}
+
+/* Embeds a source message queue into a message. */
+Void MessageQ_setReplyQueue (MessageQ_Handle handle, MessageQ_Msg msg)
+{
+    MessageQ_Object * obj   = (MessageQ_Object *) handle;
+
+    msg->replyId   = (UInt16)(obj->queue);
+    msg->replyProc = (UInt16)(obj->queue >> 16);
+}
+
+/* Returns the QueueId associated with the handle. */
+MessageQ_QueueId MessageQ_getQueueId (MessageQ_Handle handle)
+{
+    MessageQ_Object * obj = (MessageQ_Object *) handle;
+    UInt32            queueId;
+
+    queueId = (obj->queue);
+
+    return queueId;
+}
+
+/* Sets the tracing of a message */
+Void MessageQ_setMsgTrace (MessageQ_Msg msg, Bool traceFlag)
+{
+    msg->flags = (msg->flags & ~TRACEMASK) |   (traceFlag << TRACESHIFT);
+}
+
+/*
+ *  Returns the amount of shared memory used by one transport instance.
+ *
+ *  The MessageQ module itself does not use any shared memory but the
+ *  underlying transport may use some shared memory.
+ */
+SizeT MessageQ_sharedMemReq (Ptr sharedAddr)
+{
+    SizeT memReq = 0u;
+
+    /* Do nothing, as this is a copy transport. */
+
+    return (memReq);
+}
+
+/*
+ *  Opens a file descriptor for this remote proc.
+ *
+ *  Only opens it if one does not already exist for this procId.
+ *
+ *  Note: remoteProcId may be MultiProc_Self() for loopback case.
+ */
+Int MessageQ_attach (UInt16 remoteProcId, Ptr sharedAddr)
+{
+    Int     status = MessageQ_S_SUCCESS;
+    int     ipcFd;
+    int     err;
+
+    PRINTVERBOSE1("MessageQ_attach: remoteProcId: %d\n", remoteProcId)
+
+    if (remoteProcId >= MultiProc_MAXPROCESSORS) {
+        status = MessageQ_E_INVALIDPROCID;
+        goto exit;
+    }
+
+    pthread_mutex_lock (&(MessageQ_module->gate));
+
+    /* Only open a fd if one doesn't exist: */
+    if (MessageQ_module->ipcFd[remoteProcId] == -1)  {
+        /* Create a fd for sending messages to the remote proc: */
+        ipcFd = open("/dev/tiipc", O_RDWR);
+        if (ipcFd < 0) {
+            status = MessageQ_E_FAIL;
+            printf ("MessageQ_attach: open of tiipc device failed: %d, %s\n",
+                       errno, strerror(errno));
+        }
+        else  {
+            PRINTVERBOSE1("MessageQ_attach: opened tiipc fd for sending: %d\n",
+                ipcFd)
+            MessageQ_module->ipcFd[remoteProcId] = ipcFd;
+            /*
+             * Connect to the remote endpoint and bind any reserved address as
+             * local endpoint
+             */
+            Connect(ipcFd, remoteProcId, MESSAGEQ_RPMSG_PORT);
+            err = BindAddr(ipcFd, TIIPC_ADDRANY);
+            if (err < 0) {
+                status = MessageQ_E_FAIL;
+                printf ("MessageQ_attach: bind failed: %d, %s\n",
+                    errno, strerror(errno));
+            }
+        }
+    }
+    else {
+        status = MessageQ_E_ALREADYEXISTS;
+    }
+
+    pthread_mutex_unlock (&(MessageQ_module->gate));
+
+exit:
+    return (status);
+}
+
+/*
+ *  Close the fd for this remote proc.
+ *
+ */
+Int MessageQ_detach (UInt16 remoteProcId)
+{
+    Int status = MessageQ_S_SUCCESS;
+    int ipcFd;
+
+    if (remoteProcId >= MultiProc_MAXPROCESSORS) {
+        status = MessageQ_E_INVALIDPROCID;
+        goto exit;
+    }
+
+    pthread_mutex_lock (&(MessageQ_module->gate));
+
+    ipcFd = MessageQ_module->ipcFd[remoteProcId];
+    if (close (ipcFd)) {
+        status = MessageQ_E_OSFAILURE;
+        printf("MessageQ_detach: close failed: %d, %s\n",
+                       errno, strerror(errno));
+    }
+    else {
+        PRINTVERBOSE1("MessageQ_detach: closed fd: %d\n", ipcFd)
+        MessageQ_module->ipcFd[remoteProcId] = -1;
+    }
+
+    pthread_mutex_unlock (&(MessageQ_module->gate));
+
+exit:
+    return (status);
+}
+
+/*
+ * This is a helper function to initialize a message.
+ */
+Void MessageQ_msgInit (MessageQ_Msg msg)
+{
+    msg->reserved0 = 0;  /* We set this to distinguish from NameServerMsg */
+    msg->replyId   = (UInt16)MessageQ_INVALIDMESSAGEQ;
+    msg->msgId     = MessageQ_INVALIDMSGID;
+    msg->dstId     = (UInt16)MessageQ_INVALIDMESSAGEQ;
+    msg->flags     = MessageQ_HEADERVERSION | MessageQ_NORMALPRI;
+    msg->srcProc   = MultiProc_self();
+
+    pthread_mutex_lock(&(MessageQ_module->gate));
+    msg->seqNum  = MessageQ_module->seqNum++;
+    pthread_mutex_unlock(&(MessageQ_module->gate));
+}
+
+/*
+ * =============================================================================
+ * Transport: Fxns kept here until need for a transport layer is realized.
+ * =============================================================================
+ */
+/*
+ * ======== transportCreateEndpoint ========
+ *
+ * Create a communication endpoint to receive messages.
+ */
+static Int transportCreateEndpoint(int * fd, UInt16 queueIndex)
+{
+    Int          status    = MessageQ_S_SUCCESS;
+    int          err;
+
+    /* Create a fd to the ti-ipc to receive messages for this messageQ */
+    *fd= open("/dev/tiipc", O_RDWR);
+    if (*fd < 0) {
+        status = MessageQ_E_FAIL;
+        printf ("transportCreateEndpoint: Couldn't open tiipc device: %d, %s\n",
+                  errno, strerror(errno));
+
+        goto exit;
+    }
+
+    PRINTVERBOSE1("transportCreateEndpoint: opened fd: %d\n", *fd)
+
+    err = BindAddr(*fd, (UInt32)queueIndex);
+    if (err < 0) {
+        status = MessageQ_E_FAIL;
+        printf ("transportCreateEndpoint: bind failed: %d, %s\n",
+                  errno, strerror(errno));
+    }
+
+exit:
+    return (status);
+}
+
+/*
+ * ======== transportCloseEndpoint ========
+ *
+ *  Close the communication endpoint.
+ */
+static Int transportCloseEndpoint(int fd)
+{
+    Int status = MessageQ_S_SUCCESS;
+
+    PRINTVERBOSE1("transportCloseEndpoint: closing fd: %d\n", fd)
+
+    /* Stop communication to this endpoint */
+    close(fd);
+
+    return (status);
+}
+
+/*
+ * ======== transportGet ========
+ *  Retrieve a message waiting in the queue.
+*/
+static Int transportGet(int fd, MessageQ_Msg * retMsg)
+{
+    Int           status    = MessageQ_S_SUCCESS;
+    MessageQ_Msg  msg;
+    int           ret;
+    int           byteCount;
+    tiipc_remote_params remote;
+
+    /*
+     * We have no way of peeking to see what message size we'll get, so we
+     * allocate a message of max size to receive contents from tiipc
+     * (currently, a copy transport)
+     */
+    msg = MessageQ_alloc (0, MESSAGEQ_RPMSG_MAXSIZE);
+    if (!msg)  {
+        status = MessageQ_E_MEMORY;
+        goto exit;
+    }
+
+    /* Get message */
+    byteCount = read(fd, msg, MESSAGEQ_RPMSG_MAXSIZE);
+    if (byteCount < 0) {
+        printf("read failed: %s (%d)\n", strerror(errno), errno);
+        status = MessageQ_E_FAIL;
+        goto exit;
+    }
+    else {
+         /* Update the allocated message size (even though this may waste space
+          * when the actual message is smaller than the maximum rpmsg size,
+          * the message will be freed soon anyway, and it avoids an extra copy).
+          */
+         msg->msgSize = byteCount;
+
+         /*
+          * If the message received was statically allocated, reset the
+          * heapId, so the app can free it.
+          */
+         if (msg->heapId == MessageQ_STATICMSG)  {
+             msg->heapId = 0;  /* for a copy transport, heap id is 0. */
+         }
+    }
+
+    PRINTVERBOSE1("transportGet: read from fd: %d\n", fd)
+    ret = ioctl(fd, TIIPC_IOCGETREMOTE, &remote);
+    PRINTVERBOSE3("\tReceived a msg: byteCount: %d, rpmsg addr: %d, rpmsg \
+        proc: %d\n", byteCount, remote.remote_addr, remote.remote_proc)
+    PRINTVERBOSE2("\tMessage Id: %d, Message size: %d\n", msg->msgId, msg->msgSize)
+
+    *retMsg = msg;
+
+exit:
+    return (status);
+}
+
+/*
+ * ======== transportPut ========
+ *
+ * Write to tiipc file descriptor associated with
+ * with this destination procID.
+ */
+static Int transportPut(MessageQ_Msg msg, UInt16 dstId, UInt16 dstProcId)
+{
+    Int     status    = MessageQ_S_SUCCESS;
+    int     ipcFd;
+    int     err;
+
+    /*
+     * Retrieve the tiipc file descriptor associated with this
+     * transport for the destination processor.
+     */
+    ipcFd = MessageQ_module->ipcFd[dstProcId];
+
+    PRINTVERBOSE2("Sending msgId: %d via fd: %d\n", msg->msgId, ipcFd)
+
+    /* send response message to remote processor */
+    err = write(ipcFd, msg, msg->msgSize);
+    if (err < 0) {
+        printf ("transportPut: write failed: %d, %s\n",
+                  errno, strerror(errno));
+        status = MessageQ_E_FAIL;
+    }
+
+    /*
+     * Free the message, as this is a copy transport, we maintain MessageQ
+     * semantics.
+     */
+    MessageQ_free (msg);
+
+    return (status);
+}
diff --git a/qnx/src/api/NameServer.c b/qnx/src/api/NameServer.c
new file mode 100644 (file)
index 0000000..de2cf43
--- /dev/null
@@ -0,0 +1,234 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/*
+ *  ======== NameServer.c ========
+ */
+#include <Std.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <time.h>
+
+#include <ti/ipc/NameServer.h>
+#include <_IpcLog.h>
+#include <_MultiProc.h>
+#include <ti/syslink/inc/IoctlDefs.h>
+#include <ti/syslink/inc/usr/Qnx/NameServerDrv.h>
+#include <ti/syslink/inc/NameServerDrvDefs.h>
+
+static Bool verbose = FALSE;
+
+
+/*
+ * The NameServer_*() APIs are reproduced here.  These versions are just
+ * front-ends for communicating with the actual NameServer module (currently
+ * implemented in the IPC driver process acting as a daemon).
+ */
+
+Int NameServer_setup(Void)
+{
+    Int status;
+    NameServerDrv_CmdArgs cmdArgs;
+
+    status = NameServerDrv_ioctl (CMD_NAMESERVER_SETUP, &cmdArgs);
+    if (status < 0) {
+        PRINTVERBOSE1("NameServer_setup: API (through IOCTL) failed, \
+            status=%d\n", status)
+    }
+
+    return status;
+}
+
+Int NameServer_destroy(Void)
+{
+    Int status;
+
+    NameServerDrv_CmdArgs cmdArgs;
+
+    PRINTVERBOSE0("NameServer_destroy: entered\n")
+
+    status = NameServerDrv_ioctl (CMD_NAMESERVER_DESTROY, &cmdArgs);
+
+    if (status < 0) {
+        PRINTVERBOSE1("NameServer_destroy: API (through IOCTL) failed, \
+            status=%d\n", status)
+    }
+
+    return status;
+}
+
+Void NameServer_Params_init(NameServer_Params *params)
+{
+    Int status;
+    NameServerDrv_CmdArgs cmdArgs;
+
+    cmdArgs.args.ParamsInit.params = params;
+    status = NameServerDrv_ioctl (CMD_NAMESERVER_PARAMS_INIT, &cmdArgs);
+
+    if (status < 0) {
+        PRINTVERBOSE1("NameServer_Params_init: API (through IOCTL) failed, \
+            status=%d\n", status)
+        return;
+    }
+
+    return;
+}
+
+NameServer_Handle NameServer_create(String name,
+                                    const NameServer_Params *params)
+{
+    Int status;
+    NameServerDrv_CmdArgs cmdArgs;
+
+    cmdArgs.args.create.name    = name;
+    cmdArgs.args.create.nameLen = strlen (name) + 1;
+    cmdArgs.args.create.params  = (NameServer_Params *) params;
+
+    status = NameServerDrv_ioctl (CMD_NAMESERVER_CREATE, &cmdArgs);
+
+    if (status < 0) {
+        PRINTVERBOSE1("NameServer_create: API (through IOCTL) failed, \
+            status=%d\n", status)
+        return NULL;
+    }
+
+    return cmdArgs.args.create.handle;
+}
+
+Ptr NameServer_addUInt32(NameServer_Handle nsHandle, String name, UInt32 value)
+{
+    Int status;
+    NameServerDrv_CmdArgs cmdArgs;
+
+    cmdArgs.args.addUInt32.handle  = nsHandle;
+    cmdArgs.args.addUInt32.name    = name;
+    cmdArgs.args.addUInt32.nameLen = strlen(name) + 1;
+    cmdArgs.args.addUInt32.value   = value;
+    status = NameServerDrv_ioctl(CMD_NAMESERVER_ADDUINT32, &cmdArgs);
+
+    if (status < 0) {
+        PRINTVERBOSE1("NameServer_addUInt32: API (through IOCTL) failed, \
+            status=%d\n", status)
+        return NULL;
+    }
+
+    return cmdArgs.args.addUInt32.entry;
+}
+
+Int NameServer_getUInt32(NameServer_Handle nsHandle, String name, Ptr buf,
+                          UInt16 procId[])
+{
+    Int status;
+    UInt32 *val;
+    NameServerDrv_CmdArgs cmdArgs;
+
+    cmdArgs.args.getUInt32.name  = name;
+    cmdArgs.args.getUInt32.handle  = nsHandle;
+    if (procId != NULL) {
+        memcpy(cmdArgs.args.getUInt32.procId, procId,
+               sizeof(UInt16) * MultiProc_MAXPROCESSORS);
+    }
+    else {
+        cmdArgs.args.getUInt32.procId[0] = (UInt16)-1;
+    }
+    status = NameServerDrv_ioctl (CMD_NAMESERVER_GETUINT32, &cmdArgs);
+
+    if (status < 0) {
+        PRINTVERBOSE1("NameServer_getUInt32: API (through IOCTL) failed, \
+            status=%d\n", status)
+        return status;
+    }
+
+    val = (UInt32 *)buf;
+    *val = cmdArgs.args.getUInt32.value;
+
+    return status;
+}
+
+Int NameServer_remove(NameServer_Handle nsHandle, String name)
+{
+    Int status;
+    NameServerDrv_CmdArgs cmdArgs;
+
+    cmdArgs.args.remove.handle  = nsHandle;
+    cmdArgs.args.remove.name    = name;
+    cmdArgs.args.remove.nameLen = strlen(name) + 1;
+    status = NameServerDrv_ioctl(CMD_NAMESERVER_REMOVE, &cmdArgs);
+
+    if (status < 0) {
+        PRINTVERBOSE1("NameServer_remove: API (through IOCTL) failed, \
+            status=%d\n", status)
+    }
+
+    return status;
+}
+
+Int NameServer_removeEntry(NameServer_Handle nsHandle, Ptr entry)
+{
+    Int status;
+    NameServerDrv_CmdArgs cmdArgs;
+
+    cmdArgs.args.removeEntry.handle = nsHandle;
+    cmdArgs.args.removeEntry.entry  = entry;
+    status = NameServerDrv_ioctl (CMD_NAMESERVER_REMOVEENTRY, &cmdArgs);
+
+    if (status < 0) {
+        PRINTVERBOSE1("NameServer_removeEntry: API (through IOCTL) failed, \
+            status=%d\n", status)
+    }
+
+    return status;
+}
+
+Int NameServer_delete(NameServer_Handle *nsHandle)
+{
+    Int status;
+    NameServerDrv_CmdArgs cmdArgs;
+
+    cmdArgs.args.delete.handle = *nsHandle;
+    status = NameServerDrv_ioctl (CMD_NAMESERVER_DELETE, &cmdArgs);
+
+    if (status < 0) {
+        PRINTVERBOSE1("NameServer_delete: API (through IOCTL) failed, \
+            status=%d\n", status)
+        return status;
+    }
+
+    *nsHandle = cmdArgs.args.delete.handle;
+
+    return status;
+}
diff --git a/qnx/src/api/arm/Makefile b/qnx/src/api/arm/Makefile
new file mode 100644 (file)
index 0000000..dbffb72
--- /dev/null
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=VARIANT
+ifndef QRECURSE
+QRECURSE=recurse.mk
+ifdef QCONFIG
+QRDIR=$(dir $(QCONFIG))
+endif
+endif
+include $(QRDIR)$(QRECURSE)
diff --git a/qnx/src/api/arm/a.g.le.v7/Makefile b/qnx/src/api/arm/a.g.le.v7/Makefile
new file mode 100644 (file)
index 0000000..0bdf91d
--- /dev/null
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 ../../common.mk
diff --git a/qnx/src/api/arm/a.le.v7/Makefile b/qnx/src/api/arm/a.le.v7/Makefile
new file mode 100644 (file)
index 0000000..94992d8
--- /dev/null
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 ../../common.mk
+
+CCFLAGS += -O3
diff --git a/qnx/src/api/common.mk b/qnx/src/api/common.mk
new file mode 100644 (file)
index 0000000..cbbe938
--- /dev/null
@@ -0,0 +1,61 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 QCONFIG
+QCONFIG=qconfig.mk
+endif
+include $(QCONFIG)
+
+NAME = ipc
+
+define PINFO
+PINFO DESCRIPTION=IPC QNX User library
+endef
+
+# don't install the binaries, they are copied in base makefile
+INSTALLDIR = /dev/null
+
+CCOPTS += -DSYSLINK_BUILDOS_QNX
+
+# source path
+EXTRA_SRCVPATH += \
+       $(IPC_REPO)/qnx/src/api \
+
+EXCLUDE_OBJS =
+
+# include path
+EXTRA_INCVPATH += \
+        $(IPC_REPO)/packages \
+       $(IPC_REPO)/qnx/include \
+       $(IPC_REPO)/qnx/src/ipc3x_dev
+
+include $(MKFILES_ROOT)/qtargets.mk
+OPTIMIZE__gcc=$(OPTIMIZE_NONE_gcc)
diff --git a/qnx/src/family/Makefile b/qnx/src/family/Makefile
new file mode 100644 (file)
index 0000000..02aa99c
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=CPU
+include recurse.mk
diff --git a/qnx/src/family/SystemCfg_omap5432.c b/qnx/src/family/SystemCfg_omap5432.c
new file mode 100644 (file)
index 0000000..f00c382
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/*
+ * ========SystemCfg.c ========
+ * System-wide configuration
+ */
+
+/* Standard headers */
+#include <Std.h>
+
+/* For Backplane IPC startup/shutdown stuff: */
+#include <_MultiProc.h>
+
+/* This must match BIOS side MultiProc configuration for given platform!: */
+MultiProc_Config _MultiProc_cfg =  {
+   .numProcessors = 2,
+   .nameList[0] = "HOST",
+   .nameList[1] = "CORE0",
+/*   .nameList[2] = "DSP",  TODO: Commented out for now til DSP validated */
+   .id = 0,                 /* The host is always zero */
+};
diff --git a/qnx/src/family/arm/Makefile b/qnx/src/family/arm/Makefile
new file mode 100644 (file)
index 0000000..dbffb72
--- /dev/null
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=VARIANT
+ifndef QRECURSE
+QRECURSE=recurse.mk
+ifdef QCONFIG
+QRDIR=$(dir $(QCONFIG))
+endif
+endif
+include $(QRDIR)$(QRECURSE)
diff --git a/qnx/src/family/arm/a.g.le.v7/Makefile b/qnx/src/family/arm/a.g.le.v7/Makefile
new file mode 100644 (file)
index 0000000..0bdf91d
--- /dev/null
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 ../../common.mk
diff --git a/qnx/src/family/arm/a.le.v7/Makefile b/qnx/src/family/arm/a.le.v7/Makefile
new file mode 100644 (file)
index 0000000..94992d8
--- /dev/null
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 ../../common.mk
+
+CCFLAGS += -O3
diff --git a/qnx/src/family/common.mk b/qnx/src/family/common.mk
new file mode 100644 (file)
index 0000000..2ba45bf
--- /dev/null
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 QCONFIG
+QCONFIG=qconfig.mk
+endif
+include $(QCONFIG)
+
+NAME = cfg
+
+define PINFO
+PINFO DESCRIPTION=IPC QNX CONFIGURATION LIBRARY
+endef
+
+# don't install the binaries, they are copied in base makefile
+INSTALLDIR = /dev/null
+
+# platform dependent source files
+SRCS += \
+        $(IPC_REPO)/qnx/src/family/SystemCfg_$(PLATFORM).c \
+
+EXCLUDE_OBJS =
+
+# include path
+EXTRA_INCVPATH += \
+        $(IPC_REPO) \
+        $(IPC_REPO)/qnx/include
+
+include $(MKFILES_ROOT)/qtargets.mk
+OPTIMIZE__gcc=$(OPTIMIZE_NONE_gcc)
index 6b48d83275e53c2e521760ab63f75b699a3107ed..b0b5ce4514d4f6fe36fd51a90d0820959473c965 100644 (file)
@@ -51,7 +51,9 @@ EXTRA_INCVPATH+=$(SYSLINK_ROOT)       \
                                $(SYSLINK_ROOT)/ti/syslink/inc  \
                                $(SYSLINK_ROOT)/ti/syslink/inc/usr/$(SYSLINK_BUILDOS)   \
                                $(SYSLINK_ROOT)/ti/syslink/inc/usr      \
-                               $(SYSLINK_ROOT)/ti/syslink/inc/$(SYSLINK_BUILDOS)
+                               $(SYSLINK_ROOT)/ti/syslink/inc/$(SYSLINK_BUILDOS) \
+                               $(IPC_REPO)/packages \
+                               $(IPC_REPO)/qnx/include
 #SRCS:=$(CSRCS)
 
 #SRCDIRS=$(sort $(foreach i,$(CSRCS),$(shell dirname $i)))
index a02e12471d77c2bb74f0963ae395f6b3feabd27f..b2d0602e20cad61a4be63fdae566bd40e6a42812 100644 (file)
@@ -110,6 +110,8 @@ EXTRA_INCVPATH = $(SYSLINK_ROOT)    \
                  $(SYSLINK_ROOT)/tiler/usr/memmgr/public       \
                  $(SYSLINK_ROOT)/tiler/resmgr/tiler/public     \
                  $(SYSLINK_ROOT)/ti/syslink/resources  \
+                 $(IPC_REPO)/qnx/include \
+                 $(IPC_REPO)/packages \
 
 #devctl for ipc, procmgr, utils
 EXTRA_SRCVPATH+=$(SYSLINK_ROOT)/ti/syslink/procMgr/hlos/knl    \
@@ -178,6 +180,14 @@ EXTRA_LIBVPATH += $(INSTALL_ROOT_nto)/usr/lib
 
 EXTRA_LIBVPATH += $(SYSLINK_ROOT)/tiler/usr/memmgr/arm/so.le.v7
 
+ifeq ("$(SYSLINK_DEBUG)", "1")
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/utils/arm/a.g.le.v7
+LIBS += utils_g
+else
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/utils/arm/a.le.v7
+LIBS += utils
+endif # ifeq ("$(SYSLINK_DEBUG)", "1")
+
 ifeq ("$(SYSLINK_PLATFORM)", "omap4430")
 LIBS += powman camdrv login slog2
 endif
diff --git a/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/resmgr/dcmd_syslink.h b/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/resmgr/dcmd_syslink.h
new file mode 100644 (file)
index 0000000..6fde47d
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/*!
+ *  @file       dcmd_syslink.h
+ *
+ *  @brief      DCMD definitions for ipc device
+ *
+ *  @ver        0001
+ */
+#ifndef DCMD_SYSLINK_H
+#define DCMD_SYSLINK_H
+
+#include <devctl.h>
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+#define _DCMD_SYSLINK   _DCMD_MISC
+
+typedef enum {
+    _DCMD_SYSLINK_NAMESERVER = 0x2A,
+    _DCMD_SYSLINK_MESSAGEQ,
+} dcmd_class_t_val;
+
+/*  ----------------------------------------------------------------------------
+ *  DEVCTL command IDs for Nameserver
+ *  ----------------------------------------------------------------------------
+ */
+/*!
+ *  @brief  Command for NameServer_setup
+ */
+#define DCMD_NAMESERVER_SETUP               __DIOTF(_DCMD_SYSLINK_NAMESERVER,\
+                                            2,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_setup
+ */
+#define DCMD_NAMESERVER_DESTROY             __DIOTF(_DCMD_SYSLINK_NAMESERVER,\
+                                            3,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_destroy
+ */
+#define DCMD_NAMESERVER_PARAMS_INIT         __DIOTF(_DCMD_SYSLINK_NAMESERVER,\
+                                            4,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_create
+ */
+#define DCMD_NAMESERVER_CREATE              __DIOTF(_DCMD_SYSLINK_NAMESERVER,\
+                                            5,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_delete
+ */
+#define DCMD_NAMESERVER_DELETE              __DIOTF(_DCMD_SYSLINK_NAMESERVER,\
+                                            6,\
+                                            NameServerDrv_CmdArgs)
+
+/*!
+ *  @brief  Command for NameServer_addUInt32
+ */
+#define DCMD_NAMESERVER_ADDUINT32           __DIOTF(_DCMD_SYSLINK_NAMESERVER,\
+                                            7,\
+                                            NameServerDrv_CmdArgs)
+
+/*!
+ *  @brief  Command for NameServer_remove
+ */
+#define DCMD_NAMESERVER_REMOVE              __DIOTF(_DCMD_SYSLINK_NAMESERVER,\
+                                            8,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_removeEntry
+ */
+#define DCMD_NAMESERVER_REMOVEENTRY         __DIOTF(_DCMD_SYSLINK_NAMESERVER,\
+                                            9,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_getUInt32
+ */
+#define DCMD_NAMESERVER_GETUINT32           __DIOTF(_DCMD_SYSLINK_NAMESERVER,\
+                                            10, \
+                                            NameServerDrv_CmdArgs)
+
+
+/*  ----------------------------------------------------------------------------
+*   IOCTL command IDs for MessageQ
+*   ----------------------------------------------------------------------------
+*/
+
+/*!
+ *  @brief  Command for MessageQ_getConfig
+*/
+#define DCMD_MESSAGEQ_GETCONFIG             __DIOTF(_DCMD_SYSLINK_MESSAGEQ,\
+                                            1,\
+                                            MessageQDrv_CmdArgs)
+/*!
+ *  @brief  Command for MessageQ_setup
+*/
+#define DCMD_MESSAGEQ_SETUP                 __DIOTF(_DCMD_SYSLINK_MESSAGEQ,\
+                                            2,\
+                                            MessageQDrv_CmdArgs)
+/*!
+ *  @brief  Command for MessageQ_setup
+*/
+#define DCMD_MESSAGEQ_DESTROY               __DIOTF(_DCMD_SYSLINK_MESSAGEQ,\
+                                            3,\
+                                            MessageQDrv_CmdArgs)
+/*!
+ *  @brief  Command for MessageQ_create
+*/
+#define DCMD_MESSAGEQ_CREATE                __DIOTF(_DCMD_SYSLINK_MESSAGEQ,\
+                                            4,\
+                                            MessageQDrv_CmdArgs)
+/*!
+ *  @brief  Command for MessageQ_delete
+*/
+#define DCMD_MESSAGEQ_DELETE                __DIOTF(_DCMD_SYSLINK_MESSAGEQ,\
+                                            5,\
+                                            MessageQDrv_CmdArgs)
+
+#if defined (__cplusplus)
+}
+#endif
+
+#endif
index 5c8d3c2b27478d91d4410f636b25c47d4bf09a24..5332004f512a1eed8279b36640874064c1831d91 100644 (file)
@@ -8,7 +8,7 @@
  *
  *  ============================================================================
  *
- *  Copyright (c) 2010-2011, Texas Instruments Incorporated
+ *  Copyright (c) 2010-2013, Texas Instruments Incorporated
  *
  *  Redistribution and use in source and binary forms, with or without
  *  modification, are permitted provided that the following conditions
@@ -84,7 +84,7 @@ struct syslink_attr;
 #include "ti/syslink/utils/List.h"
 #include <OsalThread.h>
 
-#define SYSLINK_DEVICE_PATH        "/dev/syslink"
+#define IPC_DEVICE_PATH        "/dev/ipc"
 
 #define NUM_REMOTE_PROCS 3
 
index f7a766a28a00f65efa5494dac049367b25bb96f3..fbdd3c37519133808f1479aebe531ee670fe3db7 100644 (file)
@@ -8,7 +8,7 @@
  *
  *  ============================================================================
  *
- *  Copyright (c) 2010-2011, Texas Instruments Incorporated
+ *  Copyright (c) 2010-2013, Texas Instruments Incorporated
  *
  *  Redistribution and use in source and binary forms, with or without
  *  modification, are permitted provided that the following conditions
@@ -66,6 +66,9 @@
 #include <ti/syslink/Std.h>
 #include "MessageQCopyDrvDefs.h"
 #include "HwSpinLockCmdBase.h"
+#include "NameServerDrvDefs.h"
+#include "MessageQDrvDefs.h"
+#include <ti/syslink/build/Qnx/resmgr/dcmd_syslink.h>
 
 #include <ti/syslink/utils/Trace.h>
 
@@ -73,6 +76,10 @@ extern Int MessageQCopyDrv_devctl (resmgr_context_t *ctp, io_devctl_t *msg,
                                    syslink_ocb_t *ocb);
 extern Int GateHWSpinlockDrv_devctl (resmgr_context_t * ctp, io_devctl_t * msg,
                                      syslink_ocb_t * ocb);
+extern int syslink_messageq_devctl(resmgr_context_t *ctp, io_devctl_t *msg,
+                                   syslink_ocb_t *ocb);
+extern int syslink_nameserver_devctl(resmgr_context_t *ctp, io_devctl_t *msg,
+                                     syslink_ocb_t * ocb);
 
 /**
  * Handler for devctl() messages.
@@ -111,7 +118,12 @@ int syslink_devctl(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb)
         case HWSPINLOCKDRV_BASE_CMD:
             status = GateHWSpinlockDrv_devctl(ctp, msg, ocb);
             break;
-
+        case _DCMD_SYSLINK_NAMESERVER:
+            status = syslink_nameserver_devctl(ctp, msg, ocb);
+            break;
+        case _DCMD_SYSLINK_MESSAGEQ:
+            status = syslink_messageq_devctl(ctp, msg, ocb);
+            break;
         default:
             status = _RESMGR_ERRNO(ENOSYS);
             GT_1trace( curTrace, GT_3CLASS,
index 16708b25a4eee5f7c88fdef190bef40ca0464ff7..8aac3981449f920e17f309cc2bde7a4ac9274d0c 100644 (file)
@@ -8,7 +8,7 @@
  *
  *  ============================================================================
  *
- *  Copyright (c) 2011-2012, Texas Instruments Incorporated
+ *  Copyright (c) 2011-2013, Texas Instruments Incorporated
  *
  *  Redistribution and use in source and binary forms, with or without
  *  modification, are permitted provided that the following conditions
@@ -341,6 +341,14 @@ int init_syslink_device(syslink_dev_t *dev)
     attr->mount = &dev->syslink.mattr;
     iofunc_time_update(attr);
 
+    if (-1 == (dev->syslink.resmgr_id =
+        resmgr_attach(dev->dpp, &resmgr_attr,
+                      IPC_DEVICE_PATH, _FTYPE_ANY, 0,
+                      &dev->syslink.cfuncs,
+                      &dev->syslink.iofuncs, attr))) {
+        return(-1);
+    }
+
     for (i = 0; i < syslink_num_cores; i++) {
         iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &dev->syslink.cfuncs_trace[i],
                          _RESMGR_IO_NFUNCS, &dev->syslink.iofuncs_trace[i]);
@@ -401,6 +409,12 @@ int deinit_syslink_device(syslink_dev_t *dev)
     int status = EOK;
     int i = 0;
 
+    status = resmgr_detach(dev->dpp, dev->syslink.resmgr_id, 0);
+    if (status < 0) {
+        Osal_printf("syslink: resmgr_detach failed %d", errno);
+        status = errno;
+    }
+
     for (i = 0; i < syslink_num_cores; i++) {
         status = resmgr_detach(dev->dpp, dev->syslink.resmgr_id_trace[i], 0);
         if (status < 0) {
diff --git a/qnx/src/ipc3x_dev/ti/syslink/inc/IoctlDefs.h b/qnx/src/ipc3x_dev/ti/syslink/inc/IoctlDefs.h
new file mode 100644 (file)
index 0000000..93529cd
--- /dev/null
@@ -0,0 +1,68 @@
+/**
+ *  @file   IoctlDefs.h
+ *
+ *  @brief
+ *
+ *
+ */
+/*
+ *  ============================================================================
+ *
+ *  Copyright (c) 2008-2013, Texas Instruments Incorporated
+ *
+ *  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.
+ *  Contact information for paper mail:
+ *  Texas Instruments
+ *  Post Office Box 655303
+ *  Dallas, Texas 75265
+ *  Contact information:
+ *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
+ *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
+ *  ============================================================================
+ *
+ */
+
+
+#ifndef IOCTLDEFS_H_
+#define IOCTLDEFS_H_
+
+#include <sys/ioctl.h>
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+#ifndef _IOWR
+#define _IOWR(x,y,z) y
+#endif /* #ifndef _IOWR */
+
+#if defined (__cplusplus)
+}
+#endif /* defined (__cplusplus) */
+
+#endif /* ifndef IOCTLDEFS_H_ */
\ No newline at end of file
diff --git a/qnx/src/ipc3x_dev/ti/syslink/inc/MessageQDrvDefs.h b/qnx/src/ipc3x_dev/ti/syslink/inc/MessageQDrvDefs.h
new file mode 100644 (file)
index 0000000..cce059d
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/*!
+ *  @file       MessageQDrvDefs.h
+ *
+ *  @brief      Definitions of MessageQDrv types and structures.
+ */
+
+
+#ifndef MESSAGEQ_DRVDEFS_H_0xf653
+#define MESSAGEQ_DRVDEFS_H_0xf653
+
+/* Module headers */
+#include <ti/ipc/MessageQ.h>
+#include "_MessageQ.h"
+#include "IpcCmdBase.h"
+#include <ti/syslink/inc/IoctlDefs.h>
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+
+/*  ----------------------------------------------------------------------------
+ *  IOCTL command IDs for MessageQ
+ *  ----------------------------------------------------------------------------
+ */
+/*!
+ *  @brief  Base command ID for MessageQ
+ */
+#define MESSAGEQ_BASE_CMD                 0x150
+
+/*!
+ *  @brief  Command for MessageQ_getConfig
+ */
+#define CMD_MESSAGEQ_GETCONFIG              _IOWR(IPCCMDBASE,\
+                                            MESSAGEQ_BASE_CMD + 1u,\
+                                            MessageQDrv_CmdArgs)
+/*!
+ *  @brief  Command for MessageQ_setup
+ */
+#define CMD_MESSAGEQ_SETUP                  _IOWR(IPCCMDBASE,\
+                                            MESSAGEQ_BASE_CMD + 2u,\
+                                            MessageQDrv_CmdArgs)
+/*!
+ *  @brief  Command for MessageQ_setup
+ */
+#define CMD_MESSAGEQ_DESTROY                _IOWR(IPCCMDBASE,\
+                                            MESSAGEQ_BASE_CMD + 3u,\
+                                            MessageQDrv_CmdArgs)
+/*!
+ *  @brief  Command for MessageQ_create
+ */
+#define CMD_MESSAGEQ_CREATE                 _IOWR(IPCCMDBASE,\
+                                            MESSAGEQ_BASE_CMD + 4u,\
+                                            MessageQDrv_CmdArgs)
+
+/*!
+ *  @brief  Command for MessageQ_delete
+ */
+#define CMD_MESSAGEQ_DELETE                 _IOWR(IPCCMDBASE,\
+                                            MESSAGEQ_BASE_CMD + 5u,\
+                                            MessageQDrv_CmdArgs)
+
+/*  ----------------------------------------------------------------------------
+ *  Command arguments for MessageQ
+ *  ----------------------------------------------------------------------------
+ */
+/*!
+ *  @brief  Command arguments for MessageQ
+ */
+typedef struct MessageQDrv_CmdArgs_Tag {
+    union {
+        struct {
+            MessageQ_Config     * config;
+        } getConfig;
+
+        struct {
+            MessageQ_Config     * config;
+            NameServer_Handle     nameServerHandle;
+        } setup;
+
+        struct {
+            Ptr                   handle;
+            String                name;
+            MessageQ_Params     * params;
+            UInt32                nameLen;
+            MessageQ_QueueId      queueId;
+        } create;
+
+        struct {
+            Ptr                  handle;
+        } deleteMessageQ;
+
+    } args;
+
+    Int32 apiStatus;
+} MessageQDrv_CmdArgs;
+
+
+#if defined (__cplusplus)
+}
+#endif /* defined (__cplusplus) */
+
+
+#endif /* MESSAGEQ_DRVDEFS_H_0xf653 */
diff --git a/qnx/src/ipc3x_dev/ti/syslink/inc/NameServerDrvDefs.h b/qnx/src/ipc3x_dev/ti/syslink/inc/NameServerDrvDefs.h
new file mode 100644 (file)
index 0000000..675484d
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/*!
+ *  @file       NameServerDrvDefs.h
+ *
+ *  @brief      Definitions of NameServerDrv types and structures.
+ *
+ */
+
+
+#ifndef NAMESERVER_DRVDEFS_H
+#define NAMESERVER_DRVDEFS_H
+
+
+#include <ti/ipc/NameServer.h>
+#include "UtilsCmdBase.h"
+#include "_NameServer.h"
+#include "_MultiProc.h"
+#include <ti/syslink/inc/IoctlDefs.h>
+
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+
+/*  ----------------------------------------------------------------------------
+ *  IOCTL command IDs for NameServer
+ *  ----------------------------------------------------------------------------
+ */
+/*!
+ *  @brief  Base command ID for NameServer
+ */
+#define NAMESERVER_BASE_CMD                 (0x130)
+
+/*!
+ *  @brief  Command for NameServer_setup
+ */
+#define CMD_NAMESERVER_SETUP                _IOWR(UTILSCMDBASE,\
+                                            NAMESERVER_BASE_CMD + 2u,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_setup
+ */
+#define CMD_NAMESERVER_DESTROY                _IOWR(UTILSCMDBASE,\
+                                            NAMESERVER_BASE_CMD + 3u,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_destroy
+ */
+#define CMD_NAMESERVER_PARAMS_INIT          _IOWR(UTILSCMDBASE,\
+                                            NAMESERVER_BASE_CMD + 4u,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_create
+ */
+#define CMD_NAMESERVER_CREATE                _IOWR(UTILSCMDBASE,\
+                                            NAMESERVER_BASE_CMD + 5u,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_delete
+ */
+#define CMD_NAMESERVER_DELETE                _IOWR(UTILSCMDBASE,\
+                                            NAMESERVER_BASE_CMD + 6u,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_addUInt32
+ */
+#define CMD_NAMESERVER_ADDUINT32                _IOWR(UTILSCMDBASE,\
+                                            NAMESERVER_BASE_CMD + 7u,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_remove
+ */
+#define CMD_NAMESERVER_REMOVE                _IOWR(UTILSCMDBASE,\
+                                            NAMESERVER_BASE_CMD + 8u,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_removeEntry
+ */
+#define CMD_NAMESERVER_REMOVEENTRY          _IOWR(UTILSCMDBASE,\
+                                            NAMESERVER_BASE_CMD + 9u,\
+                                            NameServerDrv_CmdArgs)
+/*!
+ *  @brief  Command for NameServer_close
+ */
+#define CMD_NAMESERVER_GETUINT32            _IOWR(UTILSCMDBASE,\
+                                            NAMESERVER_BASE_CMD + 10u,\
+                                            NameServerDrv_CmdArgs)
+
+
+/*  ----------------------------------------------------------------------------
+ *  Command arguments for NameServer
+ *  ----------------------------------------------------------------------------
+ */
+/*!
+ *  @brief  Command arguments for NameServer
+ */
+typedef struct NameServerDrv_CmdArgs {
+    union {
+        struct {
+            NameServer_Params * params;
+        } ParamsInit;
+
+        struct {
+            NameServer_Handle   handle;
+            String              name;
+            UInt32              nameLen;
+            NameServer_Params * params;
+        } create;
+
+        struct {
+            NameServer_Handle   handle;
+        } delete;
+
+        struct {
+            NameServer_Handle   handle;
+            String              name;
+            UInt32              nameLen;
+            UInt32              value;
+            Ptr                 entry;
+        } addUInt32;
+
+        struct {
+            NameServer_Handle   handle;
+            String              name;
+            UInt32              value;
+            UInt16              procId[MultiProc_MAXPROCESSORS];
+        } getUInt32;
+
+        struct {
+            NameServer_Handle   handle;
+            String              name;
+            UInt32              nameLen;
+        } remove;
+
+        struct {
+            NameServer_Handle   handle;
+            Ptr                 entry;
+        } removeEntry;
+    } args;
+
+    Int32 apiStatus;
+} NameServerDrv_CmdArgs;
+
+
+#if defined (__cplusplus)
+}
+#endif /* defined (__cplusplus) */
+
+
+#endif /* NameServer_DrvDefs_H */
diff --git a/qnx/src/ipc3x_dev/ti/syslink/inc/usr/Qnx/IpcDrv.h b/qnx/src/ipc3x_dev/ti/syslink/inc/usr/Qnx/IpcDrv.h
new file mode 100644 (file)
index 0000000..c7b58f1
--- /dev/null
@@ -0,0 +1,77 @@
+/**
+ *  @file   IpcDrv.h
+ *
+ *  @brief      Declarations of OS-specific functionality for Ipc
+ *
+ *              This file contains declarations of OS-specific functions for
+ *              IPC.
+ */
+/*
+ *  ============================================================================
+ *
+ *  Copyright (c) 2013, Texas Instruments Incorporated
+ *
+ *  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.
+ *  Contact information for paper mail:
+ *  Texas Instruments
+ *  Post Office Box 655303
+ *  Dallas, Texas 75265
+ *  Contact information:
+ *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
+ *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
+ *  ============================================================================
+ *
+ */
+
+
+
+#ifndef IpcDrv_H
+#define IpcDrv_H
+
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+
+/* =============================================================================
+ *  APIs
+ * =============================================================================
+ */
+/* Function to open the Ipc driver. */
+Int IpcDrv_open (Void);
+
+/* Function to close the Ipc driver. */
+Int IpcDrv_close (Void);
+
+#if defined (__cplusplus)
+}
+#endif /* defined (__cplusplus) */
+
+
+#endif /* IpcDrv_H */
\ No newline at end of file
diff --git a/qnx/src/ipc3x_dev/ti/syslink/inc/usr/Qnx/MessageQDrv.h b/qnx/src/ipc3x_dev/ti/syslink/inc/usr/Qnx/MessageQDrv.h
new file mode 100644 (file)
index 0000000..83df65e
--- /dev/null
@@ -0,0 +1,74 @@
+/**
+ *  @file   MessageQDrv.h
+ *
+ *  @brief      Declarations of OS-specific functionality for MessageQ
+ *
+ *              This file contains declarations of OS-specific functions for
+ *              MessageQ.
+ *
+ */
+/*
+ *  ============================================================================
+ *
+ *  Copyright (c) 2013, Texas Instruments Incorporated
+ *
+ *  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.
+ *  Contact information for paper mail:
+ *  Texas Instruments
+ *  Post Office Box 655303
+ *  Dallas, Texas 75265
+ *  Contact information:
+ *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
+ *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
+ *  ============================================================================
+ *
+ */
+
+#ifndef MessageQDrv_H
+#define MessageQDrv_H
+
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+
+/* =============================================================================
+ *  APIs
+ * =============================================================================
+ */
+/* Function to invoke the APIs through ioctl. */
+Int MessageQDrv_ioctl (UInt32 cmd, Ptr args);
+
+
+#if defined (__cplusplus)
+}
+#endif /* defined (__cplusplus) */
+
+
+#endif /* MessageQDrv_H */
\ No newline at end of file
diff --git a/qnx/src/ipc3x_dev/ti/syslink/inc/usr/Qnx/NameServerDrv.h b/qnx/src/ipc3x_dev/ti/syslink/inc/usr/Qnx/NameServerDrv.h
new file mode 100644 (file)
index 0000000..9571804
--- /dev/null
@@ -0,0 +1,77 @@
+/**
+ *  @file   NameServerDrv.h
+ *
+ *  @brief      Declarations of OS-specific functionality for NameServer
+ *
+ *              This file contains declarations of OS-specific functions for
+ *              NameServer.
+ *
+ */
+/*
+ *  ============================================================================
+ *
+ *  Copyright (c) 2013, Texas Instruments Incorporated
+ *
+ *  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.
+ *  Contact information for paper mail:
+ *  Texas Instruments
+ *  Post Office Box 655303
+ *  Dallas, Texas 75265
+ *  Contact information:
+ *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
+ *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
+ *  ============================================================================
+ *
+ */
+
+
+
+#ifndef NameServerDrv_H
+#define NameServerDrv_H
+
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+
+/* =============================================================================
+ *  APIs
+ * =============================================================================
+ */
+
+/* Function to invoke the APIs through ioctl. */
+Int NameServerDrv_ioctl (UInt32 cmd, Ptr args);
+
+
+#if defined (__cplusplus)
+}
+#endif /* defined (__cplusplus) */
+
+
+#endif /* NameServerDrv_H */
\ No newline at end of file
diff --git a/qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/knl/MessageQ_daemon.c b/qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/knl/MessageQ_daemon.c
new file mode 100644 (file)
index 0000000..c6e12b8
--- /dev/null
@@ -0,0 +1,569 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/*============================================================================
+ *  @file   MessageQ.c
+ *
+ *  @brief  MessageQ module "server" implementation
+ *
+ *  This implementation is geared for use in a "client/server" model, whereby
+ *  system-wide data is maintained here as needed and process-specific data
+ *  is handled at the "client" level.  At the moment, LAD is the only "user"
+ *  of this implementation.
+ *
+ *  The MessageQ module supports the structured sending and receiving of
+ *  variable length messages. This module can be used for homogeneous or
+ *  heterogeneous multi-processor messaging.
+ *
+ *  MessageQ provides more sophisticated messaging than other modules. It is
+ *  typically used for complex situations such as multi-processor messaging.
+ *
+ *  The following are key features of the MessageQ module:
+ *  -Writers and readers can be relocated to another processor with no
+ *   runtime code changes.
+ *  -Timeouts are allowed when receiving messages.
+ *  -Readers can determine the writer and reply back.
+ *  -Receiving a message is deterministic when the timeout is zero.
+ *  -Messages can reside on any message queue.
+ *  -Supports zero-copy transfers.
+ *  -Can send and receive from any type of thread.
+ *  -Notification mechanism is specified by application.
+ *  -Allows QoS (quality of service) on message buffer pools. For example,
+ *   using specific buffer pools for specific message queues.
+ *
+ *  Messages are sent and received via a message queue. A reader is a thread
+ *  that gets (reads) messages from a message queue. A writer is a thread that
+ *  puts (writes) a message to a message queue. Each message queue has one
+ *  reader and can have many writers. A thread may read from or write to multiple
+ *  message queues.
+ *
+ *  Conceptually, the reader thread owns a message queue. The reader thread
+ *  creates a message queue. Writer threads  a created message queues to
+ *  get access to them.
+ *
+ *  Message queues are identified by a system-wide unique name. Internally,
+ *  MessageQ uses the NameServermodule for managing
+ *  these names. The names are used for opening a message queue. Using
+ *  names is not required.
+ *
+ *  Messages must be allocated from the MessageQ module. Once a message is
+ *  allocated, it can be sent on any message queue. Once a message is sent, the
+ *  writer loses ownership of the message and should not attempt to modify the
+ *  message. Once the reader receives the message, it owns the message. It
+ *  may either free the message or re-use the message.
+ *
+ *  Messages in a message queue can be of variable length. The only
+ *  requirement is that the first field in the definition of a message must be a
+ *  MsgHeader structure. For example:
+ *  typedef struct MyMsg {
+ *      MessageQ_MsgHeader header;
+ *      ...
+ *  } MyMsg;
+ *
+ *  The MessageQ API uses the MessageQ_MsgHeader internally. Your application
+ *  should not modify or directly access the fields in the MessageQ_MsgHeader.
+ *
+ *  All messages sent via the MessageQ module must be allocated from a
+ *  Heap implementation. The heap can be used for
+ *  other memory allocation not related to MessageQ.
+ *
+ *  An application can use multiple heaps. The purpose of having multiple
+ *  heaps is to allow an application to regulate its message usage. For
+ *  example, an application can allocate critical messages from one heap of fast
+ *  on-chip memory and non-critical messages from another heap of slower
+ *  external memory
+ *
+ *  MessageQ does support the usage of messages that allocated via the
+ *  alloc function. Please refer to the staticMsgInit
+ *  function description for more details.
+ *
+ *  In a multiple processor system, MessageQ communications to other
+ *  processors via MessageQTransport instances. There must be one and
+ *  only one MessageQTransport instance for each processor where communication
+ *  is desired.
+ *  So on a four processor system, each processor must have three
+ *  MessageQTransport instance.
+ *
+ *  The user only needs to create the MessageQTransport instances. The instances
+ *  are responsible for registering themselves with MessageQ.
+ *  This is accomplished via the registerTransport function.
+ *
+ *  ============================================================================
+ */
+
+
+/* Standard headers */
+#include <Std.h>
+
+/* Qnx specific header files */
+#include <pthread.h>
+
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <assert.h>
+
+/* Module level headers */
+#include <ti/ipc/NameServer.h>
+#include <ti/ipc/MultiProc.h>
+#include <_MultiProc.h>
+#include <ti/ipc/MessageQ.h>
+#include <_MessageQ.h>
+#include <_IpcLog.h>
+
+/* =============================================================================
+ * Macros/Constants
+ * =============================================================================
+ */
+
+/*!
+ *  @brief  Name of the reserved NameServer used for MessageQ.
+ */
+#define MessageQ_NAMESERVER  "MessageQ"
+
+/* Slot 0 reserved for NameServer messages: */
+#define RESERVED_MSGQ_INDEX  1
+
+/* Define BENCHMARK to quiet key MessageQ APIs: */
+//#define BENCHMARK
+
+/* =============================================================================
+ * Structures & Enums
+ * =============================================================================
+ */
+
+/* structure for MessageQ module state */
+typedef struct MessageQ_ModuleObject {
+    Int                 refCount;
+    /*!< Reference count */
+    NameServer_Handle   nameServer;
+    /*!< Handle to the local NameServer used for storing GP objects */
+    pthread_mutex_t     gate;
+    /*!< Handle of gate to be used for local thread safety */
+    MessageQ_Config     cfg;
+    /*!< Current config values */
+    MessageQ_Config     defaultCfg;
+    /*!< Default config values */
+    MessageQ_Params     defaultInstParams;
+    /*!< Default instance creation parameters */
+    MessageQ_Handle *   queues;
+    /*!< Global array of message queues */
+    UInt16              numQueues;
+    /*!< Initial number of messageQ objects allowed */
+    Bool                canFreeQueues;
+    /*!< Grow option */
+    Bits16              seqNum;
+    /*!< sequence number */
+} MessageQ_ModuleObject;
+
+/*!
+ *  @brief  Structure for the Handle for the MessageQ.
+ */
+typedef struct MessageQ_Object {
+    MessageQ_Params         params;
+    /*! Instance specific creation parameters */
+    MessageQ_QueueId        queue;
+    /* Unique id */
+    Ptr                     nsKey;
+    /* NameServer key */
+    Int                     ownerPid;
+    /* Process ID of owner */
+} MessageQ_Object;
+
+
+/* =============================================================================
+ *  Globals
+ * =============================================================================
+ */
+static MessageQ_ModuleObject MessageQ_state =
+{
+    .refCount               = 0,
+    .nameServer             = NULL,
+    .queues                 = NULL,
+    .numQueues              = 2u,
+    .canFreeQueues          = FALSE,
+    .gate                   = PTHREAD_MUTEX_INITIALIZER,
+    .defaultCfg.traceFlag   = FALSE,
+    .defaultCfg.maxRuntimeEntries = 32u,
+    .defaultCfg.maxNameLen    = 32u,
+};
+
+/*!
+ *  @var    MessageQ_module
+ *
+ *  @brief  Pointer to the MessageQ module state.
+ */
+MessageQ_ModuleObject * MessageQ_module = &MessageQ_state;
+
+
+/* =============================================================================
+ * Forward declarations of internal functions
+ * =============================================================================
+ */
+/* Grow the MessageQ table */
+static UInt16 _MessageQ_grow(MessageQ_Object * obj);
+
+/* =============================================================================
+ * APIS
+ * =============================================================================
+ */
+/* Function to get default configuration for the MessageQ module.
+ *
+ */
+Void MessageQ_getConfig(MessageQ_Config * cfg)
+{
+    assert(cfg != NULL);
+
+    /* If setup has not yet been called... */
+    if (MessageQ_module->refCount < 1) {
+        memcpy(cfg, &MessageQ_module->defaultCfg, sizeof(MessageQ_Config));
+    }
+    else {
+        memcpy(cfg, &MessageQ_module->cfg, sizeof(MessageQ_Config));
+    }
+}
+
+/* Function to setup the MessageQ module. */
+Int MessageQ_setup(const MessageQ_Config * cfg)
+{
+    Int                    status = MessageQ_S_SUCCESS;
+    NameServer_Params      params;
+
+    pthread_mutex_lock(&(MessageQ_module->gate));
+
+    LOG1("MessageQ_setup: entered, refCount=%d\n", MessageQ_module->refCount)
+
+    MessageQ_module->refCount++;
+    if (MessageQ_module->refCount > 1) {
+        status = MessageQ_S_ALREADYSETUP;
+        LOG1("MessageQ module has been already setup, refCount=%d\n", MessageQ_module->refCount)
+
+        goto exitSetup;
+    }
+
+    /* Initialize the parameters */
+    NameServer_Params_init(&params);
+    params.maxValueLen = sizeof(UInt32);
+    params.maxNameLen  = cfg->maxNameLen;
+
+    /* Create the nameserver for modules */
+    MessageQ_module->nameServer = NameServer_create(MessageQ_NAMESERVER,
+                                                    &params);
+
+    memcpy(&MessageQ_module->cfg, (void *)cfg, sizeof(MessageQ_Config));
+
+    MessageQ_module->seqNum = 0;
+    MessageQ_module->numQueues = cfg->maxRuntimeEntries;
+    MessageQ_module->queues = (MessageQ_Handle *)
+        calloc(1, sizeof(MessageQ_Handle) * MessageQ_module->numQueues);
+
+exitSetup:
+    LOG1("MessageQ_setup: exiting, refCount=%d\n", MessageQ_module->refCount)
+
+    pthread_mutex_unlock(&(MessageQ_module->gate));
+
+    return (status);
+}
+
+/*
+ * Function to destroy the MessageQ module.
+ */
+Int MessageQ_destroy(void)
+{
+    Int    status    = MessageQ_S_SUCCESS;
+    UInt32 i;
+
+    pthread_mutex_lock(&(MessageQ_module->gate));
+
+    LOG1("MessageQ_destroy: entered, refCount=%d\n", MessageQ_module->refCount)
+
+    /* Decrease the refCount */
+    MessageQ_module->refCount--;
+    if (MessageQ_module->refCount > 0) {
+        goto exitDestroy;
+    }
+
+    /* Delete any Message Queues that have not been deleted so far. */
+    for (i = 0; i< MessageQ_module->numQueues; i++) {
+        if (MessageQ_module->queues [i] != NULL) {
+            MessageQ_delete(&(MessageQ_module->queues [i]));
+        }
+    }
+
+    if (MessageQ_module->nameServer != NULL) {
+        /* Delete the nameserver for modules */
+        status = NameServer_delete(&MessageQ_module->nameServer);
+    }
+
+    /* Since MessageQ_module->gate was not allocated, no need to delete. */
+
+    if (MessageQ_module->queues != NULL) {
+        free(MessageQ_module->queues);
+        MessageQ_module->queues = NULL;
+    }
+
+    memset(&MessageQ_module->cfg, 0, sizeof(MessageQ_Config));
+    MessageQ_module->numQueues  = 0u;
+    MessageQ_module->canFreeQueues = TRUE;
+
+exitDestroy:
+    LOG1("MessageQ_destroy: exiting, refCount=%d\n", MessageQ_module->refCount)
+
+    pthread_mutex_unlock(&(MessageQ_module->gate));
+
+    return (status);
+}
+
+/* Function to initialize the parameters for the MessageQ instance. */
+Void MessageQ_Params_init(MessageQ_Params * params)
+{
+    memcpy(params, &(MessageQ_module->defaultInstParams),
+           sizeof(MessageQ_Params));
+
+    return;
+}
+
+/*
+ *   Function to create a MessageQ object for receiving.
+ */
+MessageQ_Handle MessageQ_create(String name, const MessageQ_Params * params)
+{
+    Int                 status    = MessageQ_S_SUCCESS;
+    MessageQ_Object   * obj    = NULL;
+    Bool                found  = FALSE;
+    UInt16              count  = 0;
+    UInt16              queueIndex = 0u;
+    UInt16              procId;
+    int                 i;
+
+    LOG1("MessageQ_create: creating '%s'\n", name)
+
+    /* Create the generic obj */
+    obj = (MessageQ_Object *)calloc(1, sizeof(MessageQ_Object));
+
+    pthread_mutex_lock(&(MessageQ_module->gate));
+
+    count = MessageQ_module->numQueues;
+
+    /* Search the dynamic array for any holes */
+    /* We start from 1, as 0 is reserved for binding NameServer: */
+    for (i = RESERVED_MSGQ_INDEX; i < count ; i++) {
+        if (MessageQ_module->queues [i] == NULL) {
+            MessageQ_module->queues [i] = (MessageQ_Handle)obj;
+            queueIndex = i;
+            found = TRUE;
+            break;
+        }
+    }
+
+    if (found == FALSE) {
+        /* Growth is always allowed. */
+        queueIndex = _MessageQ_grow(obj);
+    }
+
+    pthread_mutex_unlock(&(MessageQ_module->gate));
+
+    if (params != NULL) {
+       /* Populate the params member */
+        memcpy((Ptr)&obj->params, (Ptr)params, sizeof(MessageQ_Params));
+    }
+
+    procId = MultiProc_self();
+    /* create globally unique messageQ ID: */
+    obj->queue = (MessageQ_QueueId)(((UInt32)procId << 16) | queueIndex);
+    obj->ownerPid = 0;
+
+    if (name != NULL) {
+        obj->nsKey = NameServer_addUInt32(MessageQ_module->nameServer, name,
+                                          obj->queue);
+    }
+
+    /* Cleanup if fail */
+    if (status < 0) {
+        MessageQ_delete((MessageQ_Handle *)&obj);
+    }
+
+    LOG1("MessageQ_create: returning %p\n", obj)
+
+    return ((MessageQ_Handle)obj);
+}
+
+/*
+ * Function to delete a MessageQ object for a specific slave processor.
+ */
+Int MessageQ_delete(MessageQ_Handle * handlePtr)
+{
+    Int              status = MessageQ_S_SUCCESS;
+    MessageQ_Object *obj;
+    MessageQ_Handle queue;
+
+    obj = (MessageQ_Object *)(*handlePtr);
+
+    LOG1("MessageQ_delete: deleting %p\n", obj)
+
+    queue = MessageQ_module->queues[(MessageQ_QueueIndex)(obj->queue)];
+    if (queue != obj) {
+        LOG1("    ERROR: obj != MessageQ_module->queues[%d]\n", (MessageQ_QueueIndex)(obj->queue))
+    }
+
+    if (obj->nsKey != NULL) {
+        /* Remove from the name server */
+        status = NameServer_removeEntry(MessageQ_module->nameServer,
+                                         obj->nsKey);
+        if (status < 0) {
+            /* Override with a MessageQ status code. */
+            status = MessageQ_E_FAIL;
+        }
+        else {
+            status = MessageQ_S_SUCCESS;
+        }
+    }
+
+    pthread_mutex_lock(&(MessageQ_module->gate));
+
+    /* Clear the MessageQ obj from array. */
+    MessageQ_module->queues[(MessageQ_QueueIndex)(obj->queue)] = NULL;
+
+    /* Release the local lock */
+    pthread_mutex_unlock(&(MessageQ_module->gate));
+
+    /* Now free the obj */
+    free(obj);
+    *handlePtr = NULL;
+
+    LOG1("MessageQ_delete: returning %d\n", status)
+
+    return (status);
+}
+
+/* Returns the MessageQ_QueueId associated with the handle. */
+MessageQ_QueueId MessageQ_getQueueId(MessageQ_Handle handle)
+{
+    MessageQ_Object * obj = (MessageQ_Object *)handle;
+    UInt32            queueId;
+
+    queueId = (obj->queue);
+
+    return queueId;
+}
+
+/*!
+ *  @brief   Grow the MessageQ table
+ *
+ *  @param   obj     Pointer to the MessageQ object.
+ *
+ *  @sa      _MessageQ_grow
+ *
+ */
+static UInt16 _MessageQ_grow(MessageQ_Object * obj)
+{
+    UInt16            queueIndex = MessageQ_module->numQueues;
+    UInt16            oldSize;
+    MessageQ_Handle * queues;
+    MessageQ_Handle * oldQueues;
+
+    /* No parameter validation required since this is an internal function. */
+    oldSize = (MessageQ_module->numQueues) * sizeof(MessageQ_Handle);
+
+    /* Allocate larger table */
+    queues = calloc(1, oldSize + sizeof(MessageQ_Handle));
+
+    /* Copy contents into new table */
+    memcpy(queues, MessageQ_module->queues, oldSize);
+
+    /* Fill in the new entry */
+    queues[queueIndex] = (MessageQ_Handle)obj;
+
+    /* Hook-up new table */
+    oldQueues = MessageQ_module->queues;
+    MessageQ_module->queues = queues;
+    MessageQ_module->numQueues++;
+
+    /* Delete old table if not statically defined */
+    if (MessageQ_module->canFreeQueues == TRUE) {
+        free(oldQueues);
+    }
+    else {
+        MessageQ_module->canFreeQueues = TRUE;
+    }
+
+    LOG1("_MessageQ_grow: queueIndex: 0x%x\n", queueIndex)
+
+    return (queueIndex);
+}
+
+/*
+ * This is a helper function to initialize a message.
+ */
+Void MessageQ_msgInit(MessageQ_Msg msg)
+{
+    msg->reserved0 = 0;  /* We set this to distinguish from NameServerMsg */
+    msg->replyId   = (UInt16)MessageQ_INVALIDMESSAGEQ;
+    msg->msgId     = MessageQ_INVALIDMSGID;
+    msg->dstId     = (UInt16)MessageQ_INVALIDMESSAGEQ;
+    msg->flags     = MessageQ_HEADERVERSION | MessageQ_NORMALPRI;
+    msg->srcProc   = MultiProc_self();
+
+    pthread_mutex_lock(&(MessageQ_module->gate));
+    msg->seqNum  = MessageQ_module->seqNum++;
+    pthread_mutex_unlock(&(MessageQ_module->gate));
+}
+
+NameServer_Handle MessageQ_getNameServerHandle(void)
+{
+    return MessageQ_module->nameServer;
+}
+
+Void MessageQ_setQueueOwner(MessageQ_Handle handle, Int pid)
+{
+    handle->ownerPid = pid;
+
+    return;
+}
+
+Void MessageQ_cleanupOwner(Int pid)
+{
+    MessageQ_Handle queue;
+    Int i;
+
+    for (i = 0; i < MessageQ_module->numQueues; i++) {
+        queue = MessageQ_module->queues[i];
+        if (queue != NULL && queue->ownerPid == pid) {
+            MessageQ_delete(&queue);
+        }
+    }
+}
diff --git a/qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/knl/Qnx/messageq_devctl.c b/qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/knl/Qnx/messageq_devctl.c
new file mode 100644 (file)
index 0000000..d06568f
--- /dev/null
@@ -0,0 +1,307 @@
+/*
+ *  @file   messageq_devctl.c
+ *
+ *  @brief      OS-specific implementation of Messageq driver for Qnx
+ *
+ *
+ *  ============================================================================
+ *
+ *  Copyright (c) 2013, Texas Instruments Incorporated
+ *
+ *  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.
+ *  Contact information for paper mail:
+ *  Texas Instruments
+ *  Post Office Box 655303
+ *  Dallas, Texas 75265
+ *  Contact information:
+ *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
+ *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
+ *  ============================================================================
+ *
+ */
+
+
+/* Standard headers */
+#include <ti/syslink/Std.h>
+
+/* OSAL & Utils headers */
+#include <ti/syslink/utils/List.h>
+#include <ti/syslink/utils/Trace.h>
+#include <ti/syslink/utils/Memory.h>
+
+/* QNX specific header include */
+#include <ti/syslink/build/Qnx/resmgr/proto.h>
+#include <ti/syslink/build/Qnx/resmgr/dcmd_syslink.h>
+
+/* Module specific header files */
+#include <ti/ipc/MessageQ.h>
+#include <ti/syslink/inc/MessageQDrvDefs.h>
+
+/* Function prototypes */
+int syslink_messageq_getconfig(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+int syslink_messageq_setup(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+int syslink_messageq_destroy(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+int syslink_messageq_create(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+int syslink_messageq_delete(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+
+/**
+ * Handler for devctl() messages for messageQ module.
+ *
+ * Handles special devctl() messages that we export for control.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_messageq_devctl(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    switch (msg->i.dcmd)
+    {
+          case DCMD_MESSAGEQ_CREATE:
+          {
+                return syslink_messageq_create( ctp, msg, ocb);
+          }
+          break;
+
+          case DCMD_MESSAGEQ_DELETE:
+          {
+                return syslink_messageq_delete( ctp, msg, ocb);
+          }
+          break;
+
+          case DCMD_MESSAGEQ_GETCONFIG:
+          {
+                return syslink_messageq_getconfig( ctp, msg, ocb);
+          }
+          break;
+
+          case DCMD_MESSAGEQ_SETUP:
+          {
+                return syslink_messageq_setup( ctp, msg, ocb);
+          }
+          break;
+
+          case DCMD_MESSAGEQ_DESTROY:
+          {
+                return syslink_messageq_destroy( ctp, msg, ocb);
+          }
+          break;
+
+     default:
+        fprintf( stderr, "Invalid DEVCTL for messageQ 0x%x \n", msg->i.dcmd);
+        break;
+
+    }
+
+    return (_RESMGR_PTR(ctp, &msg->o, sizeof(msg->o) +
+        sizeof(MessageQDrv_CmdArgs)));
+}
+
+/**
+ * Handler for messageq create API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_messageq_create(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    MessageQDrv_CmdArgs *       cargs = (MessageQDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->i));
+    MessageQDrv_CmdArgs *       out   = (MessageQDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->o));
+    MessageQ_Params *local_createparams = NULL;
+    String local_createname = NULL;
+    out->apiStatus = MessageQ_S_SUCCESS;
+
+    if (cargs->args.create.params) {
+        local_createparams = (MessageQ_Params *)(cargs+1);
+        if (cargs->args.create.name)
+            local_createname = (String)(local_createparams+1);
+    }
+    else {
+        if (cargs->args.create.name)
+            local_createname = (String)(cargs+1);
+    }
+
+    out->args.create.handle = MessageQ_create (local_createname,
+        local_createparams);
+    GT_assert (curTrace, (out->args.create.handle != NULL));
+
+    /* Set failure status if create has failed. */
+    if (out->args.create.handle == NULL) {
+        out->apiStatus = MessageQ_E_FAIL;
+    }
+    else {
+        out->apiStatus = MessageQ_S_SUCCESS;
+    }
+
+    if (out->args.create.handle != NULL) {
+        out->args.create.queueId = MessageQ_getQueueId(out->args.create.handle);
+        /*
+         * TODO: Need to implement cleanup of queues for processes that departed
+         */
+        /* MessageQ_setQueueOwner(out->args.create.handle,clientPID[clientId])*/
+    }
+
+    SETIOV(&ctp->iov[0], &msg->o, sizeof(msg->o) +
+        sizeof(MessageQDrv_CmdArgs));
+    return _RESMGR_NPARTS(1);
+}
+
+/**
+ * Handler for messageq delete API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_messageq_delete(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    MessageQDrv_CmdArgs * cargs = (MessageQDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->i));
+    MessageQDrv_CmdArgs * out  = (MessageQDrv_CmdArgs *)(_DEVCTL_DATA (msg->o));
+
+    out->apiStatus = MessageQ_delete ((MessageQ_Handle *)
+        &(cargs->args.deleteMessageQ.handle));
+    GT_assert (curTrace, (out->apiStatus >= 0));
+
+    return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
+        sizeof(MessageQDrv_CmdArgs)));
+}
+
+/**
+ * Handler for messageq getconfig API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_messageq_getconfig(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    MessageQDrv_CmdArgs * cargs = (MessageQDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->i));
+    MessageQ_Config local_config;
+    MessageQ_getConfig (&local_config);
+
+    cargs->apiStatus = MessageQ_S_SUCCESS;
+    SETIOV(&ctp->iov[0], &msg->o, sizeof(msg->o) +
+        sizeof(MessageQDrv_CmdArgs));
+    SETIOV(&ctp->iov[1], &local_config, sizeof(MessageQ_Config));
+
+    return _RESMGR_NPARTS(2);
+
+}
+
+/**
+ * Handler for messageq setup API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_messageq_setup(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    MessageQDrv_CmdArgs * cargs = (MessageQDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->i));
+    MessageQDrv_CmdArgs * out  = (MessageQDrv_CmdArgs *)(_DEVCTL_DATA (msg->o));
+
+    MessageQ_Config *     local_setupconfig;
+    local_setupconfig = (MessageQ_Config *)(cargs+1);
+
+    out->apiStatus = MessageQ_setup (local_setupconfig);
+    out->args.setup.nameServerHandle  = MessageQ_getNameServerHandle();
+
+    GT_assert (curTrace, (out->apiStatus  >= 0));
+    GT_assert (curTrace, (out->args.setup.nameServerHandle  != NULL));
+
+    SETIOV(&ctp->iov[0], &msg->o, sizeof(msg->o) +
+        sizeof(MessageQDrv_CmdArgs));
+
+    return _RESMGR_NPARTS(1);
+}
+
+
+/**
+ * Handler for messageq destroy API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_messageq_destroy(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    MessageQDrv_CmdArgs * out = (MessageQDrv_CmdArgs *)(_DEVCTL_DATA (msg->o));
+
+    out->apiStatus = MessageQ_destroy();
+    GT_assert(curTrace, (out->apiStatus  >= 0));
+
+    return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
+        sizeof(MessageQDrv_CmdArgs)));
+}
index 2f3c15b920bd16596a88a5f16b25fe30e3a89a60..83c0454f4aef14c198d68006ae87355bd1899544 100644 (file)
@@ -72,7 +72,7 @@ extern "C" {
  *  @def    MessageQCopy_MAXMQS
  *  @brief  Maximum number of MQ handles (endpoints) per transport supported.
  */
-#define MessageQCopy_MAXMQS 256u
+#define MessageQCopy_MAXMQS 1280u
 
 /*!
  *  @def    MessageQCopy_NUMVIRTQS
@@ -113,7 +113,7 @@ extern "C" {
  *  @def    MessageQCopy_MAXRESERVEDEPT
  *  @brief  Maximum Value for System Reserved Endpoints.
  */
-#define MessageQCopy_MAXRESERVEDEPT    100
+#define MessageQCopy_MAXRESERVEDEPT    1024
 
 /*
  * The alignment to use between consumer and producer parts of vring.
diff --git a/qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/usr/Qnx/IpcDrv.c b/qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/usr/Qnx/IpcDrv.c
new file mode 100644 (file)
index 0000000..144c640
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ *  @file   IpcDrv.c
+ *
+ *  @brief      OS-specific implementation of Ipc driver for Qnx
+ *
+ *
+ *  ============================================================================
+ *
+ *  Copyright (c) 2013, Texas Instruments Incorporated
+ *
+ *  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.
+ *  Contact information for paper mail:
+ *  Texas Instruments
+ *  Post Office Box 655303
+ *  Dallas, Texas 75265
+ *  Contact information:
+ *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
+ *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
+ *  ============================================================================
+ *
+ */
+
+
+/* Standard headers */
+#include <ti/syslink/Std.h>
+
+/* OSAL & Utils headers */
+#include <ti/syslink/utils/Trace.h>
+#include <ti/syslink/utils/Gate.h>
+#include <ti/ipc/Ipc.h>
+#include <ti/syslink/build/Qnx/resmgr/dcmd_syslink.h>
+
+/* QNX specific header files */
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <inttypes.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <string.h>
+
+
+/** ============================================================================
+ *  Macros and types
+ *  ============================================================================
+ */
+/*!
+ *  @brief  Driver name for Ipc.
+ */
+#define IPC_DRIVER_NAME         "/dev/ipc"
+
+
+/** ============================================================================
+ *  Globals
+ *  ============================================================================
+ */
+/*!
+ *  @brief  Driver handle for Ipc in this process.
+ */
+
+/*  Making this a global as it will be used as the single device handle
+ *  for resMgr
+ */
+Int32 IpcDrv_handle = 0;
+
+/*!
+ *  @brief  Reference count for the driver handle.
+ */
+static UInt32 IpcDrv_refCount = 0;
+
+
+/** ============================================================================
+ *  Functions
+ *  ============================================================================
+ */
+/*!
+ *  @brief  Function to open the Ipc driver.
+ *
+ *  @sa     IpcDrv_close
+ */
+Int
+IpcDrv_open (Void)
+{
+    Int status      = Ipc_S_SUCCESS;
+    int osStatus    = 0;
+
+    GT_0trace (curTrace, GT_ENTER, "IpcDrv_open");
+
+    if (IpcDrv_refCount == 0) {
+
+        IpcDrv_handle = open (IPC_DRIVER_NAME,
+                                       O_SYNC | O_RDWR);
+        if (IpcDrv_handle < 0) {
+            /*! @retval Ipc_E_OSFAILURE Failed to open Ipc driver with OS
+             */
+            status = Ipc_E_OSFAILURE;
+            GT_setFailureReason (curTrace,
+                                 GT_4CLASS,
+                                 "IpcDrv_open",
+                                 status,
+                                 "Failed to open Ipc driver with OS!");
+        }
+        else {
+            osStatus = fcntl (IpcDrv_handle, F_SETFD, FD_CLOEXEC);
+            if (osStatus != 0) {
+                /*! @retval Ipc_E_OSFAILURE Failed to set file descriptor flags
+                 */
+                status = Ipc_E_OSFAILURE;
+                GT_setFailureReason (curTrace,
+                                     GT_4CLASS,
+                                     "IpcDrv_open",
+                                     status,
+                                     "Failed to set file descriptor flags!");
+            }
+            else {
+                /* TBD: Protection for refCount. */
+                IpcDrv_refCount++;
+            }
+        }
+    }
+    else {
+        IpcDrv_refCount++;
+    }
+
+    GT_1trace (curTrace, GT_LEAVE, "IpcDrv_open", status);
+
+    return status;
+}
+
+
+/*!
+ *  @brief  Function to close the Ipc driver.
+ *
+ *  @sa     IpcDrv_open
+ */
+Int
+IpcDrv_close (Void)
+{
+    Int status      = Ipc_S_SUCCESS;
+    int osStatus    = 0;
+
+    GT_0trace (curTrace, GT_ENTER, "IpcDrv_close");
+
+    /* TBD: Protection for refCount. */
+    IpcDrv_refCount--;
+    if (IpcDrv_refCount == 0) {
+        osStatus = close (IpcDrv_handle);
+        if (osStatus != 0) {
+            perror ("Ipc driver close: ");
+            /*! @retval Ipc_E_OSFAILURE Failed to open Ipc driver with OS */
+            status = Ipc_E_OSFAILURE;
+            GT_setFailureReason (curTrace,
+                                 GT_4CLASS,
+                                 "IpcDrv_close",
+                                 status,
+                                 "Failed to close Ipc driver with OS!");
+        }
+        else {
+            IpcDrv_handle = 0;
+        }
+    }
+
+    GT_1trace (curTrace, GT_LEAVE, "IpcDrv_close", status);
+    return status;
+}
\ No newline at end of file
diff --git a/qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/usr/Qnx/MessageQDrv.c b/qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/usr/Qnx/MessageQDrv.c
new file mode 100644 (file)
index 0000000..dc755d2
--- /dev/null
@@ -0,0 +1,231 @@
+/*
+ *  @file   MessageQDrv.c
+ *
+ *  @brief      OS-specific implementation of MessageQ driver for Qnx
+ *
+ *
+ *  ============================================================================
+ *
+ *  Copyright (c) 2008-2013, Texas Instruments Incorporated
+ *
+ *  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.
+ *  Contact information for paper mail:
+ *  Texas Instruments
+ *  Post Office Box 655303
+ *  Dallas, Texas 75265
+ *  Contact information:
+ *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
+ *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
+ *  ============================================================================
+ *
+ */
+
+
+/* Standard headers */
+#include <ti/syslink/Std.h>
+
+/* OSAL & Utils headers */
+#include <ti/syslink/utils/Trace.h>
+#include <ti/ipc/MessageQ.h>
+#include <ti/syslink/inc/MessageQDrvDefs.h>
+#include <ti/syslink/build/Qnx/resmgr/dcmd_syslink.h>
+
+/* QNX specific header files */
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <inttypes.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <string.h>
+
+
+/** ============================================================================
+ *  Globals
+ *  ============================================================================
+ */
+/*!
+ *  @brief  Driver handle for MessageQ in this process.
+ */
+extern Int32 IpcDrv_handle;
+
+/** ============================================================================
+ *  Functions
+ *  ============================================================================
+ */
+/*!
+ *  @brief  Function to open the MessageQ driver.
+ *
+ *  @sa     MessageQDrv_close
+ */
+Int
+MessageQDrv_open (Void)
+{
+    Int status      = MessageQ_S_SUCCESS;
+
+    return status;
+}
+
+
+/*!
+ *  @brief  Function to close the MessageQ driver.
+ *
+ *  @sa     MessageQDrv_open
+ */
+Int
+MessageQDrv_close (Void)
+{
+    Int status      = MessageQ_S_SUCCESS;
+
+    return status;
+}
+
+
+/*!
+ *  @brief  Function to invoke the APIs through ioctl.
+ *
+ *  @param  cmd     Command for driver ioctl
+ *  @param  args    Arguments for the ioctl command
+ *
+ *  @sa
+ */
+Int
+MessageQDrv_ioctl (UInt32 cmd, Ptr args)
+{
+    Int status      = MessageQ_S_SUCCESS;
+    int osStatus    = -1;
+
+    GT_2trace (curTrace, GT_ENTER, "MessageQDrv_ioctl", cmd, args);
+
+    switch (cmd) {
+
+          case CMD_MESSAGEQ_CREATE:
+          {
+              MessageQDrv_CmdArgs *cargs = (MessageQDrv_CmdArgs *)args;
+              iov_t mqcreate_iov[3];
+              int i = 0;
+
+              SETIOV(&mqcreate_iov[i], cargs, sizeof(MessageQDrv_CmdArgs));
+              i++;
+              if (cargs->args.create.params) {
+                  SETIOV(&mqcreate_iov[i], cargs->args.create.params,
+                      sizeof(MessageQ_Params) );
+                  i++;
+              }
+              if (cargs->args.create.name) {
+                  SETIOV(&mqcreate_iov[i], cargs->args.create.name, sizeof(char)
+                      * cargs->args.create.nameLen );
+                  i++;
+              }
+
+              // send i iov, return 1 iov
+              osStatus = devctlv(IpcDrv_handle, DCMD_MESSAGEQ_CREATE, i, 1,
+                  mqcreate_iov, mqcreate_iov, NULL);
+          }
+          break;
+
+          case CMD_MESSAGEQ_DELETE:
+          {
+              osStatus = devctl(IpcDrv_handle, DCMD_MESSAGEQ_DELETE, args,
+                  sizeof(MessageQDrv_CmdArgs), NULL);
+          }
+          break;
+
+          case CMD_MESSAGEQ_GETCONFIG:
+          {
+              MessageQDrv_CmdArgs *cargs = (MessageQDrv_CmdArgs *)args;
+                  iov_t mqgetconfig_iov[2];
+
+              SETIOV(&mqgetconfig_iov[0], cargs, sizeof(MessageQDrv_CmdArgs));
+              SETIOV(&mqgetconfig_iov[1], cargs->args.getConfig.config,
+                  sizeof(MessageQ_Config));
+              osStatus = devctlv(IpcDrv_handle, DCMD_MESSAGEQ_GETCONFIG, 1, 2,
+                  mqgetconfig_iov, mqgetconfig_iov, NULL);
+          }
+          break;
+
+          case CMD_MESSAGEQ_SETUP:
+          {
+              MessageQDrv_CmdArgs *cargs = (MessageQDrv_CmdArgs *)args;
+              iov_t mqsetup_iov[2];
+
+              SETIOV(&mqsetup_iov[0], cargs, sizeof(MessageQDrv_CmdArgs));
+              SETIOV(&mqsetup_iov[1], cargs->args.setup.config,
+                  sizeof(MessageQ_Config) );
+                // send 2 iov, get back 1 iov
+              osStatus = devctlv(IpcDrv_handle, DCMD_MESSAGEQ_SETUP, 2, 1,
+                  mqsetup_iov, mqsetup_iov, NULL);
+          }
+          break;
+
+          case CMD_MESSAGEQ_DESTROY:
+          {
+              osStatus = devctl(IpcDrv_handle, DCMD_MESSAGEQ_DESTROY, args,
+                  sizeof(MessageQDrv_CmdArgs), NULL);
+          }
+          break;
+
+          default:
+          {
+              /* This does not impact return status of this function, so retVal
+               * comment is not used.
+               */
+              status = MessageQ_E_INVALIDARG;
+              GT_setFailureReason (curTrace,
+                                   GT_4CLASS,
+                                   "MessageQDrv_ioctl",
+                                   status,
+                                   "Unsupported ioctl command specified");
+          }
+          break;
+      }
+
+
+    if (osStatus != 0) {
+        /*! @retval MessageQ_E_OSFAILURE Driver ioctl failed */
+        status = MessageQ_E_OSFAILURE;
+        GT_setFailureReason (curTrace,
+                             GT_4CLASS,
+                             "MessageQDrv_ioctl",
+                             status,
+                             "Driver ioctl failed!");
+    }
+    else {
+        /* First field in the structure is the API status. */
+        status = ((MessageQDrv_CmdArgs *) args)->apiStatus;
+    }
+
+    GT_1trace (curTrace, GT_LEAVE, "MessageQDrv_ioctl", status);
+
+    return status;
+}
index 9c0528c53d380737bb32e1bde2508f2ed7cb260b..ab9fa3166bdba8a672db794c1f06e5a525da3eda 100644 (file)
@@ -83,6 +83,7 @@
 
 #define TIIPC_DEVICE_NAME "/dev/tiipc"
 
+
 /* structure to hold rpmsg-rpc device information */
 typedef struct named_device {
     iofunc_mount_t      mattr;
@@ -1237,7 +1238,8 @@ ti_ipc_write(resmgr_context_t *ctp, io_write_t *msg, RESMGR_OCB_T *io_ocb)
     }
 
     status = MessageQCopy_send(obj->procId, MultiProc_self(), obj->remoteAddr,
-                               obj->addr, buf, bytes, TRUE);
+                                   obj->addr, buf, bytes, TRUE);
+
     if (status < 0) {
         return (EIO);
     }
diff --git a/qnx/src/ipc3x_dev/ti/syslink/utils/hlos/knl/NameServer_daemon.c b/qnx/src/ipc3x_dev/ti/syslink/utils/hlos/knl/NameServer_daemon.c
new file mode 100644 (file)
index 0000000..86cc94c
--- /dev/null
@@ -0,0 +1,1049 @@
+/*
+ * Copyright (c) 2012-2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/*!
+ *  @file       NameServer.c
+ *
+ *  @brief      NameServer Manager
+ *
+ */
+
+
+/* Standard headers */
+#include <Std.h>
+
+/* Qnx specific header files */
+#include <pthread.h>
+
+/* Socket Headers */
+#include <sys/queue.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <assert.h>
+#include <fcntl.h>
+
+/* Module level headers */
+#include <ti/ipc/NameServer.h>
+#include <ti/ipc/MultiProc.h>
+#include <_MultiProc.h>
+#include <ti/ipc/MessageQCopy.h>
+
+/* Internal stuff: */
+#include <_MessageQCopy.h>
+#include <_MessageQCopyDefs.h>
+#include <_NameServer.h>
+#include <_NameServerRemoteRpmsg.h>
+#include <_IpcLog.h>
+
+/* TI Ipc utils: */
+#include <TiIpcFxns.h>
+
+#include "ti/ipc/ti_ipc.h"
+
+#define MESSAGEQ_RPMSG_PORT       61
+#define NAME_SERVER_RPMSG_ADDR    0
+#define RPMSG_RESERVED_ADDRESSES  (1024)
+
+#define INVALIDSOCKET     (-1)
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+
+/* =============================================================================
+ * Structures & Enums
+ * =============================================================================
+ */
+
+/* Structure of entry in Name/Value table */
+typedef struct NameServer_TableEntry_tag {
+    CIRCLEQ_ENTRY(NameServer_TableEntry_tag) elem;
+    /* List element */
+    UInt32                    hash;
+    /* Hash value */
+    String                    name;
+    /* Name portion of the name/value pair. */
+    UInt                      len;
+    /* Length of the value field. */
+    Ptr                       value;
+    /* Value portion of the name/value entry. */
+    Bool                      collide;
+    /* Does the hash collide? */
+    struct NameServer_TableEntry_tag * next;
+    /* Pointer to the next entry, used incase of collision only */
+} NameServer_TableEntry;
+
+/* Structure defining object for the NameServer */
+struct NameServer_Object {
+    CIRCLEQ_ENTRY(NameServer_Object) elem;
+    CIRCLEQ_HEAD(dummy2, NameServer_TableEntry_tag) nameList;
+    String             name;            /* name of the instance */
+    NameServer_Params  params;          /* the parameter structure */
+    UInt32             count;           /* count of entries */
+    pthread_mutex_t    gate;            /* crit sect gate */
+} NameServer_Object;
+
+/* structure for NameServer module state */
+typedef struct NameServer_ModuleObject {
+    CIRCLEQ_HEAD(dummy1, NameServer_Object) objList;
+    Int32               refCount;
+    MessageQCopy_Handle mq;
+    /* MessageQCopy instance to receive from remote proc nameserver ports: */
+    UInt32              recvAddr;
+    /* Local endpoint for receiving from remote proc nameserver ports: */
+    pthread_t           listener;
+    /* Listener thread for NameServer replies and requests. */
+    int                 waitFdW;
+    int                 waitFdR;
+    /* Pipe to post to NameServer_get. */
+    NameServerMsg       nsMsg;
+    /* NameServer Message cache. */
+    NameServer_Params   defInstParams;
+    /* Default instance paramters */
+    pthread_mutex_t     modGate;
+} NameServer_ModuleObject;
+
+#define CIRCLEQ_destruct(head) { \
+        (head)->cqh_first = NULL; \
+        (head)->cqh_last = NULL; \
+}
+
+#define CIRCLEQ_elemClear(elem) { \
+        (elem)->cqe_next = (elem)->cqe_prev = (Void *)(elem); \
+}
+
+#define CIRCLEQ_traverse(x, y, tag) \
+        for (x = (y)->cqh_first; x != (struct tag *)(y); x = x->elem.cqe_next)
+
+/* =============================================================================
+ *  Globals
+ * =============================================================================
+ */
+/*
+ * NameServer_state
+ *
+ * Make the module gate "recursive" since NameServer_getHandle() needs to
+ * use it and NameServer_create() needs to hold it around its call to
+ * NameServer_getHandle().  Also, use the static initializer instead of a
+ * run-time init call, so we can use this gate immediately in _setup().
+ */
+static NameServer_ModuleObject NameServer_state = {
+    .defInstParams.maxRuntimeEntries = 0u,
+    .defInstParams.tableHeap         = NULL,
+    .defInstParams.checkExisting     = TRUE,
+    .defInstParams.maxValueLen       = 0u,
+    .defInstParams.maxNameLen        = 16u,
+//    .modGate                         = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP,
+    .modGate                         = PTHREAD_RMUTEX_INITIALIZER,
+    .refCount                        = 0
+};
+
+static NameServer_ModuleObject * NameServer_module = &NameServer_state;
+
+static const UInt32 stringCrcTab[256u] = {
+  0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+  0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+  0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+  0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+  0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+  0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+  0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+  0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+  0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+  0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+  0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+  0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+  0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+  0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+  0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+  0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+  0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+  0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+  0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+  0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+  0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+  0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+  0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+  0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+  0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+  0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+  0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+  0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+  0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+  0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+  0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+  0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+  0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+  0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+  0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+  0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+  0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+  0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+  0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+  0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+  0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+  0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+  0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
+};
+
+static UInt32 stringHash(String s)
+{
+    UInt32 hash = strlen(s);
+    UInt32 i;
+
+    for (i = 0; i < strlen(s); i++) {
+        hash = (hash >> 8u) ^ stringCrcTab[(hash & 0xff)] ^ s[i];
+    }
+
+    return (hash);
+}
+
+static void NameServerRemote_processMessage(NameServerMsg * msg, UInt16 procId)
+{
+    NameServer_Handle handle;
+    Int               status = NameServer_E_FAIL;
+    char              buf = 'n';
+    int               numBytes;
+    int               waitFd = NameServer_module->waitFdW;
+
+    if (msg->request == NAMESERVER_REQUEST) {
+        LOG2("NameServer Request: instanceName: %s, name: %s\n",
+             (String)msg->instanceName, (String)msg->name)
+
+        /*
+         *  Message is a request. Lookup name in NameServer table.
+         *  Send a response message back to source processor.
+         */
+        handle = NameServer_getHandle((String)msg->instanceName);
+
+        if (handle != NULL) {
+            /* Search for the NameServer entry */
+            LOG0("Calling NameServer_getLocalUInt32...\n")
+            status = NameServer_getLocalUInt32(handle,
+                     (String)msg->name, &msg->value);
+        }
+
+        LOG2("NameServer Response: instanceName: %s, name: %s,",
+             (String)msg->instanceName, (String)msg->name)
+        /* set the request status */
+        if (status < 0) {
+            LOG1(" Value not found, status: %d\n", status)
+            msg->requestStatus = 0;
+        }
+        else {
+            msg->requestStatus = 1;
+            LOG1(" Value: 0x%x\n", msg->value)
+        }
+
+        /* specify message as a response */
+        msg->request = NAMESERVER_RESPONSE;
+        msg->reserved = NAMESERVER_MSG_TOKEN;
+
+        /* send response message to remote processor */
+        status = MessageQCopy_send(procId, MultiProc_self(),
+            MESSAGEQ_RPMSG_PORT, RPMSG_RESERVED_ADDRESSES, msg,
+            sizeof(NameServerMsg), TRUE);
+        if (status < 0) {
+            LOG0("NameServer: MessageQCopy_send failed\n")
+        }
+    }
+    else {
+        LOG2("NameServer Reply: instanceName: %s, name: %s",
+             (String)msg->instanceName, (String)msg->name)
+        LOG1(", value: 0x%x\n", msg->value)
+
+        /* Save the response message.  */
+        memcpy(&NameServer_module->nsMsg, msg, sizeof(NameServerMsg));
+
+        /* Post the eventfd upon which NameServer_get() is waiting */
+        numBytes = write(waitFd, &buf, sizeof(buf));
+    }
+}
+
+static Void _listener_cb(MessageQCopy_Handle handle, void * data, int len,
+    void * priv, UInt32 src, UInt16 srcProc)
+{
+    NameServerMsg msg;
+
+    LOG0("listener_cb: Entered Listener thread.\n")
+
+    LOG1("NameServer: Listener got NameServer message "
+         "from MessageQCopy: 0x%x!\n", handle);
+    /* Get NameServer message and process: */
+    memcpy(&msg, data, len);
+
+    if (len != sizeof(NameServerMsg)) {
+        LOG1("NameServer: got bad NameServerMsg len (%d)\n",
+            len)
+    }
+    else {
+        LOG1("listener_cb: read from MessageQCopy 0x%x\n", handle)
+        LOG2("\tReceived ns msg: byte count: %d, from addr: %d, ",
+             len, src)
+        LOG1("from vproc: %d\n", srcProc)
+        NameServerRemote_processMessage(&msg, srcProc);
+    }
+}
+
+/* =============================================================================
+ * APIS
+ * =============================================================================
+ */
+
+/* Function to setup the nameserver module. */
+Int NameServer_setup(Void)
+{
+    Int    status = NameServer_S_SUCCESS;
+    UInt16 numProcs;
+    int    fd[2];
+
+    pthread_mutex_lock(&NameServer_module->modGate);
+
+    LOG1("NameServer_setup: entered, refCount=%d\n", NameServer_module->refCount)
+
+    NameServer_module->refCount++;
+
+    if (NameServer_module->refCount > 1) {
+        LOG0("NameServer_setup: already setup\n")
+        status = NameServer_S_ALREADYSETUP;
+        goto exit;
+    }
+
+    numProcs = MultiProc_getNumProcessors();
+
+    if (pipe(fd) == -1) {
+        status = NameServer_E_FAIL;
+        LOG0("NameServer_setup: failed to create waitFd.\n")
+        goto exit;
+    }
+    NameServer_module->waitFdW = fd[1];
+    NameServer_module->waitFdR = fd[0];
+
+    /* Create the MessageQCopy for receiving messages from all remote proc */
+    NameServer_module->mq = MessageQCopy_create(NAME_SERVER_RPMSG_ADDR,
+        NULL, _listener_cb, NULL, &NameServer_module->recvAddr);
+
+    if (NameServer_module->mq == NULL) {
+        status = NameServer_E_FAIL;
+        LOG0("NameServer_setup: failed to create MessageQCopy instance.\n")
+        goto exit;
+    }
+
+    /* Construct the list object */
+    CIRCLEQ_INIT(&NameServer_module->objList);
+
+exit:
+    LOG1("NameServer_setup: exiting, refCount=%d\n", \
+        NameServer_module->refCount)
+
+    pthread_mutex_unlock(&NameServer_module->modGate);
+
+    return (status);
+}
+
+/*! Function to destroy the nameserver module. */
+Int NameServer_destroy(void)
+{
+    Int      status    = NameServer_S_SUCCESS;
+
+    pthread_mutex_lock(&NameServer_module->modGate);
+
+    LOG1("NameServer_destroy: entered, refCount=%d\n", NameServer_module->refCount)
+
+    NameServer_module->refCount--;
+
+    if (NameServer_module->refCount > 0) {
+        LOG1("NameServer_destroy(): refCount(%d) > 0, exiting\n", NameServer_module->refCount)
+        status = NameServer_S_SUCCESS;
+
+        goto exit;
+    }
+
+    /* Delete the MessageQCopy instances */
+    if (NameServer_module->mq != NULL) {
+        MessageQCopy_delete(&NameServer_module->mq);
+    }
+
+    CIRCLEQ_destruct(&NameServer_module->objList);
+
+    close(NameServer_module->waitFdW);
+    close(NameServer_module->waitFdR);
+
+exit:
+    LOG1("NameServer_destroy: exiting, refCount=%d\n", NameServer_module->refCount)
+
+    pthread_mutex_unlock(&NameServer_module->modGate);
+
+    return (status);
+}
+
+/* Function to retrieve a NameServer handle from name. */
+NameServer_Handle NameServer_getHandle(String name)
+{
+    NameServer_Handle handle = NULL;
+    Bool              found = FALSE;
+    struct NameServer_Object * elem;
+
+    assert(name != NULL);
+    assert(NameServer_module->refCount != 0);
+
+    pthread_mutex_lock(&NameServer_module->modGate);
+
+    /* Lookup handle from name: */
+    CIRCLEQ_traverse(elem, &NameServer_module->objList, NameServer_Object) {
+        handle = (NameServer_Handle) elem;
+        if (strcmp(handle->name, name) == 0) {
+            found = TRUE;
+            break;
+        }
+    }
+
+    if (found == FALSE) {
+        handle = NULL;
+    }
+
+    pthread_mutex_unlock(&NameServer_module->modGate);
+
+    return (handle);
+}
+
+
+/* Function to create a name server. */
+NameServer_Handle NameServer_create(String name,
+                                    const NameServer_Params * params)
+{
+    NameServer_Handle handle = NULL;
+    pthread_mutexattr_t mutex_attr;
+
+    assert(params != NULL);
+    assert(name != NULL);
+    assert(NameServer_module->refCount != 0);
+
+    LOG1("NameServer_create(): '%s'\n", name)
+
+    pthread_mutex_lock(&NameServer_module->modGate);
+
+    if (params->maxValueLen > sizeof(UInt32)) {
+        LOG1("NameServer_create: params->maxValueLen (%d) too big for now\n", params->maxValueLen)
+       /* Can't handle more than UInt32 at this time: */
+       goto leave;
+    }
+
+    /* check if the name is already created or not */
+    if (NameServer_getHandle(name)) {
+        LOG0("NameServer_create NameServer_E_INVALIDARG Name is in use!\n")
+        handle = NULL;
+        goto leave;
+    }
+    else {
+        handle = (NameServer_Handle)calloc(1, sizeof(NameServer_Object));
+    }
+
+    if (!handle) {
+        LOG0("NameServer_create: NameServer_Handle alloc failed\n")
+        goto leave;
+    }
+
+    handle->name = (String)malloc(strlen(name) + 1u);
+    if (!handle->name) {
+        LOG0("NameServer_create: instance name alloc failed\n")
+        goto cleanup;
+    }
+    strncpy(handle->name, name, strlen (name) + 1u);
+    memcpy((Ptr) &handle->params, (Ptr) params, sizeof(NameServer_Params));
+
+    if (params->maxValueLen < sizeof(UInt32)) {
+        handle->params.maxValueLen = sizeof(UInt32);
+    }
+    else {
+        handle->params.maxValueLen = params->maxValueLen;
+    }
+
+    CIRCLEQ_INIT(&handle->nameList);
+    handle->count = 0u;
+
+    /* Put in the local list */
+    CIRCLEQ_elemClear(&handle->elem);
+    CIRCLEQ_INSERT_HEAD(&NameServer_module->objList, handle, elem);
+
+    /*
+     * NameServer_removeEntry() enters gate and is called by
+     * NameServer_remove() while holding the gate.
+     */
+    pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
+    pthread_mutex_init(&handle->gate, &mutex_attr);
+
+    goto leave;
+
+cleanup:
+    free(handle);
+    handle = NULL;
+
+leave:
+    pthread_mutex_unlock(&NameServer_module->modGate);
+
+    return (handle);
+}
+
+
+/* Function to delete a name server. */
+Int NameServer_delete(NameServer_Handle * handle)
+{
+    Int status = NameServer_S_SUCCESS;
+
+    assert(handle != NULL);
+    assert(*handle != NULL);
+    assert((*handle)->count == 0);
+    assert(NameServer_module->refCount != 0);
+
+    pthread_mutex_lock(&NameServer_module->modGate);
+
+    if ((*handle)->count == 0) {
+        CIRCLEQ_REMOVE(&NameServer_module->objList, *handle, elem);
+
+        if ((*handle)->name != NULL) {
+            free((*handle)->name);
+            (*handle)->name = NULL;
+        }
+
+        CIRCLEQ_destruct(&(*handle)->nameList);
+
+        free((*handle));
+        (*handle) = NULL;
+    }
+
+    pthread_mutex_unlock(&NameServer_module->modGate);
+
+    return (status);
+}
+
+/* Adds a variable length value into the local NameServer table */
+Ptr NameServer_add(NameServer_Handle handle, String name, Ptr buf, UInt len)
+{
+    Int                 status = NameServer_S_SUCCESS;
+    NameServer_TableEntry * node = NULL;
+    NameServer_TableEntry * new_node = NULL;
+    Bool                found = FALSE;
+    UInt32              hash;
+
+    assert(handle != NULL);
+    assert(name     != NULL);
+    assert(buf      != NULL);
+    assert(len      != 0);
+    assert(NameServer_module->refCount != 0);
+
+    /* Calculate the hash */
+    hash = stringHash(name);
+
+    pthread_mutex_lock(&handle->gate);
+
+    /* Traverse the list to find duplicate check */
+    CIRCLEQ_traverse(node, &handle->nameList, NameServer_TableEntry_tag) {
+        /* Hash matches */
+        if (node->hash == hash) {
+            /* If the name matches, incase hash is duplicate */
+            if (strcmp(node->name, name) == 0) {
+                if (handle->params.checkExisting == TRUE) {
+                    status = NameServer_E_INVALIDARG;
+                    LOG1("NameServer_add: '%s' - duplicate entry found!\n", name)
+                    break;
+                }
+            }
+            else {
+                found = TRUE;
+                break;
+            } /* name does not match */
+        } /* hash does not match */
+    } /* CIRCLEQ_traverse */
+
+    if (status != NameServer_S_SUCCESS) {
+        new_node = NULL;
+        goto exit;
+    }
+
+    /* Now add the new entry. */
+    new_node = (NameServer_TableEntry *)malloc(sizeof(NameServer_TableEntry));
+    if (new_node == NULL) {
+        status = NameServer_E_MEMORY;
+        LOG1("NameServer_add: %d - malloc new_node failed!\n", status)
+
+        goto exit;
+    }
+
+    new_node->hash    = hash;
+    new_node->collide = found; /* Indicate if there is a collision*/
+    new_node->len     = len;
+    new_node->next    = NULL;
+    new_node->name = (String)malloc(strlen(name) + 1u);
+    new_node->value  = (Ptr)malloc(len);
+    strncpy(new_node->name, name, strlen(name) + 1u);
+    memcpy((Ptr)new_node->value, (Ptr)buf, len);
+
+    if (found == TRUE) {
+        /* If hash is found, need to stitch the list to link the
+         * new node to the existing node with the same hash.
+         */
+        new_node->next = node->next;
+        node->next = new_node;
+    }
+    else {
+        /* put the new node into the list */
+        CIRCLEQ_INSERT_HEAD(&handle->nameList, new_node, elem);
+    }
+
+    handle->count++;
+
+    LOG2("NameServer_add: Entered key: '%s', data: 0x%x\n",
+         name, *(UInt32 *)buf)
+
+exit:
+    pthread_mutex_unlock(&handle->gate);
+
+    return (new_node);
+}
+
+
+/* Function to add a UInt32 value into a name server. */
+Ptr NameServer_addUInt32(NameServer_Handle handle, String name, UInt32 value)
+{
+    Ptr entry = NULL;
+
+    assert(handle != NULL);
+    assert(name   != NULL);
+    assert(NameServer_module->refCount != 0);
+
+    entry = NameServer_add(handle, name, &value, sizeof(UInt32));
+
+    return (entry);
+}
+
+/* Function to remove a name/value pair from a name server. */
+Int NameServer_remove(NameServer_Handle handle, String name)
+{
+    Int                 status = NameServer_S_SUCCESS;
+    NameServer_TableEntry *prev = NULL;
+    NameServer_TableEntry *temp = NULL;
+    NameServer_TableEntry *node = NULL;
+    Bool                done   = FALSE;
+    UInt32              hash;
+
+    assert(handle != NULL);
+    assert(name   != NULL);
+    assert(NameServer_module->refCount != 0);
+
+    /* Calculate the hash */
+    hash = stringHash(name);
+
+    pthread_mutex_lock(&handle->gate);
+
+    /* Traverse the list to find duplicate check */
+    CIRCLEQ_traverse(node, &handle->nameList, NameServer_TableEntry_tag) {
+        /* Hash matchs */
+        if (node->hash == hash) {
+            if (node->collide == TRUE) {
+                if (strcmp(node->name, name) == 0){
+                    free(node->value);
+                    free(node->name);
+                    memcpy((Ptr)node, (Ptr) node->next,
+                           sizeof(NameServer_TableEntry));
+                    node->next = node->next->next;
+                    free(node->next);
+                    handle->count--;
+                    done = TRUE;
+                    break;
+                }
+                else {
+                    prev = node;
+                    temp = node->next;
+                    while (temp) {
+                        if (strcmp(temp->name, name) == 0){
+                            free(temp->value);
+                            free(temp->name);
+                            prev->next = temp->next;
+                            free(temp);
+                            handle->count--;
+                            done = TRUE;
+                            break;
+                        }
+                        temp = temp->next;
+                    }
+                    break;
+                }
+            }
+            else {
+                NameServer_removeEntry(handle, (Ptr)node);
+
+                done = TRUE;
+                break;
+            }
+        }
+    }
+
+    if (done == FALSE) {
+        status = NameServer_E_INVALIDARG;
+        LOG1("NameServer_remove %d Entry not found!\n", status)
+    }
+
+    pthread_mutex_unlock(&handle->gate);
+
+    return (status);
+}
+
+/* Function to remove a name/value pair from a name server. */
+Int NameServer_removeEntry(NameServer_Handle handle, Ptr entry)
+{
+    Int  status = NameServer_S_SUCCESS;
+    NameServer_TableEntry * node;
+
+    assert(handle != NULL);
+    assert(entry  != NULL);
+    assert(NameServer_module->refCount != 0);
+
+    pthread_mutex_lock(&handle->gate);
+
+    node = (NameServer_TableEntry *)entry;
+
+    free(node->value);
+    free(node->name);
+    CIRCLEQ_REMOVE(&handle->nameList, node, elem);
+    free(node);
+    handle->count--;
+
+    pthread_mutex_unlock(&handle->gate);
+
+    return (status);
+}
+
+
+/* Initialize this config-params structure with supplier-specified
+ * defaults before instance creation.
+ */
+Void NameServer_Params_init(NameServer_Params * params)
+{
+    assert(params != NULL);
+
+    memcpy(params, &(NameServer_module->defInstParams),
+           sizeof (NameServer_Params));
+}
+
+
+Int NameServer_getRemote(NameServer_Handle handle,
+                     String            name,
+                     Ptr               value,
+                     UInt32 *          len,
+                     UInt16            procId)
+{
+    Int status = NameServer_S_SUCCESS;
+    Int mqcStatus = -1;
+    struct NameServer_Object *obj = (struct NameServer_Object *)(handle);
+    NameServerMsg nsMsg;
+    NameServerMsg *replyMsg;
+    fd_set rfds;
+    int ret = 0, maxfd, waitFd;
+    struct timeval tv;
+    char buf = '1';
+    int numBytes;
+
+    pthread_mutex_lock(&NameServer_module->modGate);
+
+    /* Set Timeout to wait: */
+    tv.tv_sec = NAMESERVER_GET_TIMEOUT;
+    tv.tv_usec = 0;
+
+    /* Create request message and send to remote processor: */
+    nsMsg.reserved = NAMESERVER_MSG_TOKEN;
+    nsMsg.request = NAMESERVER_REQUEST;
+    nsMsg.requestStatus = 0;
+
+    strncpy((char *)nsMsg.instanceName, obj->name, strlen(obj->name) + 1);
+    strncpy((char *)nsMsg.name, name, strlen(name) + 1);
+
+    LOG2("NameServer_getRemote: Requesting from procId %d, %s:",
+           procId, (String)nsMsg.instanceName)
+    LOG1("%s...\n", (String)nsMsg.name)
+    /* send message */
+    mqcStatus = MessageQCopy_send(procId, MultiProc_self(), MESSAGEQ_RPMSG_PORT,
+            RPMSG_RESERVED_ADDRESSES, &nsMsg, sizeof(NameServerMsg),
+        TRUE);
+    if (mqcStatus < 0) {
+        LOG0("NameServer_getRemote: Can't send to remote endpoint\n")
+        status = NameServer_E_FAIL;
+        goto exit;
+    }
+
+    /* Block on waitFd for signal from listener thread: */
+    waitFd = NameServer_module->waitFdR;
+    FD_ZERO(&rfds);
+    FD_SET(waitFd, &rfds);
+    maxfd = waitFd + 1;
+    LOG1("NameServer_getRemote: pending on waitFd: %d\n", waitFd)
+    ret = select(maxfd, &rfds, NULL, NULL, &tv);
+    if (ret == -1) {
+        LOG0("NameServer_getRemote: select failed.")
+        status = NameServer_E_FAIL;
+        goto exit;
+    }
+    else if (!ret) {
+        LOG0("NameServer_getRemote: select timed out.\n")
+        status = NameServer_E_TIMEOUT;
+        goto exit;
+    }
+
+    if (FD_ISSET(waitFd, &rfds)) {
+        /* Read, just to balance the write: */
+        numBytes = read(waitFd, &buf, sizeof(buf));
+
+        /* Process response: */
+        replyMsg = &NameServer_module->nsMsg;
+
+        if (replyMsg->requestStatus) {
+            /* name is found */
+            /* set the contents of value */
+            *(UInt32 *)value = (UInt32)replyMsg->value;
+
+            LOG2("NameServer_getRemote: Reply from: %d, %s:",
+                 procId, (String)replyMsg->instanceName)
+            LOG2("%s, value: 0x%x...\n",
+                 (String)replyMsg->name, *(UInt32 *)value)
+            goto exit;
+        }
+        else {
+            /* name is not found */
+            LOG2("NameServer_getRemote: value for %s:%s not found.\n",
+                 (String)replyMsg->instanceName, (String)replyMsg->name)
+
+            /* set status to not found */
+            status = NameServer_E_NOTFOUND;
+        }
+    }
+
+exit:
+    pthread_mutex_unlock(&NameServer_module->modGate);
+
+    return (status);
+}
+
+/* Function to retrieve the value portion of a name/value pair from
+ * local table.
+ */
+Int NameServer_get(NameServer_Handle handle,
+               String            name,
+               Ptr               value,
+               UInt32 *          len,
+               UInt16            procId[])
+{
+    Int status = NameServer_S_SUCCESS;
+    UInt16 numProcs = MultiProc_getNumProcessors();
+    UInt32 i;
+
+    if (procId == NULL) {
+        status = NameServer_getLocal(handle, name, value, len);
+        if (status == NameServer_E_NOTFOUND) {
+            for (i = 0; i < numProcs; i++) {
+                /* getLocal call already covers "self", keep going */
+                if (i == MultiProc_self()) {
+                    continue;
+                }
+
+                status = NameServer_getRemote(handle, name, value, len, i);
+
+                if ((status >= 0) ||
+                    ((status < 0) && (status != NameServer_E_NOTFOUND))) {
+                    break;
+                }
+            }
+        }
+    }
+    else {
+        /*
+         *  Search the query list. It might contain the local proc
+         *  somewhere in the list.
+         */
+        i = 0;
+        while (procId[i] != MultiProc_INVALIDID) {
+            if (procId[i] == MultiProc_self()) {
+                status = NameServer_getLocal(handle, name, value, len);
+            }
+            else {
+                status = NameServer_getRemote(handle, name, value, len, i);
+            }
+
+            if ((status >= 0) ||
+                ((status < 0) && (status != NameServer_E_NOTFOUND))) {
+                break;
+            }
+
+            i++;
+        }
+    }
+
+    return (status);
+}
+
+/* Gets a 32-bit value by name */
+Int NameServer_getUInt32(NameServer_Handle handle,
+                     String            name,
+                     Ptr               value,
+                     UInt16            procId[])
+{
+    Int  status;
+    UInt32 len = sizeof(UInt32);
+
+    assert(handle != NULL);
+    assert(name   != NULL);
+    assert(value  != NULL);
+    assert(NameServer_module->refCount != 0);
+
+    status = NameServer_get(handle, name, value, &len, procId);
+
+    return (status);
+}
+
+/* Function to Retrieve the value portion of a name/value pair from
+ * local table.
+ */
+Int NameServer_getLocal(NameServer_Handle handle,
+                    String            name,
+                    Ptr               value,
+                    UInt32 *          len)
+{
+    Int status = NameServer_E_NOTFOUND;
+    NameServer_TableEntry * node = NULL;
+    NameServer_TableEntry * temp = NULL;
+    Bool done   = FALSE;
+    UInt32 length;
+    UInt32 hash;
+
+    assert(handle != NULL);
+    assert(name   != NULL);
+    assert(value  != NULL);
+    assert(len    != NULL);
+    assert(NameServer_module->refCount != 0);
+
+    length = *len;
+
+    /* Calculate the hash */
+    hash = stringHash(name);
+
+    pthread_mutex_lock(&handle->gate);
+
+    /* Traverse the list to find duplicate check */
+    CIRCLEQ_traverse(node, &handle->nameList, NameServer_TableEntry_tag) {
+        if (node->hash == hash) {
+            if (node->collide == TRUE) {
+                temp = node;
+                while (temp) {
+                    if (strcmp(temp->name, name) == 0u){
+                        if (length <= node->len) {
+                            memcpy(value, node->value, length);
+                            *len = length;
+                        }
+                        else {
+                            memcpy(value, node->value, node->len);
+                            *len = node->len;
+                        }
+                        done = TRUE;
+                        break;
+                    }
+                    temp = temp->next;
+                }
+                break;
+            }
+            else {
+                if (length <= node->len) {
+                    memcpy(value, node->value, length);
+                    *len = length;
+                }
+                else {
+                    memcpy(value, node->value, node->len);
+                    *len = node->len;
+                }
+                done = TRUE;
+                break;
+            }
+        }
+    }
+
+    pthread_mutex_unlock(&handle->gate);
+
+    if (done == FALSE) {
+        LOG1("NameServer_getLocal: entry key: '%s' not found!\n", name)
+    }
+    else {
+        LOG2("NameServer_getLocal: Found entry key: '%s', data: 0x%x\n",
+             node->name, (UInt32)node->value)
+        status = NameServer_S_SUCCESS;
+    }
+
+    return (status);
+}
+
+/*
+ *  Gets a 32-bit value by name from the local table
+ *
+ *  If the name is found, the 32-bit value is copied into the value
+ *  argument and a success status is returned.
+ *
+ *  If the name is not found, zero is returned in len and the contents
+ *  of value are not modified. Not finding a name is not considered
+ *  an error.
+ *
+ *  This function only searches the local name/value table.
+ *
+ */
+Int NameServer_getLocalUInt32(NameServer_Handle handle, String name, Ptr value)
+{
+    Int                 status;
+    UInt32              len    = sizeof(UInt32);
+
+    assert(handle != NULL);
+    assert(name   != NULL);
+    assert(value  != NULL);
+    assert(NameServer_module->refCount != 0);
+
+    LOG0("NameServer_getLocalUInt32: calling NameServer_getLocal()...\n")
+    status = NameServer_getLocal(handle, name, value, &len);
+
+    return (status);
+}
+
+
+#if defined (__cplusplus)
+}
+#endif /* defined (__cplusplus) */
diff --git a/qnx/src/ipc3x_dev/ti/syslink/utils/hlos/knl/Qnx/Nameserver_devctl.c b/qnx/src/ipc3x_dev/ti/syslink/utils/hlos/knl/Qnx/Nameserver_devctl.c
new file mode 100644 (file)
index 0000000..98f4e92
--- /dev/null
@@ -0,0 +1,435 @@
+/*
+ *  @file   Nameserver_devctl.c
+ *
+ *  @brief      OS-specific implementation of NameServer driver for Qnx
+ *
+ *
+ *  ============================================================================
+ *
+ *  Copyright (c) 2008-2013, Texas Instruments Incorporated
+ *
+ *  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.
+ *  Contact information for paper mail:
+ *  Texas Instruments
+ *  Post Office Box 655303
+ *  Dallas, Texas 75265
+ *  Contact information:
+ *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
+ *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
+ *  ============================================================================
+ *
+ */
+
+/* Standard headers */
+#include <ti/syslink/Std.h>
+
+/* OSAL & Utils headers */
+#include <ti/syslink/utils/List.h>
+#include <ti/syslink/utils/Trace.h>
+#include <ti/syslink/utils/Memory.h>
+
+/* QNX specific header include */
+#include <ti/syslink/build/Qnx/resmgr/proto.h>
+#include <ti/syslink/build/Qnx/resmgr/dcmd_syslink.h>
+
+/* Module specific header files */
+#include <ti/ipc/NameServer.h>
+#include <ti/syslink/inc/NameServerDrvDefs.h>
+
+/* Function prototypes */
+int syslink_nameserver_adduint32(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+int syslink_nameserver_getuint32(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+int syslink_nameserver_remove(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+int syslink_nameserver_removeentry(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+int syslink_nameserver_params_init(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+int syslink_nameserver_create(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+int syslink_nameserver_delete(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+int syslink_nameserver_setup(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+int syslink_nameserver_destroy(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb);
+
+/**
+ * Handler for devctl() messages for MultiProc module.
+ *
+ * Handles special devctl() messages that we export for control.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_nameserver_devctl(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+
+    switch (msg->i.dcmd)
+    {
+      case DCMD_NAMESERVER_ADDUINT32:
+      {
+          return syslink_nameserver_adduint32( ctp, msg, ocb);
+      }
+      break;
+
+      case DCMD_NAMESERVER_GETUINT32:
+      {
+          return syslink_nameserver_getuint32( ctp, msg, ocb);
+      }
+      break;
+
+      case DCMD_NAMESERVER_REMOVE:
+      {
+          return syslink_nameserver_remove( ctp, msg, ocb);
+      }
+      break;
+
+      case DCMD_NAMESERVER_REMOVEENTRY:
+      {
+          return syslink_nameserver_removeentry( ctp, msg, ocb);
+      }
+      break;
+
+      case DCMD_NAMESERVER_PARAMS_INIT:
+      {
+          return syslink_nameserver_params_init( ctp, msg, ocb);
+      }
+      break;
+
+      case DCMD_NAMESERVER_CREATE:
+      {
+          return syslink_nameserver_create( ctp, msg, ocb);
+      }
+      break;
+
+      case DCMD_NAMESERVER_DELETE:
+      {
+          return syslink_nameserver_delete( ctp, msg, ocb);
+      }
+      break;
+
+      case DCMD_NAMESERVER_SETUP:
+      {
+          return syslink_nameserver_setup( ctp, msg, ocb);
+      }
+      break;
+
+      case DCMD_NAMESERVER_DESTROY:
+      {
+          return syslink_nameserver_destroy( ctp, msg, ocb);
+      }
+      break;
+
+      default:
+          fprintf( stderr, "Invalid DEVCTL for nameserver 0x%x\n", msg->i.dcmd);
+          break;
+
+    }
+
+    return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
+        sizeof(NameServerDrv_CmdArgs)));
+}
+
+/**
+ * Handler for nameserver addunit32 API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_nameserver_adduint32(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    NameServerDrv_CmdArgs *     cargs = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->i));
+    NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->o));
+    String name = (String)(cargs+1);
+
+    Ptr    entry;
+
+    GT_assert (curTrace, (name != NULL));
+
+    entry = NameServer_addUInt32 (cargs->args.addUInt32.handle,
+                                  name,
+                                  cargs->args.addUInt32.value);
+    GT_assert (curTrace, (entry != NULL));
+
+    out->args.addUInt32.entry = entry;
+
+    return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
+        sizeof(NameServerDrv_CmdArgs)));
+}
+
+/**
+ * Handler for nameserver get  API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_nameserver_getuint32(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    UInt32                      value;
+    NameServerDrv_CmdArgs *     cargs = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->i));
+    NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->o));
+
+    char * name  = (char *)(cargs + 1);
+    UInt16 * procId = NULL;
+
+
+    if (cargs->args.getUInt32.procId[0] != (UInt16)-1) {
+        procId = (UInt16 *)(name + (sizeof(char) * strlen(name)));
+    }
+
+    out->apiStatus = NameServer_getUInt32 (cargs->args.getUInt32.handle,
+                             (String)name,
+                             (Ptr)&value,
+                             procId);
+
+    out->args.getUInt32.value = value;
+
+    /* Do not assert. This can return NameServer_E_NOTFOUND
+     * as a valid runtime failure.
+     */
+
+    return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
+        sizeof(NameServerDrv_CmdArgs)));
+}
+
+/**
+ * Handler for nameserver remove API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_nameserver_remove(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    NameServerDrv_CmdArgs * cargs = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->i));
+    NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *) (_DEVCTL_DATA (msg->o));
+    String name = (String)(cargs+1);
+
+    out->apiStatus = NameServer_remove (cargs->args.remove.handle, name);
+
+    return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
+        sizeof(NameServerDrv_CmdArgs)));
+}
+
+/**
+ * Handler for nameserver remove entry API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_nameserver_removeentry(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    NameServerDrv_CmdArgs *     cargs = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->i));
+    NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->o));
+
+    out->apiStatus = NameServer_removeEntry (cargs->args.removeEntry.handle,
+                                    cargs->args.removeEntry.entry);
+
+    return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
+        sizeof(NameServerDrv_CmdArgs)));
+}
+
+/**
+ * Handler for nameserver params init API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_nameserver_params_init(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    NameServerDrv_CmdArgs *     cargs = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->i));
+
+    NameServer_Params *params = (NameServer_Params *)(cargs+1);
+
+    NameServer_Params_init (params);
+
+    SETIOV(&ctp->iov[0], &msg->o, sizeof(msg->o) +
+        sizeof(NameServerDrv_CmdArgs));
+    SETIOV(&ctp->iov[1], params, sizeof(NameServer_Params));
+
+    return _RESMGR_NPARTS(2);
+}
+
+/**
+ * Handler for nameserver create API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_nameserver_create(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    NameServerDrv_CmdArgs *     cargs = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->i));
+    NameServerDrv_CmdArgs *     out  = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->o));
+    NameServer_Params *         params = (NameServer_Params *)(cargs+1);
+    String name = (String)(params+1);
+
+    out->args.create.handle = NameServer_create (name, params);
+    GT_assert (curTrace, (out->args.create.handle != NULL));
+
+    return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
+        sizeof(NameServerDrv_CmdArgs)));
+}
+
+/**
+ * Handler for nameserver delete API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_nameserver_delete(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    NameServerDrv_CmdArgs * cargs = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->i));
+    NameServerDrv_CmdArgs * out  = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->o));
+
+    out->apiStatus = NameServer_delete (&(cargs->args.delete.handle));
+    GT_assert (curTrace, (out->apiStatus >= 0));
+
+    return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
+        sizeof(NameServerDrv_CmdArgs)));
+}
+
+/**
+ * Handler for nameserver setup  API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_nameserver_setup(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    NameServerDrv_CmdArgs * out  = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->o));
+
+    out->apiStatus = NameServer_setup ();
+    GT_assert (curTrace, (out->apiStatus >= 0));
+
+    return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
+        sizeof(NameServerDrv_CmdArgs)));
+}
+
+/**
+ * Handler for nameserver destroy API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_nameserver_destroy(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    NameServerDrv_CmdArgs * out  = (NameServerDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->o));
+
+    out->apiStatus = NameServer_destroy ();
+    GT_assert (curTrace, (out->apiStatus >= 0));
+
+    return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
+        sizeof(NameServerDrv_CmdArgs)));
+
+}
diff --git a/qnx/src/ipc3x_dev/ti/syslink/utils/hlos/usr/Qnx/NameServerDrv.c b/qnx/src/ipc3x_dev/ti/syslink/utils/hlos/usr/Qnx/NameServerDrv.c
new file mode 100644 (file)
index 0000000..d138b4b
--- /dev/null
@@ -0,0 +1,296 @@
+/*
+ *  @file   NameServerDrv.c
+ *
+ *  @brief      OS-specific implementation of NameServer driver for Qnx
+ *
+ *
+ *  ============================================================================
+ *
+ *  Copyright (c) 2008-2013, Texas Instruments Incorporated
+ *
+ *  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.
+ *  Contact information for paper mail:
+ *  Texas Instruments
+ *  Post Office Box 655303
+ *  Dallas, Texas 75265
+ *  Contact information:
+ *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm?
+ *  DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact
+ *  ============================================================================
+ *
+ */
+
+
+/* Standard headers */
+#include <ti/syslink/Std.h>
+
+/* OSAL & Utils headers */
+#include <ti/syslink/utils/Trace.h>
+#include <ti/syslink/utils/Gate.h>
+#include <ti/ipc/NameServer.h>
+#include <_MultiProc.h>
+#include <ti/syslink/inc/NameServerDrvDefs.h>
+
+#include <ti/syslink/build/Qnx/resmgr/dcmd_syslink.h>
+
+/* QNX specific header files */
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <inttypes.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <string.h>
+
+/** ============================================================================
+ *  Globals
+ *  ============================================================================
+ */
+
+extern Int32 IpcDrv_handle;
+
+
+/** ============================================================================
+ *  Functions
+ *  ============================================================================
+ */
+/*!
+ *  @brief  Function to open the NameServer driver.
+ *
+ *  @sa     NameServerDrv_close
+ */
+Int
+NameServerDrv_open (Void)
+{
+    Int status      = NameServer_S_SUCCESS;
+
+    return status;
+}
+
+
+/*!
+ *  @brief  Function to close the NameServer driver.
+ *
+ *  @sa     NameServerDrv_open
+ */
+Int
+NameServerDrv_close (Void)
+{
+    Int status      = NameServer_S_SUCCESS;
+
+    return status;
+}
+
+
+/*!
+ *  @brief  Function to invoke the APIs through ioctl.
+ *
+ *  @param  cmd     Command for driver ioctl
+ *  @param  args    Arguments for the ioctl command
+ *
+ *  @sa
+ */
+Int
+NameServerDrv_ioctl (UInt32 cmd, Ptr args)
+{
+    Int                     status = NameServer_S_SUCCESS;
+    Int                     osStatus = 0;
+    NameServerDrv_CmdArgs * cargs = (NameServerDrv_CmdArgs *)args;
+
+    GT_2trace (curTrace, GT_ENTER, "NameServerDrv_ioctl", cmd, args);
+
+    switch (cmd) {
+
+      case CMD_NAMESERVER_ADDUINT32:
+      {
+          iov_t nameserver_add_iov[2];
+
+          SETIOV(&nameserver_add_iov[0], cargs, sizeof(NameServerDrv_CmdArgs));
+          SETIOV(&nameserver_add_iov[1], cargs->args.addUInt32.name,
+              cargs->args.addUInt32.nameLen );
+          osStatus = devctlv(IpcDrv_handle, DCMD_NAMESERVER_ADDUINT32, 2, 2,
+              nameserver_add_iov, nameserver_add_iov, NULL);
+
+          if ( osStatus != 0 ){
+              status = NameServer_E_OSFAILURE;
+          }
+      }
+      break;
+
+      case CMD_NAMESERVER_GETUINT32:
+      {
+          iov_t     nameserver_get_iov[3];
+          unsigned char   count = 0;
+
+          SETIOV(&nameserver_get_iov[count], cargs,
+              sizeof(NameServerDrv_CmdArgs));
+          count++;
+          SETIOV( &nameserver_get_iov[count], cargs->args.getUInt32.name,
+              NameServer_Params_MAXNAMELEN);
+          count++;
+
+          if (cargs->args.getUInt32.procId != NULL) {
+              SETIOV(&nameserver_get_iov[count], cargs->args.getUInt32.procId,
+                  (sizeof(UInt16) * MultiProc_MAXPROCESSORS));
+              count++;
+          }
+
+          osStatus = devctlv(IpcDrv_handle, DCMD_NAMESERVER_GETUINT32, count,
+              count, nameserver_get_iov, nameserver_get_iov, NULL);
+          if (osStatus != 0) {
+              status = NameServer_E_OSFAILURE;
+          }
+      }
+      break;
+
+      case CMD_NAMESERVER_REMOVE:
+      {
+          iov_t nameserver_remove_iov[2];
+
+          SETIOV(&nameserver_remove_iov[0], cargs,
+              sizeof(NameServerDrv_CmdArgs));
+          SETIOV(&nameserver_remove_iov[1], cargs->args.remove.name,
+              cargs->args.remove.nameLen);
+          osStatus = devctlv(IpcDrv_handle, DCMD_NAMESERVER_REMOVE, 2, 2,
+              nameserver_remove_iov, nameserver_remove_iov, NULL);
+
+          if (osStatus != 0) {
+              status = NameServer_E_OSFAILURE;
+          }
+      }
+      break;
+
+      case CMD_NAMESERVER_REMOVEENTRY:
+      {
+          osStatus = devctl(IpcDrv_handle, DCMD_NAMESERVER_REMOVEENTRY, cargs,
+              sizeof(NameServerDrv_CmdArgs), NULL);
+
+          if ( osStatus != 0 ){
+              status = NameServer_E_OSFAILURE;
+          }
+      }
+      break;
+
+      case CMD_NAMESERVER_PARAMS_INIT:
+      {
+          iov_t    nameserver_params_init[2];
+
+          SETIOV(&nameserver_params_init[0], cargs,
+              sizeof(NameServerDrv_CmdArgs));
+          SETIOV(&nameserver_params_init[1], cargs->args.ParamsInit.params,
+              sizeof(NameServer_Params));
+
+          osStatus = devctlv(IpcDrv_handle, DCMD_NAMESERVER_PARAMS_INIT, 2, 2,
+              nameserver_params_init, nameserver_params_init, NULL);
+
+          if (osStatus != 0){
+              status = NameServer_E_OSFAILURE;
+          }
+      }
+      break;
+
+      case CMD_NAMESERVER_CREATE:
+      {
+          iov_t    nameserver_create_iov[3];
+
+          SETIOV(&nameserver_create_iov[0], cargs,
+              sizeof(NameServerDrv_CmdArgs));
+          SETIOV(&nameserver_create_iov[1], cargs->args.create.params,
+              sizeof(NameServer_Params));
+          SETIOV(&nameserver_create_iov[2], cargs->args.create.name,
+              cargs->args.create.nameLen );
+          osStatus = devctlv( IpcDrv_handle, DCMD_NAMESERVER_CREATE, 3, 3,
+              nameserver_create_iov, nameserver_create_iov, NULL);
+
+          if ( osStatus != 0 ){
+              status = NameServer_E_OSFAILURE;
+          }
+      }
+      break;
+
+      case CMD_NAMESERVER_DELETE:
+      {
+          osStatus = devctl( IpcDrv_handle, DCMD_NAMESERVER_DELETE, cargs,
+              sizeof(NameServerDrv_CmdArgs), NULL);
+
+          if ( osStatus != 0 ){
+              status = NameServer_E_OSFAILURE;
+          }
+      }
+      break;
+
+      case CMD_NAMESERVER_SETUP:
+      {
+          osStatus = devctl( IpcDrv_handle, DCMD_NAMESERVER_SETUP, cargs,
+              sizeof(NameServerDrv_CmdArgs), NULL);
+
+          if (osStatus != 0) {
+              status = NameServer_E_OSFAILURE;
+          }
+      }
+      break;
+
+      case CMD_NAMESERVER_DESTROY:
+      {
+          osStatus = devctl( IpcDrv_handle, DCMD_NAMESERVER_DESTROY, cargs,
+              sizeof(NameServerDrv_CmdArgs), NULL);
+
+          if (osStatus != 0) {
+              status = NameServer_E_OSFAILURE;
+          }
+      }
+      break;
+
+      default:
+      {
+          /* This does not impact return status of this function, so retVal
+           * comment is not used.
+           */
+          status = NameServer_E_INVALIDARG;
+          GT_setFailureReason (curTrace,
+                               GT_4CLASS,
+                               "NameServerDrv_ioctl",
+                               status,
+                               "Unsupported ioctl command specified");
+      }
+      break;
+    }
+
+    if (status == NameServer_S_SUCCESS) {
+        status = cargs->apiStatus;
+    }
+
+    GT_1trace(curTrace, GT_LEAVE, "NameServerDrv_ioctl", status);
+
+    return (status);
+}
diff --git a/qnx/src/tests/Makefile b/qnx/src/tests/Makefile
new file mode 100644 (file)
index 0000000..86127b8
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=SAMPLES
+include recurse.mk
diff --git a/qnx/src/tests/MessageQApp/Makefile b/qnx/src/tests/MessageQApp/Makefile
new file mode 100644 (file)
index 0000000..02aa99c
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=CPU
+include recurse.mk
diff --git a/qnx/src/tests/MessageQApp/MessageQApp.c b/qnx/src/tests/MessageQApp/MessageQApp.c
new file mode 100644 (file)
index 0000000..320ef23
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2012-2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/* =============================================================================
+ *  @file   MessageQApp.c
+ *
+ *  @brief  Sample application for MessageQ module between MPU and Remote Proc
+ *
+ *  ============================================================================
+ */
+
+/* Standard headers */
+#include <stdio.h>
+#include <stdlib.h>
+
+/* IPC Headers */
+#include <Std.h>
+#include <ti/ipc/Ipc.h>
+#include <ti/ipc/MessageQ.h>
+
+/* App defines:  Must match on remote proc side: */
+#define HEAPID              0u
+#define SLAVE_MESSAGEQNAME  "SLAVE"
+#define MPU_MESSAGEQNAME    "HOST"
+
+#define PROC_ID_DFLT        1     /* Host is zero, remote cores start at 1 */
+#define NUM_LOOPS_DFLT   100
+
+typedef struct SyncMsg {
+    MessageQ_MsgHeader header;
+    unsigned long numLoops;
+    unsigned long print;
+} SyncMsg ;
+
+Int MessageQApp_execute(UInt32 numLoops, UInt16 procId)
+{
+    Int32                    status = 0;
+    MessageQ_Msg             msg = NULL;
+    MessageQ_Params          msgParams;
+    UInt16                   i;
+    MessageQ_QueueId         queueId = MessageQ_INVALIDMESSAGEQ;
+    MessageQ_Handle          msgqHandle;
+    char                     remoteQueueName[64];
+
+    printf("Entered MessageQApp_execute\n");
+
+    /* Create the local Message Queue for receiving. */
+    MessageQ_Params_init(&msgParams);
+    msgqHandle = MessageQ_create(MPU_MESSAGEQNAME, &msgParams);
+    if (msgqHandle == NULL) {
+        printf("Error in MessageQ_create\n");
+        goto exit;
+    }
+    else {
+        printf("Local MessageQId: 0x%x\n", MessageQ_getQueueId(msgqHandle));
+    }
+
+    sprintf(remoteQueueName, "%s_%s", SLAVE_MESSAGEQNAME,
+             MultiProc_getName(procId));
+
+    /* Poll until remote side has it's messageQ created before we send: */
+    do {
+        status = MessageQ_open(remoteQueueName, &queueId);
+        sleep (1);
+    } while (status == MessageQ_E_NOTFOUND);
+
+    if (status < 0) {
+        printf("Error in MessageQ_open [%d]\n", status);
+        goto cleanup;
+    }
+    else {
+        printf("Remote queueId  [0x%x]\n", queueId);
+    }
+
+    msg = MessageQ_alloc(HEAPID, sizeof(SyncMsg));
+    if (msg == NULL) {
+        printf("Error in MessageQ_alloc\n");
+        MessageQ_close(&queueId);
+        goto cleanup;
+    }
+
+    /* handshake with remote to set the number of loops */
+    MessageQ_setReplyQueue(msgqHandle, msg);
+    ((SyncMsg *)msg)->numLoops = numLoops;
+    ((SyncMsg *)msg)->print = TRUE;
+    MessageQ_put(queueId, msg);
+    MessageQ_get(msgqHandle, &msg, MessageQ_FOREVER);
+
+    printf("Exchanging %d messages with remote processor %s...\n",
+           numLoops, MultiProc_getName(procId));
+
+    for (i = 0 ; i < numLoops; i++) {
+        MessageQ_setMsgId(msg, i);
+
+        /* Have the remote proc reply to this message queue */
+        MessageQ_setReplyQueue(msgqHandle, msg);
+
+        status = MessageQ_put(queueId, msg);
+        if (status < 0) {
+            printf("Error in MessageQ_put [%d]\n", status);
+            break;
+        }
+
+        status = MessageQ_get(msgqHandle, &msg, MessageQ_FOREVER);
+        if (status < 0) {
+            printf("Error in MessageQ_get [%d]\n", status);
+            break;
+        }
+        else {
+            printf("MessageQ_get #%d Msg = 0x%x\n", i, (UInt)msg);
+
+            /* Validate the returned message. */
+            if ((msg != NULL) && (MessageQ_getMsgId (msg) != i)) {
+                printf("Data integrity failure!\n"
+                        "    Expected %d\n"
+                        "    Received %d\n",
+                        i, MessageQ_getMsgId(msg));
+                break;
+            }
+        }
+
+        printf("Exchanged %d messages with remote processor %s\n",
+            (i+1), MultiProc_getName(procId));
+    }
+
+    if (status >= 0) {
+       printf("Sample application successfully completed!\n");
+    }
+
+    MessageQ_free(msg);
+    MessageQ_close(&queueId);
+
+cleanup:
+    /* Clean-up */
+    status = MessageQ_delete(&msgqHandle);
+    if (status < 0) {
+        printf("Error in MessageQ_delete [%d]\n", status);
+    }
+
+exit:
+    printf("Leaving MessageQApp_execute\n\n");
+
+    return (status);
+}
+
+int main (int argc, char ** argv)
+{
+    Int32 status = 0;
+    UInt32 numLoops = NUM_LOOPS_DFLT;
+    UInt16 procId = PROC_ID_DFLT;
+
+    /* Parse Args: */
+    switch (argc) {
+        case 1:
+           /* use defaults */
+           break;
+        case 2:
+           numLoops   = atoi(argv[1]);
+           break;
+        case 3:
+           numLoops   = atoi(argv[1]);
+           procId     = atoi(argv[2]);
+           break;
+        default:
+           printf("Usage: %s [<numLoops>] [<ProcId>]\n", argv[0]);
+           printf("\tDefaults: numLoops: %d; ProcId: %d\n",
+                   NUM_LOOPS_DFLT, PROC_ID_DFLT);
+           exit(0);
+    }
+    if (procId >= MultiProc_getNumProcessors()) {
+        printf("ProcId must be less than %d\n", MultiProc_getNumProcessors());
+        exit(0);
+    }
+    printf("Using numLoops: %d; procId : %d\n", numLoops, procId);
+
+    status = Ipc_start();
+
+    if (status >= 0) {
+        MessageQApp_execute(numLoops, procId);
+        Ipc_stop();
+    }
+    else {
+        printf("Ipc_start failed: status = %d\n", status);
+    }
+
+    return(0);
+}
diff --git a/qnx/src/tests/MessageQApp/MessageQApp.use b/qnx/src/tests/MessageQApp/MessageQApp.use
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/qnx/src/tests/MessageQApp/arm/Makefile b/qnx/src/tests/MessageQApp/arm/Makefile
new file mode 100644 (file)
index 0000000..dbffb72
--- /dev/null
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=VARIANT
+ifndef QRECURSE
+QRECURSE=recurse.mk
+ifdef QCONFIG
+QRDIR=$(dir $(QCONFIG))
+endif
+endif
+include $(QRDIR)$(QRECURSE)
diff --git a/qnx/src/tests/MessageQApp/arm/o.g.le.v7/Makefile b/qnx/src/tests/MessageQApp/arm/o.g.le.v7/Makefile
new file mode 100644 (file)
index 0000000..c7a9cc1
--- /dev/null
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 ../../common.mk
+
+$(PROJECT_ROOT)/arm/o.g.le.v7/MessageQApp_g: $(IPC_REPO)/qnx/src/api/arm/a.g.le.v7/libipc_g.a
+$(PROJECT_ROOT)/arm/o.g.le.v7/MessageQApp_g: $(IPC_REPO)/qnx/src/utils/arm/a.g.le.v7/libutils_g.a
+$(PROJECT_ROOT)/arm/o.g.le.v7/MessageQApp_g: $(IPC_REPO)/qnx/src/family/arm/a.g.le.v7/libcfg_g.a
+$(PROJECT_ROOT)/arm/o.g.le.v7/MessageQApp_g: $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7/libsyslink_clientS.a
+
+# link with syslink static library, dynamic for others
+LIBPREF_ipc_g = -Bstatic
+LIBPOST_ipc_g = -Bdynamic
+LIBPREF_utils_g = -Bstatic
+LIBPOST_utils_g = -Bdynamic
+LIBPREF_cfg_g = -Bstatic
+LIBPOST_cfg_g = -Bdynamic
+LIBPREF_syslink_client = -Bstatic
+LIBPOST_syslink_client = -Bdynamic
+
+# add libpath and libs
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/api/arm/a.g.le.v7
+LIBS += ipc_g
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/utils/arm/a.g.le.v7
+LIBS += utils_g
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/family/arm/a.g.le.v7
+LIBS += cfg_g
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7
+LIBS += syslink_clientS
+
+
+# copy and rename executables to suit our preferences (TODO: where do we copy the executables)
+#POST_BUILD = \
+#        $(CP_HOST) \
+#        $(PROJECT_ROOT)/arm/o.g.le.v7/MessageQApp_g \
+#        $(PROJECT_ROOT)/../bin/debug/MessageQApp
diff --git a/qnx/src/tests/MessageQApp/arm/o.le.v7/Makefile b/qnx/src/tests/MessageQApp/arm/o.le.v7/Makefile
new file mode 100644 (file)
index 0000000..5ea1c1b
--- /dev/null
@@ -0,0 +1,65 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 ../../common.mk
+
+CCFLAGS += -O3
+
+$(PROJECT_ROOT)/arm/o.le.v7/MessageQApp: $(IPC_REPO)/qnx/src/api/arm/a.le.v7/libipc.a
+$(PROJECT_ROOT)/arm/o.le.v7/MessageQApp: $(IPC_REPO)/qnx/src/utils/arm/a.le.v7/libutils.a
+$(PROJECT_ROOT)/arm/o.le.v7/MessageQApp: $(IPC_REPO)/qnx/src/family/arm/a.le.v7/libcfg.a
+$(PROJECT_ROOT)/arm/o.le.v7/MessageQApp: $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7/libsyslink_clientS.a
+
+# link with syslink static library, dynamic for others
+LIBPREF_ipc = -Bstatic
+LIBPOST_ipc = -Bdynamic
+LIBPREF_utils = -Bstatic
+LIBPOST_utils = -Bdynamic
+LIBPREF_cfg = -Bstatic
+LIBPOST_cfg = -Bdynamic
+LIBPREF_syslink_client = -Bstatic
+LIBPOST_syslink_client = -Bdynamic
+
+# add libpath and libs
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/api/arm/a.le.v7
+LIBS += ipc
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/utils/arm/a.le.v7
+LIBS += utils
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/family/arm/a.le.v7
+LIBS += cfg
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7
+LIBS += syslink_clientS
+
+# copy and rename executables to suit our preferences (TODO: where do we copy the executables)
+#POST_BUILD = \
+#        $(CP_HOST) \
+#        $(PROJECT_ROOT)/arm/o.le.v7/MessageQApp \
+#        $(PROJECT_ROOT)/../bin/debug/MessageQApp
diff --git a/qnx/src/tests/MessageQApp/common.mk b/qnx/src/tests/MessageQApp/common.mk
new file mode 100644 (file)
index 0000000..60b2e6e
--- /dev/null
@@ -0,0 +1,61 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 QCONFIG
+QCONFIG=qconfig.mk
+endif
+include $(QCONFIG)
+
+NAME = MessageQApp
+
+define PINFO
+PINFO DESCRIPTION=IPC QNX MESSAGEQ SAMPLE
+endef
+
+# don't install the binaries, they are copied in base makefile
+INSTALLDIR = /dev/null
+
+CCOPTS += -DSYSLINK_BUILDOS_QNX
+
+# source path
+EXTRA_SRCVPATH += \
+        $(IPC_REPO)/qnx/src/tests/MessageQApp \
+
+EXCLUDE_OBJS =
+
+# include path
+EXTRA_INCVPATH += \
+        $(IPC_REPO)/packages \
+        $(IPC_REPO)/qnx/include
+
+include $(MKFILES_ROOT)/qtargets.mk
+
+LDFLAGS += -M
diff --git a/qnx/src/tests/MessageQBench/Makefile b/qnx/src/tests/MessageQBench/Makefile
new file mode 100644 (file)
index 0000000..02aa99c
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=CPU
+include recurse.mk
diff --git a/qnx/src/tests/MessageQBench/MessageQBench.c b/qnx/src/tests/MessageQBench/MessageQBench.c
new file mode 100644 (file)
index 0000000..14b28d2
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * Copyright (c) 2012-2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/* =============================================================================
+ *  @file   MessageQBench.c
+ *
+ *  @brief  Benchmark application for MessageQ module between MPU/Remote Proc
+ *
+ *  ============================================================================
+ */
+
+/*
+ * opkg --tmp-dir ~/tmp install util-linux-ng
+ * chrt -f ./MessageQBench
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <sys/param.h>
+
+#include <Std.h>
+#include <ti/ipc/Ipc.h>
+#include <ti/ipc/MessageQ.h>
+
+#define MessageQ_payload(m) ((void *)((char *)(m) + sizeof(MessageQ_MsgHeader)))
+#define MINPAYLOADSIZE      (2 * sizeof(UInt32))
+
+/* App defines: Must match on remote proc side: */
+#define NUM_LOOPS_DFLT           1000  /* Number of transfers to be tested. */
+#define HEAPID              0u
+#define PROC_ID_DFLT        1     /* Host is zero, remote cores start at 1 */
+#define SLAVE_MESSAGEQNAME  "SLAVE"
+#define MPU_MESSAGEQNAME    "HOST"
+
+
+long diff(struct timespec start, struct timespec end)
+{
+    struct timespec temp;
+
+    if ((end.tv_nsec - start.tv_nsec) < 0) {
+        temp.tv_sec = end.tv_sec - start.tv_sec-1;
+        temp.tv_nsec = 1000000000UL + end.tv_nsec - start.tv_nsec;
+    } else {
+        temp.tv_sec = end.tv_sec - start.tv_sec;
+        temp.tv_nsec = end.tv_nsec - start.tv_nsec;
+    }
+
+    return (temp.tv_sec * 1000000UL + temp.tv_nsec / 1000);
+}
+
+Int MessageQApp_execute(UInt32 numLoops, UInt32 payloadSize, UInt16 procId)
+{
+    Int32                    status     = 0;
+    MessageQ_Msg             msg        = NULL;
+    MessageQ_Params          msgParams;
+    UInt16                   i;
+    MessageQ_QueueId         queueId = MessageQ_INVALIDMESSAGEQ;
+    MessageQ_Handle          msgqHandle;
+    char                     remoteQueueName[64];
+    struct timespec          start, end;
+    long                     elapsed;
+    UInt32 *params;
+
+    printf ("Entered MessageQApp_execute\n");
+
+    /* Create the local Message Queue for receiving. */
+    MessageQ_Params_init(&msgParams);
+    msgqHandle = MessageQ_create(MPU_MESSAGEQNAME, &msgParams);
+    if (msgqHandle == NULL) {
+        printf ("Error in MessageQ_create\n");
+        goto exit;
+    }
+    else {
+        printf ("Local MessageQId: 0x%x\n", MessageQ_getQueueId(msgqHandle));
+    }
+
+    sprintf(remoteQueueName, "%s_%s", SLAVE_MESSAGEQNAME,
+             MultiProc_getName(procId));
+
+    /* Poll until remote side has its messageQ created before we send: */
+    do {
+        status = MessageQ_open(remoteQueueName, &queueId);
+        sleep (1);
+    } while (status == MessageQ_E_NOTFOUND);
+
+    if (status < 0) {
+        printf("Error in MessageQ_open [%d]\n", status);
+        goto cleanup;
+    }
+
+    printf("Remote queueId  [0x%x]\n", queueId);
+
+    msg = MessageQ_alloc(HEAPID, sizeof(MessageQ_MsgHeader) + payloadSize);
+    if (msg == NULL) {
+        printf("Error in MessageQ_alloc\n");
+        MessageQ_close(&queueId);
+        goto cleanup;
+    }
+
+    /* handshake with remote to set the number of loops */
+    MessageQ_setReplyQueue(msgqHandle, msg);
+    params = MessageQ_payload(msg);
+    params[0] = numLoops;
+    params[1] = FALSE;
+    MessageQ_put(queueId, msg);
+    MessageQ_get(msgqHandle, &msg, MessageQ_FOREVER);
+
+    printf("Exchanging %d messages with remote processor %s...\n",
+           numLoops, MultiProc_getName(procId));
+
+    clock_gettime(CLOCK_REALTIME, &start);
+
+    for (i = 0; i < numLoops; i++) {
+        MessageQ_setMsgId(msg, i);
+
+        /* Have the remote proc reply to this message queue */
+        MessageQ_setReplyQueue(msgqHandle, msg);
+
+        status = MessageQ_put(queueId, msg);
+        if (status < 0) {
+            printf("Error in MessageQ_put [%d]\n", status);
+            break;
+        }
+
+        status = MessageQ_get(msgqHandle, &msg, MessageQ_FOREVER);
+        if (status < 0) {
+            printf("Error in MessageQ_get [%d]\n", status);
+            break;
+        }
+        else {
+            /* Validate the returned message. */
+            if ((msg != NULL) && (MessageQ_getMsgId(msg) != i)) {
+                printf ("Data integrity failure!\n"
+                        "    Expected %d\n"
+                        "    Received %d\n",
+                        i, MessageQ_getMsgId (msg));
+                break;
+            }
+        }
+    }
+
+    clock_gettime(CLOCK_REALTIME, &end);
+    elapsed = diff(start, end);
+
+    if (numLoops > 0) {
+        printf("%s: Avg round trip time: %ld usecs\n",
+               MultiProc_getName(procId), elapsed / numLoops);
+    }
+
+    MessageQ_free(msg);
+    MessageQ_close(&queueId);
+
+cleanup:
+    status = MessageQ_delete(&msgqHandle);
+    if (status < 0) {
+        printf ("Error in MessageQ_delete [%d]\n", status);
+    }
+
+exit:
+    printf("Leaving MessageQApp_execute\n\n");
+
+    return (status);
+}
+
+int main (int argc, char * argv[])
+{
+    Int32 status = 0;
+    UInt32 numLoops = NUM_LOOPS_DFLT;
+    UInt32 payloadSize = MINPAYLOADSIZE;
+    UInt16 procId = PROC_ID_DFLT;
+    UInt32 argul = strtoul(argv[2], NULL, 0);
+
+    /* Parse args: */
+    if (argc > 1) {
+        numLoops = strtoul(argv[1], NULL, 0);
+    }
+
+    if (argc > 2) {
+        payloadSize = ((argul >= MINPAYLOADSIZE) ? argul : MINPAYLOADSIZE);
+    }
+
+    if (argc > 3) {
+        procId  = atoi(argv[3]);
+    }
+
+    if (argc > 4) {
+        printf("Usage: %s [<numLoops>] [<payloadSize>] [<ProcId>]\n", argv[0]);
+        printf("\tDefaults: numLoops: %d; payloadSize: %d, ProcId: %d\n",
+                   NUM_LOOPS_DFLT, MINPAYLOADSIZE, PROC_ID_DFLT);
+        exit(0);
+    }
+    if (procId >= MultiProc_getNumProcessors()) {
+        printf("ProcId must be less than %d\n", MultiProc_getNumProcessors());
+        exit(0);
+    }
+    printf("Using numLoops: %d; payloadSize: %d, procId : %d\n",
+            numLoops, payloadSize, procId);
+
+    status = Ipc_start();
+
+    if (status >= 0) {
+        MessageQApp_execute(numLoops, payloadSize, procId);
+        Ipc_stop();
+    }
+    else {
+        fprintf(stderr, "Ipc_start failed: status = %d\n", status);
+    }
+
+    return (status);
+}
diff --git a/qnx/src/tests/MessageQBench/MessageQBench.use b/qnx/src/tests/MessageQBench/MessageQBench.use
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/qnx/src/tests/MessageQBench/arm/Makefile b/qnx/src/tests/MessageQBench/arm/Makefile
new file mode 100644 (file)
index 0000000..dbffb72
--- /dev/null
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=VARIANT
+ifndef QRECURSE
+QRECURSE=recurse.mk
+ifdef QCONFIG
+QRDIR=$(dir $(QCONFIG))
+endif
+endif
+include $(QRDIR)$(QRECURSE)
diff --git a/qnx/src/tests/MessageQBench/arm/o.g.le.v7/Makefile b/qnx/src/tests/MessageQBench/arm/o.g.le.v7/Makefile
new file mode 100644 (file)
index 0000000..08bd87e
--- /dev/null
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 ../../common.mk
+
+$(PROJECT_ROOT)/arm/o.g.le.v7/MessageQBenchApp_g: $(IPC_REPO)/qnx/src/api/arm/a.g.le.v7/libipc_g.a
+$(PROJECT_ROOT)/arm/o.g.le.v7/MessageQBenchApp_g: $(IPC_REPO)/qnx/src/utils/arm/a.g.le.v7/libutils_g.a
+$(PROJECT_ROOT)/arm/o.g.le.v7/MessageQBenchApp_g: $(IPC_REPO)/qnx/src/family/arm/a.g.le.v7/libcfg_g.a
+$(PROJECT_ROOT)/arm/o.g.le.v7/MessageQBench_g: $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7/libsyslink_clientS.a
+
+# link with syslink static library, dynamic for others
+LIBPREF_ipc_g = -Bstatic
+LIBPOST_ipc_g = -Bdynamic
+LIBPREF_utils_g = -Bstatic
+LIBPOST_utils_g = -Bdynamic
+LIBPREF_cfg_g = -Bstatic
+LIBPOST_cfg_g = -Bdynamic
+LIBPREF_syslink_client = -Bstatic
+LIBPOST_syslink_client = -Bdynamic
+
+# add libpath and libs
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/api/arm/a.g.le.v7
+LIBS += ipc_g
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/utils/arm/a.g.le.v7
+LIBS += utils_g
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/family/arm/a.g.le.v7
+LIBS += cfg_g
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7
+LIBS += syslink_clientS
+
+
+# copy and rename executables to suit our preferences (TODO: where do we copy the executables)
+#POST_BUILD = \
+#        $(CP_HOST) \
+#        $(PROJECT_ROOT)/arm/o.g.le.v7/MessageQApp_g \
+#        $(PROJECT_ROOT)/../bin/debug/MessageQApp
diff --git a/qnx/src/tests/MessageQBench/arm/o.le.v7/Makefile b/qnx/src/tests/MessageQBench/arm/o.le.v7/Makefile
new file mode 100644 (file)
index 0000000..8d18c27
--- /dev/null
@@ -0,0 +1,65 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 ../../common.mk
+
+CCFLAGS += -O3
+
+$(PROJECT_ROOT)/arm/o.le.v7/MessageQBench: $(IPC_REPO)/qnx/src/api/arm/a.le.v7/libipc.a
+$(PROJECT_ROOT)/arm/o.le.v7/MessageQBench: $(IPC_REPO)/qnx/src/utils/arm/a.le.v7/libutils.a
+$(PROJECT_ROOT)/arm/o.le.v7/MessageQBench: $(IPC_REPO)/qnx/src/family/arm/a.le.v7/libcfg.a
+$(PROJECT_ROOT)/arm/o.le.v7/MessageQBench: $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7/libsyslink_clientS.a
+
+# link with syslink static library, dynamic for others
+LIBPREF_ipc = -Bstatic
+LIBPOST_ipc = -Bdynamic
+LIBPREF_utils = -Bstatic
+LIBPOST_utils = -Bdynamic
+LIBPREF_cfg = -Bstatic
+LIBPOST_cfg = -Bdynamic
+LIBPREF_syslink_client = -Bstatic
+LIBPOST_syslink_client = -Bdynamic
+
+# add libpath and libs
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/api/arm/a.le.v7
+LIBS += ipc
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/utils/arm/a.le.v7
+LIBS += utils
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/family/arm/a.le.v7
+LIBS += cfg
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7
+LIBS += syslink_clientS
+
+# copy and rename executables to suit our preferences (TODO: where do we copy the executables)
+#POST_BUILD = \
+#        $(CP_HOST) \
+#        $(PROJECT_ROOT)/arm/o.le.v7/MessageQBench \
+#        $(PROJECT_ROOT)/../bin/debug/MessageQBench
diff --git a/qnx/src/tests/MessageQBench/common.mk b/qnx/src/tests/MessageQBench/common.mk
new file mode 100644 (file)
index 0000000..21e40d1
--- /dev/null
@@ -0,0 +1,61 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 QCONFIG
+QCONFIG=qconfig.mk
+endif
+include $(QCONFIG)
+
+NAME = MessageQBench
+
+define PINFO
+PINFO DESCRIPTION=IPC QNX MESSAGEQ SAMPLE
+endef
+
+# don't install the binaries, they are copied in base makefile
+INSTALLDIR = /dev/null
+
+CCOPTS += -DSYSLINK_BUILDOS_QNX
+
+# source path
+EXTRA_SRCVPATH += \
+        $(IPC_REPO)/qnx/src/tests/MessageQBench \
+
+EXCLUDE_OBJS =
+
+# include path
+EXTRA_INCVPATH += \
+        $(IPC_REPO)/packages \
+        $(IPC_REPO)/qnx/include
+
+include $(MKFILES_ROOT)/qtargets.mk
+
+LDFLAGS += -M
diff --git a/qnx/src/tests/MessageQMulti/Makefile b/qnx/src/tests/MessageQMulti/Makefile
new file mode 100644 (file)
index 0000000..02aa99c
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=CPU
+include recurse.mk
diff --git a/qnx/src/tests/MessageQMulti/MessageQMulti.c b/qnx/src/tests/MessageQMulti/MessageQMulti.c
new file mode 100644 (file)
index 0000000..93f226c
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * Copyright (c) 2012-2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/* =============================================================================
+ *  @file   MessageQApp.c
+ *
+ *  @brief  Sample application for MessageQ module between MPU and Remote Proc
+ *
+ *  ============================================================================
+ */
+
+/* Standard headers */
+#include <pthread.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* IPC Headers */
+#include <Std.h>
+#include <ti/ipc/Ipc.h>
+#include <ti/ipc/MessageQ.h>
+
+/* App defines: Must match on remote proc side: */
+#define MSGSIZE                     64u
+#define HEAPID                      0u
+#define SLAVE_MESSAGEQNAME          "SLAVE"
+#define HOST_MESSAGEQNAME           "HOST"
+
+/** ============================================================================
+ *  Macros and types
+ *  ============================================================================
+ */
+
+#define  NUM_LOOPS_DFLT   1000
+#define  NUM_THREADS_DFLT 10
+#define  MAX_NUM_THREADS  50
+#define  ONE_PROCESS_ONLY (-1)
+
+/** ============================================================================
+ *  Globals
+ *  ============================================================================
+ */
+static Int     numLoops, numThreads, procNum;
+
+struct thread_info {    /* Used as argument to thread_start() */
+    pthread_t thread_id;        /* ID returned by pthread_create() */
+    int       thread_num;       /* Application-defined thread # */
+};
+
+static void * pingThreadFxn(void *arg);
+
+/** ============================================================================
+ *  Functions
+ *  ============================================================================
+ */
+
+static Void * pingThreadFxn(void *arg)
+{
+    Int                      threadNum = *(int *)arg;
+    Int32                    status     = 0;
+    MessageQ_Msg             msg        = NULL;
+    MessageQ_Params          msgParams;
+    UInt16                   i;
+    MessageQ_Handle          handle;
+    MessageQ_QueueId         queueId = MessageQ_INVALIDMESSAGEQ;
+
+    char             remoteQueueName[64];
+    char             hostQueueName[64];
+
+    printf ("Entered pingThreadFxn: %d\n", threadNum);
+
+    sprintf(remoteQueueName, "%s_%d", SLAVE_MESSAGEQNAME, threadNum );
+    sprintf(hostQueueName,   "%s_%d", HOST_MESSAGEQNAME,  threadNum );
+
+    /* Create the local Message Queue for receiving. */
+    MessageQ_Params_init (&msgParams);
+    handle = MessageQ_create (hostQueueName, &msgParams);
+    if (handle == NULL) {
+        printf ("Error in MessageQ_create\n");
+        goto exit;
+    }
+    else {
+        printf ("thread: %d, Local Message: %s, QId: 0x%x\n",
+            threadNum, hostQueueName, MessageQ_getQueueId(handle));
+    }
+
+    /* Poll until remote side has it's messageQ created before we send: */
+    do {
+        status = MessageQ_open (remoteQueueName, &queueId);
+        sleep (1);
+    } while (status == MessageQ_E_NOTFOUND);
+    if (status < 0) {
+        printf ("Error in MessageQ_open [0x%x]\n", status);
+        goto cleanup;
+    }
+    else {
+        printf ("thread: %d, Remote queue: %s, QId: 0x%x\n",
+                 threadNum, remoteQueueName, queueId);
+    }
+
+    printf ("\nthread: %d: Exchanging messages with remote processor...\n",
+            threadNum);
+    for (i = 0 ; i < numLoops ; i++) {
+        /* Allocate message. */
+        msg = MessageQ_alloc (HEAPID, MSGSIZE);
+        if (msg == NULL) {
+            printf ("Error in MessageQ_alloc\n");
+            break;
+        }
+
+        MessageQ_setMsgId (msg, i);
+
+        /* Have the remote proc reply to this message queue */
+        MessageQ_setReplyQueue (handle, msg);
+
+        status = MessageQ_put (queueId, msg);
+        if (status < 0) {
+            printf ("Error in MessageQ_put [0x%x]\n", status);
+            break;
+        }
+
+        status = MessageQ_get(handle, &msg, MessageQ_FOREVER);
+        if (status < 0) {
+            printf ("Error in MessageQ_get [0x%x]\n", status);
+            break;
+        }
+        else {
+            /* Validate the returned message. */
+            if ((msg != NULL) && (MessageQ_getMsgId (msg) != i)) {
+                printf ("Data integrity failure!\n"
+                        "    Expected %d\n"
+                        "    Received %d\n",
+                        i, MessageQ_getMsgId (msg));
+                break;
+            }
+
+            status = MessageQ_free (msg);
+        }
+
+        printf ("thread: %d: Exchanged %d msgs\n", threadNum, (i+1));
+    }
+
+    printf ("thread: %d: pingThreadFxn successfully completed!\n", threadNum);
+
+    MessageQ_close (&queueId);
+
+cleanup:
+    /* Clean-up */
+    status = MessageQ_delete (&handle);
+    if (status < 0) {
+        printf ("Error in MessageQ_delete [0x%x]\n", status);
+    }
+
+exit:
+
+    return ((void *)status);
+}
+
+int main (int argc, char ** argv)
+{
+    struct thread_info threads[MAX_NUM_THREADS];
+    int ret,i;
+    void *res;
+    Int32   status = 0;
+
+    /* Parse Args: */
+    numLoops = NUM_LOOPS_DFLT;
+    numThreads = NUM_THREADS_DFLT;
+    procNum = ONE_PROCESS_ONLY;
+    switch (argc) {
+        case 1:
+           /* use defaults */
+           break;
+        case 2:
+           numThreads = atoi(argv[1]);
+           break;
+        case 3:
+           numThreads = atoi(argv[1]);
+           numLoops   = atoi(argv[2]);
+           break;
+        case 4:
+           /* We force numThreads = 1 if doing a multiProcess test: */
+           numThreads = 1;
+           numLoops   = atoi(argv[2]);
+           procNum = atoi(argv[3]);
+           break;
+        default:
+           printf("Usage: %s [<numThreads>] [<numLoops>] [<Process #]>\n",
+                   argv[0]);
+           printf("\tDefaults: numThreads: 10, numLoops: 100\n");
+           printf("\tMax Threads: 100\n");
+           exit(0);
+    }
+    printf("Using numThreads: %d, numLoops: %d\n", numThreads, numLoops);
+    if (procNum != ONE_PROCESS_ONLY) {
+        printf("ProcNum: %d\n", procNum);
+    }
+
+    status = Ipc_start();
+    if (status < 0) {
+        printf ("Ipc_start failed: status = 0x%x\n", status);
+        goto exit;
+    }
+
+    /* Launch multiple threads: */
+    for (i = 0; i < numThreads; i++) {
+        /* Create the test thread: */
+        printf ("creating pingThreadFxn: %d\n", i);
+        threads[i].thread_num = (procNum == ONE_PROCESS_ONLY)? i: procNum;
+        ret = pthread_create(&threads[i].thread_id, NULL, &pingThreadFxn,
+                           &(threads[i].thread_num));
+        if (ret) {
+            printf("MessageQMulti: can't spawn thread: %d, %s\n",
+                    i, strerror(ret));
+        }
+    }
+
+    /* Join all threads: */
+    for (i = 0; i < numThreads; i++) {
+        ret = pthread_join(threads[i].thread_id, &res);
+        if (ret != 0) {
+            printf("MessageQMulti: failed to join thread: %d, %s\n",
+                    i, strerror(ret));
+        }
+        printf("MessageQMulti: Joined with thread %d; returned value was %d\n",
+                threads[i].thread_num, res);
+        free(res);      /* Free memory allocated by thread */
+    }
+
+    Ipc_stop();
+
+exit:
+
+    return (0);
+}
diff --git a/qnx/src/tests/MessageQMulti/MessageQMulti.use b/qnx/src/tests/MessageQMulti/MessageQMulti.use
new file mode 100644 (file)
index 0000000..e965047
--- /dev/null
@@ -0,0 +1 @@
+Hello
diff --git a/qnx/src/tests/MessageQMulti/arm/Makefile b/qnx/src/tests/MessageQMulti/arm/Makefile
new file mode 100644 (file)
index 0000000..dbffb72
--- /dev/null
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=VARIANT
+ifndef QRECURSE
+QRECURSE=recurse.mk
+ifdef QCONFIG
+QRDIR=$(dir $(QCONFIG))
+endif
+endif
+include $(QRDIR)$(QRECURSE)
diff --git a/qnx/src/tests/MessageQMulti/arm/o.g.le.v7/Makefile b/qnx/src/tests/MessageQMulti/arm/o.g.le.v7/Makefile
new file mode 100644 (file)
index 0000000..29d608a
--- /dev/null
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 ../../common.mk
+
+$(PROJECT_ROOT)/arm/o.g.le.v7/MessageQMulti_g: $(IPC_REPO)/qnx/src/api/arm/a.g.le.v7/libipc_g.a
+$(PROJECT_ROOT)/arm/o.g.le.v7/MessageQMulti_g: $(IPC_REPO)/qnx/src/utils/arm/a.g.le.v7/libutils_g.a
+$(PROJECT_ROOT)/arm/o.g.le.v7/MessageQMulti_g: $(IPC_REPO)/qnx/src/family/arm/a.g.le.v7/libcfg_g.a
+$(PROJECT_ROOT)/arm/o.g.le.v7/MessageQNulti_g: $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7/libsyslink_clientS.a
+
+# link with syslink static library, dynamic for others
+LIBPREF_ipc_g = -Bstatic
+LIBPOST_ipc_g = -Bdynamic
+LIBPREF_utils_g = -Bstatic
+LIBPOST_utils_g = -Bdynamic
+LIBPREF_cfg_g = -Bstatic
+LIBPOST_cfg_g = -Bdynamic
+LIBPREF_syslink_client = -Bstatic
+LIBPOST_syslink_client = -Bdynamic
+
+# add libpath and libs
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/api/arm/a.g.le.v7
+LIBS += ipc_g
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/utils/arm/a.g.le.v7
+LIBS += utils_g
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/family/arm/a.g.le.v7
+LIBS += cfg_g
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7
+LIBS += syslink_clientS
+
+
+# copy and rename executables to suit our preferences (TODO: where do we copy the executables)
+#POST_BUILD = \
+#        $(CP_HOST) \
+#        $(PROJECT_ROOT)/arm/o.g.le.v7/MessageQMulti_g \
+#        $(PROJECT_ROOT)/../bin/debug/MessageQMulti
diff --git a/qnx/src/tests/MessageQMulti/arm/o.le.v7/Makefile b/qnx/src/tests/MessageQMulti/arm/o.le.v7/Makefile
new file mode 100644 (file)
index 0000000..3da371e
--- /dev/null
@@ -0,0 +1,65 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 ../../common.mk
+
+CCFLAGS += -O3
+
+$(PROJECT_ROOT)/arm/o.le.v7/MessageQMulti: $(IPC_REPO)/qnx/src/api/arm/a.le.v7/libipc.a
+$(PROJECT_ROOT)/arm/o.le.v7/MessageQMulti: $(IPC_REPO)/qnx/src/utils/arm/a.le.v7/libutils.a
+$(PROJECT_ROOT)/arm/o.le.v7/MessageQMulti: $(IPC_REPO)/qnx/src/family/arm/a.le.v7/libcfg.a
+$(PROJECT_ROOT)/arm/o.le.v7/MessageQMulti: $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7/libsyslink_clientS.a
+
+# link with syslink static library, dynamic for others
+LIBPREF_ipc = -Bstatic
+LIBPOST_ipc = -Bdynamic
+LIBPREF_utils = -Bstatic
+LIBPOST_utils = -Bdynamic
+LIBPREF_cfg = -Bstatic
+LIBPOST_cfg = -Bdynamic
+LIBPREF_syslink_client = -Bstatic
+LIBPOST_syslink_client = -Bdynamic
+
+# add libpath and libs
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/api/arm/a.le.v7
+LIBS += ipc
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/utils/arm/a.le.v7
+LIBS += utils
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/family/arm/a.le.v7
+LIBS += cfg
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7
+LIBS += syslink_clientS
+
+# copy and rename executables to suit our preferences (TODO: where do we copy the executables)
+#POST_BUILD = \
+#        $(CP_HOST) \
+#        $(PROJECT_ROOT)/arm/o.le.v7/MessageQMulti \
+#        $(PROJECT_ROOT)/../bin/debug/MessageQMulti
diff --git a/qnx/src/tests/MessageQMulti/common.mk b/qnx/src/tests/MessageQMulti/common.mk
new file mode 100644 (file)
index 0000000..a4f1c42
--- /dev/null
@@ -0,0 +1,61 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 QCONFIG
+QCONFIG=qconfig.mk
+endif
+include $(QCONFIG)
+
+NAME = MessageQMulti
+
+define PINFO
+PINFO DESCRIPTION=IPC QNX MESSAGEQ SAMPLE
+endef
+
+# don't install the binaries, they are copied in base makefile
+INSTALLDIR = /dev/null
+
+CCOPTS += -DSYSLINK_BUILDOS_QNX
+
+# source path
+EXTRA_SRCVPATH += \
+        $(IPC_REPO)/qnx/src/tests/MessageQMulti \
+
+EXCLUDE_OBJS =
+
+# include path
+EXTRA_INCVPATH += \
+        $(IPC_REPO)/packages \
+        $(IPC_REPO)/qnx/include
+
+include $(MKFILES_ROOT)/qtargets.mk
+
+LDFLAGS += -M
diff --git a/qnx/src/tests/MessageQMulti/multi_process.sh b/qnx/src/tests/MessageQMulti/multi_process.sh
new file mode 100644 (file)
index 0000000..2f2c965
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/bash
+# Run MessageQMulti in parallel processes
+#
+if [ $# -ne 2 ]
+then
+    echo "Usage: multi_process <num_processes> <iterations_per_process>"
+    exit
+fi
+
+for i in `seq 0 $(( $1 - 1))`
+do
+       echo "MessageQMulti Test #" $i
+       # This calls MessageQMulti with One Thread, a process #, and
+       # number of iterations per thread.
+       MessageQMulti 1 $2 $i &
+done
diff --git a/qnx/src/tests/NameServerApp/Makefile b/qnx/src/tests/NameServerApp/Makefile
new file mode 100644 (file)
index 0000000..02aa99c
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=CPU
+include recurse.mk
diff --git a/qnx/src/tests/NameServerApp/NameServerApp.c b/qnx/src/tests/NameServerApp/NameServerApp.c
new file mode 100644 (file)
index 0000000..bbab4f9
--- /dev/null
@@ -0,0 +1,308 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/* =============================================================================
+ *  @file   NameServerApp.c
+ *
+ *  @brief  Sample application for NameServer module between MPU and Remote Proc
+ *
+ *  ============================================================================
+ */
+
+/* Standard headers */
+#include <stdio.h>
+
+/* Ipc Standard header */
+#include <Std.h>
+
+#include <ti/ipc/Ipc.h>
+#include <_NameServer.h>
+
+/* Module level headers */
+#include <ti/ipc/NameServer.h>
+
+
+/** ============================================================================
+ *  Macros and types
+ *  ============================================================================
+ */
+#define NSNAME "MyNS"
+#define NSNAME2 "MyNS2"
+
+/** ============================================================================
+ *  Globals
+ *  ============================================================================
+ */
+
+Int testNS(NameServer_Handle nsHandle, String name)
+{
+    Int32 status = 0;
+    Ptr ptr;
+    UInt32 val;
+    char key[16];
+    Int i;
+
+    ptr = NameServer_addUInt32(nsHandle, name, 0xdeadbeef);
+    if (ptr == NULL) {
+        printf("Failed to NameServer_addUInt32()\n");
+        return -1;
+    }
+    else {
+        printf("NameServer_addUInt32() returned %p\n", ptr);
+    }
+
+    printf("Trying to add same key (should fail)...\n");
+    ptr = NameServer_addUInt32(nsHandle, name, 0xdeadc0de);
+    if (ptr == NULL) {
+        printf("    ...got expected Failure from NameServer_addUInt32()\n");
+    }
+    else {
+        printf("    Error: NameServer_addUInt32() returned non-NULL %p (but was expected to fail)\n", ptr);
+        return -1;
+    }
+
+    val = 0x00c0ffee;
+    status = NameServer_getUInt32(nsHandle, name, &val, NULL);
+    printf("NameServer_getUInt32() returned %d, val=0x%x (was 0x00c0ffee)\n", status, val);
+
+    printf("Removing 0xdeadbeef w/ NameServer_remove()...\n");
+    status = NameServer_remove(nsHandle, name);
+    if (status < 0) {
+        printf("NameServer_remove() failed: %d\n", status);
+        return -1;
+    }
+
+    ptr = NameServer_addUInt32(nsHandle, name, 0xdeadc0de);
+    if (ptr == NULL) {
+        printf("Error: NameServer_addUInt32() failed\n");
+        return -1;
+    }
+    else {
+        printf("NameServer_addUInt32(0xdeadc0de) succeeded\n");
+    }
+
+    val = 0x00c0ffee;
+    status = NameServer_getUInt32(nsHandle, name, &val, NULL);
+    printf("NameServer_getUInt32() returned %d, val=0x%x (was 0x00c0ffee)\n", status, val);
+
+    printf("Removing 0xdeadc0de w/ NameServer_removeEntry()...\n");
+    status = NameServer_removeEntry(nsHandle, ptr);
+    if (status < 0) {
+        printf("NameServer_remove() failed: %d\n", status);
+        return -1;
+    }
+
+    ptr = NameServer_addUInt32(nsHandle, name, 0x0badc0de);
+    if (ptr == NULL) {
+        printf("Error: NameServer_addUInt32() failed\n");
+        return -1;
+    }
+    else {
+        printf("NameServer_addUInt32(0x0badc0de) succeeded\n");
+    }
+
+    val = 0x00c0ffee;
+    status = NameServer_getUInt32(nsHandle, name, &val, NULL);
+    printf("NameServer_getUInt32() returned %d, val=0x%x (was 0x00c0ffee)\n", status, val);
+
+    status = NameServer_remove(nsHandle, name);
+    if (status < 0) {
+        printf("Error: NameServer_remove() failed\n");
+        return -1;
+    }
+    else {
+        printf("NameServer_remove(%s) succeeded\n", name);
+    }
+
+    for (i = 0; i < 10; i++) {
+        sprintf(key, "foobar%d", i);
+
+        ptr = NameServer_addUInt32(nsHandle, key, 0x0badc0de + i);
+        if (ptr == NULL) {
+            printf("Error: NameServer_addUInt32() failed\n");
+            return -1;
+        }
+        else {
+            printf("NameServer_addUInt32(%s, 0x%x) succeeded\n", key, 0x0badc0de + i);
+        }
+
+        val = 0x00c0ffee;
+        status = NameServer_getUInt32(nsHandle, key, &val, NULL);
+        printf("NameServer_getUInt32(%s) returned %d, val=0x%x (was 0x00c0ffee)\n", key, status, val);
+
+        if (val != (0x0badc0de + i)) {
+            printf("get val (0x%x) != add val (0x%x)!\n", val, 0x0badc0de + i);
+        }
+    }
+
+    for (i = 0; i < 10; i++) {
+        sprintf(key, "foobar%d", i);
+
+        status = NameServer_remove(nsHandle, key);
+        if (status < 0) {
+            printf("Error: NameServer_remove() failed\n");
+            return -1;
+        }
+        else {
+            printf("NameServer_remove(%s) succeeded\n", key);
+        }
+    }
+
+    return 0;
+}
+
+/** ============================================================================
+ *  Functions
+ *  ============================================================================
+ */
+Int
+NameServerApp_startup()
+{
+    Int32 status = 0;
+    NameServer_Params params;
+    NameServer_Handle nsHandle;
+    NameServer_Handle nsHandle2;
+    Int iteration = 0;
+
+    printf ("Entered NameServerApp_startup\n");
+
+    status = Ipc_start();
+
+    if (status < 0) {
+        printf("Ipc_start failed: status = %d\n", status);
+        return -1;
+    }
+
+    printf("Calling NameServer_setup()...\n");
+    NameServer_setup();
+
+again:
+    NameServer_Params_init(&params);
+    printf("params.maxValueLen=%d\n", params.maxValueLen);
+    printf("params.maxNameLen=%d\n", params.maxNameLen);
+    printf("params.checkExisting=%d\n", params.checkExisting);
+
+    params.maxValueLen = sizeof(UInt32);
+    params.maxNameLen = 32;
+    nsHandle = NameServer_create(NSNAME, &params);
+    if (nsHandle == NULL) {
+        printf("Failed to create NameServer '%s'\n", NSNAME);
+        return -1;
+    }
+    else {
+        printf("Created NameServer '%s'\n", NSNAME);
+    }
+
+    NameServer_Params_init(&params);
+
+    params.maxValueLen = sizeof(UInt32);
+    params.maxNameLen = 32;
+    nsHandle2 = NameServer_create(NSNAME2, &params);
+    if (nsHandle2 == NULL) {
+        printf("Failed to create NameServer '%s'\n", NSNAME2);
+        return -1;
+    }
+    else {
+        printf("Created NameServer '%s'\n", NSNAME2);
+    }
+
+    status = testNS(nsHandle, "Key");
+    status = testNS(nsHandle2, "Key");
+
+    printf("Deleting nsHandle and nsHandle2...\n");
+    NameServer_delete(&nsHandle);
+    NameServer_delete(&nsHandle2);
+
+    iteration++;
+    if (iteration < 2) {
+        goto again;
+    }
+
+    printf("Calling NameServer_destroy()...\n");
+    NameServer_destroy();
+
+    printf ("Leaving NameServerApp_startup: status = 0x%x\n", status);
+
+    return status;
+}
+
+
+Int
+NameServerApp_execute()
+{
+    Int32 status = 0;
+
+    printf ("Entered NameServerApp_execute\n");
+
+    printf ("Leaving NameServerApp_execute\n\n");
+
+    return status;
+}
+
+Int
+NameServerApp_shutdown()
+{
+    Int32 status = 0;
+
+    printf ("Entered NameServerApp_shutdown()\n");
+
+    status = Ipc_stop();
+    if (status < 0) {
+        printf("Ipc_stop failed: status = %d\n", status);
+    }
+
+    printf ("Leave NameServerApp_shutdown()\n");
+
+    return status;
+}
+
+int
+main (int argc, char ** argv)
+{
+    int status = 0;
+
+    status = NameServerApp_startup();
+    if (status < 0) {
+        return -1;
+    }
+
+    status = NameServerApp_execute();
+    if (status < 0) {
+        return -1;
+    }
+
+    status = NameServerApp_shutdown();
+    if (status < 0) {
+        return -1;
+    }
+
+    return(0);
+}
diff --git a/qnx/src/tests/NameServerApp/NameServerApp.use b/qnx/src/tests/NameServerApp/NameServerApp.use
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/qnx/src/tests/NameServerApp/arm/Makefile b/qnx/src/tests/NameServerApp/arm/Makefile
new file mode 100644 (file)
index 0000000..dbffb72
--- /dev/null
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=VARIANT
+ifndef QRECURSE
+QRECURSE=recurse.mk
+ifdef QCONFIG
+QRDIR=$(dir $(QCONFIG))
+endif
+endif
+include $(QRDIR)$(QRECURSE)
diff --git a/qnx/src/tests/NameServerApp/arm/o.g.le.v7/Makefile b/qnx/src/tests/NameServerApp/arm/o.g.le.v7/Makefile
new file mode 100644 (file)
index 0000000..76fc7b8
--- /dev/null
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 ../../common.mk
+
+$(PROJECT_ROOT)/arm/o.g.le.v7/NameServerApp_g: $(IPC_REPO)/qnx/src/api/arm/a.g.le.v7/libipc_g.a
+$(PROJECT_ROOT)/arm/o.g.le.v7/NameServerApp_g: $(IPC_REPO)/qnx/src/utils/arm/a.g.le.v7/libutils_g.a
+$(PROJECT_ROOT)/arm/o.g.le.v7/NameServerApp_g: $(IPC_REPO)/qnx/src/family/arm/a.g.le.v7/libcfg_g.a
+$(PROJECT_ROOT)/arm/o.g.le.v7/NameServerApp_g: $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7/libsyslink_clientS.a
+
+# link with syslink static library, dynamic for others
+LIBPREF_ipc_g = -Bstatic
+LIBPOST_ipc_g = -Bdynamic
+LIBPREF_utils_g = -Bstatic
+LIBPOST_utils_g = -Bdynamic
+LIBPREF_cfg_g = -Bstatic
+LIBPOST_cfg_g = -Bdynamic
+LIBPREF_syslink_client = -Bstatic
+LIBPOST_syslink_client = -Bdynamic
+
+# add libpath and libs
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/api/arm/a.g.le.v7
+LIBS += ipc_g
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/utils/arm/a.g.le.v7
+LIBS += utils_g
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/family/arm/a.g.le.v7
+LIBS += cfg_g
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7
+LIBS += syslink_clientS
+
+
+# copy and rename executables to suit our preferences (TODO: where do we copy the executables)
+#POST_BUILD = \
+#        $(CP_HOST) \
+#        $(PROJECT_ROOT)/arm/o.g.le.v7/NameServerApp_g \
+#        $(PROJECT_ROOT)/../bin/debug/NameServerApp
diff --git a/qnx/src/tests/NameServerApp/arm/o.le.v7/Makefile b/qnx/src/tests/NameServerApp/arm/o.le.v7/Makefile
new file mode 100644 (file)
index 0000000..744397c
--- /dev/null
@@ -0,0 +1,65 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 ../../common.mk
+
+CCFLAGS += -O3
+
+$(PROJECT_ROOT)/arm/o.le.v7/NameServerApp: $(IPC_REPO)/qnx/src/api/arm/a.le.v7/libipc.a
+$(PROJECT_ROOT)/arm/o.le.v7/NameServerApp: $(IPC_REPO)/qnx/src/utils/arm/a.le.v7/libutils.a
+$(PROJECT_ROOT)/arm/o.le.v7/NameServerApp: $(IPC_REPO)/qnx/src/family/arm/a.le.v7/libcfg.a
+$(PROJECT_ROOT)/arm/o.le.v7/NameServerApp: $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7/libsyslink_clientS.a
+
+# link with syslink static library, dynamic for others
+LIBPREF_ipc = -Bstatic
+LIBPOST_ipc = -Bdynamic
+LIBPREF_utils = -Bstatic
+LIBPOST_utils = -Bdynamic
+LIBPREF_cfg = -Bstatic
+LIBPOST_cfg = -Bdynamic
+LIBPREF_syslink_client = -Bstatic
+LIBPOST_syslink_client = -Bdynamic
+
+# add libpath and libs
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/api/arm/a.le.v7
+LIBS += ipc
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/utils/arm/a.le.v7
+LIBS += utils
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/family/arm/a.le.v7
+LIBS += cfg
+EXTRA_LIBVPATH += $(IPC_REPO)/qnx/src/ipc3x_dev/ti/syslink/build/Qnx/lib/arm/so.le.v7
+LIBS += syslink_clientS
+
+# copy and rename executables to suit our preferences (TODO: where do we copy the executables)
+#POST_BUILD = \
+#        $(CP_HOST) \
+#        $(PROJECT_ROOT)/arm/o.le.v7/NameServerApp \
+#        $(PROJECT_ROOT)/../bin/debug/NameServerApp
diff --git a/qnx/src/tests/NameServerApp/common.mk b/qnx/src/tests/NameServerApp/common.mk
new file mode 100644 (file)
index 0000000..9c452df
--- /dev/null
@@ -0,0 +1,61 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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 QCONFIG
+QCONFIG=qconfig.mk
+endif
+include $(QCONFIG)
+
+NAME = NameServerApp
+
+define PINFO
+PINFO DESCRIPTION=IPC QNX MESSAGEQ SAMPLE
+endef
+
+# don't install the binaries, they are copied in base makefile
+INSTALLDIR = /dev/null
+
+CCOPTS += -DSYSLINK_BUILDOS_QNX
+
+# source path
+EXTRA_SRCVPATH += \
+        $(IPC_REPO)/qnx/src/tests/NameServerApp \
+
+EXCLUDE_OBJS =
+
+# include path
+EXTRA_INCVPATH += \
+        $(IPC_REPO)/packages \
+        $(IPC_REPO)/qnx/include
+
+include $(MKFILES_ROOT)/qtargets.mk
+
+LDFLAGS += -M
\ No newline at end of file
diff --git a/qnx/src/tests/NameServerApp/multi_process.sh b/qnx/src/tests/NameServerApp/multi_process.sh
new file mode 100644 (file)
index 0000000..c92ebbf
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+# Run MessageQMulti in parallel processes
+#
+
+g=""
+
+if [ $# -ne 2 ]
+then
+    echo "Usage: multi_process <num_processes> <iterations_per_process>"
+    exit
+fi
+
+i=0; while [ $i -le $(($1 - 1)) ]; do
+       echo "MessageQMulti Test #" $i
+       # This calls MessageQMulti with One Thread, a process #, and
+       # number of iterations per thread.
+       MessageQMulti$g 1 $2 $i &
+       ((i = $i + 1))
+done
diff --git a/qnx/src/tests/NameServerApp/multi_process_debug.sh b/qnx/src/tests/NameServerApp/multi_process_debug.sh
new file mode 100644 (file)
index 0000000..0de0843
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+# Run MessageQMulti in parallel processes
+#
+
+g="_g"
+
+if [ $# -ne 2 ]
+then
+    echo "Usage: multi_process <num_processes> <iterations_per_process>"
+    exit
+fi
+
+i=0; while [ $i -le $(($1 - 1)) ]; do
+       echo "MessageQMulti Test #" $i
+       # This calls MessageQMulti with One Thread, a process #, and
+       # number of iterations per thread.
+       MessageQMulti$g 1 $2 $i &
+       ((i = $i + 1))
+done
diff --git a/qnx/src/utils/IpcLog.c b/qnx/src/utils/IpcLog.c
new file mode 100644 (file)
index 0000000..1ed5c1c
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * 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.
+ */
+/*
+ *  ======== IpcLog.c ========
+ *
+ *  Implementation of functions for log output.
+ */
+
+/* Standard headers */
+#include <Std.h>
+
+#include <stdio.h>
+
+/*
+ * TODO: Currently hardcoded these, but in future we should expose on
+ * command line
+ */
+/* Set to TRUE to enable log output */
+Bool IpcLog_logFile = FALSE;
+FILE * IpcLog_logPtr = stdout;
diff --git a/qnx/src/utils/Makefile b/qnx/src/utils/Makefile
new file mode 100644 (file)
index 0000000..02aa99c
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2013, Texas Instruments Incorporated
+# All rights reserved.
+#
+# 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.
+#
+LIST=CPU
+include recurse.mk
diff --git a/qnx/src/utils/MultiProc.c b/qnx/src/utils/MultiProc.c
new file mode 100644 (file)
index 0000000..6ab9112
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *