基于WinDriver的多路串行設(shè)備驅(qū)動(dòng)開(kāi)發(fā)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
摘要:工業(yè)控制計(jì)算機(jī)中廣泛使用串行接口UART與外圍設(shè)備進(jìn)行通信,同時(shí),Windows操作系統(tǒng)以其友好的UI界面被廣泛采用。文中闡述了UART設(shè)備的工作原理,并利用Jungo公司的WinDriver軟件實(shí)現(xiàn)了Windows操作系統(tǒng)下一種PCI轉(zhuǎn)多路UART設(shè)備的驅(qū)動(dòng)開(kāi)發(fā)。
0 引言
XR17D158是在工業(yè)控制計(jì)算機(jī)中被廣泛使用的一種PCI轉(zhuǎn)8路UART接口芯片。本文首先介紹Window操作系統(tǒng)驅(qū)動(dòng)程序和開(kāi)發(fā)工具Win Driv er軟件,并通過(guò)該軟件完成XR17D158在Windows系統(tǒng)下驅(qū)動(dòng)程序的開(kāi)發(fā)。并以此為基礎(chǔ),提出了一種利用WinDrive工具開(kāi)發(fā)PCI總線設(shè)備驅(qū)動(dòng)程序的軟件架構(gòu)。
1 Windows操作系統(tǒng)驅(qū)動(dòng)開(kāi)發(fā)
Windows操作系統(tǒng)以其友好的用戶圖形界面和強(qiáng)大的功能在工業(yè)控制計(jì)算機(jī)領(lǐng)域廣泛使用。但是Windows對(duì)系統(tǒng)底層操作進(jìn)行了屏蔽,限制應(yīng)用程序直接訪問(wèn)硬件資源,應(yīng)用程序需要調(diào)用設(shè)備的驅(qū)動(dòng)程序訪問(wèn)硬件資源,而開(kāi)發(fā)Windows環(huán)境下的驅(qū)動(dòng)程序,需要對(duì)操作系統(tǒng)內(nèi)核的運(yùn)行機(jī)制有深入的了解。
美國(guó)Jungo公司的WinDriver驅(qū)動(dòng)程序工具包使程序設(shè)計(jì)人員不需要掌握Windows操作系統(tǒng)內(nèi)核的相關(guān)內(nèi)容,只需要調(diào)用WinDriver提供的接口函數(shù)就可以直接訪問(wèn)系統(tǒng)硬件資源,減輕了設(shè)計(jì)人員的開(kāi)發(fā)難度。WinDriver同時(shí)支持PCI/CardBus/ISA/ISAPnP/EISA/CompactPCI和USB等多種總線結(jié)構(gòu)。
WinDriver驅(qū)動(dòng)程序的體系結(jié)構(gòu)如圖1所示。
利用WinDriver開(kāi)發(fā)驅(qū)動(dòng),可以使用內(nèi)核插入模式和用戶模式。內(nèi)核插入模式效率高,但編寫(xiě)復(fù)雜,需要編寫(xiě)者對(duì)操作系統(tǒng)內(nèi)核和微軟提供的DDK(Device Driver Kits)都有深入的了解。用戶模式下,開(kāi)發(fā)人員通過(guò)WinDriver Wizard圖形化界面的引導(dǎo):首先,生成所要開(kāi)發(fā)設(shè)備的.inf文件,其次,生成設(shè)備驅(qū)動(dòng)程序源代碼模板。該模板由三部分組成:1)WinDriver提供給用戶的設(shè)備訪問(wèn)庫(kù)函數(shù)WDC Lib;2)Win Driv er所產(chǎn)生的設(shè)備操作例程,用以檢查設(shè)備的硬件功能是否正常;3)用戶開(kāi)發(fā)環(huán)境,包括:Visual Studio、Delphi等。
2 XR17D158工作原理
2.1 XR17D158簡(jiǎn)介
XR17D158是EXAR公司生產(chǎn)的一款PCI總線UART芯片,符合PCI2,3規(guī)范。XR17D158擁有8路獨(dú)立的UART接口,每路UART接口兼容16C550的配置寄存器和64字節(jié)的發(fā)送/接收FIFO。XR17D158每路UART接口的數(shù)據(jù)傳輸速率可進(jìn)行設(shè)置,最高速率可達(dá)921.6kbps。
XR17D158內(nèi)部的寄存器用來(lái)實(shí)現(xiàn)PCI設(shè)備的配置、芯片自身的狀態(tài)監(jiān)控和串行數(shù)據(jù)的接收和發(fā)送。X86體系結(jié)構(gòu)下,系統(tǒng)上電后,BIOS將讀取XR17D158的PCI信息,根據(jù)系統(tǒng)的硬件架構(gòu)為XR17D158分配存儲(chǔ)地址、端口地址和中斷號(hào)等信息。并將信息寫(xiě)入PCI配置寄存器中,例如系統(tǒng)會(huì)將XR17D158的UART配置寄存器基地址寫(xiě)入BAR0(10H)中。
2.2 XR17D158芯片配置
2.2.1 波特率設(shè)置
XR17D158的8路UART接口可以配置不同的波特率,波特率計(jì)算公式為:
式(1)中,MCR[7]代表域分頻系數(shù),分頻系數(shù)由每路UART接口的DLM和DLL寄存器控制,對(duì)一路UART接口的波特率配置步驟如下:
(1)LCR[7]置1,使能DLM、DLL寄存器;
(2)EFR[4]置1,使能MCR[7:5];
(3)設(shè)置MCR[7],MCR[7]=0,預(yù)分頻系數(shù)為1,MCR[7]=1,預(yù)分頻系數(shù)為4;
(4)設(shè)定分頻系數(shù),根據(jù)所要設(shè)定的波特率,利用式(1)計(jì)算分頻系數(shù),并將分頻系數(shù)寫(xiě)入DLM、DLL寄存器中;
(5)EFR[4]清0,鎖存MCR[7]。
2.2.2 UART接口數(shù)據(jù)接收
UART接口的數(shù)據(jù)接收部分由接收移位寄存器(RSR)和接收保持寄存器(RHR)組成,RSR檢測(cè)接收到的每一位數(shù)據(jù)的有效性,當(dāng)檢測(cè)到停止位時(shí),表明一個(gè)字符接收完畢,RSR將數(shù)據(jù)裝入RHR中。數(shù)據(jù)準(zhǔn)備好中斷(ISR[2]=1)會(huì)在數(shù)據(jù)裝入RHR,或者在接收FIFO使能并且接收數(shù)據(jù)達(dá)到設(shè)定的FIFO觸發(fā)條件時(shí)產(chǎn)生。處理器可以利用查詢方式和中斷方式讀取XR17D158接收FIFO的數(shù)據(jù)。兩種方式實(shí)現(xiàn)的步驟為:
(1)查詢方式:1)設(shè)置UART通道的波特率;2)中斷使能寄存器[IER]清0,禁止所有中斷;3)讀取線路狀態(tài)寄存器(LSR);4)如果LSR[0]=0,表示RHR或者接收FIFO中沒(méi)有數(shù)據(jù),等待一定時(shí)間后,重復(fù)第3)步;5)如果LSR[0]=1,表示RHR或者接收FIFO中已經(jīng)保存有接收到的數(shù)據(jù),此時(shí)讀取RHR中的數(shù)據(jù),并重復(fù)第3)步。
(2)中斷方式:1)設(shè)置UART通道的波特率;2)IER[0]置1,使能RHR中斷;3)當(dāng)PCI總線上產(chǎn)生中斷時(shí),讀取INT0寄存器,確定產(chǎn)生中斷的通道號(hào);4)讀取INT1、INT2、INT3寄存器,確定產(chǎn)生中斷的UART接口序號(hào)和中斷源;5)讀取RHR中的數(shù)據(jù)。
2.2.3 UART通道數(shù)據(jù)發(fā)送
發(fā)送數(shù)據(jù)過(guò)程,有效數(shù)據(jù)由主機(jī)寫(xiě)入U(xiǎn)ART接口中的發(fā)送FIFO寄存器,當(dāng)發(fā)送保持寄存器(THR)清空標(biāo)志位ISR[1]=1,表示發(fā)送FIFO中的數(shù)據(jù)減少到滿足設(shè)定的觸發(fā)中斷條件而引起中斷,在輸出移位寄存器(TSR)中,由發(fā)送控制邏輯在待發(fā)送數(shù)據(jù)加上起始位、奇偶校驗(yàn)位和終止位,并按設(shè)定的時(shí)鐘頻率逐位移出數(shù)據(jù)。
3 開(kāi)發(fā)實(shí)例
使用WinDriver用戶模式開(kāi)發(fā)的驅(qū)動(dòng)程序,實(shí)則是為上層的應(yīng)用程序提供一組訪問(wèn)設(shè)備的接口函數(shù),實(shí)現(xiàn)應(yīng)用程序?qū)υO(shè)備的初始化、讀操作、寫(xiě)操作和設(shè)置等。
XR17D158的驅(qū)動(dòng)程包含:UART接口打開(kāi)函數(shù)XR17D158_Open()、UART接口讀函數(shù)XR17D158_Read()、UART寫(xiě)函數(shù)XR17D158 Write()和UART接口關(guān)閉函數(shù)XR17D158 Close()。為了提高驅(qū)動(dòng)效率,可以在內(nèi)存中分別開(kāi)辟一個(gè)接收緩沖區(qū)和一個(gè)發(fā)送緩沖區(qū),XR17D158 Read()和XR17 D158 Write()不直接訪問(wèn)硬件設(shè)備,而是通過(guò)對(duì)內(nèi)存緩沖區(qū)的讀寫(xiě),實(shí)現(xiàn)對(duì)XR17D158的讀操作和寫(xiě)操作。本文提出的驅(qū)動(dòng)程序架構(gòu)如圖2所示。
圖2中,XR17D158 Open()中注冊(cè)的中斷服務(wù)程序XR17D158 Handle()完成XR17158的數(shù)據(jù)接收與發(fā)送;XR17D158 Read()和XR17D158 Write()為應(yīng)用層提供讀/寫(xiě)接口,通過(guò)內(nèi)存緩沖區(qū)接收XR17D158_Handle()的數(shù)據(jù)或向XR17D158_Handle()發(fā)送數(shù)據(jù)。
XR17D158_Open()使用WDC_PciReadCfg()和WDC_PciWriteCfg()實(shí)現(xiàn)對(duì)XR17D158PCI配置空間的訪問(wèn),使用WDC_ReadAddr8()和WDC_Write Addr80實(shí)現(xiàn)對(duì)XR17D158中設(shè)備配置寄存器和UART配置寄存器的操作,如UART接口波特率的配置:
UAR了接口數(shù)據(jù)的讀取可以使用查詢方式或者接口方式,但是查詢方式要求處理器周期地對(duì)XR17D158的狀態(tài)進(jìn)行檢測(cè),處理器的效率較低。因此本文使用中斷的方式完成UART接口數(shù)據(jù)的接收和發(fā)送。中斷服務(wù)程序XR17D158 Handle()的工作過(guò)程過(guò)程如下:
XR17D158_Handle()實(shí)現(xiàn)UART接口和內(nèi)存緩沖區(qū)之間的數(shù)據(jù)交換,從內(nèi)存緩沖區(qū)中讀取XR17D158_Write()寫(xiě)入的數(shù)據(jù)實(shí)現(xiàn)數(shù)據(jù)的發(fā)送,向內(nèi)存緩沖區(qū)中寫(xiě)入U(xiǎn)ART接口接收的數(shù)據(jù),再由XR17D158_Read()讀取實(shí)現(xiàn)數(shù)據(jù)的接收。在XR17D158_Open()使用WDC_XR17D158_IntEnable()注冊(cè)XR17D158_Handle()。
4 結(jié)果驗(yàn)證
使用外部設(shè)備向XR17D158子卡發(fā)送RS232數(shù)據(jù),發(fā)送數(shù)據(jù)波特率為9600 bps,發(fā)送周期為1 Hz,通過(guò)示波器觀察XR17D158的接收數(shù)據(jù)波形。
圖3(a)為XR17D158接收到RS232數(shù)據(jù)的波形,圖3(b)為XR17D158所產(chǎn)生的中斷信號(hào)波形,中斷信號(hào)為低電平時(shí),驅(qū)動(dòng)程序處理XR17D158所接收到的數(shù)據(jù)。試驗(yàn)中,RS232數(shù)據(jù)為周期發(fā)送,每幀數(shù)據(jù)為90字節(jié),圖3中可以看出驅(qū)動(dòng)程序處理每幀數(shù)據(jù)的時(shí)間約為0.1ms,如果8路UART接口同時(shí)接收數(shù)據(jù),且波特率為921.6kbps,此時(shí)驅(qū)動(dòng)程序處理數(shù)據(jù)的時(shí)間約為100ms,不會(huì)出現(xiàn)丟數(shù)現(xiàn)象。
5 結(jié)束語(yǔ)
文中簡(jiǎn)單地介紹了WinDriver軟件工具的特點(diǎn)和驅(qū)動(dòng)產(chǎn)生的過(guò)程,并針對(duì)一種PCI轉(zhuǎn)UART設(shè)備XR17D158,提出了使用WinDriver開(kāi)發(fā)PCI設(shè)備驅(qū)動(dòng)的軟件架構(gòu)。此時(shí)Windows驅(qū)動(dòng)設(shè)備的開(kāi)發(fā)更像是Windows應(yīng)用程序的開(kāi)發(fā),僅在一個(gè)驅(qū)動(dòng)函數(shù)中使用WinDriVer提供的接口函數(shù),而無(wú)需觸及Windows內(nèi)核。此外該驅(qū)動(dòng)架構(gòu)不僅適用于XR17D158設(shè)備,還可應(yīng)用于其它PCⅡ設(shè)備,如PCI9056等。