/** ============================================================================ * @func SWIRGB2YCBCR_DSP_create * * @desc Create phase of SWISWIRGB2YCBCR_DSP application. It allocates * SWISWIRGB2YCBCR_DSP_TransferInfo structure and intializes it with configured * values. * * @modif None. * ============================================================================ */ Int SWIRGB2YCBCR_DSP_create (SWIRGB2YCBCR_DSP_TransferInfo ** infoPtr) { Int status = SYS_OK ; SWI_Attrs swiAttrs = SWI_ATTRS ; SWIRGB2YCBCR_DSP_TransferInfo * info; #if defined (DSP_BOOTMODE_NOBOOT) POOL_Obj poolObj ; { while (DSPLINK_initFlag != 0xC0C0BABA) ; } /* Initialize DSP/BIOS LINK. */ DSPLINK_init () ; smaPoolObj.poolId = 0; smaPoolObj.exactMatchReq = TRUE ; poolObj.initFxn = SMAPOOL_init ; poolObj.fxns = (POOL_Fxns *) &SMAPOOL_FXNS ; poolObj.params = &(smaPoolObj) ; poolObj.object = NULL ; status = POOL_open (0, &poolObj) ; /* Create IOM driver dynamically */ status = DEV_createDevice("/dsplink", &ZCPYDATA_FXNS, (Fxn) &ZCPYDATA_init, &devAttrs) ; /* Create DIO adapter dynamically */ status = DEV_createDevice("/dio_dsplink", &DIO_tskDynamicFxns, NULL, &dioDevAttrs); #endif /* Allocate SWIRGB2YCBCR_DSP_TransferInfo structure */ *infoPtr = MEM_calloc (DSPLINK_SEGID, sizeof (SWIRGB2YCBCR_DSP_TransferInfo), DSPLINK_BUF_ALIGN) ; if (*infoPtr == NULL) { status = SYS_EALLOC ; SET_FAILURE_REASON (status) ; } else { info = *infoPtr ; } /* Initialize SWIRGB2YCBCR_DSP_TransferInfo structure */ if (status == SYS_OK) { info->bufferSize = xferBufSize ; (info->appReadCb).fxn = readFinishCb ; (info->appReadCb).arg = (Ptr) info ; (info->appWriteCb).fxn = writeFinishCb ; (info->appWriteCb).arg = (Ptr) info ; } /* Create channel handles */ if (status == SYS_OK) { GIO_Attrs gioAttrs = GIO_ATTRS ; info->gioInputChan = GIO_create (INPUT_CHANNEL, IOM_INPUT, NULL, NULL, &gioAttrs) ; info->gioOutputChan = GIO_create (OUTPUT_CHANNEL, IOM_OUTPUT, NULL, NULL, &gioAttrs) ; if ( (info->gioInputChan == NULL) || (info->gioOutputChan == NULL)) { status = SYS_EALLOC ; SET_FAILURE_REASON (status) ; } } /* Create SWI for sending and receiving data */ if (status == SYS_OK) { swiAttrs.fxn = rgb2ycbcr_dspSWI ; swiAttrs.arg0 = (Arg) info ; swiAttrs.mailbox = INITIAL_MAILBOX_VAL ; info->swi = SWI_create (&swiAttrs) ; if (info->swi == NULL) { status = SYS_EALLOC ; SET_FAILURE_REASON (status) ; } } /* Allocate input and output buffers */ if (status == SYS_OK) { status = POOL_alloc (SAMPLE_POOL_ID, (Ptr *) &(info->inputBuffer), info->bufferSize) ; if (status == SYS_OK) { status = POOL_alloc (SAMPLE_POOL_ID, (Ptr *) &(info->outputBuffer), info->bufferSize) ; if (status != SYS_OK) { SET_FAILURE_REASON (status) ; } } else { SET_FAILURE_REASON (status) ; } } return status ; }
/** ============================================================================ * @func pool_notify_Create * * @desc This function allocates and initializes resources used by * this application. * * @modif None * ============================================================================ */ NORMAL_API DSP_STATUS pool_notify_Create (IN Char8 * dspExecutable, IN Char8 * strBufferSize, IN Uint8 processorId) { DSP_STATUS status = DSP_SOK ; Uint32 numArgs = NUM_ARGS ; Void * dspDataBuf = NULL ; Uint32 numBufs [NUM_BUF_SIZES] = {NUM_BUF_POOL0, } ; Uint32 size [NUM_BUF_SIZES] ; SMAPOOL_Attrs poolAttrs ; Char8 * args [NUM_ARGS] ; #ifdef DEBUG printf ("Entered pool_notify_Create ()\n") ; #endif sem_init(&sem,0,0); /* * Create and initialize the proc object. */ status = PROC_setup (NULL) ; /* * Attach the Dsp with which the transfers have to be done. */ if (DSP_SUCCEEDED (status)) { status = PROC_attach (processorId, NULL) ; if (DSP_FAILED (status)) { printf ("PROC_attach () failed. Status = [0x%x]\n", (int)status) ; } } else { printf ("PROC_setup () failed. Status = [0x%x]\n", (int)status) ; } /* * Open the pool. */ if (DSP_SUCCEEDED (status)) { size [0] = pool_notify_BufferSize ; poolAttrs.bufSizes = (Uint32 *) &size ; poolAttrs.numBuffers = (Uint32 *) &numBufs ; poolAttrs.numBufPools = NUM_BUF_SIZES ; poolAttrs.exactMatchReq = TRUE ; status = POOL_open (POOL_makePoolId(processorId, SAMPLE_POOL_ID), &poolAttrs) ; if (DSP_FAILED (status)) { printf ("POOL_open () failed. Status = [0x%x]\n", (int)status) ; } } /* * Allocate the data buffer to be used for the application. */ if (DSP_SUCCEEDED (status)) { status = POOL_alloc (POOL_makePoolId(processorId, SAMPLE_POOL_ID), (Void **) &pool_notify_DataBuf, pool_notify_BufferSize) ; /* Get the translated DSP address to be sent to the DSP. */ if (DSP_SUCCEEDED (status)) { status = POOL_translateAddr ( POOL_makePoolId(processorId, SAMPLE_POOL_ID), &dspDataBuf, AddrType_Dsp, (Void *) pool_notify_DataBuf, AddrType_Usr) ; if (DSP_FAILED (status)) { printf ("POOL_translateAddr () DataBuf failed." " Status = [0x%x]\n", (int)status) ; } } else { printf ("POOL_alloc () DataBuf failed. Status = [0x%x]\n", (int)status) ; } } /* * Register for notification that the DSP-side application setup is * complete. */ if (DSP_SUCCEEDED (status)) { status = NOTIFY_register (processorId, pool_notify_IPS_ID, pool_notify_IPS_EVENTNO, (FnNotifyCbck) pool_notify_Notify, 0/* vladms XFER_SemPtr*/) ; if (DSP_FAILED (status)) { printf ("NOTIFY_register () failed Status = [0x%x]\n", (int)status) ; } } /* * Load the executable on the DSP. */ if (DSP_SUCCEEDED (status)) { args [0] = strBufferSize ; { status = PROC_load (processorId, dspExecutable, numArgs, args) ; } if (DSP_FAILED (status)) { printf ("PROC_load () failed. Status = [0x%x]\n", (int)status) ; } } /* * Start execution on DSP. */ if (DSP_SUCCEEDED (status)) { status = PROC_start (processorId) ; if (DSP_FAILED (status)) { printf ("PROC_start () failed. Status = [0x%x]\n", (int)status) ; } } /* * Wait for the DSP-side application to indicate that it has completed its * setup. The DSP-side application sends notification of the IPS event * when it is ready to proceed with further execution of the application. */ if (DSP_SUCCEEDED (status)) { // wait for initialization sem_wait(&sem); } /* * Send notifications to the DSP with information about the address of the * control structure and data buffer to be used by the application. * */ status = NOTIFY_notify (processorId, pool_notify_IPS_ID, pool_notify_IPS_EVENTNO, (Uint32) dspDataBuf); if (DSP_FAILED (status)) { printf ("NOTIFY_notify () DataBuf failed." " Status = [0x%x]\n", (int)status) ; } status = NOTIFY_notify (processorId, pool_notify_IPS_ID, pool_notify_IPS_EVENTNO, (Uint32) pool_notify_BufferSize); if (DSP_FAILED (status)) { printf ("NOTIFY_notify () DataBuf failed." " Status = [0x%x]\n", (int)status) ; } #ifdef DEBUG printf ("Leaving pool_notify_Create ()\n") ; #endif return status ; }