国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于WDM的CPCI多串口數(shù)據(jù)通信卡驅(qū)動程序設(shè)計

2015-09-18 13:04:01龔俊張京王璐
軟件導刊 2015年8期

龔俊 張京 王璐

摘要:介紹Windows XP系統(tǒng)下,基于WDM架構(gòu)的CPCI多串口數(shù)據(jù)通信卡驅(qū)動程序的設(shè)計及實現(xiàn)方法,并分析WDM架構(gòu)下的多串口卡設(shè)備的驅(qū)動層次結(jié)構(gòu)、總線驅(qū)動關(guān)鍵IRP事件的處理機制。最后,探討其驅(qū)動程序安裝及調(diào)試。

關(guān)鍵詞:CPCI;WDM;多串口數(shù)據(jù)通信卡;Windows XP

DOIDOI:10.11907/rjdk.151822

中圖分類號:TP319

文獻標識碼:A 文章編號文章編號:16727800(2015)008011503

0 引言

CPCI是PICMG(國際工業(yè)計算機制造者聯(lián)合會)組織于1994年提出的高性能工業(yè)計算機總線標準。CPCI總線以PCI電氣規(guī)范為基礎(chǔ),解決了VME等總線技術(shù)與PCI總線不兼容的問題,其與傳統(tǒng)PCI總線完全兼容,使得基于PC的x86架構(gòu)等技術(shù)能在工業(yè)領(lǐng)域廣泛使用。同時由于其接口作了重大改進,使得采用CPCI架構(gòu)技術(shù)的工控電腦具有高可靠性、高密度優(yōu)點。

本文CPCI多串口數(shù)據(jù)通信卡由西南自動化研究所自主研發(fā)設(shè)計生產(chǎn),具有8通道RS232/422/485接口,各通道均可通過撥碼開關(guān)進行協(xié)議間切換。硬件采用PLX9054橋與CPLD組合的方案,實現(xiàn)ST16C554串口控制器與CPCI總線間的數(shù)據(jù)訪問,CPLD邏輯負責將8個串口的寄存器操作地址空間、中斷分別映射到PCI可操作地址空間及中斷向量上,供串口功能驅(qū)動進行使用。硬件結(jié)構(gòu)框圖如圖1所示。

1 驅(qū)動程序框架

1.1 WDM驅(qū)動架構(gòu)

WDM(Windows Driver Mode)是微軟公司定義的驅(qū)動設(shè)計規(guī)范,其基于模塊化設(shè)計思想,使得驅(qū)動開發(fā)更加規(guī)范可靠。WDM定義了一個基本模型,處理所有類型的數(shù)據(jù),擁有總線驅(qū)動和類驅(qū)動。WDM 驅(qū)動體系定義驅(qū)動程序?qū)哟危ㄒ妶D2),將各層次的驅(qū)動程序按一定順序排列起來。

圖1 硬件結(jié)構(gòu)[HJ]

圖2 WDM中設(shè)備對象和驅(qū)動程序的層次結(jié)構(gòu)

在單個硬件驅(qū)動程序堆棧中,不同位置的驅(qū)動程序扮演著不同的角色。功能驅(qū)動程序管理FDO所代表的設(shè)備,總線驅(qū)動程序管理計算機與PDO所代表設(shè)備的連接,過濾器驅(qū)動程序用于監(jiān)視和修改IRP流[1]。

當總線驅(qū)動程序枚舉硬件時,其作用相當于一個普通的功能驅(qū)動程序。檢測到新硬件后,它改變?yōu)榭偩€驅(qū)動程序角色,并為找到的硬件創(chuàng)建PDO,最終由PnP管理器負責加載該PDO的驅(qū)動程序。

1.2 CPCI多串口數(shù)據(jù)通信卡驅(qū)動架構(gòu)

