1. 程式人生 > >vxWorks驅動架構

vxWorks驅動架構

Vxworks核心驅動基本結構: 三張表:1. 系統裝置表  2. 系統驅動表 3. 檔案描述符表

    Vxworks 內部對每個裝置使用DEV_HDR 資料結構進行表示: Typedef struct {    DL_NODE    node;    Short      drvnum;    Char       *name; }     該結構中給出了連結指標(用以將該結構串入佇列中)、驅動索引號、裝置節點名稱。核心提供這個結構較為簡單,只儲存了一些裝置的關鍵資訊。底層驅動對其驅動的裝置都有一個自定義資料結構表示,其中包含了驅動裝置暫存器基地址,中斷號,可能的資料緩衝區,儲存核心回撥函式的指標,以及一些標誌位。最關鍵的一點是DEV_HDR必須是自定義資料結構的第一個成員變數,因為這個使用者自定義結構最後需要新增到系統裝置佇列中,必須能夠在使用者定義結構與DEV_HDR結構之間進行轉換,而將DEV_HDR結構設定為使用者自定義結構的第一個成員變數就可以達到目的。

typedef struct {        DEV_HDR     pFCcardHdr;        BOOL        created;        char *      buf_virts;        UINT32      iobase;        UINT32      membase;        char        irq;        UINT32      irqvec;        UINT32      Bus;        UINT32      Device;        UINT32      Func; }DRV_CTRL;

    系統提供了iosDevAdd(DEV_HDR *pDevHdr, char *name, int drvnum)用於驅動程式呼叫註冊一個裝置。第三個引數是裝置對應的驅動程式索引號。這個驅動號是iosDrvInstall函式的返回值,在裝置初始化函式中,我們首先呼叫iosDrvInstall註冊驅動,然後使用iosDrvInstall 函式返回的驅動號呼叫 iosDevAdd新增裝置到系統中通過這兩步裝置就可以被使用者程式使用了。     使用者呼叫open函式開啟一個裝置檔案時,系統將以傳入的檔案路徑名匹配系統裝置的裝置節點名,匹配方式是最佳匹配。   系統驅動表:     系統驅動表包含了當前註冊到I/O子系統下的所有驅動。這些驅動可以直接驅動硬體工作的驅動層。系統驅動表底層實現是一個數組,陣列元素數目在核心初始化過程中指定。I/O子系統提供iosDrvInstall供驅動程式註冊,iosDrvInstall原型如下: Int iosDrvInstall (   FUNCPTR  pCreate,   FUNCPTR  pDelete,     FUNCPTR  pOpen,    FUNCPTR  pClose,     FUNCPTR  pRead,   FUNCPTR  pWrite,  FUNCPTR  pIoctl /*pointer to driver ioctl function*/ )

    一個裝置驅動在初始化過程中一方面完成硬體裝置暫存器配置,另一方面就是向I/O子系統註冊驅動和裝置。一個驅動並不需要實現上述所有函式,無須實現的函式直接傳遞NULL指標就可以了。iosDrvInstall 函式的基本實現即遍歷drvTable陣列,查詢一個空閒表項,用傳入的函式地址對各成員變數進行初始化。   系統檔案描述符表     檔案描述符表表項索引被用做檔案描述符ID,即open函式返回值。對於檔案描述符,需要注意:標準輸入、標準輸出、標準錯誤輸出雖然使用0,1,2三個檔案描述符,但是可能在系統檔案描述符表中只佔用一個表項,即都使用同一個表項。Vxworks核心將0,1,2三個標準檔案描述符與系統檔案描述符表中的內容分開進行管理。     系統檔案描述符中的內容主要是針對硬體裝置,使用一次open函式呼叫就佔用一個表項: int fd = open(DevName, 2,0);

    應用程式每呼叫一次open函式,系統檔案描述符表中就增加一個有效表項,直到陣列滿為止。此時open函式呼叫將以失敗返回,因此注意如果需要反覆開啟裝置的話,一定要在裝置不用的時候呼叫close函式關閉該描述符指向的裝置,並在每次呼叫open函式之後檢查返回的檔案描述符是否合法。