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函數之後檢查返回的文件描述符是否合法。
最後更新:2017-04-03 12:55:36