摘 要:數據采集卡是典型的字符設備,以其為例,分析了VxWorks下字符設備驅動程序的結構,說明了字符設備驅動的開發思路,列出了開發的具體步驟,為驅動開發人員提供了參考。而用戶在使用該設備驅動時,無需了解底層實現,即設備寄存器的操作,只需熟悉VxWorks下標準的I/O函數即可實現對數據采集卡的操作,極大地方便了應用程序開發。
關鍵詞:VxWorks;字符設備;驅動;ADT700
中圖分類號:TP316文獻標識碼:B
文章編號:1004-373X(2008)07-113-02
Driver Development of Data Acquisition Card under VxWorks
YANG Yang,YANG Zhihui,LI Xu,LI Zhengxi
(Machine and Electronic Engineering School,North China University of Technology,Beijing,100041,China)
Abstract:The data acquisition card is a typical character equipment.Taking it as the example,the paper analyzes the structure of the character device drives under VxWorks,explains the development ideas of the character device drivers,lists the concrete step of development and provides a reference to driver developers.At the same time,users don′t need to know how to operate the device register,but only pay attention to the standard I/O function,which is convenient to develop program.
Keywords:VxWorks;character device;driver;ADT700
1 引 言
隨著嵌入式技術的發展,數據采集廣泛應用于現場設備中。本文根據實際項目需求,開發了數據采集卡在VxWorks操作系統下的驅動程序,以方便應用程序開發。
本文采用的數據采集卡為盛博協同公司基于PC/104總線的ADT700采集卡,他通過總線與PC/104嵌入式系統構成一個高性能的數據采集與控制系統。ADT700具有如下特點:
模擬輸入[HTSS] 16單端/8差分輸入;12位分辨率;100 kHz最大A/D采樣率;0 ~ +10 V,-5~+5 V,-10~+10 V雙極性或單極性輸入量程;1,2,4,8倍可編程增益;DMA實現數據的高速傳輸。
模擬輸出[HTSS] 4通道輸出;-5~+5 V,-10~+10 V,0~5 V,0~10 V量程可選;通道單獨置數或4通道同時置數。
數字量I/O[HTSS] 可編程外圍接口,24通道TTL/CMOS兼容;I/O接口上拉或下拉限流電阻。
定時/計數器[HTSS] 6個16位、10 MHz(最大)定時/計數器。
2 VxWorks及其字符設備驅動
VxWorks是一個基于搶占式的實時操作系統,他以其高度的可靠性、優秀的實時性、靈活的可裁性廣泛應用到許多行業中。在VxWorks中,I/O系統提供了與設備無關的用戶接口,應用程序可以通過標準的接口函數如:create( ),remove( ),open( ),close( ),read( ),write( ),ioctl( )等來訪問設備驅動程序,而不用關心驅動程序是如何實現的。ADT700屬于字符型設備,他的驅動程序需要支持以上接口函數。
下面以字符設備中open( )操作為例,說明字符設備驅動程序結構。
如圖1所示,當應用程序調用fd=open(“/xx0”,O[CD#*2]RDONLY,0)時,I/O系統根據文件名“/xx0”在設備列表中查找設備(設備是以文件形式存在的,文件名即設備名)(如①所示);查找到相應設備后根據驅動號定位到驅動表中(如②所示);I/O系統在文件描述表中預留一個表項fd=3(如③所示);然后I/O系統調用驅動程序中的xxoOpen( )函數,返回需要保留的值,即設備描述指針(如④所示);I/O系統將驅動號和驅動返回值填到文件描述符表中(如⑤所示);最后,I/O系統返回新open( )的文件在文件描述符表中的索引,應用程序得到文件描述符fd=3(如⑥所示)。用戶可以通過操作文件來訪問I/O設備。
圖1 字符設備驅動程序結構
3 驅動實現
3.1 功能分類
ADT700具有A/D,D/A轉換,數字I/O,定時/計數等功能,對其進行分析,可分為3類:
(1) A/D轉換為只讀,而D/A轉換為只寫;
(2) 數字I/O既可讀又可寫;
(3) 定時/計數器基本無需讀寫,只設置即可。
根據以上功能,得出需要實現3個驅動,分別為:
(1) adtDrv驅動,用于讀入A/D轉換后的數據,寫出D/A轉換的數據,設備描述符為“/adt”;
(2) ppiDrv驅動,用于讀入或寫出數字I/O的數字,設備描述符為“/ppi”;
(3) pitDrv驅動,用于設置定時/計數器,設備描述符為“/pit”。
3.2 基本流程
(1) 安裝驅動
I/O系統的功能是將用戶的I/O請求轉換成對相應驅動程序具體操作函數的調用,他通過維護一個包括所有驅動程序操作函數的地址表來實現的。通過調用iosDrvInstall( )可以動態安裝驅動程序,該函數的參數就是7種基本I/O操作函數指針。iosDrvInstall( )函數將這些地址寫入驅動表中的一塊空閑存儲區中,并返回這塊存儲區的編號,編號即驅動程序號,可被與驅動程序相關聯的設備使用。iosDrvInstall( )的原型是:
int iosDrvInstall(FUNCPTR pCreate,FUNCPTR pDelete,FUNCPTR pOpen,FUNCPTR pClose,FUNCPTR pRead,FUNCPTR pWrite,FUNCPTR pIoctl);
當調用iosDrvInstall( )注冊I/O函數成功后,在shell下用iosDrvShow命令可以觀察驅動表中ADT700的驅動入口。
(2) 創建設備
創建設備過程即是調用設備創建函數iosDevAdd( )將此設備加入到I/O系統的設備列表中。iosDevAdd( )的原型為:
STATUS iosDevAdd ( DEV[CD#*2]HDR *pDevHdr,char *name,int drvnum);
其中:DEV[CD#*2]HDR是一個指向該設備的描述符指針;而DEV[CD#*2]HDR結構中的第一項則指向下一個設備的描述符指針。
設備創建成功后,在shell下用devs命令可以觀察設備列表中ADT700的設備描述符。
以ADT700中adtDrv驅動為例,以上兩步的完成過程如圖2所示。
圖2 adtDrv驅動程序安裝
(3) 實現I/O函數
安裝驅動和創建設備完成后,就需要實現I/O函數,即填充驅動表中的函數了。對于字符型設備而言,打開設備操作與創建設備操作通常使用相同的函數,底層驅動中都用xxOpen( )完成;而設備驅動一旦安裝,就無需刪除, remove( )無效,因此在底層驅動中xxRemove( )為空。下面給出了ppiDrv驅動中ppiRead( )的實現模板。
int ppiRead(int ppiDevId,UCHAR *pBuf, int nByte)
{
PPI[CD#*2]DEV* pPpiDev= (PPI[CD#*2]DEV*)ppiDevId;
int ReadLength = ERROR;
UCHAR ch;
if(pPpiDev == (PPI[CD#*2]DEV*)NULL)
{
errnoSet(S[CD#*2]PPI[CD#*2]NODEV);
return (ERROR);
}
if(pPpiDev->ReadyToRead)
{
ReadLength = 0;
while(ReadLength < nByte)
{
if((pPpiDev->pinnum)PORTA) /* 如果輸入口為A*/
{
ch = ReadDigitalIO(0); /* 讀A 口數據*/
pBuf[ReadLength++] = ch;
}
/* 讀其他輸入口*/
}
}
return (ReadLength);
}
完成以上3步,就基本實現了驅動程序,此時,在應用程序中可以用標準接口函數進行操作了。以打開ADT700中定時/計數器(驅動為pitDrv)為例。
int fd = open(\"/pit/timer\",O[CD#*2]RDWR,0);
此時,在shell用iosFdShow命令可以觀察到新創建的文件描述符“/pit/timer”。
4 結 語
本文以數據采集卡驅動程序為例,詳細介紹了VxWorks操作系統下字符設備驅動程序的開發過程。本驅動程序封裝了ADT700幾乎所有功能,支持標準的I/O系統接口函數。用戶可將ADT700當作文件,只需定義文件名建立文件描述符,而無需關心底層實現,即可完成對他的操作,從而縮短了應用程序開發時間,提高了效率。
參 考 文 獻
[1]盛博協同科技有限公司.SEM/ADT700技術手冊(版本1.2)[Z].2006.
[2]周啟平,張楊.VxWorks下設備驅動程序及BSP開發指南[M].北京:中國電力出版社,2006.
[3]李忠民,楊剛,顧亦然,等.ARM嵌入式VxWorks實踐教程[M].北京:北京航空航天大學出版社,2006.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。