新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PCI9052接口芯片的配置及驅(qū)動(dòng)程序開(kāi)發(fā)

PCI9052接口芯片的配置及驅(qū)動(dòng)程序開(kāi)發(fā)

作者: 時(shí)間:2012-03-21 來(lái)源:網(wǎng)絡(luò) 收藏

2.1 在操作系統(tǒng)體系結(jié)構(gòu)中的位置

操作系統(tǒng)結(jié)構(gòu)可分為五層模型:

(1)用戶應(yīng)用程序;

(2)IO管理層;

(3);

(4)HAL(硬件抽象層);

(5)硬件。

圖2給出了Windows2000操作系統(tǒng)開(kāi)發(fā)者所關(guān)心的特征,一般情況下,軟件要么在用戶模式中執(zhí)行,要么在內(nèi)核模式下執(zhí)行。從驅(qū)動(dòng)開(kāi)發(fā)的角度上看,WDM模型為存在于Win-dows2000系統(tǒng)中的驅(qū)動(dòng)程序提供了一個(gè)參考框架。作為Windows2000系統(tǒng)結(jié)構(gòu)開(kāi)發(fā)人員,由于操作系統(tǒng)為應(yīng)用程序,而在驅(qū)動(dòng)程序和硬件之間提供有系統(tǒng)服務(wù)接口和平臺(tái)相關(guān)操作,因此,設(shè)計(jì)時(shí)只需要關(guān)注應(yīng)用程序和設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)。

2.2 設(shè)備資源

PCI設(shè)備的硬件資源分配與管理是驅(qū)動(dòng)程序很重要的部分,設(shè)備的硬件資源包括內(nèi)存空間、I/O空間和中斷。由于PCI總線為PnP總線,PCI設(shè)備的硬件資源是由PCI配置機(jī)構(gòu)動(dòng)態(tài)分配給PCI配置寄存器的,因此,驅(qū)動(dòng)程序首先需要取得這些資源才能操作硬件。當(dāng)PnP管理器檢測(cè)到PCI設(shè)備時(shí),系統(tǒng)就會(huì)發(fā)送IRP_MN_START_DEVICE的IRP給驅(qū)動(dòng)程序,驅(qū)動(dòng)程序調(diào)用ONStartDevice以啟動(dòng)例程處理,并在啟動(dòng)例程里獲取該IRP棧,同時(shí)把它包含的系統(tǒng)分配給該設(shè)備的資源信息。

用DriverStudio開(kāi)發(fā)驅(qū)動(dòng)程序時(shí),應(yīng)在Wizard中設(shè)置好PCI設(shè)備的資源。對(duì)于實(shí)際的設(shè)備卡,其基地址寄存器0和1分別固定用于局部寄存器的內(nèi)存映射地址和I/O映射地址,基地址寄存器2則用于設(shè)備卡的內(nèi)存映射地址,并使用局部中斷引腳來(lái)產(chǎn)生PCI中斷,以分別生成對(duì)應(yīng)的KIoRange類(lèi)、KMemoryRange類(lèi)和KInterrupt類(lèi)。這些配置信息由配置管理器發(fā)送到OnStartDevice中重載該成員函數(shù),而開(kāi)發(fā)者則不必再處理。在一般情況下,驅(qū)動(dòng)程序無(wú)需再訪問(wèn)PCI設(shè)備的配置空間,如果需要訪問(wèn),則可通過(guò)類(lèi)KPciConfiguration,該類(lèi)包含了通過(guò)向PCI總線發(fā)送瀆寫(xiě)配置空間的IRP操作。也可定義類(lèi)KRe-sourceAssignment來(lái)獲取PCI的端口地址和中斷號(hào)以及內(nèi)存地址和大小,并把得到的資源放在用戶自己定義的變量中。

2.3 WDM驅(qū)動(dòng)程序?qū)τ布Y源的訪問(wèn)

