void example_uvc(void) { /*init payload queue*/ INIT_LIST_HEAD(&payload_queue.wait_queue); INIT_LIST_HEAD(&payload_queue.done_queue); RtlMutexInit(&payload_queue.wait_mutex); RtlMutexInit(&payload_queue.done_mutex); RtlInitSema(&payload_queue.wait_sema, 0); RtlInitSema(&payload_queue.done_sema, 0); payload_queue.flush_err = 0; uvc_stream_init(); }
/****************************************************************************** * Function: RtlMBoxIdToHdl * Desc: Map a mailbox ID to the mailbox pointer. * Para: * MBoxId: The Mailbox ID * Return: The pointer of the mailbox. If didn't found match mailbox, * return NULL. * ******************************************************************************/ static PRTL_MAILBOX RtlMBoxIdToHdl( IN u8 MBoxId ) { RTL_MAILBOX *pMbox=NULL; RTL_MAILBOX *pTmpMbox; _LIST *pHead; _LIST *pList; // if the Mailbox root entry initialed ? if not, initial it if (!MBox_Entry.isInitialed) { RtlMutexInit(&MBox_Entry.Mutex); // Init the Mutex for the mailbox add/delete procedure protection RtlInitListhead(&MBox_Entry.mbox_list); // Init the link list head to chain all created mailbox MBox_Entry.isInitialed = 1; MSG_MBOX_INFO("MBox Entry Initial...\n"); } pHead = &MBox_Entry.mbox_list; RtlDownMutex(&MBox_Entry.Mutex); pList = RtlListGetNext(&MBox_Entry.mbox_list); while (pList != pHead) { pTmpMbox = CONTAINER_OF(pList, RTL_MAILBOX, mbox_list); if (MBoxId == pTmpMbox->mbox_id) { pMbox = pTmpMbox; break; } pList = RtlListGetNext(pList); } RtlUpMutex(&MBox_Entry.Mutex); return pMbox; }
/****************************************************************************** * Function: RtlMailboxCreate * Desc: To create a mailbox with a given mailbox ID and size * Para: * MboxID: A number to identify this created mailbox. A message block can * be send to a mailbox by a given MboxID. The MboxID must be unique * in the whole system. If this MboxID is conflict with a created * mailbox, the mailbox creation will fail and return NULL. * MboxSize: The size of this mailbox to be created. It means maximum number * of message blocks can be stored in this mailbox. * pWakeSema: The semaphore to wake up the receiving task to receive the new * message. If the receiving task doesn't need a semaphore to wakeup * it, then just let this pointer is NULL. * Return: The created mailbox pointer. If it failed, return NULL. ******************************************************************************/ PRTL_MAILBOX RtlMailboxCreate( IN u8 MboxID, IN u32 MboxSize, IN _Sema *pWakeSema ) { PRTL_MAILBOX pMBox=NULL; // if the Mailbox root entry initialed ? if not, initial it if (!MBox_Entry.isInitialed) { RtlMutexInit(&MBox_Entry.Mutex); // Init the Mutex for the mailbox add/delete procedure protection RtlInitListhead(&MBox_Entry.mbox_list); // Init the link list head to chain all created mailbox MBox_Entry.isInitialed = 1; MSG_MBOX_INFO("MBox Entry Initial...\n"); } // check if this mailbox ID is ocupied ? pMBox = RtlMBoxIdToHdl(MboxID); if (NULL != pMBox) { MSG_MBOX_ERR("RtlMailboxCreate: The Mailbox ID %d is used by someone!!\n", MboxID); return NULL; } pMBox = (RTL_MAILBOX *)RtlZmalloc(sizeof(RTL_MAILBOX)); if (NULL==pMBox) { MSG_MBOX_ERR("RtlMailboxCreate: MAlloc Failed\n"); return NULL; } RtlInitListhead(&pMBox->mbox_list); // Init the link list to be chained into the created mailbox list pMBox->mbox_id = MboxID; pMBox->pWakeSema = pWakeSema; #ifdef PLATFORM_FREERTOS pMBox->mbox_hdl = xQueueCreate(MboxSize, sizeof(MSG_BLK)); if (NULL == pMBox->mbox_hdl) { MSG_MBOX_ERR("RtlMailboxCreate: xQueueCreate Failed\n"); RtlMfree((void *)pMBox, sizeof(RTL_MAILBOX)); return NULL; } #endif #ifdef PLATFORM_ECOS // TODO: Create mailbox #endif // Add this mailbox to the link list of created mailbox RtlDownMutex(&MBox_Entry.Mutex); RtlListInsertTail(&pMBox->mbox_list, &MBox_Entry.mbox_list); RtlUpMutex(&MBox_Entry.Mutex); MSG_MBOX_INFO("A Mailbox Created: Size=%d\n", MboxSize); return pMBox; }