一般一個設(shè)備的驅(qū)動程序至少包括兩個驅(qū)動程序: 一個是總線驅(qū)動程序,另一個是功能驅(qū)動程序??偩€驅(qū)動程序通常由系統(tǒng)供應(yīng)商提供,負責管理硬件與計算機的連接[2]。功能驅(qū)動程序,即通常所說的設(shè)備驅(qū)動程序,負責指揮硬件工作,例如初始化IO 請求等[3]。

在CPCI多串口數(shù)據(jù)通信卡驅(qū)動架構(gòu)中,通信卡驅(qū)動程序也是由總線設(shè)備驅(qū)動和串口設(shè)備驅(qū)動組合而成。總線設(shè)備驅(qū)動負責枚舉出當前板卡上的全部串口,并為每個串口分配其所需要的硬件IO地址及中斷資源,負責處理每個子串口驅(qū)動各類型IRP請求。功能驅(qū)動則負責完成串口控制器的初始化、響應(yīng)串口中斷,接收與發(fā)送串口緩存區(qū)數(shù)據(jù),對串口控制參數(shù)進行配置[4]。

1.3 標準文件操作

相比利用第三方工具開發(fā)出來的非標驅(qū)動程序,選用WDM架構(gòu)開發(fā)的串口驅(qū)動,開發(fā)人員可直接使用標準的Windows系統(tǒng)文件操作函數(shù)CreateFile、ReadFile、WriteFile、CloseFile等即可對每個串口進行配置、數(shù)據(jù)接收、數(shù)據(jù)發(fā)送及關(guān)閉操作。同時還可支持目前市面上大部分第三方開發(fā)的標準串口應(yīng)用程序(如串口助手、串口精靈等),帶來極大便利。

2 驅(qū)動程序設(shè)計與實現(xiàn)

與單一功能的CPCI設(shè)備驅(qū)動開發(fā)相比,多串口數(shù)據(jù)通信卡驅(qū)動開發(fā)的難點在于對設(shè)備總線驅(qū)動的設(shè)計,該驅(qū)動既要完成其本身的總線功能角色,又要提供方法與串口功能驅(qū)動進行數(shù)據(jù)交互。

2.1 總線設(shè)備驅(qū)動

本文針對多串口數(shù)據(jù)通信卡驅(qū)動中總線設(shè)備驅(qū)動處理的幾類關(guān)鍵IRP流程進行分析。

2.1.1 IRP_MN_QUERY_INTERFACE處理流程

串口設(shè)備驅(qū)動程序通過向總線設(shè)備驅(qū)動程序發(fā)送IRP_MN_QUERY_INTERFACE請求獲得一個指向總線設(shè)備接口描述符的指針。串口在設(shè)備啟動和停止時調(diào)用總線設(shè)備驅(qū)動程序中的函數(shù)來獲得和釋放總線設(shè)備所擁有的資源??偩€設(shè)備驅(qū)動通過定義GUID為串口功能驅(qū)動程序提供接口,并與之互通。

2.1.2 IRP_MN_QUERY_ID處理流程

