FVID驅動模型

來源:互聯網
上載者:User

FVID驅動模型

TI公司最初設計的GIO 模型存在缺陷的,主要在資料緩衝區管理的問題上,應用程式在取得裝置驅動程式的緩衝區進行資料處理之後,無法將緩衝區返回裝置驅動程式。於是TI公司在推出DM642這一款主要用於視頻處理的DSP晶片的同時,對GIO模型進行了改進,提出了專門針對視頻裝置的FVID模型。

FVID模型是建立在GIO模型之上的,以FVID_alloc()、FVID_exchange()、FVID_free()函數對GIO模型中的GIO_submit()函數進行封裝,解決了GIO模型中驅動程式不能回收緩衝區的問題。

此外FVID模型還專門設計了FVID_frame結構。此結構中包含了常用的視頻訊號的資訊,如行數、列數、YUV結構、場頻等,很適合描述視頻資料幀,為視頻場合設計的FVID模型主要是針對DM64X 系統設計的.

迷你驅動各個函數的具體實現如下:

① mdBindDev()函數。在應用程式建立裝置介面(如FVID_create()函數)時被調用以實施裝置邦定,完成對外部裝置的初始化。而與其對應的是mdUBindDev()函數,使用mdUBindDev()函數會使裝置處於無效狀態,不能再使用。

② mdCreateChan()函數。使用此函數為應用程式和驅動程式建立通訊通道,同時為每個通道申請緩衝區。在TI公司發布的FVID模型中,為每個通道都分配了3個緩衝區,輪流與外部裝置交換資料,每個緩衝區對應1幀視頻資料。與mdCreateChan()對應的是md_DeleteChan()函數,用於刪除裝置通道,釋放緩衝區資源。

③ mdSubmitChan()函數。負責管理緩衝區,分別接受應用程式發出的FVID_ALLOC()、FVID_EXCHANGE()、FVID_FREE()三個命令並進行處理。其中FVID_ALLOC命令擷取驅動程式中的緩衝區,應用程式從三個緩衝區中取出最新的一幀視頻資料,對其中的資料做處理,而只剩下的緩衝區用來接受外部裝置輸入的資料。FVID_EXCHANGE()將使用完的緩衝區與驅動程式的最新資料緩衝區交換,應用程式處理完1幀資料,將這1幀資料返回驅動程式,再讀入新的1幀資料進行處理。FVID_FREE()將使用完的緩衝區重新返回給驅動程式,應用程式將處理完的資料幀返回驅動程式,而不再向驅動程式申請新的資料幀。

④ mdControlChan()函數。用來操作外部視頻裝置,完成對視頻資料的採集和輸出。應用程式通過FVID_Control()函數將命令傳遞給GIO_Control()函數,然後再GIO_Control()傳遞給mdControlChan()函數,最後將命令分發到指定的裝置。

FVID 函數:

1.FVID_create()作用:是分配並初始化FVID通道對象;

文法:fvidChan = FVID_create (name, mode, *status, optArgs, *attrs);

參數定義:

String name            /* handle to an instance of the device */

Int mode               /* pointer to buffer allocated by driver */

Int *status            /* pointer to size of buffer pointed to by */

Ptr optArgs            /* */

FVID_Attrs *attrs      /* */

其中:

name是裝置執行個體的控制代碼,是一個字串mode 是選擇的模式,只有兩個值:IOM_INPUT 設定採集模式,IOM_OUTPUT設定顯示模式。

status是由下層mini driver返回的狀態值。

attrs 是指向FVID_Attrs結構的指標:

FVID_Attrs的定義如下:

typedef struct FVID_Attrs {

                          Uns timeout;

                           } FVID_Attrs;

timeout成員用來指定旗語同步,它的值可以是:

SYS_FOREVER:會讓FVID_alloc, FVID_free and FVID_exchange的調用不確定的等待到這個調用完成.

數位timeout值會讓這些APIs阻塞一段指定的時間(以系統時鐘). 0值會讓APIs不阻塞,他們會立刻返回,這種情況下,應用程式會檢查返回的status值來保證調用已經成功完成.

備忘:FVID_alloc, FVID_free 和 FVID_exchange 的調用只能在 DSP/BIOS task (TSK).

FVID_create的傳回值:

如果通道成功的開啟了,那麼FVID_create返回一個指向通道的控制代碼.這個控制代碼可以用來讓後來的模組調用這個通道.

實列:

/* Initialize the attributes */

FVID_ATTRS dispAttrs = FVID_ATTRS;

/* Create an instance to a video display device */ chan-

Handle = FVID_create(“\display0”, IOM_INPUT, NULL, NULL,&dispAttrs);

