DSP/BIOS下mini驅動介面概述
做嵌入式開發的同學們應該都知道,在DSP處理器領域中TI公司佔有絕大多數的市場。TI的DSP基本上就是DSP處理器的代名詞。作為一個DSP開發者,不僅對DSP獨特的硬體介面要有所瞭解,而且要對DSP/BIOS下的mini驅動介面的編寫知道一二。因為雖然作為RTOS的一份子,DSP/BIOS可以直接對暫存器地址進行讀寫訪問,但是現今DSP程式開發無論從量還是複雜度上都並非原來微控制器開發模式可比。一個工程下往往需要若干名驅動工程師,應用工程師以及演算法工程師協同工作才可完成。這就衍生出如果驅動工程師和應用工程師沒有一個固定的介面標準,則勢必會對程式間協作以及日後維護造成不小的困擾。在此背景下mini驅動介面孕育而生。
1, CapChanA = FVID_create("/vp_driver/A", IOM_INPUT, &status, (Ptr)&VP_ChanA_para, NULL);
FVID驅動的應用呼叫是GIO的上層封裝,依靠這個函式使GIO的類驅動與底層tcf所指定的mini驅動繫結。
vp_driver,被tcf檔案所指定
圖形配置:
程式碼配置:
bios.vp_driver.fxnTable = prog.extern("VPORTCAP_Fxns");
bios.vp_driver.fxnTableType = "IOM_Fxns";
bios.vp_driver.deviceId = 0x2;
bios.vp_driver.params = prog.extern("vp_para");
而VPORTCAP_Fxns函式結構就是mini驅動中的IOM_Fxns結構
vp_para按照.h中的說明
/******************************************************************************
* Binding of external device control function tables to the video port *
* is done when _mdBindDev() is called at system initialization time. *
* A statically defined EDC function table is passed to the _mdBindDev() *
* function via the "devParam" argument. This argument must point to a *
* type of data structure that is defined below *
*****************************************************************************/
在_mdBindDev()被呼叫的時候,引數就會被傳入。
IOM_Fxns 函式列表
功能
一個迷你驅動應當實現以下功能:
mdBindDev:將裝置繫結至迷你驅動。
mdControlChan:執行訊號控制命令。
mdCreateChan:建立裝置通道。
mdDeleteChan:刪除一個通道。
mdSubmitChan:提交資料包至通道處理。
mdUnBindDev:將裝置從迷你驅動解綁。
描述
迷你驅動包含指定裝置驅動的一部分。一旦為迷你驅動建立指定的函式,應用整合商可以很容易地通過GIO通道使用你的迷你驅動。
以下小節詳細描述如何實現迷你驅動函式。一旦實現,這些函式通過一個IOM_Fxns型別介面表引用,應用程式將參考整合迷你驅動。例如:
IOM_Fxns UART_FXNS = { mdBindDev, IOM_UNBINDDEVNOTIMPL, mdControlChan, mdCreateChan, mdDeleteChan, mdSubmitChan }; |
注意:任意你選擇不實現的迷你函式都應該以IOM_xxxNOTIMPL為名稱加入迷你函式表,xxx對應函式名稱。另外,你也可以實現一個返回IOM_ENOTIMPL狀態的函式。
常量、型別和結構
以下程式碼可在 <bios_install_dir>/packages/ti/sysbios/io/IOM.h .中找到:
/* Modes for mdCreateChan */ #define IOM_INPUT 0x0001 #define IOM_OUTPUT 0x0002 #define IOM_INOUT (IOM_INPUT | IOM_OUTPUT) /* IOM Status Codes */ #define IOM_COMPLETED 0 /* I/O successful */ #define IOM_PENDING 1 /* I/O queued and pending */ #define IOM_FLUSHED 2 /* I/O request flushed */ #define IOM_ABORTED 3 /* I/O aborted */ /* IOM Error Codes */ #define IOM_EBADIO -1 /* generic failure */ #define IOM_ETIMEOUT -2 /* timeout occurred */ #define IOM_ENOPACKETS -3 /* no packets available */ #define IOM_EFREE -4 /* unable to free resources */ #define IOM_EALLOC -5 /* unable to alloc resource */ #define IOM_EABORT -6 /* I/O aborted uncompleted*/ #define IOM_EBADMODE -7 /* illegal device mode */ #define IOM_EOF -8 /* end-of-file encountered */ #define IOM_ENOTIMPL -9 /* operation not supported */ #define IOM_EBADARGS -10 /* illegal arguments used */ #define IOM_ETIMEOUTUNREC -11 /* unrecoverable timeout */ #define IOM_EINUSE -12 /* device already in use */ /* Command codes for IOM_Packet */ #define IOM_READ 0 #define IOM_WRITE 1 #define IOM_ABORT 2 #define IOM_FLUSH 3 #define IOM_USER 128 /* 0-127 reserved for system */ /* Command codes for GIO_control and mdControlChan */ #define IOM_CHAN_RESET 0 /* reset channel only */ #define IOM_CHAN_TIMEDOUT 1 /* channel timeout occurred */ #define IOM_DEVICE_RESET 2 /* reset entire device */ typedef struct IOM_Fxns { IOM_TmdBindDev mdBindDev; IOM_TmdUnBindDev mdUnBindDev; IOM_TmdControlChan mdControlChan; IOM_TmdCreateChan mdCreateChan; IOM_TmdDeleteChan mdDeleteChan; IOM_TmdSubmitChan mdSubmitChan; } IOM_Fxns; #define IOM_BINDDEVNOTIMPL (IOM_TmdBindDev)IOM_mdNotImpl #define IOM_UNBINDDEVNOTIMPL (IOM_TmdUnBindDev)IOM_mdNotImpl #define IOM_CONTROLCHANNOTIMPL (IOM_TmdControlChan)IOM_mdNotImpl #define IOM_CREATECHANNOTIMPL (IOM_TmdCreateChan)IOM_mdNotImpl #define IOM_DELETECHANNOTIMPL (IOM_TmdDeleteChan)IOM_mdNotImpl #define IOM_SUBMITCHANNOTIMPL (IOM_TmdSubmitChan)IOM_mdNotImpl typedef struct IOM_Packet /* frame object */ { Queue_Elem link; /* queue link */ Ptr addr; /* buffer address */ SizeT size; /* buffer size */ UArg arg; /* user argument */ UInt cmd; /* mini-driver command */ Int status; /* status of command */ UArg misc; /* reserved for driver */ } IOM_Packet; /* Mini-driver's callback function. */ Void (*IOM_TiomCallback)(Ptr arg, IOM_Packet *packet); |
mdBindDev 將裝置繫結至迷你驅動
C 介面
語法
status = mdBindDev(*devp, devid, devParams);
引數
Ptr *devp; /*address for global device data pointer*/
Int devid; /* device id */
Ptr devParams; /* pointer to config parameters */
返回值
Int status; /* success or failure code */
描述
mdBindDev函式由SYS/BIOS在裝置初始化期間呼叫。每個配置裝置呼叫它一次,並且是在迷你驅動初始化函式之後呼叫。
此函式通常使用指定裝置全域性資料,如中斷IDs和全域性資料結構(ROM-ability的)。另外系統資源可通過迷你驅動在執行時分配。
devp引數是指向函式存放全域性裝置資料指標的地址。
devid引數用於確定具有特定型別的多個裝置的系統中的具體裝置。例如,幾個McBSP迷你驅動程式使用devid引數指定分配和配置的McBSP埠。
devParams引數是用於配置裝置的配置引數的指標。
此函式成功執行將返回IOM_COMPLETED。如果失敗,它將返回F.1節迷你驅動介面概覽所羅列的負數的錯誤編號。如果此函式返回一個錯誤編號,SYS/BIOS初始化失敗,呼叫System_abort()。
mdControlChan 執行通道控制命令
C介面
語法
status = mdControlChan (chanp, cmd, arg);
引數
Ptr chanp; /* channel handle */
UInt cmd; /* control functionality to perform */
Ptr arg; /* optional device-defined data structure */
返回值
Int status; /* success or failure code */
描述
一個類驅動呼叫此函式會使得迷你驅動執行某種型別的控制功能。例如,它可使迷你驅動重啟裝置或獲取裝置狀態。呼叫GIO_control導致相應迷你驅動的mdControlChan函式執行。
chanp引數指示標識裝置例項的通道控制代碼。
cmd引數指示實施哪個控制功能。
/* Command codes for GIO_control and mdControlChan */ #define IOM_CHAN_RESET 0 /* reset channel only */ #define IOM_CHAN_TIMEDOUT 1 /* channel timeout occurred */ #define IOM_DEVICE_RESET 2 /* reset entire device */ |
arg引數是可選引數,是用於在裝置和應用間傳遞控制資訊的裝置定義資料結構。
如果成功,此函式返回IOM_COMPLETED。如果不支援提供cmd值,此函式將返回一個IOM_EMOTIMPL狀態。
mdCreateChan 建立一個裝置通道
C介面
語法
status = mdCreateChan (*chanp, devp, name, mode, chanParams, cbFxn, cbArg);
引數
Ptr *chanp; /* channel handle */
Ptr devp; /* device global data structure */
String name /* name of device instance */
Int mode /* input or output mode */
Ptr chanParams /*pointer to channel parameters */
IOM_TiomCallback cbFxn /* pointer to callback function */
Ptr cbArg /* callback function argument */
返回值
Int status; /* success or failure code */
描述
類驅動呼叫此函式來建立一個通道例項。呼叫GIO_create導致相應迷你驅動的mdCreateChan函式執行。
chanp引數提供
chanp引數指向此函式儲存標識裝置例項通道控制代碼的地址。通道控制代碼是指定裝置資料結構指標。見243頁的“mdBindDev”檢視例項。
devp引數是指向裝置全域性資料結構的指標。它是由迷你驅動呼叫mdBindDev所返回的值。
name引數是裝置例項名稱。這是從SYS/BIOS裝置驅動表獲取一個完整匹配後剩餘的裝置名稱。例如,它可能包含通道引數。
mdoe引數指示裝置是以輸入還是輸出模式開啟,或兩者皆有。模式值可為IOM_INPUT、IOM_OUTPUT或IOM_INOUT。如果你的裝置不支援一個或多個模式,此函式將返回IOM_EBADMODE以表示不支援模式。
chanParams引數用於向迷你驅動傳遞裝置或域特定引數。
cbFxn引數是指向回撥函式的函式指標,當完成一個請求時,迷你驅動呼叫此函式。
cbArg引數在迷你驅動呼叫回撥函式時傳遞引數用。
通常,mdCreateChan函式將回調函式及它的引數放置在裝置特定資料結構,如:
chan->cbFxn = cbFxn; chan->cbArg = cbArg; |
如果成功,此函式將返回IOM_COMPLETED。如果失敗此函式返回一個負數錯誤編碼列表裡的值。
mdDeleteChan 刪除一個通道
C介面
語法
status = mdDeleteChan (chanp)
引數
Ptr chanp; /* channel handle */
返回值
Int status; /* success or failure code */
描述
類驅動呼叫此函式刪除指定通道例項。呼叫GIO_delete導致相應迷你驅動的mdDeleteChan函式執行。
chanp引數提供標識裝置例項的通道控制代碼。通道控制代碼是指向裝置特定資料結構指標。參考mdBindDev話題裡的例項。
如果成功,此函式返回IOM_COMPLETED。如果不成功,此函式將返回一個F.1節所羅列的負數錯誤編碼。
mdSubmitChan 提交資料包給通道處理
C介面
語法
status = mdSubmitChan (chanp, *packet);
引數
Ptr chanp; /* channel handle */
IOM_Packet *packet; /* pointer to IOM_Packet */
返回值
Int status; /* success or failure code */
描述
類驅動呼叫此函式以使迷你驅動處理IOM_Packet。呼叫 GIO_submit、GIO_read、GIO_write、GIO_abort和GIO_flush使得迷你驅動的mdSubmitChan函式執行。
注意:迷你驅動函式mdSubmitChan必須書寫為可重入的,這樣就可以從多個執行緒上下文呼叫。
chanp引數提供標識裝置例項的通道控制代碼。通道控制代碼是一個裝置特定資料結構指標。見mdBindDev話題裡的例項。
packet引數指向一個IOM_Packet型別結構體。此結構體定義如下:
typedef struct IOM_Packet /* frame object */ { Queue_Elem link; /* queue link */ Ptr addr; /* buffer address */ SizeT size; /* buffer size */ UArg arg; /* user argument */ UInt cmd; /* mini-driver command */ Int status; /* status of command */ UArg misc; /* reserved for driver */ } IOM_Packet; |
cmd值為下列之一:
#define IOM_READ 0 #define IOM_WRITE 1 #define IOM_ABORT 2 #define IOM_FLUSH 3 |
附加的cmd編碼可被新增至域特定命令。這樣的編碼應為大於127的常量。見iom.h檔案查閱這些cmd編碼。
如果cmd編碼是IOM_READ或IOM_WRITE,這些函式將把資料包壓入懸停列表佇列。如果cmd編碼是IOM_ABORT,此函式將中止讀和寫資料包。如果cmd編碼是IOM_FLUSH,此函式將完全排隊寫,但中止排隊讀。
如果此函式成功完成一個讀或寫IOM_Packet請求,它將返回IOM_COMPLETED。如果此函式壓隊一個讀或寫請求,它將返回IOM_PENDING。如果此函式成功中止或清除一個數據包,它將返回IOM_COMPLETED。如果不成功,此函式將返回負數錯誤編碼表中的值。
mdUnBindDev 從迷你驅動解綁裝置
C介面
語法
status = mdUnBindDev(devp);
引數
Ptr devp; /* global device data pointer */
返回值
Int status; /* success or failure code */
描述
此函式將釋放由mdBindDev函式分配的資源。
目前,此函式不作為任何GIO函式結果呼叫。它可在未來支援動態裝置驅動載入或解除安裝使用。
devp引數是裝置的全域性資料結構指標。它是迷你驅動的mdBindDev呼叫返回值。
如果成功,此函式將返回IOM_COMPLETED。如果不成功,此函式將返回一個負數錯誤編碼。