基于WinDriver的PCI總線設備驅動開發
摘要:工業控制計算機中廣泛使用串行接口UART與外圍設備進行通信,同時,Windows操作系統以其友好的UI界面被廣泛采用。文中闡述了UART設備的工作原理,并利用Jungo公司的WinDriver軟件實現了Windows操作系統下一種PCI轉多路UART設備的驅動開發。
本文引用地址:http://www.j9360.com/article/256424.htm0 引言
XR17D158是在工業控制計算機中被廣泛使用的一種PCI轉8路UART接口芯片。本文首先介紹Window操作系統驅動程序和開發工具Win Driv er軟件,并通過該軟件完成XR17D158在Windows系統下驅動程序的開發。并以此為基礎,提出了一種利用WinDrive工具開發PCI總線設備驅動程序的軟件架構。
1 Windows操作系統驅動開發
Windows操作系統以其友好的用戶圖形界面和強大的功能在工業控制計算機領域廣泛使用。但是Windows對系統底層操作進行了屏蔽,限制應用程序直接訪問硬件資源,應用程序需要調用設備的驅動程序訪問硬件資源,而開發Windows環境下的驅動程序,需要對操作系統內核的運行機制有深入的了解。
美國Jungo公司的WinDriver驅動程序工具包使程序設計人員不需要掌握Windows操作系統內核的相關內容,只需要調用WinDriver提供的接口函數就可以直接訪問系統硬件資源,減輕了設計人員的開發難度。WinDriver同時支持PCI/CardBus/ISA/ISAPnP/EISA/CompactPCI和USB等多種總線結構。
WinDriver驅動程序的體系結構如圖1所示。

利用WinDriver開發驅動,可以使用內核插入模式和用戶模式。內核插入模式效率高,但編寫復雜,需要編寫者對操作系統內核和微軟提供的DDK(Device Driver Kits)都有深入的了解。用戶模式下,開發人員通過WinDriver Wizard圖形化界面的引導:首先,生成所要開發設備的.inf文件,其次,生成設備驅動程序源代碼模板。該模板由三部分組成:1)WinDriver提供給用戶的設備訪問庫函數WDC Lib;2)Win Driv er所產生的設備操作例程,用以檢查設備的硬件功能是否正常;3)用戶開發環境,包括:Visual Studio、Delphi等。
2 XR17D158工作原理
2.1 XR17D158簡介
XR17D158是EXAR公司生產的一款PCI總線UART芯片,符合PCI2,3規范。XR17D158擁有8路獨立的UART接口,每路UART接口兼容16C550的配置寄存器和64字節的發送/接收FIFO。XR17D158每路UART接口的數據傳輸速率可進行設置,最高速率可達921.6kbps。
XR17D158內部的寄存器用來實現PCI設備的配置、芯片自身的狀態監控和串行數據的接收和發送。X86體系結構下,系統上電后,BIOS將讀取XR17D158的PCI信息,根據系統的硬件架構為XR17D158分配存儲地址、端口地址和中斷號等信息。并將信息寫入PCI配置寄存器中,例如系統會將XR17D158的UART配置寄存器基地址寫入BAR0(10H)中。
2.2 XR17D158芯片配置
2.2.1 波特率設置
XR17D158的8路UART接口可以配置不同的波特率,波特率計算公式為:

式(1)中,MCR[7]代表域分頻系數,分頻系數由每路UART接口的DLM和DLL寄存器控制,對一路UART接口的波特率配置步驟如下:
(1)LCR[7]置1,使能DLM、DLL寄存器;
(2)EFR[4]置1,使能MCR[7:5];
(3)設置MCR[7],MCR[7]=0,預分頻系數為1,MCR[7]=1,預分頻系數為4;
(4)設定分頻系數,根據所要設定的波特率,利用式(1)計算分頻系數,并將分頻系數寫入DLM、DLL寄存器中;
(5)EFR[4]清0,鎖存MCR[7]。
2.2.2 UART接口數據接收
UART接口的數據接收部分由接收移位寄存器(RSR)和接收保持寄存器(RHR)組成,RSR檢測接收到的每一位數據的有效性,當檢測到停止位時,表明一個字符接收完畢,RSR將數據裝入RHR中。數據準備好中斷(ISR[2]=1)會在數據裝入RHR,或者在接收FIFO使能并且接收數據達到設定的FIFO觸發條件時產生。處理器可以利用查詢方式和中斷方式讀取XR17D158接收FIFO的數據。兩種方式實現的步驟為:
(1)查詢方式:1)設置UART通道的波特率;2)中斷使能寄存器[IER]清0,禁止所有中斷;3)讀取線路狀態寄存器(LSR);4)如果LSR[0]=0,表示RHR或者接收FIFO中沒有數據,等待一定時間后,重復第3)步;5)如果LSR[0]=1,表示RHR或者接收FIFO中已經保存有接收到的數據,此時讀取RHR中的數據,并重復第3)步。
(2)中斷方式:1)設置UART通道的波特率;2)IER[0]置1,使能RHR中斷;3)當PCI總線上產生中斷時,讀取INT0寄存器,確定產生中斷的通道號;4)讀取INT1、INT2、INT3寄存器,確定產生中斷的UART接口序號和中斷源;5)讀取RHR中的數據。
2.2.3 UART通道數據發送
發送數據過程,有效數據由主機寫入UART接口中的發送FIFO寄存器,當發送保持寄存器(THR)清空標志位ISR[1]=1,表示發送FIFO中的數據減少到滿足設定的觸發中斷條件而引起中斷,在輸出移位寄存器(TSR)中,由發送控制邏輯在待發送數據加上起始位、奇偶校驗位和終止位,并按設定的時鐘頻率逐位移出數據。
3 開發實例
使用WinDriver用戶模式開發的驅動程序,實則是為上層的應用程序提供一組訪問設備的接口函數,實現應用程序對設備的初始化、讀操作、寫操作和設置等。
XR17D158的驅動程包含:UART接口打開函數XR17D158_Open()、UART接口讀函數XR17D158_Read()、UART寫函數XR17D158 Write()和UART接口關閉函數XR17D158 Close()。為了提高驅動效率,可以在內存中分別開辟一個接收緩沖區和一個發送緩沖區,XR17D158 Read()和XR17 D158 Write()不直接訪問硬件設備,而是通過對內存緩沖區的讀寫,實現對XR17D158的讀操作和寫操作。本文提出的驅動程序架構如圖2所示。

評論