PCI9052接口芯片的配置及驅動(dòng)程序開(kāi)發(fā)
2.1 驅動(dòng)程序在操作系統體系結構中的位置
操作系統結構可分為五層模型:
(1)用戶(hù)應用程序;
(2)IO管理層;
(3)驅動(dòng)程序;
(4)HAL(硬件抽象層);
(5)硬件。
圖2給出了Windows2000操作系統驅動(dòng)程序開(kāi)發(fā)者所關(guān)心的特征,一般情況下,軟件要么在用戶(hù)模式中執行,要么在內核模式下執行。從驅動(dòng)開(kāi)發(fā)的角度上看,WDM模型為存在于Win-dows2000系統中的驅動(dòng)程序提供了一個(gè)參考框架。作為Windows2000系統結構開(kāi)發(fā)人員,由于操作系統為應用程序,而在驅動(dòng)程序和硬件之間提供有系統服務(wù)接口和平臺相關(guān)操作,因此,設計時(shí)只需要關(guān)注應用程序和設備驅動(dòng)程序的開(kāi)發(fā)。
2.2 設備資源
PCI設備的硬件資源分配與管理是驅動(dòng)程序很重要的部分,設備的硬件資源包括內存空間、I/O空間和中斷。由于PCI總線(xiàn)為PnP總線(xiàn),PCI設備的硬件資源是由PCI配置機構動(dòng)態(tài)分配給PCI配置寄存器的,因此,驅動(dòng)程序首先需要取得這些資源才能操作硬件。當PnP管理器檢測到PCI設備時(shí),系統就會(huì )發(fā)送IRP_MN_START_DEVICE的IRP給驅動(dòng)程序,驅動(dòng)程序調用ONStartDevice以啟動(dòng)例程處理,并在啟動(dòng)例程里獲取該IRP棧,同時(shí)把它包含的系統分配給該設備的資源信息。
用DriverStudio開(kāi)發(fā)驅動(dòng)程序時(shí),應在Wizard中設置好PCI設備的資源。對于實(shí)際的PCI9052設備卡,其基地址寄存器0和1分別固定用于PCI9052局部寄存器的內存映射地址和I/O映射地址,基地址寄存器2則用于設備卡的內存映射地址,并使用局部中斷引腳來(lái)產(chǎn)生PCI中斷,以分別生成對應的KIoRange類(lèi)、KMemoryRange類(lèi)和KInterrupt類(lèi)。這些配置信息由配置管理器發(fā)送到OnStartDevice中重載該成員函數,而開(kāi)發(fā)者則不必再處理。在一般情況下,驅動(dòng)程序無(wú)需再訪(fǎng)問(wèn)PCI設備的配置空間,如果需要訪(fǎng)問(wèn),則可通過(guò)類(lèi)KPciConfiguration,該類(lèi)包含了通過(guò)向PCI總線(xiàn)發(fā)送瀆寫(xiě)配置空間的IRP操作。也可定義類(lèi)KRe-sourceAssignment來(lái)獲取PCI的端口地址和中斷號以及內存地址和大小,并把得到的資源放在用戶(hù)自己定義的變量中。
2.3 WDM驅動(dòng)程序對硬件資源的訪(fǎng)問(wèn)
獲取設備的硬件資源以后,就可以對硬件資源進(jìn)行訪(fǎng)問(wèn)了。對硬件的訪(fǎng)問(wèn)一般包括I/O端口訪(fǎng)問(wèn)和內存訪(fǎng)問(wèn),它們分別對應PCI配置空間的I/O空間和內存空間。從圖2可以看出,當應用程序需要訪(fǎng)問(wèn)設備時(shí),它就會(huì )調用Win32API函數(如ReadFile)。Win32子系統模塊通過(guò)調用平臺相關(guān)的系統服務(wù)接口實(shí)現該API,而平臺相關(guān)的系統服務(wù)則調用內核模式來(lái)支持例程。即在調用ReadFile函數時(shí),首先到達系統的人口點(diǎn),然后調用系統服務(wù)接口,最后由系統調用內核模式的服務(wù)例程。執行時(shí)首先檢查傳遞給它們的參數,然后創(chuàng )建一個(gè)“I/O請求包(IRP)”的數據結構,并把這個(gè)數據結構送到某個(gè)驅動(dòng)程序的入口點(diǎn)執行IRP設備驅動(dòng)程序,最后再訪(fǎng)問(wèn)硬件。對于PIO方式的設備,一個(gè)IRP_MJ_READ操作將直接讀取設備的端口或設備的內存寄存器。一般會(huì )使用硬件抽象層(HAL)來(lái)訪(fǎng)問(wèn)硬件。IRP貫穿于驅動(dòng)程序之間,它在應用程序、驅動(dòng)程序和設備之間起著(zhù)橋梁作用,可稱(chēng)之為內核態(tài)的“消息”。驅動(dòng)程序完成一個(gè)I/O操作后,可通過(guò)調用一個(gè)特殊內核模式服務(wù)例程來(lái)完成該IRP,完成操作時(shí)再處理IRP的最后工作,以它使等待的應用程序恢復運行。
用DriverStudio開(kāi)發(fā)驅動(dòng)程序時(shí),可根據配置聲明KIoRange類(lèi)、KMemoryRange類(lèi)和KInterrupt類(lèi)來(lái)實(shí)現對內存空間、I/O空間、中斷的操作。在本例中,基地址寄存器0和1固定用于PCI9052芯片的操作寄存器內存映射地址和I/O映射地址,基地址寄存器2則用于雙口RAM的內存映射。通過(guò)一個(gè)外部引腳即可產(chǎn)生中斷。標識兩個(gè)KMem-oryRange類(lèi)實(shí)例、一個(gè)KIoRange類(lèi)實(shí)例和一個(gè)KInterrupt類(lèi)實(shí)例的具體實(shí)現細節如下:
(1) I/O端口的訪(fǎng)問(wèn)
I/O端口的訪(fǎng)問(wèn)流程如圖3所示,應用程序通過(guò)API函數DeviceIoControl的調用,并調用驅動(dòng)程序的分發(fā)例程DeviceControl,同時(shí)通過(guò)KIoRange類(lèi)來(lái)實(shí)現對I/O映射空間的訪(fǎng)問(wèn)。需要注意的是,當DeviceloControl異步調用的時(shí)候,必須在驅動(dòng)程序中添加取消例程,并在DeviceControl例程中阻止一個(gè)應用程序對其的多次調用。KIoRange類(lèi)的成員函數outb、inb、outw、inw、ind、outd可分別用于從端口讀或寫(xiě)一個(gè)字節、字和雙字數據。在WDM中,對于I/O端口,系統可將其看成寄存器,一般用于數字傳輸量比較小的地方。在對PCI設備的訪(fǎng)問(wèn)中,I/O端口的訪(fǎng)問(wèn)通常比較頻繁。
評論