FVID 視頻驅動模塊

TI公司爲開發DSP的外設驅動程序,推出了DSP/BIOS Device Driver KitDDK,定義了標準的設備驅動模型,並提供了一系列的API接口。

外設驅動程序分爲兩層:

類驅動(class driver)。類驅動程序用來爲應用程序提供接口。這部分程序與設備無關,主要功能包括維護設備數據緩衝區,向上提供API接口供應用層程序調用,並協調應用程序對外設操作的同步和阻塞;向下提供適配層與迷你驅動層相連,實現API接口函數到迷你驅動層程序的映射。類驅動程序與硬件無關,只要外設驅動模型選定了,類驅動程序就定下來了,不需要做多少修改。

迷你驅動(mini driver)。迷你驅動程序與設備相關,所以設計迷你驅動程序是外設驅動開發中的重點。迷你驅動程序與類驅動層的接口格式是統一的,但迷你驅動程序對底層硬件的操作是根據硬件平臺的不同而變化的。迷你驅動接收類驅動層發出的IOM_Packet命令包,決定對底層硬件進行什麼樣的操作。

外設驅動程序模型又可以分爲以下3:

①PIP/PIO模型。基於數據管道的I/O模型,每個管道都在維護自己的一個緩衝區。當數據寫入緩衝區,或從緩衝區取出數據時,便會激發notifyReader()notifyWriter()函數實現數據的同步。

②SIO/DIO模型。基於數據流的I/O模型,一個數據流是單向的,要麼是輸入,要麼是輸出,而且SIO/DIO模型使用異步方式來操作I/O,對於數據的讀寫、處理可以同時進行。

③ GIO模型。通用的I/O模型,靈活性很強,且沒有適配層,直接操作迷你驅動程序,主要用來設計新型的設備驅動模型。

 

比較PIOSIOGIO

PIO支持更底層的通信,適合設計比較簡單的外設驅動程序。例如在TI公司的6X11DSK板上實現的音頻採集和回放,一般都是基於PIO模型的。而SIO模型具有很好的緩衝器分配回收機制,比較適合描述視頻設備, SIO提供的功能也是相當豐富的,GIO 模型設計的目的就是針對特殊硬件的新型設備,以根據實際的場合和功能使用GIO設備驅動模型。

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 函數:

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);

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);

 

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);

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);

 

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);

 

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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章