dm8148 vpssM3 cameralink 原始碼解析

smilestone322發表於2015-08-05

cameralink 原始碼解析:

 

CameraLink_tskRun 函式中的SYSTEM_CMD_NEW_DATA你是從ISS驅動中傳送的嗎?通知camera link獲取資料;

答覆:ISS驅動中呼叫CameraLink_drvCallback回撥函式,在該回撥函式中通過Utils_tskSendCmd傳送通知;

Int32 CameraLink_drvCallback(FVID2_Handle handle, Ptr appData, Ptr reserved)
{
    CameraLink_Obj *pObj = (CameraLink_Obj *) appData;

    Utils_tskSendCmd(&pObj->tsk, SYSTEM_CMD_NEW_DATA);
    pObj->cbCount++;

    return FVID2_SOK;
}



2)CameraLink_drvCallback 在哪個地方設定的呢?
答覆:在CameraLink_drvCreateInst函式設定給     FVID2_CbParams cbPrm;

    if (instId == 0)
        pInst->cbPrm.cbFxn = CameraLink_drvCallback;

其中:    CameraLink_InstObj *pInst;

CameraLink_drvCreateInst函式被CameraLink_drvCreate函式呼叫;而CameraLink_drvCreate在CameraLink_tskMain函式中呼叫;

即:CameraLink_tskMain-->CameraLink_drvCreate->CameraLink_drvCreateInst->CameraLink_drvCallback;

在Int32 CameraLink_drvCreateInst(CameraLink_Obj * pObj, UInt16 instId)函式中呼叫了
    pInst->cameraVipHandle = FVID2_create(FVID2_ISS_CAPT_DRV,
                                          pInst->instId,
                                          pVipCreateArgs,
                                          &pInst->createStatus, &pInst->cbPrm);
建立ISS的驅動;在FVID2_create中將回撥函式,Iss需要的引數    Iss_CaptCreateParams *pVipCreateArgs;傳遞到ISS驅動中;
這樣ISS中有資料時,就可以呼叫camera link的回撥函式,通知camera link 接收資料;

3)camera link 中的SYSTEM_CMD_START命令是在什麼時候收到的呢;
答覆:在link建立的流程中呼叫System_linkStart,link建立流程在A8上建立;

Int32 System_linkStart(UInt32 linkId)
{
    return System_linkControl(linkId, SYSTEM_CMD_START, NULL, 0, TRUE);
}


4)camera link什麼時候通知 Iss 可以接收驅動的資料了呢;
答覆:是通過FVID2_start函式通知ISS的,在A8 link的建立流程中呼叫System_linkStart時,通知ISS可以接收驅動的資料了;
在camera link 收到SYSTEM_CMD_START訊號後,呼叫        status = CameraLink_drvStart(pObj); 在函式中呼叫FVID2_start告訴ISS可以接收資料了;

 

5)camra link 如何接收ISS驅動傳遞過來的資料;
答覆:camera link 通過FVID2_dequeue函式從佇列中獲取幀資料,通過FVID2_queue歸還驅動的buff;
在camera link 中收到SYSTEM_CMD_NEW_DATA 命令後,呼叫     status = CameraLink_drvProcessData(pObj);
從佇列中獲取資料,在CameraLink_drvProcessData 中呼叫FVID2_dequeue 從Iss 佇列中獲取資料; 在該函式往下一個link傳送SYSTEM_CMD_NEW_DATA;
通知下一個link獲取資料;

通過CameraLink_drvPutEmptyFrames 呼叫FVID2_queue歸還給驅動buff

Int32 CameraLink_putEmptyFrames(Utils_TskHndl * pTsk, UInt16 queId,
                                FVID2_FrameList * pFrameList)
{
    CameraLink_Obj *pObj = (CameraLink_Obj *) pTsk->appData;

    UTILS_assert(queId < CAMERA_LINK_MAX_OUT_QUE);

    return CameraLink_drvPutEmptyFrames(pObj, pFrameList);
}

在CameraLink_init中呼叫;
    linkObj.linkPutEmptyFrames = CameraLink_putEmptyFrames;


6)在雙碼流的情況下,不同解析度的碼流是在什麼地方獲取的,從ISS驅動中出來的碼流是原始解析度的,在camera link中做了scale操作嗎?

iss 驅動只傳遞原始解析度的影象,跟蹤到Iss驅動的程式碼,看ISS驅動是傳遞一個原始解析度給camera link嗎? 在iss的驅動檔案issdrv_captureApi.c 發現只傳遞原始解析度;
camealink 支援傳遞不同解析度的碼流到nextlink0,nextlink1;

7)camera link 通過FVID2_control設定引數;

8)在A8 建立link流程時,呼叫system_linkCreate,將引數傳遞到camralink;
Int32 CameraLink_drvCreate(CameraLink_Obj * pObj,CameraLink_CreateParams * pPrm)


9)camera link實現往2個nextlink傳遞不同解析度的碼流,呼叫碼流複製模組和影象縮放模組嗎,在哪個地方呼叫的?
獲取2路碼流,不用呼叫dup模組,cameralink本身能夠實現;

10)cameralink 如何分配記憶體;
            if (CameraLink_drvIsDataFormatTiled(&pDrvObj->createArgs, streamId))
            {
                Utils_tilerFrameAlloc(&format, frames,
                                      gCameraLink_framesPerChannel);
            }
            else
            {
                Utils_memFrameAlloc_capture(&format, frames,
                                            gCameraLink_framesPerChannel,
                                            Blanking_Data_Size, BoxCarDataSize);
            }

相關文章