總線設(shè)備驅(qū)動要處理的最重要的PnP請求是IRP_MN_QUERY_ID。PnP管理器以多種形式發(fā)出此請求,用于獲取設(shè)備標識符,而這些標識符能定位子設(shè)備的INF文件。響應(yīng)此請求只需要返回一個包含設(shè)備標識符的值。邏輯查詢串口代碼如下(驅(qū)動中定義為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ū)動程序,其硬件被賦予I/O資源,以及指導功能驅(qū)動程序作必要的硬件或軟件設(shè)置,以便設(shè)備能正常工作。當前總線設(shè)備驅(qū)動程序在該IRP處理例程中,讀取CPLD為各個串口分配的IO空間地址及中斷號資源,初始化PLX9054橋芯片的中斷使能參數(shù)配置,并最終調(diào)用IoCreateDevice函數(shù)為8個串口創(chuàng)建出獨立的PDO對象,函數(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處理流程

當多串口數(shù)據(jù)通信卡插入機箱背板CPCI插槽后,Windows標準總線的驅(qū)動程序檢測到設(shè)備,然后PnP管理器就像配置任何普通CPCI/PCI設(shè)備一樣配置板卡。啟動板卡后,PnP管理器向板卡的總線設(shè)備驅(qū)動發(fā)送一個帶IRP_MN_QUERY_DEVICE_RELATIONS副功能碼的PnP請求,以了解當前數(shù)據(jù)通信卡內(nèi)部總線關(guān)系,判斷其是否含有子設(shè)備??偩€設(shè)備驅(qū)動處理該IRP請求后,告知PnP管理器當前板卡上包含的8個獨立串口。

2.1.5 其它IRP

除上述幾種IRP處理例程外,總線驅(qū)動實際開發(fā)中還實現(xiàn)了包含IRP_MN_QUERY_CAPABILITIES、IRP_MN_STOP_DEVICE、IRP_MN_REMOVE_DEVICE等通常WDM驅(qū)動所必須的處理例程,確保該驅(qū)動能完全覆蓋串口功能設(shè)備驅(qū)動的IRP請求。

2.2 串口功能驅(qū)動程序

串口功能驅(qū)動主要參考微軟公司的配套Windows XP DDK中自帶的單個串口設(shè)備樣例代碼。在此基礎(chǔ)上,配合總線設(shè)備驅(qū)動架構(gòu),在創(chuàng)建設(shè)備時加入與總線驅(qū)動相對應(yīng)的接口函數(shù)代碼,實現(xiàn)兩個驅(qū)動間的功能接口對接、多串口端口枚舉等功能。

在中斷處理上,根據(jù)板卡多串口共享中斷的特點,CPLD邏輯在判斷出當前中斷來源于具體的某個串口后,將CPLD中斷狀態(tài)寄存器置位。各串口驅(qū)動實例的中斷處理函數(shù)ISR首先在中斷觸發(fā)后,對CPLD中斷狀態(tài)寄存器進行判斷,若非本串口中斷類型,則直接返回不作處理,等待下一次中斷產(chǎn)生時再判斷。若是本串口的中斷位被置,將進行對應(yīng)中斷方式的數(shù)據(jù)發(fā)送、接收,完成后中斷位被自動清除。

3 驅(qū)動程序開發(fā)調(diào)試環(huán)境

CPCI多串口通信卡驅(qū)動程序采用微軟公司提供的Windows XP的DDK驅(qū)動開發(fā)環(huán)境進行驅(qū)動開發(fā)編譯,使用build命令在DDK開發(fā)環(huán)境命令行下進行編譯。

驅(qū)動調(diào)試時,借助微軟公司提供的調(diào)試軟件DebugView,通過檢查關(guān)鍵處理流程代碼處有無對應(yīng)調(diào)試信息輸出,完成驅(qū)動調(diào)用過程調(diào)試。此外,利用DriverStudio中的Windows系統(tǒng)底層調(diào)試工具SoftIce在驅(qū)動內(nèi)部加入斷點,可針對驅(qū)動程序開發(fā)過程中遇到的數(shù)據(jù)超界、內(nèi)存訪問異常等嚴重錯誤進行單步斷點跟蹤調(diào)試,準確定位驅(qū)動中錯誤所在的位置。

4 驅(qū)動程序安裝使用

在插入多串口通信卡后,啟動系統(tǒng)進入Windows桌面,系統(tǒng)會提示找到其它PCI橋設(shè)備,然后自動查找驅(qū)動程序,將安裝路徑指向驅(qū)動包路徑,便可自動安裝完成全部串口,安裝完成后的設(shè)備管理器顯示如圖3所示。

圖3 驅(qū)動安裝后設(shè)備管理器顯示

5 驅(qū)動程序測試

由于本串口驅(qū)動遵循了標準的WDM架構(gòu)的串口驅(qū)動開發(fā)架構(gòu),因此可利用標準的串口測試程序進行測試,提高整個板卡的通用性及易用性。

硬件測試環(huán)境利用一臺配有Intel i7-3555主板的標準x86 架構(gòu)的CPCI機箱,裝入CPCI多串口卡后,將配套的測試線纜與MOXA公司的兩臺uPort 1450型號多串口測試儀器的8個串口進行互連。

軟件測試環(huán)境采用Windows XP系統(tǒng),安裝完成多串口通信卡的驅(qū)動程序及uPort 1450設(shè)備的驅(qū)動后,測試軟件選用Access Port標準串口測試軟件,版本號v1.37。

測試時,分別在RS232、RS422和RS485三種工作模式下,波特率選用9600、19200、38400、57600和115200五種常用波特率,生成15個測試項,在執(zhí)行測試項時,多串口通信卡上的8個串口與兩臺uPort 1450的8個串口同時開始進行數(shù)據(jù)收發(fā),進一步驗證板卡上串口并行工作能力。

測試結(jié)束后,通過比較發(fā)送源數(shù)據(jù)與接收實際數(shù)據(jù)的個數(shù),將發(fā)送數(shù)據(jù)文件和接收后轉(zhuǎn)存的數(shù)據(jù)文件進行MD5校驗計算后發(fā)現(xiàn):多串口通信卡上的8個串口在全部測試過程中的數(shù)據(jù)通信均無丟數(shù)、錯數(shù)現(xiàn)象,從而可知該CPCI多串口通信卡所使用的驅(qū)動程序完全滿足標準串口的功能及性能要求。

6 結(jié)語

本文以基于CPCI總線的多串口通信卡為例,介紹了總線驅(qū)動開發(fā)中的關(guān)鍵處理流程的處理方法。目前該多串口通信卡已經(jīng)在本所多個橫向及縱向項目中的設(shè)備上得以應(yīng)用,效果良好。

CPCI總線形式的各類板卡目前已經(jīng)廣泛應(yīng)用于智能交通、航空航天、工業(yè)現(xiàn)場控制、軍事系統(tǒng)等領(lǐng)域,在硬件設(shè)計時,往往考慮到成本、結(jié)構(gòu)及用戶定制化的要求,會出現(xiàn)越來越多的集成多種功能模塊的CPCI板卡。本文多串口通信卡的多功能設(shè)備驅(qū)動架構(gòu)將得到更為廣泛應(yīng)用及推廣。

參考文獻:

[1] WALTER ONEY.Programming the microsoft windows driver mode second edition[M].Microsoft Press,2002

[2] 田澤,劉娟,王綺卉.基于WDM 的PCIE 驅(qū)動設(shè)計和實現(xiàn)[J].軟件導刊,2010(4):910.

[3] 張建新.Windows 2000內(nèi)核結(jié)構(gòu)的分析及驅(qū)動程序的編制[J].計算機工程與應(yīng)用,2012(10):121123.

[4] 田澤,劉娟,王綺卉.基于WDM 的PCIE 驅(qū)動設(shè)計和實現(xiàn)[J].軟件導刊,2010,9(4):2930.

(責任編輯:陳福時)

扶余县| 长丰县| 宣汉县| 三亚市| 无锡市| 新乐市| 平罗县| 祥云县| 长宁区| 松滋市| 威宁| 宜阳县| 新宾| 莱州市| 夏邑县| 大关县| 司法| 盱眙县| 孝昌县| 浦北县| 邵武市| 河西区| 永靖县| 通山县| 吕梁市| 什邡市| 涡阳县| 象州县| 中阳县| 安顺市| 吉木乃县| 故城县| 山东省| 乌兰浩特市| 张北县| 龙岩市| 九龙坡区| 侯马市| 杭锦后旗| 交口县| 区。|