PCI裝置驅動

2021-06-22 15:17:04 字數 2667 閱讀 9291

pci匯流排

一種將系統外部裝置連線起來的匯流排標準。如isa、usb匯流排都掛載在pci匯流排上。

開發pci裝置驅動,需要獲取pci配置空間的各個資料。

基礎pci區域性匯流排與主處理器相連線的host/pci稱為北橋

基礎pci匯流排與中斷控制器、ide控制器、usb控制器、dma控制器和isa匯流排的 稱為南橋。

pci配置空間:

系統加電時,bios檢測pci匯流排,確定所有連線的pci上的裝置以及它們的配置要求,進行系統配置。所有的pci裝置必須有配置空間,從而能夠實現引數的自動配置,實現真正的即插即用。

配置空間總共256位元組:

前64位元組:配置頭,主要用來識別裝置,定義主機訪問pci的方式(io訪問或者儲存器訪問、中斷資訊)。

剩餘192位元組:本地配置空間:

訪問pci配置空間:

方法一:通過io埠直接讀取

訪問2個重要的暫存器,config_address暫存器和config_data暫存器。在pc中分別對應著埠cf8h和cfch,並且是32位埠(ulong)

config_address結構如下:對應著3個資訊進行定位:busnumber、devicenumber、functionnumber。

另外配置空間為564個位元組,被分解為64個4位元組的暫存器,從0-63編號。

例如訪問:busnumber=0,devicenumber=1,functionnumber=2的pci配置空間中的status和command。

首先檢視status和command在pci的配置空間位於第1號暫存器,填寫config_address。然後檢視config_data的內容(status在高16位,comand在低16位)

**:

void dispaly_pci_configspace(ulong ubus,ulong udev,ulong ufunc)

kdprint(("bus:%d\tdev:%d\tfunc:%d\n",ubus,udev,ufunc));

kdprint(("vendorid:%x\n",pciconfig.vendorid));

kdprint(("deviceid:%x\n",pciconfig.deviceid));

kdprint(("command:%x\n",pciconfig.command));

kdprint(("status:%x\n",pciconfig.status));

kdprint(("revisionid:%x\n",pciconfig.revisionid));

kdprint(("progif:%x\n",pciconfig.progif));

kdprint(("subclass:%x\n",pciconfig.subclass));

kdprint(("baseclass:%x\n",pciconfig.baseclass));

kdprint(("cachelinesize:%x\n",pciconfig.cachelinesize));

kdprint(("latencytimer:%x\n",pciconfig.latencytimer));

kdprint(("headertype:%x\n",pciconfig.headertype));

kdprint(("bist:%x\n",pciconfig.bist));

for (int i=0;i<6;i++)

kdprint(("interruptline:%d\n",pciconfig.u.type0.interruptline));

kdprint(("interruptpin:%d\n",pciconfig.u.type0.interruptpin));

}

方法二:

使用ddk提供的兩個核心函式,halgetbusdata halsetbusdata,這2個函式微軟已經不推薦使用,遺留下來只是為了相容性。適用於nt模型的驅動。

#define pci_bus_max 0xff

#define pci_device_max 0x1f

#define pci_func_max 0x7

void enumpciconfig()

{ ulong ubus = 0;

ulong udev = 0;

ulong ufunc = 0;

pci_common_config pciconfig;

pci_slot_number pcislotnum;

rtlzeromemory(&pciconfig,sizeof(pci_common_config));

rtlzeromemory(&pcislotnum,sizeof(pci_slot_number));

kdprint(("enumpciconfig enter...\n"));

kdprint(("bus\tdevice\tfunc\tvendor\tdevice\tbasecls\tsubcls\tirq\tpin\n"));

//列舉匯流排號

for (ubus=0;ubus

**暫時略。。。

方法四:

在wdm模型的驅動中,建立irp_mn_read_config和irp_mn_write_config來獲得完整的256位元組的pci的配置空間。此驅動必須是乙個真實的裝置,不能為虛擬裝置。

**暫時略。。。

待續。。更新。。。

遍歷PCI裝置

pc機在啟動的時候,都會看到乙個pci裝置清單,可以看到機器中的所有pci裝置,其實搜尋pci裝置的程式並不難編,本文通過乙個例項說明如何遍歷pci裝置。工作環境 ms dos 6.22,djgpp rhide 1 了解pci裝置 pci的含義是外設部件互連 peripheral component...

遍歷PCI裝置

原文 該文在2011年3月11日做過修改,其中 已為完整 pc機在啟動的時候,都會看到乙個pci裝置清單,可以看到機器中的所有pci裝置,其實搜尋pci裝置的程式並不難編,本文通過乙個例項說明如何遍歷pci裝置。工作環境 ms dos 6.22,djgpp rhide 1 了解pci裝置 pci的含...

PCI 裝置解析(一)

pci匯流排在目前計算機匯流排系統中佔據舉足輕重的地位,其良好的擴充套件性,位址統一分配和匯流排競爭的處理相對於其他匯流排而言都具有絕對優勢。reference 擴充套件性 pci匯流排上存在若干pci裝置插槽,當pci插槽無法滿足需求,就可以通過pci橋擴充套件pci裝置,乙個pci橋把乙個pci...