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