1. 程式人生 > >DSP/BIOS下mini驅動介面概述

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。如果不成功,此函式將返回一個負數錯誤編碼。