2.FVID_control()作用是:發送一個控制命令給下層的mini_driver

文法: status = FVID_control (fvidChan, cmd, args);

參數定義:

   FVID_Handle fvidChan    /* handle to an instance of the device */

      Int cmd                 /* control command */

      Ptr args                /* pointer to control command arguments */

      Return Value Int status /* returns IOM_COMPLETED if successful */

參數說明:

    fvidChan 是FVID_create()建立的指向通道的控制代碼。

    cmd有兩個值:IOM_ABORT----作用是中止所以的未定的I/O工作。

                     IOM_FLUSH----作用是所以採集口的工作被丟棄,所以顯示I/O的工作正常進行。

    Args 是要傳遞的命令(參數或者結構體)的指標。

    傳回值:如果調用成功,FVID_control返回IOM_COMPLETED .如果有錯誤產生,這個調用會返回一個負值。

執行個體:

/* abort all pending video driver I/O jobs */

FVID_control(fvidChan, IOM_ABORT, NULL);

3.FVID-alloc()作用:申請獲得驅動程式緩衝單元。

文法:status = FVID_alloc (fvidChan, bufp);

參數定義:

       FVID_Handle fvidChan /* handle to an instance of the device */

       Ptr bufp /* pointer to buffer allocated by driver */

       Return Value Int status /* returns IOM_COMPLETED if successful */

參數說明:

       fvidChan 是FVID_create()建立的指向通道的控制代碼。

       bufp 是輸出參數,指向所申請的驅動緩衝空間的指標。

       傳回值:如果調用成功,FVID_alloc()返回IOM_COMPLETED,如果有錯誤產生,這個調用會返回一個負值。

       備忘:這個函數只能是在外設已經載入和初始化之後才能調用。其中的控制代碼應該由FVID_create()函數提供。

       執行個體:

/* allocate a buffer from the device */

status = FVID_alloc(chanHandle, dispBuf);

4.FVID_exchange()作用:交換應用程式和驅動程式緩衝空間,實際作用相當於FVID_free()和FVID_alloc()函數的組合。

文法: status = FVID_exchange (fvidChan, bufp);

參數定義:

      FVID_Handle fvidChan /* handle to an instance of the device */

      Ptr bufp /* pointer to buffer exchanged by driver */

      LgUns *pSize /* pointer to size of buffer pointed to by bufp */

參數說明:

      fvidChan 是FVID_create()建立的指向通道的控制代碼。

      bufp 是輸入輸出參數,剛開始指向的是應用程式需要交換的緩衝空間,交換後,指向與驅動程式進行緩衝空間交換後的記憶體空間。

      pSize 是指向bufp記憶體大小的指標。

傳回值:如果調用成功,FVID_exchange()返回IOM_COMPLETED,如果有錯誤產生,這個調用會返回一個負值。

      備忘:這個函數只能是在外設已經載入和初始化之後才能調用。其中的控制代碼應該由FVID_create()函數提供。

執行個體:

/* allocate a buffer from the device */

status = FVID_exchange(chanHandle, dispBuf);

4.FVID_free()作用:釋放返回應用程式申請的緩衝給驅動程式

文法: status = FVID_free (fvidChan, bufp);

參數定義:

       FVID_Handle fvidChan /* handle to an instance of the device */

       Ptr bufp /* pointer to buffer to be relinquished to driver */

       LgUns *pSize /* pointer to size of buffer pointed to by bufp */

參數說明:

      fvidChan 是FVID_create()建立的指向通道的控制代碼。

      bufp 是輸入參數,指向的是應用程式需要釋放返回的緩衝空間。

      pSize 是指向bufp記憶體大小的指標。

傳回值:如果調用成功,FVID_free()返回IOM_COMPLETED,如果有錯誤產生,這個調用會返回一個負值。

備忘:這個函數只能是在外設已經載入和初始化之後才能調用。其中的控制代碼應該由FVID_create()函數提供。

執行個體:

Example /* free a buffer back to the device */

status = FVID_free(chanHandle, dispBuf);

5.FVID_delete()作用: 申請關閉一個FVID channel 對象。

文法: status = FVID_delete (fvidChan);

參數定義:

       FVID_Handle fvidChan /* handle to an instance of the device */

參說說明:

       fvidChan 是FVID_create()建立的指向通道的控制代碼。

傳回值:如果調用成功,FVID_delete()返回IOM_COMPLETED,如果有錯誤產生,這個調用會返回一個負值。

備忘:這個函數只能是在外設已經載入和初始化之後才能調用。其中的控制代碼應該由FVID_create()函數提供。

執行個體:

Example /* allocate a buffer from the device */

status = FVID_delete(chanHandle);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.