Int main(Int argc, char* argv[]) { RcmServer_Params rcmServerParams; System_printf("%s starting..\n", MultiProc_getName(MultiProc_self())); /* * Enable use of runtime Diags_setMask per module: * * Codes: E = ENTRY, X = EXIT, L = LIFECYCLE, F = INFO, S = STATUS */ Diags_setMask("ti.ipc.rpmsg.MessageQCopy=EXLFS"); /* Setup the table of services, so clients can create and connect to * new service instances: */ ServiceMgr_init(); /* initialize RcmServer create params */ RcmServer_Params_init(&rcmServerParams); /* The first function, at index 0, is a special create function, which * gets passed a Service_Handle argument. * We set this at run time as our C compiler is not allowing named union * field initialization: */ OMXServer_fxnTab.elem[0].addr.createFxn = RPC_SKEL_GetHandle; rcmServerParams.priority = Thread_Priority_ABOVE_NORMAL; rcmServerParams.fxns.length = OMXServer_fxnTab.length; rcmServerParams.fxns.elem = OMXServer_fxnTab.elem; int i = 0; for (i = 0; i < 255; i ++) bit_num[i] = ((i&1) != 0) + ((i&2) != 0) + ((i&4) != 0) + ((i&8) != 0) + ((i&16) != 0) + ((i&32) != 0) + ((i&64) != 0) + ((i&128) != 0); /* Register an OMX service to create and call new OMX components: */ ServiceMgr_register("OMX", &rcmServerParams); #if 0 /* Some background ping testing tasks, used by rpmsg samples: */ start_ping_tasks(); #endif #if 0 /* DSP or CORE0 or IPU */ /* Run a background task to test rpmsg_resmgr service */ start_resmgr_task(); #endif #if 0 /* DSP or CORE0 or IPU */ /* Run a background task to test hwspinlock */ start_hwSpinlock_task(); #endif /* Start the ServiceMgr services */ ServiceMgr_start(0); BIOS_start(); return (0); }
/* * ======== MemMgr_createDaemon ======== */ MemMgr_Daemon_Handle MemMgr_createDaemon(String name) { Error_Block ebObj; Error_Block *eb = &ebObj; RcmServer_Params rcmServer_Params; MemMgr_Daemon_Object *obj = NULL; UInt32 unused; Int status = 0; Error_init(eb); /* allocate the daemon object */ obj = (MemMgr_Daemon_Object *)Memory_alloc(NULL, sizeof(MemMgr_Daemon_Object), sizeof(Int), eb); if (Error_check(eb)) { goto leave; } obj->hRcmServer = NULL; /* create the RcmServer instance */ RcmServer_Params_init(&rcmServer_Params); status = RcmServer_create(name, &rcmServer_Params, &obj->hRcmServer); if (status < 0) { goto leave; } /* install the function pointers */ status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_PageSize_skel", MemMgr_PageSize_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_Alloc_skel", MemMgr_Alloc_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_Free_skel", MemMgr_Free_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_Map_skel", MemMgr_Map_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_UnMap_skel", MemMgr_UnMap_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_Is1DBlock_skel", MemMgr_Is1DBlock_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_Is2DBlock_skel", MemMgr_Is2DBlock_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_IsMapped_skel", MemMgr_IsMapped_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "MemMgr_GetStride_skel", MemMgr_GetStride_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "TilerMem_GetStride_skel", TilerMem_GetStride_skel, &unused); if (status < 0) goto leave; status = RcmServer_addSymbol(obj->hRcmServer, "TilerMem_VirtToPhys_skel", TilerMem_VirtToPhys_skel, &unused); if (status < 0) goto leave; /* start the server */ RcmServer_start(obj->hRcmServer); /* pause to let server thread get going */ usleep(20000); /* 0.02 sec */ leave: if (Error_check(eb)) { Error_raise(eb, Error_E_generic, "MemMgr_createDeamon failed", 0); if (obj != NULL) { Memory_free(NULL, (Ptr)obj, sizeof(MemMgr_Daemon_Object)); obj = NULL; } } return((MemMgr_Daemon_Handle)obj); }
/* * ======== RcmServerThreadFxn ======== * RCM server test thread function */ Void RcmServerThreadFxn (Void *arg) { RcmServer_Params rcmServerParams; UInt fxnIdx; Char * rcmServerName = RCMSERVER_NAME; Int status = 0; /* Rcm server module init */ Osal_printf ("RcmServerThreadFxn: RCM Server module init.\n"); RcmServer_init (); /* Rcm server module params init*/ Osal_printf ("RcmServerThreadFxn: RCM Server module params init.\n"); status = RcmServer_Params_init (&rcmServerParams); if (status < 0) { Osal_printf ("RcmServerThreadFxn: Error in RCM Server instance params " "init \n"); goto exit; } Osal_printf ("RcmServerThreadFxn: RCM Server instance params init " "passed \n"); /* Create the RcmServer instance */ Osal_printf ("RcmServerThreadFxn: Creating RcmServer instance %s.\n", rcmServerName); status = RcmServer_create (rcmServerName, &rcmServerParams, &rcmServerHandle); if (status < 0) { Osal_printf ("RcmServerThreadFxn: Error in RCM Server create.\n"); goto exit; } Osal_printf ("RcmServerThreadFxn: RCM Server Create passed \n"); sem_init (&serverThreadSync, 0, 0); /* Register the remote functions */ Osal_printf ("RcmServerThreadFxn: Registering remote function - " "fxnDouble\n"); status = RcmServer_addSymbol (rcmServerHandle, "fxnDouble", fxnDouble, &fxnIdx); if ((status < 0) || (fxnIdx == 0xFFFFFFFF)) { Osal_printf ("RcmServerThreadFxn: Add symbol failed.\n"); goto exit; } Osal_printf ("RcmServerThreadFxn: Registering remote function - " "fxnExit\n"); status = RcmServer_addSymbol (rcmServerHandle, "fxnExit", fxnExit, &fxnIdx); if ((status < 0) || (fxnIdx == 0xFFFFFFFF)) { Osal_printf ("RcmServerThreadFxn: Add symbol failed.\n"); goto exit; } Osal_printf ("RcmServerThreadFxn: Start RCM server thread \n"); RcmServer_start (rcmServerHandle); Osal_printf ("RcmServerThreadFxn: RCM Server start passed \n"); sem_wait (&serverThreadSync); sem_post (&mainThreadWait); exit: Osal_printf ("RcmServerThreadFxn: Leaving RCM server test thread " "function \n"); return; }
Int main(Int argc, char* argv[]) { RcmServer_Params rcmServerParams; System_printf("%s starting..\n", MultiProc_getName(MultiProc_self())); /* * Enable use of runtime Diags_setMask per module: * * Codes: E = ENTRY, X = EXIT, L = LIFECYCLE, F = INFO, S = STATUS */ Diags_setMask("ti.ipc.rpmsg.MessageQCopy=EXLFS"); /* Setup the table of services, so clients can create and connect to * new service instances: */ ServiceMgr_init(); /* initialize RcmServer create params */ RcmServer_Params_init(&rcmServerParams); /* The first function, at index 0, is a special create function, which * gets passed a Service_Handle argument. * We set this at run time as our C compiler is not allowing named union * field initialization: */ OMXServer_fxnTab.elem[0].addr.createFxn = RPC_SKEL_GetHandle; rcmServerParams.priority = Thread_Priority_ABOVE_NORMAL; rcmServerParams.fxns.length = OMXServer_fxnTab.length; rcmServerParams.fxns.elem = OMXServer_fxnTab.elem; /* Register an OMX service to create and call new OMX components: */ ServiceMgr_register("OMX", &rcmServerParams); /* Some background ping testing tasks, used by rpmsg samples: */ //start_ping_tasks(); #if 0 /* DSP or CORE0 or IPU */ /* Run a background task to test rpmsg_resmgr service */ start_resmgr_task(); #endif #if 0 /* DSP or CORE0 or IPU */ /* Run a background task to test hwspinlock */ start_hwSpinlock_task(); #endif /* Create 1 task with priority 15 */ Error_init(&eb0); Task_Params_init(&taskParams0); //taskParams0.stackSize = 512; taskParams0.priority = 15; taskParams0.affinity = 1; taskParams0.arg0 = (xdc_UArg)(&(t1)) ; taskParams0.arg1 = 0 ; /* Create 1 task with priority 15 */ Error_init(&eb1); Task_Params_init(&taskParams1); //taskParams1.stackSize = 512; taskParams1.priority = 15; taskParams1.affinity = 0; taskParams1.arg0 = (xdc_UArg)(&(t2)) ; taskParams1.arg1 = 1 ; /* create an Event object. All events are binary */ Error_Block eb; Error_init(&eb); edgeDetectEvent = Event_create(NULL, &eb); if (edgeDetectEvent == NULL) { System_abort("Event create failed"); } local_barrier_sense = local_barrier_counter = 2 ; sem0 = Semaphore_create(1, NULL, NULL) ; /* Start the ServiceMgr services */ ServiceMgr_start(0); BIOS_start(); return (0); }
/* * ======== Server_setup ======== * * 1. create semaphore object * 2. register notify callback * 3. wait until remote core has also registered notify callback * 4. create local & shared resources * 5. send resource ready event * 6. wait for remote resource ready event * 7. open remote resources * 8. handshake the ready event */ Int Server_setup(Void) { Int status; UInt32 event; Semaphore_Params semParams; RcmServer_Params rcmServerP; Log_print0(Diags_ENTRY | Diags_INFO, "--> Server_setup:"); /* * 1. create semaphore object */ Semaphore_Params_init(&semParams); semParams.mode = Semaphore_Mode_COUNTING; Semaphore_construct(&Module.semS, 0, &semParams); Module.semH = Semaphore_handle(&Module.semS); /* * 2. register notify callback */ status = Notify_registerEventSingle(Module.hostProcId, Module.lineId, Module.eventId, Server_notifyCB, (UArg)&Module); if (status < 0) { goto leave; } /* * 3. wait until remote core has also registered notify callback */ do { status = Notify_sendEvent(Module.hostProcId, Module.lineId, Module.eventId, App_CMD_NOP, TRUE); if (status == Notify_E_EVTNOTREGISTERED) { Task_sleep(200); /* ticks */ } } while (status == Notify_E_EVTNOTREGISTERED); if (status < 0) { goto leave; } /* * 4. create local & shared resources (to be opened by remote processor) */ /* * 5. send resource ready event */ status = Notify_sendEvent(Module.hostProcId, Module.lineId, Module.eventId, App_CMD_RESRDY, TRUE); if (status < 0) { goto leave; } /* * 6. wait for remote resource ready event */ do { event = Server_waitForEvent(); if (event >= App_E_FAILURE) { status = -1; goto leave; } } while (event != App_CMD_RESRDY); /* * 7. open remote resources */ /* open the rcm heap */ status = HeapBufMP_open(Global_RcmClientHeapName, &Module.heapH); if (status < 0) { Log_error1("Server_setup: HeapBufMP_open() returned error %d", (IArg)status); goto leave; } /* register the rcm heap with MessageQ */ status = MessageQ_registerHeap((Ptr)(Module.heapH), Global_RcmClientHeapId); if (status < 0) { Log_error1("Server_setup: MessageQ_restierHeap() returned error %d", (IArg)status); goto leave; } /* initialize RcmServer create params */ RcmServer_Params_init(&rcmServerP); rcmServerP.fxns.length = Server_fxnTab.length; rcmServerP.fxns.elem = Server_fxnTab.elem; /* create the RcmServer instance */ status = RcmServer_create(Global_RcmServerName, &rcmServerP, &Module.rcmServerH); if (status < 0) { Log_error1("Server_setup: RcmServer_create() returned error %d", (IArg)status); goto leave; } /* start the server */ RcmServer_start(Module.rcmServerH); /* * 8. handshake the ready event */ status = Notify_sendEvent(Module.hostProcId, Module.lineId, Module.eventId, App_CMD_READY, TRUE); if (status < 0) { goto leave; } do { event = Server_waitForEvent(); if (event >= App_E_FAILURE) { status = -1; goto leave; } } while (event != App_CMD_READY); leave: Log_print1(Diags_EXIT, "<-- Server_setup: %d", (IArg)status); return(status); }