獲取設(shè)備的硬件資源以后,就可以對(duì)硬件資源進(jìn)行訪問(wèn)了。對(duì)硬件的訪問(wèn)一般包括I/O端口訪問(wèn)和內(nèi)存訪問(wèn),它們分別對(duì)應(yīng)PCI配置空間的I/O空間和內(nèi)存空間。從圖2可以看出,當(dāng)應(yīng)用程序需要訪問(wèn)設(shè)備時(shí),它就會(huì)調(diào)用Win32API函數(shù)(如ReadFile)。Win32子系統(tǒng)模塊通過(guò)調(diào)用平臺(tái)相關(guān)的系統(tǒng)服務(wù)接口實(shí)現(xiàn)該API,而平臺(tái)相關(guān)的系統(tǒng)服務(wù)則調(diào)用內(nèi)核模式來(lái)支持例程。即在調(diào)用ReadFile函數(shù)時(shí),首先到達(dá)系統(tǒng)的人口點(diǎn),然后調(diào)用系統(tǒng)服務(wù)接口,最后由系統(tǒng)調(diào)用內(nèi)核模式的服務(wù)例程。執(zhí)行時(shí)首先檢查傳遞給它們的參數(shù),然后創(chuàng)建一個(gè)“I/O請(qǐng)求包(IRP)”的數(shù)據(jù)結(jié)構(gòu),并把這個(gè)數(shù)據(jù)結(jié)構(gòu)送到某個(gè)驅(qū)動(dòng)程序的入口點(diǎn)執(zhí)行IRP設(shè)備驅(qū)動(dòng)程序,最后再訪問(wèn)硬件。對(duì)于PIO方式的設(shè)備,一個(gè)IRP_MJ_READ操作將直接讀取設(shè)備的端口或設(shè)備的內(nèi)存寄存器。一般會(huì)使用硬件抽象層(HAL)來(lái)訪問(wèn)硬件。IRP貫穿于驅(qū)動(dòng)程序之間,它在應(yīng)用程序、驅(qū)動(dòng)程序和設(shè)備之間起著橋梁作用,可稱之為內(nèi)核態(tài)的“消息”。驅(qū)動(dòng)程序完成一個(gè)I/O操作后,可通過(guò)調(diào)用一個(gè)特殊內(nèi)核模式服務(wù)例程來(lái)完成該IRP,完成操作時(shí)再處理IRP的最后工作,以它使等待的應(yīng)用程序恢復(fù)運(yùn)行。

用DriverStudio開(kāi)發(fā)驅(qū)動(dòng)程序時(shí),可根據(jù)配置聲明KIoRange類(lèi)、KMemoryRange類(lèi)和KInterrupt類(lèi)來(lái)實(shí)現(xiàn)對(duì)內(nèi)存空間、I/O空間、中斷的操作。在本例中,基地址寄存器0和1固定用于芯片的操作寄存器內(nèi)存映射地址和I/O映射地址,基地址寄存器2則用于雙口RAM的內(nèi)存映射。通過(guò)一個(gè)外部引腳即可產(chǎn)生中斷。標(biāo)識(shí)兩個(gè)KMem-oryRange類(lèi)實(shí)例、一個(gè)KIoRange類(lèi)實(shí)例和一個(gè)KInterrupt類(lèi)實(shí)例的具體實(shí)現(xiàn)細(xì)節(jié)如下:

(1) I/O端口的訪問(wèn)

I/O端口的訪問(wèn)流程如圖3所示,應(yīng)用程序通過(guò)API函數(shù)DeviceIoControl的調(diào)用,并調(diào)用驅(qū)動(dòng)程序的分發(fā)例程DeviceControl,同時(shí)通過(guò)KIoRange類(lèi)來(lái)實(shí)現(xiàn)對(duì)I/O映射空間的訪問(wèn)。需要注意的是,當(dāng)DeviceloControl異步調(diào)用的時(shí)候,必須在驅(qū)動(dòng)程序中添加取消例程,并在DeviceControl例程中阻止一個(gè)應(yīng)用程序?qū)ζ涞亩啻握{(diào)用。KIoRange類(lèi)的成員函數(shù)outb、inb、outw、inw、ind、outd可分別用于從端口讀或?qū)懸粋€(gè)字節(jié)、字和雙字?jǐn)?shù)據(jù)。在WDM中,對(duì)于I/O端口,系統(tǒng)可將其看成寄存器,一般用于數(shù)字傳輸量比較小的地方。在對(duì)PCI設(shè)備的訪問(wèn)中,I/O端口的訪問(wèn)通常比較頻繁。



評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