Int32 System_ipcNotifyDeInit() { Int32 status; UInt32 i, procId; Vps_printf(" %d: SYSTEM: IPC Notify de-init in progress !!!\n", Utils_getCurTimeInMsec()); i = 0; while (gSystem_ipcEnableProcId[i] != SYSTEM_PROC_MAX) { procId = gSystem_ipcEnableProcId[i]; if ((procId != System_getSelfProcId()) && (procId != SYSTEM_PROC_INVALID)) { status = Notify_unregisterEvent(procId, SYSTEM_IPC_NOTIFY_LINE_ID, SYSTEM_IPC_NOTIFY_EVENT_ID, System_ipcNotifyHandler, NULL); UTILS_assert(status == Notify_S_SUCCESS); } i++; } Vps_printf(" %d: SYSTEM: IPC Notify de-init DONE !!!\n", Utils_getCurTimeInMsec()); return status; }
Void System_ipcNotifyHandler(UInt16 procId, UInt16 lineId, UInt32 eventId, UArg arg, UInt32 payload) { UInt32 linkId, linkProcId; Utils_TskHndl *pTsk; if (lineId != SYSTEM_IPC_NOTIFY_LINE_ID) return; if (eventId != SYSTEM_IPC_NOTIFY_EVENT_ID) return; linkProcId = SYSTEM_GET_PROC_ID(payload); linkId = SYSTEM_GET_LINK_ID(payload); if (linkId >= SYSTEM_LINK_ID_MAX) return; UTILS_assert(System_getSelfProcId() == linkProcId); if (gSystem_ipcObj.notifyCb[linkId]) { pTsk = System_getLinkTskHndl(linkId); gSystem_ipcObj.notifyCb[linkId] (pTsk); } }
Int32 System_ipcMsgQDelete() { UInt32 i; UInt32 procId; Int32 status; i=0; while(gSystem_ipcMsgQEnableProcId[i]!=SYSTEM_PROC_MAX) { procId = gSystem_ipcMsgQEnableProcId[i]; if(procId==System_getSelfProcId()) { /* delete MsgQ */ status = MessageQ_delete(&gSystem_ipcObj.selfMsgQ); UTILS_assert(status==0); status = MessageQ_delete(&gSystem_ipcObj.selfAckMsgQ); UTILS_assert(status==0); } else { status = MessageQ_close(&gSystem_ipcObj.remoteProcMsgQ[procId]); UTILS_assert(status==0); /* no need to close ack msgq */ } i++; } return OSA_SOK; }
Int32 IpcFramesInLink_init() { Int32 status; System_LinkObj linkObj; UInt32 ipcFramesInId; IpcFramesInLink_Obj *pObj; char tskName[32]; UInt32 procId = System_getSelfProcId(); // UTILS_COMPILETIME_ASSERT(offsetof(SystemIpcFrames_ListElem, frameBuf) == 0); UTILS_COMPILETIME_ASSERT(offsetof(SystemIpcFrames_ListElem, frameBuf) == 0); UTILS_COMPILETIME_ASSERT(offsetof(VIDFrame_Buf, reserved) == 0); UTILS_COMPILETIME_ASSERT(sizeof(((SystemIpcFrames_ListElem *) 0)->frameBuf.reserved) == sizeof(ListMP_Elem)); for (ipcFramesInId = 0; ipcFramesInId < IPC_FRAMES_IN_LINK_OBJ_MAX; ipcFramesInId++) { pObj = &gIpcFramesInLink_obj[ipcFramesInId]; memset(pObj, 0, sizeof(*pObj)); pObj->tskId = SYSTEM_MAKE_LINK_ID(procId, SYSTEM_LINK_ID_IPC_FRAMES_IN_0) + ipcFramesInId; pObj->state = IPC_FRAMES_IN_LINK_STATE_INACTIVE; linkObj.pTsk = &pObj->tsk; linkObj.linkGetFullFrames = NULL; linkObj.linkPutEmptyFrames = NULL; linkObj.linkGetFullFrames = IpcFramesInLink_getFullFrames; linkObj.linkPutEmptyFrames = IpcFramesInLink_putEmptyFrames; linkObj.getLinkInfo = IpcFramesInLink_getLinkInfo; System_registerLink(pObj->tskId, &linkObj); UTILS_SNPRINTF(tskName, "IPC_FRAMES_IN%d", ipcFramesInId); System_ipcRegisterNotifyCb(pObj->tskId, IpcFramesInLink_notifyCb); status = Utils_tskCreate(&pObj->tsk, IpcFramesInLink_tskMain, IPC_LINK_TSK_PRI, gIpcFramesInLink_tskStack[ipcFramesInId], IPC_LINK_TSK_STACK_SIZE, pObj, tskName); UTILS_assert(status == FVID2_SOK); } return status; }
Int32 System_ipcNotifyInit() { UInt32 procId, i; Int32 status; memset(gSystem_ipcObj.notifyCb, 0, sizeof(gSystem_ipcObj.notifyCb)); i = 0; while (gSystem_ipcEnableProcId[i] != SYSTEM_PROC_MAX) { procId = gSystem_ipcEnableProcId[i]; if ((procId != System_getSelfProcId()) && (procId != SYSTEM_PROC_INVALID)) { Vps_printf (" %d: SYSTEM: Notify register to [%s] line %d, event %d ... \n", Utils_getCurTimeInMsec(), MultiProc_getName(procId), SYSTEM_IPC_NOTIFY_LINE_ID, SYSTEM_IPC_NOTIFY_EVENT_ID); if (Notify_intLineRegistered(procId, SYSTEM_IPC_NOTIFY_LINE_ID) == FALSE) { UTILS_assert(0); } if (Notify_eventAvailable (procId, SYSTEM_IPC_NOTIFY_LINE_ID, SYSTEM_IPC_NOTIFY_EVENT_ID) == FALSE) { UTILS_assert(0); } status = Notify_registerEvent(procId, SYSTEM_IPC_NOTIFY_LINE_ID, SYSTEM_IPC_NOTIFY_EVENT_ID, System_ipcNotifyHandler, NULL); UTILS_assert(status == Notify_S_SUCCESS); } i++; } return status; }
Int32 IpcOutM3Link_init() { Int32 status; System_LinkObj linkObj; UInt32 ipcOutM3Id; IpcOutM3Link_Obj *pObj; char tskName[32]; UInt32 procId = System_getSelfProcId(); for (ipcOutM3Id = 0; ipcOutM3Id < IPC_OUT_M3_LINK_OBJ_MAX; ipcOutM3Id++) { pObj = &gIpcOutM3Link_obj[ipcOutM3Id]; memset(pObj, 0, sizeof(*pObj)); pObj->tskId = SYSTEM_MAKE_LINK_ID(procId, SYSTEM_LINK_ID_IPC_OUT_M3_0) + ipcOutM3Id; linkObj.pTsk = &pObj->tsk; linkObj.linkGetFullFrames = NULL; linkObj.linkPutEmptyFrames = NULL; linkObj.getLinkInfo = IpcOutM3Link_getLinkInfo; System_registerLink(pObj->tskId, &linkObj); sprintf(tskName, "IPC_OUT_M3%d", ipcOutM3Id); System_ipcRegisterNotifyCb(pObj->tskId, IpcOutM3Link_notifyCb); IpcOutM3Link_initListMP(pObj); status = Utils_tskCreate(&pObj->tsk, IpcOutM3Link_tskMain, IPC_LINK_TSK_PRI, gIpcOutM3Link_tskStack[ipcOutM3Id], IPC_LINK_TSK_STACK_SIZE, pObj, tskName); UTILS_assert(status == FVID2_SOK); } return status; }
Int32 System_sendLinkCmd(UInt32 linkId, UInt32 cmd) { Int32 status; UInt32 procId; procId = SYSTEM_GET_PROC_ID(linkId); UTILS_assert( procId < SYSTEM_PROC_MAX); if(procId!=System_getSelfProcId()) { status = System_ipcMsgQSendMsg(linkId, cmd, NULL, 0, FALSE, OSA_TIMEOUT_FOREVER); } else { status = System_sendLinkCmd_local(linkId, cmd); } return status; }
Int32 System_linkGetInfo(UInt32 linkId, System_LinkInfo * info) { Int32 status; UInt32 procId; procId = SYSTEM_GET_PROC_ID(linkId); UTILS_assert( procId < SYSTEM_PROC_MAX); if(procId!=System_getSelfProcId()) { status = System_ipcMsgQSendMsg(linkId, SYSTEM_CMD_GET_INFO, info, sizeof(*info), TRUE, OSA_TIMEOUT_FOREVER); } else { status = System_linkGetInfo_local(linkId, info); } return status; }
Int32 NullSrcLink_init() { Int32 status; System_LinkObj linkObj; UInt32 nullSrcId; NullSrcLink_Obj *pObj; char tskName[32]; UInt32 procId = System_getSelfProcId(); for (nullSrcId = 0; nullSrcId < NULL_SRC_LINK_OBJ_MAX; nullSrcId++) { pObj = &gNullSrcLink_obj[nullSrcId]; memset(pObj, 0, sizeof(*pObj)); pObj->tskId = SYSTEM_MAKE_LINK_ID(procId, SYSTEM_LINK_ID_NULL_SRC_0) + nullSrcId; linkObj.pTsk = &pObj->tsk; linkObj.linkGetFullFrames = NullSrcLink_getFullFrames; linkObj.linkPutEmptyFrames = NullSrcLink_putEmptyFrames; linkObj.getLinkInfo = NullSrcLink_getInfo; System_registerLink(pObj->tskId, &linkObj); sprintf(tskName, "NULL_SRC%d", nullSrcId); status = Utils_tskCreate(&pObj->tsk, NullSrcLink_tskMain, NULL_SRC_LINK_TSK_PRI, gNullSrcLink_tskStack[nullSrcId], (NULL_SRC_LINK_TSK_STACK_SIZE), pObj, tskName); UTILS_assert(status == FVID2_SOK); } return status; }
Int32 DupLink_init() { Int32 status; System_LinkObj linkObj; UInt32 dupId; DupLink_Obj *pObj; char tskName[32]; UInt32 procId = System_getSelfProcId(); for (dupId = 0; dupId < DUP_LINK_OBJ_MAX; dupId++) { pObj = &gDupLink_obj[dupId]; memset(pObj, 0, sizeof(*pObj)); pObj->tskId = SYSTEM_MAKE_LINK_ID(procId, SYSTEM_LINK_ID_DUP_0) + dupId; linkObj.pTsk = &pObj->tsk; linkObj.linkGetFullFrames = DupLink_getFullFrames; linkObj.linkPutEmptyFrames = DupLink_putEmptyFrames; linkObj.getLinkInfo = DupLink_getLinkInfo; System_registerLink(pObj->tskId, &linkObj); sprintf(tskName, "DUP%d", dupId); status = Utils_tskCreate(&pObj->tsk, DupLink_tskMain, DUP_LINK_TSK_PRI, gDupLink_tskStack[dupId], DUP_LINK_TSK_STACK_SIZE, pObj, tskName); UTILS_assert(status == FVID2_SOK); } return status; }
Int32 System_linkControlWithTimeout(UInt32 linkId, UInt32 cmd, Void *pPrm, UInt32 prmSize, Bool waitAck, UInt32 timeout) { Int32 status; UInt32 procId; procId = SYSTEM_GET_PROC_ID(linkId); if(procId >= SYSTEM_PROC_MAX) { ;// printf(" SYSTEM: Invalid proc ID ( procID = %d, linkID = 0x%08x, cmd = 0x%08x) \r\n", procId, linkId, cmd); } UTILS_assert( procId < SYSTEM_PROC_MAX); if(procId!=System_getSelfProcId()) { status = System_ipcMsgQSendMsg(linkId, cmd, pPrm, prmSize, waitAck, timeout); } else { status = System_linkControl_local(linkId, cmd, pPrm, prmSize, waitAck); } return status; }
Int32 System_ipcMsgQCreate() { UInt32 i; UInt32 procId; Int32 status; Int32 retryCount; MessageQ_Params msgQParams; char msgQName[64]; char ackMsgQName[64]; i=0; while(gSystem_ipcMsgQEnableProcId[i]!=SYSTEM_PROC_MAX) { procId = gSystem_ipcMsgQEnableProcId[i]; if (procId != SYSTEM_PROC_INVALID) { System_ipcGetMsgQName(procId, msgQName, ackMsgQName); if(procId==System_getSelfProcId()) { /* create MsgQ */ MessageQ_Params_init(&msgQParams); /* printf(" %u: SYSTEM: Creating MsgQ [%s] ...\n", OSA_getCurTimeInMsec(), msgQName ); */ gSystem_ipcObj.selfMsgQ = MessageQ_create(msgQName, &msgQParams); UTILS_assert(gSystem_ipcObj.selfMsgQ!=NULL); MessageQ_Params_init(&msgQParams); /* printf(" %u: SYSTEM: Creating MsgQ [%s] ...\n", OSA_getCurTimeInMsec(), ackMsgQName ); */ gSystem_ipcObj.selfAckMsgQ = MessageQ_create(ackMsgQName, &msgQParams); UTILS_assert(gSystem_ipcObj.selfMsgQ!=NULL); } else { /* open MsgQ */ retryCount=10; while(retryCount) { // printf(" %u: SYSTEM: Opening MsgQ [%s] ...\n", // OSA_getCurTimeInMsec(), // msgQName // ); status = MessageQ_open(msgQName, &gSystem_ipcObj.remoteProcMsgQ[procId]); if(status==MessageQ_E_NOTFOUND) OSA_waitMsecs(1000); else if(status==MessageQ_S_SUCCESS) break; retryCount--; if(retryCount<=0) UTILS_assert(0); } /* no need to open ack msgq, since ack msgq id is embeeded in the received message */ } } i++; } return OSA_SOK; }