龔俊 張京 王璐
摘要:介紹Windows XP系統(tǒng)下,基于WDM架構(gòu)的CPCI多串口數(shù)據(jù)通信卡驅(qū)動(dòng)程序的設(shè)計(jì)及實(shí)現(xiàn)方法,并分析WDM架構(gòu)下的多串口卡設(shè)備的驅(qū)動(dòng)層次結(jié)構(gòu)、總線驅(qū)動(dòng)關(guān)鍵IRP事件的處理機(jī)制。最后,探討其驅(qū)動(dòng)程序安裝及調(diào)試。
關(guān)鍵詞:CPCI;WDM;多串口數(shù)據(jù)通信卡;Windows XP
DOIDOI:10.11907/rjdk.151822
中圖分類號(hào):TP319
文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào)文章編號(hào):16727800(2015)008011503
0 引言
CPCI是PICMG(國(guó)際工業(yè)計(jì)算機(jī)制造者聯(lián)合會(huì))組織于1994年提出的高性能工業(yè)計(jì)算機(jī)總線標(biāo)準(zhǔn)。CPCI總線以PCI電氣規(guī)范為基礎(chǔ),解決了VME等總線技術(shù)與PCI總線不兼容的問題,其與傳統(tǒng)PCI總線完全兼容,使得基于PC的x86架構(gòu)等技術(shù)能在工業(yè)領(lǐng)域廣泛使用。同時(shí)由于其接口作了重大改進(jìn),使得采用CPCI架構(gòu)技術(shù)的工控電腦具有高可靠性、高密度優(yōu)點(diǎn)。
本文CPCI多串口數(shù)據(jù)通信卡由西南自動(dòng)化研究所自主研發(fā)設(shè)計(jì)生產(chǎn),具有8通道RS232/422/485接口,各通道均可通過撥碼開關(guān)進(jìn)行協(xié)議間切換。硬件采用PLX9054橋與CPLD組合的方案,實(shí)現(xiàn)ST16C554串口控制器與CPCI總線間的數(shù)據(jù)訪問,CPLD邏輯負(fù)責(zé)將8個(gè)串口的寄存器操作地址空間、中斷分別映射到PCI可操作地址空間及中斷向量上,供串口功能驅(qū)動(dòng)進(jìn)行使用。硬件結(jié)構(gòu)框圖如圖1所示。
1 驅(qū)動(dòng)程序框架
1.1 WDM驅(qū)動(dòng)架構(gòu)
WDM(Windows Driver Mode)是微軟公司定義的驅(qū)動(dòng)設(shè)計(jì)規(guī)范,其基于模塊化設(shè)計(jì)思想,使得驅(qū)動(dòng)開發(fā)更加規(guī)范可靠。WDM定義了一個(gè)基本模型,處理所有類型的數(shù)據(jù),擁有總線驅(qū)動(dòng)和類驅(qū)動(dòng)。WDM 驅(qū)動(dòng)體系定義驅(qū)動(dòng)程序?qū)哟危ㄒ妶D2),將各層次的驅(qū)動(dòng)程序按一定順序排列起來。
圖1 硬件結(jié)構(gòu)[HJ]
圖2 WDM中設(shè)備對(duì)象和驅(qū)動(dòng)程序的層次結(jié)構(gòu)
在單個(gè)硬件驅(qū)動(dòng)程序堆棧中,不同位置的驅(qū)動(dòng)程序扮演著不同的角色。功能驅(qū)動(dòng)程序管理FDO所代表的設(shè)備,總線驅(qū)動(dòng)程序管理計(jì)算機(jī)與PDO所代表設(shè)備的連接,過濾器驅(qū)動(dòng)程序用于監(jiān)視和修改IRP流[1]。
當(dāng)總線驅(qū)動(dòng)程序枚舉硬件時(shí),其作用相當(dāng)于一個(gè)普通的功能驅(qū)動(dòng)程序。檢測(cè)到新硬件后,它改變?yōu)榭偩€驅(qū)動(dòng)程序角色,并為找到的硬件創(chuàng)建PDO,最終由PnP管理器負(fù)責(zé)加載該P(yáng)DO的驅(qū)動(dòng)程序。
1.2 CPCI多串口數(shù)據(jù)通信卡驅(qū)動(dòng)架構(gòu)
一般一個(gè)設(shè)備的驅(qū)動(dòng)程序至少包括兩個(gè)驅(qū)動(dòng)程序: 一個(gè)是總線驅(qū)動(dòng)程序,另一個(gè)是功能驅(qū)動(dòng)程序??偩€驅(qū)動(dòng)程序通常由系統(tǒng)供應(yīng)商提供,負(fù)責(zé)管理硬件與計(jì)算機(jī)的連接[2]。功能驅(qū)動(dòng)程序,即通常所說的設(shè)備驅(qū)動(dòng)程序,負(fù)責(zé)指揮硬件工作,例如初始化IO 請(qǐng)求等[3]。
在CPCI多串口數(shù)據(jù)通信卡驅(qū)動(dòng)架構(gòu)中,通信卡驅(qū)動(dòng)程序也是由總線設(shè)備驅(qū)動(dòng)和串口設(shè)備驅(qū)動(dòng)組合而成。總線設(shè)備驅(qū)動(dòng)負(fù)責(zé)枚舉出當(dāng)前板卡上的全部串口,并為每個(gè)串口分配其所需要的硬件IO地址及中斷資源,負(fù)責(zé)處理每個(gè)子串口驅(qū)動(dòng)各類型IRP請(qǐng)求。功能驅(qū)動(dòng)則負(fù)責(zé)完成串口控制器的初始化、響應(yīng)串口中斷,接收與發(fā)送串口緩存區(qū)數(shù)據(jù),對(duì)串口控制參數(shù)進(jìn)行配置[4]。
1.3 標(biāo)準(zhǔn)文件操作
相比利用第三方工具開發(fā)出來的非標(biāo)驅(qū)動(dòng)程序,選用WDM架構(gòu)開發(fā)的串口驅(qū)動(dòng),開發(fā)人員可直接使用標(biāo)準(zhǔn)的Windows系統(tǒng)文件操作函數(shù)CreateFile、ReadFile、WriteFile、CloseFile等即可對(duì)每個(gè)串口進(jìn)行配置、數(shù)據(jù)接收、數(shù)據(jù)發(fā)送及關(guān)閉操作。同時(shí)還可支持目前市面上大部分第三方開發(fā)的標(biāo)準(zhǔn)串口應(yīng)用程序(如串口助手、串口精靈等),帶來極大便利。
2 驅(qū)動(dòng)程序設(shè)計(jì)與實(shí)現(xiàn)
與單一功能的CPCI設(shè)備驅(qū)動(dòng)開發(fā)相比,多串口數(shù)據(jù)通信卡驅(qū)動(dòng)開發(fā)的難點(diǎn)在于對(duì)設(shè)備總線驅(qū)動(dòng)的設(shè)計(jì),該驅(qū)動(dòng)既要完成其本身的總線功能角色,又要提供方法與串口功能驅(qū)動(dòng)進(jìn)行數(shù)據(jù)交互。
2.1 總線設(shè)備驅(qū)動(dòng)
本文針對(duì)多串口數(shù)據(jù)通信卡驅(qū)動(dòng)中總線設(shè)備驅(qū)動(dòng)處理的幾類關(guān)鍵IRP流程進(jìn)行分析。
2.1.1 IRP_MN_QUERY_INTERFACE處理流程
串口設(shè)備驅(qū)動(dòng)程序通過向總線設(shè)備驅(qū)動(dòng)程序發(fā)送IRP_MN_QUERY_INTERFACE請(qǐng)求獲得一個(gè)指向總線設(shè)備接口描述符的指針。串口在設(shè)備啟動(dòng)和停止時(shí)調(diào)用總線設(shè)備驅(qū)動(dòng)程序中的函數(shù)來獲得和釋放總線設(shè)備所擁有的資源??偩€設(shè)備驅(qū)動(dòng)通過定義GUID為串口功能驅(qū)動(dòng)程序提供接口,并與之互通。
2.1.2 IRP_MN_QUERY_ID處理流程
總線設(shè)備驅(qū)動(dòng)要處理的最重要的PnP請(qǐng)求是IRP_MN_QUERY_ID。PnP管理器以多種形式發(fā)出此請(qǐng)求,用于獲取設(shè)備標(biāo)識(shí)符,而這些標(biāo)識(shí)符能定位子設(shè)備的INF文件。響應(yīng)此請(qǐng)求只需要返回一個(gè)包含設(shè)備標(biāo)識(shí)符的值。邏輯查詢串口代碼如下(驅(qū)動(dòng)中定義為CHILDTYPEA)則返回*SWCOM01。
static NTSTATUS HandleQueryId(PDEVICE_OBJECT pdo,PIRP Irp)
{
…
case BusQueryDeviceID:
if (pdx->flags & CHILDTYPEA)
idstring = LDRIVERNAME L"*SWCOM01"
…
}
2.1.3 IRP_MN_START_DEVICE處理流程
PnP管理器通常使用IRP_MN_START_DEVICE來通知功能驅(qū)動(dòng)程序,其硬件被賦予I/O資源,以及指導(dǎo)功能驅(qū)動(dòng)程序作必要的硬件或軟件設(shè)置,以便設(shè)備能正常工作。當(dāng)前總線設(shè)備驅(qū)動(dòng)程序在該IRP處理例程中,讀取CPLD為各個(gè)串口分配的IO空間地址及中斷號(hào)資源,初始化PLX9054橋芯片的中斷使能參數(shù)配置,并最終調(diào)用IoCreateDevice函數(shù)為8個(gè)串口創(chuàng)建出獨(dú)立的PDO對(duì)象,函數(shù)調(diào)用例程如下:
status = IoCreateDevice(pdx->DriverObject,sizeof(PDO_EXTENSION),NULL,
FILE_DEVICE_SERIAL_PORT,F(xiàn)ILE_AUTOGENERATED_DEVICE_NAME,F(xiàn)ALSE,&child);
if (!NT_SUCCESS(status))
{
KdPrint((DRIVERNAME " - IoCreateDevice (child) failed - %Xn",status));
return status;
}
2.1.4 IRP_MN_QUERY_DEVICE_RELATIONS處理流程
當(dāng)多串口數(shù)據(jù)通信卡插入機(jī)箱背板CPCI插槽后,Windows標(biāo)準(zhǔn)總線的驅(qū)動(dòng)程序檢測(cè)到設(shè)備,然后PnP管理器就像配置任何普通CPCI/PCI設(shè)備一樣配置板卡。啟動(dòng)板卡后,PnP管理器向板卡的總線設(shè)備驅(qū)動(dòng)發(fā)送一個(gè)帶IRP_MN_QUERY_DEVICE_RELATIONS副功能碼的PnP請(qǐng)求,以了解當(dāng)前數(shù)據(jù)通信卡內(nèi)部總線關(guān)系,判斷其是否含有子設(shè)備??偩€設(shè)備驅(qū)動(dòng)處理該IRP請(qǐng)求后,告知PnP管理器當(dāng)前板卡上包含的8個(gè)獨(dú)立串口。
2.1.5 其它IRP
除上述幾種IRP處理例程外,總線驅(qū)動(dòng)實(shí)際開發(fā)中還實(shí)現(xiàn)了包含IRP_MN_QUERY_CAPABILITIES、IRP_MN_STOP_DEVICE、IRP_MN_REMOVE_DEVICE等通常WDM驅(qū)動(dòng)所必須的處理例程,確保該驅(qū)動(dòng)能完全覆蓋串口功能設(shè)備驅(qū)動(dòng)的IRP請(qǐng)求。
2.2 串口功能驅(qū)動(dòng)程序
串口功能驅(qū)動(dòng)主要參考微軟公司的配套Windows XP DDK中自帶的單個(gè)串口設(shè)備樣例代碼。在此基礎(chǔ)上,配合總線設(shè)備驅(qū)動(dòng)架構(gòu),在創(chuàng)建設(shè)備時(shí)加入與總線驅(qū)動(dòng)相對(duì)應(yīng)的接口函數(shù)代碼,實(shí)現(xiàn)兩個(gè)驅(qū)動(dòng)間的功能接口對(duì)接、多串口端口枚舉等功能。
在中斷處理上,根據(jù)板卡多串口共享中斷的特點(diǎn),CPLD邏輯在判斷出當(dāng)前中斷來源于具體的某個(gè)串口后,將CPLD中斷狀態(tài)寄存器置位。各串口驅(qū)動(dòng)實(shí)例的中斷處理函數(shù)ISR首先在中斷觸發(fā)后,對(duì)CPLD中斷狀態(tài)寄存器進(jìn)行判斷,若非本串口中斷類型,則直接返回不作處理,等待下一次中斷產(chǎn)生時(shí)再判斷。若是本串口的中斷位被置,將進(jìn)行對(duì)應(yīng)中斷方式的數(shù)據(jù)發(fā)送、接收,完成后中斷位被自動(dòng)清除。
3 驅(qū)動(dòng)程序開發(fā)調(diào)試環(huán)境
CPCI多串口通信卡驅(qū)動(dòng)程序采用微軟公司提供的Windows XP的DDK驅(qū)動(dòng)開發(fā)環(huán)境進(jìn)行驅(qū)動(dòng)開發(fā)編譯,使用build命令在DDK開發(fā)環(huán)境命令行下進(jìn)行編譯。
驅(qū)動(dòng)調(diào)試時(shí),借助微軟公司提供的調(diào)試軟件DebugView,通過檢查關(guān)鍵處理流程代碼處有無對(duì)應(yīng)調(diào)試信息輸出,完成驅(qū)動(dòng)調(diào)用過程調(diào)試。此外,利用DriverStudio中的Windows系統(tǒng)底層調(diào)試工具SoftIce在驅(qū)動(dòng)內(nèi)部加入斷點(diǎn),可針對(duì)驅(qū)動(dòng)程序開發(fā)過程中遇到的數(shù)據(jù)超界、內(nèi)存訪問異常等嚴(yán)重錯(cuò)誤進(jìn)行單步斷點(diǎn)跟蹤調(diào)試,準(zhǔn)確定位驅(qū)動(dòng)中錯(cuò)誤所在的位置。
4 驅(qū)動(dòng)程序安裝使用
在插入多串口通信卡后,啟動(dòng)系統(tǒng)進(jìn)入Windows桌面,系統(tǒng)會(huì)提示找到其它PCI橋設(shè)備,然后自動(dòng)查找驅(qū)動(dòng)程序,將安裝路徑指向驅(qū)動(dòng)包路徑,便可自動(dòng)安裝完成全部串口,安裝完成后的設(shè)備管理器顯示如圖3所示。
圖3 驅(qū)動(dòng)安裝后設(shè)備管理器顯示
5 驅(qū)動(dòng)程序測(cè)試
由于本串口驅(qū)動(dòng)遵循了標(biāo)準(zhǔn)的WDM架構(gòu)的串口驅(qū)動(dòng)開發(fā)架構(gòu),因此可利用標(biāo)準(zhǔn)的串口測(cè)試程序進(jìn)行測(cè)試,提高整個(gè)板卡的通用性及易用性。
硬件測(cè)試環(huán)境利用一臺(tái)配有Intel i7-3555主板的標(biāo)準(zhǔn)x86 架構(gòu)的CPCI機(jī)箱,裝入CPCI多串口卡后,將配套的測(cè)試線纜與MOXA公司的兩臺(tái)uPort 1450型號(hào)多串口測(cè)試儀器的8個(gè)串口進(jìn)行互連。
軟件測(cè)試環(huán)境采用Windows XP系統(tǒng),安裝完成多串口通信卡的驅(qū)動(dòng)程序及uPort 1450設(shè)備的驅(qū)動(dòng)后,測(cè)試軟件選用Access Port標(biāo)準(zhǔn)串口測(cè)試軟件,版本號(hào)v1.37。
測(cè)試時(shí),分別在RS232、RS422和RS485三種工作模式下,波特率選用9600、19200、38400、57600和115200五種常用波特率,生成15個(gè)測(cè)試項(xiàng),在執(zhí)行測(cè)試項(xiàng)時(shí),多串口通信卡上的8個(gè)串口與兩臺(tái)uPort 1450的8個(gè)串口同時(shí)開始進(jìn)行數(shù)據(jù)收發(fā),進(jìn)一步驗(yàn)證板卡上串口并行工作能力。
測(cè)試結(jié)束后,通過比較發(fā)送源數(shù)據(jù)與接收實(shí)際數(shù)據(jù)的個(gè)數(shù),將發(fā)送數(shù)據(jù)文件和接收后轉(zhuǎn)存的數(shù)據(jù)文件進(jìn)行MD5校驗(yàn)計(jì)算后發(fā)現(xiàn):多串口通信卡上的8個(gè)串口在全部測(cè)試過程中的數(shù)據(jù)通信均無丟數(shù)、錯(cuò)數(shù)現(xiàn)象,從而可知該CPCI多串口通信卡所使用的驅(qū)動(dòng)程序完全滿足標(biāo)準(zhǔn)串口的功能及性能要求。
6 結(jié)語
本文以基于CPCI總線的多串口通信卡為例,介紹了總線驅(qū)動(dòng)開發(fā)中的關(guān)鍵處理流程的處理方法。目前該多串口通信卡已經(jīng)在本所多個(gè)橫向及縱向項(xiàng)目中的設(shè)備上得以應(yīng)用,效果良好。
CPCI總線形式的各類板卡目前已經(jīng)廣泛應(yīng)用于智能交通、航空航天、工業(yè)現(xiàn)場(chǎng)控制、軍事系統(tǒng)等領(lǐng)域,在硬件設(shè)計(jì)時(shí),往往考慮到成本、結(jié)構(gòu)及用戶定制化的要求,會(huì)出現(xiàn)越來越多的集成多種功能模塊的CPCI板卡。本文多串口通信卡的多功能設(shè)備驅(qū)動(dòng)架構(gòu)將得到更為廣泛應(yīng)用及推廣。
參考文獻(xiàn):
[1] WALTER ONEY.Programming the microsoft windows driver mode second edition[M].Microsoft Press,2002
[2] 田澤,劉娟,王綺卉.基于WDM 的PCIE 驅(qū)動(dòng)設(shè)計(jì)和實(shí)現(xiàn)[J].軟件導(dǎo)刊,2010(4):910.
[3] 張建新.Windows 2000內(nèi)核結(jié)構(gòu)的分析及驅(qū)動(dòng)程序的編制[J].計(jì)算機(jī)工程與應(yīng)用,2012(10):121123.
[4] 田澤,劉娟,王綺卉.基于WDM 的PCIE 驅(qū)動(dòng)設(shè)計(jì)和實(shí)現(xiàn)[J].軟件導(dǎo)刊,2010,9(4):2930.
(責(zé)任編輯:陳福時(shí))