




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、PCI設備驅動開發pci設備驅動開發2008-08-28 13:07PCI簡介PCI總線標準是一種將系統外部設備連接起來的總線標準,是PC中最重要的總線,實際上是系統的各個 部分如何交互的接口。傳輸速率可達到133MB/S。在當前的PC體系結構中,幾乎所有的外部設備采用 的各種各樣的接口總線,均是通過橋接電路掛接到PCI系統上。在這種PCI系統中,Host/PCI橋稱為 北橋,連接主處理器總線到基礎PCI局部總線。PCI與其他總線的接口稱為南橋,其中南橋還通常含有 中斷控制器、IDE控制器、USB控制器和DMA控制器等。南橋和北橋組成主板的芯片組。PCI配置空間每個PCI設備都有自己的配置空間
2、,用于支持即插即用,使之滿足現行的系統配置結構。下面對PCI配置 空間做一下簡要介紹。配置空間是一容量為256字節并具有特定結構的地址空間。這個空間又分為頭標區和設備有關區兩部分。 頭標區的長度是64字節,每個設備都必須配置該區的寄存器。該區中的各個字段用來唯一地識別設備。其 余的192字節因設備而異。配置空間的頭標區64個字節的使用情況如圖1示。為了實現即插即用,系統可根據硬件資源的使用情況,為PCI設備分配新的資源。因此編寫設備驅動程序 重點是獲得基址寄存器(Base Address)和中斷干線寄存器的內容。配置空間共有六個基址寄存器和一個 中斷干線寄存器,具體用法如下:PCI Base
3、Address 0寄存器:系統利用此寄存器為PCI接口芯片的配置寄存器分配一段PCI地址空間,通 過這段地址我們可以以內存映射的形式訪問PCI接口芯片的配置寄存器。PCI Base Address 1寄存器:系統利用此寄存器為PCI接口芯片的配置寄存器分配一段PCI地址空間,通 過這段地址我們可以以I/O的形式訪問PCI接口芯片的配置寄存器。PCI Base Address 2、3、4、5寄存器:系統BIOS利用這些寄存器分配PCI地址空間以支持PCI接口芯 片的局部配置寄存器0、1、2、3的訪問。在所有基址寄存器中,第0位均為只讀位,表示這段地址映射到存儲器空間還是I/O空間,如果是T表示
4、映射到I/O空間,如果是“0”則表示映射到存儲器空間。中斷干線寄存器(Interrupt Line):用于說明中斷線的連接情況,這個寄存器的值與標準8259的舊Q編 號(015)對應。Byte3Byte2Byte1Byte0Device IDVendor IDPCI StatusPCI CommandClass CodeRevision IDBuilt-In Self TestHeader TypeLatency TimerCacheLine SizeBase Address Register 0 5Reserved SpaceReserved SpaceExpansion ROM Base
5、Address Reserved Space Reserved SpaceMax. Latency Min. Grant Interrupt Pin Interrupt Line表1 PCI配置空間3.設備初始化PCI設備驅動程序要完成識別PCI器件、尋找PCI硬件的資源和對PCI器件中斷的服務。在驅動程序初 始化過程中,使用HalGetBusData()函數完成尋找PCI設備的工作。在初始化過程中,使用器件識別號 (Device ID)和廠商識別號(Vendor ID),通過遍歷總線上的所有設備,尋找到指定的PCI設備,并獲 取設備的總線號,器件號與功能號。通過這些配置信息,可以在系統中尋址
6、該設備的資源配置列表。在此之后,驅動程序需要從配置空間獲取硬件的參數。PCI設備的中斷號、端口地址的范圍(I/O)方式、 存儲器的地址與映射方式等,都可以從硬件資源列表數據結構中獲取。在Windows NT中,調用 HalAssignSlotResources()函數來獲得指定設備的資源列表數據結構指針,然后通過遍歷該列表中的所 有資源描述符,獲取該設備的I/O端口基地址與長度,中斷的中斷級、中斷向量與模式,存儲器基地址與 長度等硬件資源數據。我們設計的DMA通信采用總線主控方式進行通信,在設備初始化時需要對DMA適 配器進行初始化,使用HalGetAdapter()獲得操作系統分配的適配器對
7、象指針。示例代碼如下:/ 遍歷總線,獲得指定設備的總線號,器件號與功能號for ( busNumber = 0; busNumber MAX_PCI_BUSES; busNumber+ )(for ( deviceNumber = 0;deviceNumber PCI_MAX_DEVICES;deviceNumber+ )(slotNumber.u.bits.DeviceNumber = deviceNumber;for ( functionNumber = 0; functionNumber BusNumber = busNumber; pPciDeviceLocation-SlotNumb
8、er = slotNumber; pPciDeviceLocation = &PciDeviceList-List+count; status = STATUS_SUCCESS; /獲取設備的資源列表數據指針 status = HalAssignSlotResources(RegistryPath, &pDevExt-ClassUnicodeString, DriverObject, DeviceObject, pDevExt-InterfaceType, pDevExt-BusNumber, pDevExt-SlotNumber, &pCmResourceList );I/O端口訪問在PC機
9、上,I/O尋址方式與內存尋址方式不同,所以處理方法也不同。I/O空間是一個64K字節的尋址空 間,I/O尋址沒有實模式與保護模式之分,在各種模式下尋址方式相同。在Windows NT下,系統不允許 處于Ring3級的用戶程序和用戶模式驅動程序直接使用I/O指令,對I/O端口進行訪問,任何對I/O的操作 都需要借助內核模式驅動來完成。在訪問I/O端口時,使用READ_PORT_XXX與WRITE_PORT_XXX 函數來進行讀寫。I/O端口基地址使用從配置空間基址寄存器PCI Base Address 1中返回的I/O端口基地 址。示例代碼如下:RegValue = READ_PORT_ULON
10、G(pBaseAddr+RegOffSet); WRITE_PORT_ULONG(pBaseAddr+ RegOffset, RegValue);設備內存訪問Winsows工作在32位保護模式下,保護模式與實模式的根本區別在于CPU尋址方式上的不同,這也是 Windows驅動程序設計中需要著重解決的問題。Windows采用了分段、分頁機制,使得一個程序可以很 容易地在物理內存容量不一樣的、配置范圍差別很大的計算機上運行,編程人員使用虛擬存儲器可以寫出 比任何實際配置的物理存儲器都大得多的程序。每個虛擬地址由16位的段選擇字和32位段偏移量組成。 通過分段機制,系統由虛擬地址產生線性地址。再通過
11、分頁機制,由線性地址產生物理地址。線性地址被 分割成頁目錄(Page Directory)、頁表(Page Table)和頁偏移(Offset)三個部分。當建立一個新的Win32進 程時,操作系統會為它分配一塊內存,并建立它自己的頁目錄、頁表,頁目錄的地址也同時放入進程的現 場信息中。當計算一個地址時,系統首先從CPU控制器CR3中讀出頁目錄所在的地址,然后根據頁目錄 得到頁表所在的地址,再根據頁表得到實際代碼/數據頁的頁幀,最后再根據頁偏移訪問特定的單元。硬 件設備讀寫的是物理內存,但應用程序讀寫的是虛擬地址,所以存在著將物理內存地址映射到用戶程序線 性地址的問題。從物理內存到線性地址的轉換
12、是驅動程序需要完成的工作,可以在初始化驅動程序的進行。在已經獲得設 備的存儲器基地址后,首先調用HalTranslateBusAddress()函數將總線相關的內存地址轉換成系統的物理 地址,然后調用MmMapIoSpace()函數將系統的物理地址映射到線性地址空間。在需要訪問設備內存時, 調用READ_REGISTER_XXX()與WRITE_REGISTER_XXX ()函數來進行,基地址使用前面映射后的線性地址。在設備卸載時,調用MmUnmapIoSpace()斷開設備內存與線性地址空間的映射。示例代碼如下:HalTranslateBusAddress(InterfaceType,Bus
13、Number,BaseAddress-RangeStart,&addressSpace,&cardAddress)BaseAddress-MappedRangeStart = MmMapIoSpace(cardAddress,BaseAddress-RangeLength,MmCached);RegValue = READ_REGISTER_ULONG(pRegister);WRITE_REGISTER_ULONG(pRegister, pInBuf-RegValue);MmUnmapIoSpace(pBaseAddress-MappedRangeStart, pBaseAddress-Ran
14、geLength );中斷處理中斷的設置、響應與調用在驅動程序中完成。設置中斷應該在設備創建時完成,使用從CmResourceTypeInterrupt描述符中提取的參數,先調用HalGetInterruptVector()將與總線有關的中斷向量參數轉換為系統的中斷向量,然后調用IoConnectInterrupt()指定中斷服務,注冊中斷服務函數ISR (Interrupt Service Routine)的函數指針。當硬件設備產生中斷時,系統會自動調用ISR函數來響應中斷。ISR函數運行的中斷請求級較高,主要完 成對硬件設備中斷的清除,不適合執行過多的代碼。在傳輸大塊數據時,需要使用延遲過
15、程調用(Delay Process Call,DPC)機制。例如,使用PCI設備進行DMA通信時,在ISR函數中完成對指定設備中斷 的判斷以及清除中斷,在退出ISR前,調用DPC函數;在DPC函數中,完成DMA通信的過程,并將數 據返回給用戶程序。示例代碼如下:DeviceExtension-InterruptLevel = partialData-u.Interrupt.Level;DeviceExtension-InterruptVector = partialData-u.Interrupt.Vector;DeviceExtension-InterruptAffinity = parti
16、alData-u.Interrupt.Affinity;if (partialData-Flags & CM_RESOURCE_INTERRUPT_LATCHED)(DeviceExtension-InterruptMode = Latched;else(DeviceExtension-InterruptMode = LevelSensitive;vector = HalGetInterruptVector(pDevExt-InterfaceType, pDevExt-BusNumber,pDevExt-InterruptLevel,pDevExt-InterruptVector,&irql,
17、&affinity);status = IoConnectInterrupt(&pDevExt-InterruptObject,(PKSERVICE_ROUTINE)PciDmaISR,DeviceObject,NULL,vector,irql,irql,pDevExt-InterruptMode,TRUE,affinity,FALSE);7. DMA通信過程DMA通信在驅動程序中實現,需要多個例程才能完成一次DMA通信。DriverEntry 例程構造DEVICE_DESCRIPTION結構,并調用HalGetAdapter,找到與設備關聯的Adapter對象,并將返回的Adapter對象的
18、地址和映射寄存器的數目保存在設備擴展的數據結構中。示例代碼:/申請DMA的適配器對象deviceDescription.Version = DEVICE_DESCRIPTION_VERSION;deviceDescription.Master = TRUE;deviceDescription.ScatterGather = pDevExt-ScatterGather;deviceDescription.DemandMode = FALSE;deviceDescription.AutoInitialize = FALSE;deviceDescription.Dma32BitAddresses =
19、 TRUE;deviceDescription.BusNumber = pDevExt-BusNumber;deviceDescription.InterfaceType = pDevExt-InterfaceType;deviceDescription.MaximumLength = pDevExt-MaxTransferLength;pDevExt-AdapterObject = HalGetAdapter(&deviceDescription,&numberOfMapRegisters );2)Start I/O 例程該例程請求Adapter對象的擁有權,然后把其余的工作留給AdapterControl回調例程。a)調用KeFlushIoBuffers從CPU的Cache把數據清到物理內存,然后計算映射寄存器的數目和用戶緩沖 區的大
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025【廣告位承包租賃合同書】房屋租賃合同范本
- 2025企業租賃合同范例
- 2025網絡安全保險合同書
- 2025存量房買賣合同示范文本(版)
- 2025年墻壁粉刷工程施工合同
- 安徽省滁州市2024-2025學年高二下學期期中英語試題(含答案)
- 環保招租廠房合同協議
- 環保閥門采購合同協議
- 生存物資采購合同協議
- 電力遷改施工合同協議
- 腕踝針療法完整版本
- 提升質量意識-強化質量管理
- 大眾傳媒文化智慧樹知到期末考試答案章節答案2024年復旦大學
- 2024年《網絡反不正當競爭暫行規定》重點解讀
- NB-T20048-2011核電廠建設項目經濟評價方法
- 河南省信陽市固始縣2023-2024學年四年級下學期期末數學試題
- 修補外墻防水合同
- 20萬噸有機肥項目可行性研究報告
- 合作社用地租賃合同樣本
- 2024-2030年中國街舞培訓行業市場發展現狀及競爭格局與投資戰略研究報告
- 大學寫作訓練(第四版)課件 第15章 微型小說
評論
0/150
提交評論