summaryrefslogtreecommitdiffstats
path: root/domx/domx/omx_rpc/src/omx_rpc.c
diff options
context:
space:
mode:
Diffstat (limited to 'domx/domx/omx_rpc/src/omx_rpc.c')
-rwxr-xr-xdomx/domx/omx_rpc/src/omx_rpc.c410
1 files changed, 0 insertions, 410 deletions
diff --git a/domx/domx/omx_rpc/src/omx_rpc.c b/domx/domx/omx_rpc/src/omx_rpc.c
deleted file mode 100755
index 0743491..0000000
--- a/domx/domx/omx_rpc/src/omx_rpc.c
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * Copyright (c) 2010, 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 omx_rpc_stub.c
- * This file contains methods that provides the functionality for
- * the OpenMAX1.1 DOMX Framework RPC Stub implementations.
- *
- * @path \WTSD_DucatiMMSW\framework\domx\omx_rpc\src
- *
- * @rev 1.0
- */
-
-
-/******************************************************************
- * INCLUDE FILES
- ******************************************************************/
-/* ----- system and platform files ----------------------------*/
-#include <errno.h>
-//#include <errno-base.h>
-
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <sys/eventfd.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdio.h>
-
-#include <OMX_Types.h>
-#include <timm_osal_interfaces.h>
-#include <timm_osal_trace.h>
-
-
-/*-------program files ----------------------------------------*/
-#include "omx_rpc.h"
-#include "omx_proxy_common.h"
-#include "omx_rpc_stub.h"
-#include "omx_rpc_skel.h"
-#include "omx_rpc_internal.h"
-#include "omx_rpc_utils.h"
-
-#include "rpmsg_omx_defs.h"
-
-#define RPC_MSGPIPE_SIZE (4)
-#define RPC_MSG_SIZE_FOR_PIPE (sizeof(OMX_PTR))
-#define MAX_ATTEMPTS 15
-
-#define RPC_getPacket(nPacketSize, pPacket) do { \
- pPacket = TIMM_OSAL_Malloc(nPacketSize, TIMM_OSAL_TRUE, 0, TIMMOSAL_MEM_SEGMENT_INT); \
- RPC_assert(pPacket != NULL, RPC_OMX_ErrorInsufficientResources, \
- "Error Allocating RCM Message Frame"); \
- } while(0)
-
-#define RPC_freePacket(pPacket) do { \
- if(pPacket != NULL) TIMM_OSAL_Free(pPacket); \
- } while(0)
-
-OMX_U8 pBufferError[RPC_PACKET_SIZE];
-
-void *RPC_CallbackThread(void *data);
-
-
-/* ===========================================================================*/
-/**
-* @name RPC_InstanceInit()
-* @brief RPC instance init is used for initialization. It is called once for
-* every instance of an OMX component.
-* @param cComponentName [IN] : Name of the component.
-* @param phRPCCtx [OUT] : RPC Context structure - to be filled in and returned
-* @return RPC_OMX_ErrorNone = Successful
-*/
-/* ===========================================================================*/
-
-RPC_OMX_ERRORTYPE RPC_InstanceInit(OMX_STRING cComponentName,
- OMX_HANDLETYPE * phRPCCtx)
-{
- RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
- RPC_OMX_CONTEXT *pRPCCtx = NULL;
- OMX_S32 status = 0;
- struct omx_conn_req sReq = { .name = "OMX" };
- TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
- OMX_U32 i = 0, nAttempts = 0;
-
- *(RPC_OMX_CONTEXT **) phRPCCtx = NULL;
-
- //pthread_t cbThread;
-
-// sReq.name = "OMX";
-
- /*pRPCCtx contains context information for each instance */
- pRPCCtx =
- (RPC_OMX_CONTEXT *) TIMM_OSAL_Malloc(sizeof(RPC_OMX_CONTEXT),
- TIMM_OSAL_TRUE, 0, TIMMOSAL_MEM_SEGMENT_INT);
- RPC_assert(pRPCCtx != NULL, RPC_OMX_ErrorInsufficientResources,
- "Malloc failed");
- TIMM_OSAL_Memset(pRPCCtx, 0, sizeof(RPC_OMX_CONTEXT));
-
- /*Assuming that open maintains an internal count for multi instance */
- DOMX_DEBUG("Calling open on the device");
- while (1)
- {
- pRPCCtx->fd_omx = open("/dev/rpmsg-omx1", O_RDWR);
- if(pRPCCtx->fd_omx >= 0 || errno != ENOENT || nAttempts == MAX_ATTEMPTS)
- break;
- DOMX_DEBUG("errno from open= %d, REATTEMPTING OPEN!!!!",errno);
- nAttempts++;
- usleep(1000000);
- }
- if(pRPCCtx->fd_omx < 0)
- {
- DOMX_ERROR("Can't open device, errorno from open = %d",errno);
- eError = RPC_OMX_ErrorInsufficientResources;
- goto EXIT;
- }
- DOMX_DEBUG("Open was successful, pRPCCtx->fd_omx = %d",
- pRPCCtx->fd_omx);
-//AD
-// strncpy(sReq.name, cComponentName, OMX_MAX_STRINGNAME_SIZE);
-
- DOMX_DEBUG("Calling ioctl");
- status = ioctl(pRPCCtx->fd_omx, OMX_IOCCONNECT, &sReq);
- RPC_assert(status >= 0, RPC_OMX_ErrorInsufficientResources,
- "Can't connect");
-
- for (i = 0; i < RPC_OMX_MAX_FUNCTION_LIST; i++)
- {
- eError =
- TIMM_OSAL_CreatePipe(&(pRPCCtx->pMsgPipe[i]),
- RPC_MSGPIPE_SIZE, RPC_MSG_SIZE_FOR_PIPE, 1);
- RPC_assert(eError == TIMM_OSAL_ERR_NONE,
- RPC_OMX_ErrorInsufficientResources,
- "Pipe creation failed");
- }
-
- DOMX_DEBUG("Creating event fd");
- pRPCCtx->fd_killcb = eventfd(0, 0);
- RPC_assert(pRPCCtx->fd_killcb >= 0,
- RPC_OMX_ErrorInsufficientResources, "Can't create kill fd");
- /*Create a listener/server thread to listen for Ducati callbacks */
- DOMX_DEBUG("Create listener thread");
- status =
- pthread_create(&(pRPCCtx->cbThread), NULL, RPC_CallbackThread,
- pRPCCtx);
- RPC_assert(status == 0, RPC_OMX_ErrorInsufficientResources,
- "Can't create cb thread");
-
- EXIT:
- if (eRPCError != RPC_OMX_ErrorNone)
- {
- RPC_InstanceDeInit(pRPCCtx);
- }
- else
- {
- *(RPC_OMX_CONTEXT **) phRPCCtx = pRPCCtx;
- }
- return eRPCError;
-}
-
-
-
-/* ===========================================================================*/
-/**
-* @name RPC_InstanceDeInit()
-* @brief RPC instance deinit is used for tear down. It is called once when an
-* instance of OMX component is going down.
-* @param phRPCCtx [IN] : RPC Context structure.
-* @return RPC_OMX_ErrorNone = Successful
-*/
-/* ===========================================================================*/
-RPC_OMX_ERRORTYPE RPC_InstanceDeInit(OMX_HANDLETYPE hRPCCtx)
-{
- RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
- TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
- RPC_OMX_CONTEXT *pRPCCtx = (RPC_OMX_CONTEXT *) hRPCCtx;
- OMX_S32 status = 0;
- OMX_U32 i = 0;
- OMX_U64 nKillEvent = 1;
-
- RPC_assert(hRPCCtx != NULL, RPC_OMX_ErrorUndefined,
- "NULL context handle supplied to RPC Deinit");
-
- if (pRPCCtx->fd_killcb)
- {
- status =
- write(pRPCCtx->fd_killcb, &nKillEvent, sizeof(OMX_U64));
- if (status <= 0)
- {
- DOMX_ERROR
- ("Write to kill fd failed - cb thread may not exit");
- eRPCError = RPC_OMX_ErrorUndefined;
- } else if (pRPCCtx->cbThread)
- {
- DOMX_DEBUG("Waiting for cb thread to exit");
- status = pthread_join(pRPCCtx->cbThread, NULL);
- if (status != 0)
- {
- DOMX_ERROR("Join for cb thread failed");
- eRPCError = RPC_OMX_ErrorUndefined;
- }
- }
- DOMX_DEBUG("Closing the kill fd");
- status = close(pRPCCtx->fd_killcb);
- pRPCCtx->fd_killcb = 0;
- if (status != 0)
- {
- DOMX_ERROR("Close failed on kill fd");
- eRPCError = RPC_OMX_ErrorUndefined;
- }
- }
-
- for (i = 0; i < RPC_OMX_MAX_FUNCTION_LIST; i++)
- {
- if (pRPCCtx->pMsgPipe[i])
- {
- eError = TIMM_OSAL_DeletePipe(pRPCCtx->pMsgPipe[i]);
- pRPCCtx->pMsgPipe[i] = NULL;
- if (eError != TIMM_OSAL_ERR_NONE)
- {
- DOMX_ERROR("Pipe deletion failed");
- eRPCError = RPC_OMX_ErrorUndefined;
- }
- }
- }
-
- DOMX_DEBUG("Closing the omx fd");
- if (pRPCCtx->fd_omx)
- {
- status = close(pRPCCtx->fd_omx);
- pRPCCtx->fd_omx = 0;
- if (status != 0)
- {
- DOMX_ERROR("Close failed on omx fd");
- eRPCError = RPC_OMX_ErrorUndefined;
- }
- }
-
- TIMM_OSAL_Free(pRPCCtx);
-
- EXIT:
- return eRPCError;
-}
-
-
-
-/* ===========================================================================*/
-/**
-* @name RPC_CallbackThread()
-* @brief This is the entry function of the thread which keeps spinning, waiting
-* for messages from Ducati.
-* @param data [IN] : The RPC Context structure is passed here.
-* @return RPC_OMX_ErrorNone = Successful
-*/
-/* ===========================================================================*/
-void *RPC_CallbackThread(void *data)
-{
- OMX_PTR pBuffer = NULL;
- RPC_OMX_CONTEXT *pRPCCtx = (RPC_OMX_CONTEXT *) data;
- fd_set readfds;
- OMX_S32 maxfd = 0, status = 0;
- OMX_U32 nFxnIdx = 0, nPacketSize = RPC_PACKET_SIZE, nPos = 0;
- RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
- TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
- OMX_COMPONENTTYPE *hComp = NULL;
- PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
- OMX_PTR pBuff = pBufferError;
-
- maxfd =
- (pRPCCtx->fd_killcb >
- pRPCCtx->fd_omx ? pRPCCtx->fd_killcb : pRPCCtx->fd_omx) + 1;
- while (1)
- {
- FD_ZERO(&readfds);
- FD_SET(pRPCCtx->fd_omx, &readfds);
- FD_SET(pRPCCtx->fd_killcb, &readfds);
-
- DOMX_DEBUG("Waiting for messages from remote core");
- status = select(maxfd, &readfds, NULL, NULL, NULL);
- RPC_assert(status > 0, RPC_OMX_ErrorUndefined,
- "select failed");
-
- if (FD_ISSET(pRPCCtx->fd_killcb, &readfds))
- {
- DOMX_DEBUG("Recd. kill message - exiting the thread");
- break;
- }
-
- if (FD_ISSET(pRPCCtx->fd_omx, &readfds))
- {
- DOMX_DEBUG("Recd. omx message");
- RPC_getPacket(nPacketSize, pBuffer);
- status = read(pRPCCtx->fd_omx, pBuffer, nPacketSize);
- if(status < 0)
- {
- if(errno == ENXIO)
- {
- for(nFxnIdx = 0; nFxnIdx < RPC_OMX_MAX_FUNCTION_LIST; nFxnIdx++)
- {
- ((struct omx_packet *) pBufferError)->result = OMX_ErrorHardware;
- TIMM_OSAL_WriteToPipe(pRPCCtx->pMsgPipe[nFxnIdx], &pBuff, RPC_MSG_SIZE_FOR_PIPE, TIMM_OSAL_SUSPEND);
- if(eError != TIMM_OSAL_ERR_NONE)
- DOMX_ERROR("Write to pipe failed");
- }
- /*Indicate fatal error and exit*/
- RPC_assert(0, RPC_OMX_ErrorHardware,
- "Remote processor fatal error");
- }
- else
- {
- RPC_assert(0, RPC_OMX_ErrorUndefined,
- "read failed");
- }
- }
-
- nPos = 0;
- nFxnIdx = ((struct omx_packet *) pBuffer)->fxn_idx;
- /*Indices from static table will have bit 31 set */
- if (nFxnIdx & 0x80000000)
- nFxnIdx &= 0x0FFFFFFF;
- RPC_assert(nFxnIdx < RPC_OMX_MAX_FUNCTION_LIST,
- RPC_OMX_ErrorUndefined,
- "Bad function index recd");
- switch (nFxnIdx)
- {
- case RPC_OMX_FXN_IDX_EVENTHANDLER:
- RPC_SKEL_EventHandler(((struct omx_packet *)
- pBuffer)->data);
- RPC_freePacket(pBuffer);
- pBuffer = NULL;
- break;
- case RPC_OMX_FXN_IDX_EMPTYBUFFERDONE:
- RPC_SKEL_EmptyBufferDone(((struct omx_packet *)
- pBuffer)->data);
- RPC_freePacket(pBuffer);
- pBuffer = NULL;
- break;
- case RPC_OMX_FXN_IDX_FILLBUFFERDONE:
- RPC_SKEL_FillBufferDone(((struct omx_packet *)
- pBuffer)->data);
- RPC_freePacket(pBuffer);
- pBuffer = NULL;
- break;
- default:
- eError =
- TIMM_OSAL_WriteToPipe(pRPCCtx->
- pMsgPipe[nFxnIdx], &pBuffer,
- RPC_MSG_SIZE_FOR_PIPE, TIMM_OSAL_SUSPEND);
- RPC_assert(eError == TIMM_OSAL_ERR_NONE,
- RPC_OMX_ErrorUndefined,
- "Write to pipe failed");
- break;
- }
- }
-EXIT:
- if (eRPCError != RPC_OMX_ErrorNone)
- {
- //AD TODO: Send error CB to client and then go back in loop to wait for killfd
- if (pBuffer != NULL)
- {
- RPC_freePacket(pBuffer);
- pBuffer = NULL;
- }
- /*Report all hardware errors as fatal and exit from listener thread*/
- if (eRPCError == RPC_OMX_ErrorHardware)
- {
- /*Implicit detail: pAppData is proxy component handle updated during
- RPC_GetHandle*/
- hComp = (OMX_COMPONENTTYPE *) pRPCCtx->pAppData;
- if(hComp != NULL)
- {
- pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
- /*Indicate fatal error. Users are expected to cleanup the OMX instance
- to ensure all resources are cleaned up.*/
- pCompPrv->proxyEventHandler(hComp, pCompPrv->pILAppData, OMX_EventError,
- OMX_ErrorHardware, 0, NULL);
- }
- break;
- }
- }
- }
- return (void*)0;
-}