Peripheral Component Interconnect
Peripheral Component Interconnect (kurz PCI) ist ein Bus zur leichten Verbindung von Peripheriegeräten mit der CPU.
Inhaltsverzeichnis
- 1 Konfigurations-Register
- 2 Classcodes
- 2.1 Class 0x00 - Pre 2.0
- 2.2 Class 0x01 - Massenspeicher
- 2.3 Class 0x02 - Netzwerk-Controller
- 2.4 Class 0x03 - Bildschirm-Controller
- 2.5 Class 0x04 - Multimedia-Geräte
- 2.6 Class 0x05 - Speicher-Controller
- 2.7 Class 0x06 - Bridge-Geräte
- 2.8 Class 0x07 - Controller zur einfachen Kommunikation
- 2.9 Class 0x08 - System-Peripherie
- 2.10 Class 0x09 - Input-Geräte
- 2.11 Class 0x0A - Docking-Stationen
- 2.12 Class 0x0B - Prozessoren
- 2.13 Class 0x0C - Serielle Buscontroller
- 2.14 Class 0x0D - Wireless-Controller
- 2.15 Class 0x0E - Intelligente Controller
- 2.16 Class 0x0F - Satelliten-Kommunikations-Controller
- 2.17 Class 0x10 - Encryption/Decryption-Controller
- 2.18 Class 0x11 - Datenerfassungs- und Signalprozessor-Controller
- 3 Weblinks
Konfigurations-Register
Jedes PCI-Gerät besitzt ein Konfigurations-Register, welches 256 Byte groß ist. Gelesen und beschrieben wird es 32bit-weise mithilfe eines Adress-I/O-Ports (0xCF8) und eines Daten-I/O-Ports (0xCFC).
Aufbau des Adress-I/O-Ports
| 31 | 30-24 | 23-16 | 15-11 | 10-8 | 7-0 |
|---|---|---|---|---|---|
| Enable Bit | Reserviert | Busnummer | Gerätenummer | Funktionsnummer | Registernummer bit0 u. bit1 sind 0 |
Aufbau des Konfigurations-Adressraum
| Register | 31-24 | 23-16 | 15-8 | 7-0 |
|---|---|---|---|---|
| 0x00 | Device ID | Vendor ID | ||
| 0x04 | Status | Command | ||
| 0x08 | Classcode | Revision ID | ||
| 0x0C | BIST | Header Type | Latency Timer | Cache Line Size |
Die ersten 16 Byte sind für alle PCI-Geräte gleich.
- Die Vendor IDs werden von PCI-SIG verwaltet und den Herstellern zugewiesen. Der Wert 0xffff ist für den Fall reserviert, dass an dieser Stelle kein Gerät vorhanden ist.
- Die Device IDs verwalten die Hardwarehersteller selbst. Sie dient zusammen mit der Vendor ID der eindeutigen Identifikation des Gerätes.
- Classcode ist noch einmal geteilt. Die oberen 8 Bit repräsentieren die Base Class. Die mittleren 8 Bit stehen für die Subclass und die unter 8 Bit für das Programming Interface.
| Header Type | Kurze Beschreibung |
|---|---|
| 0x00 | Standard |
| 0x01 | PCI/PCI-Bridge |
| 0x02 | CardBus-Bridge |
- Header Type spezifiziert den Inhalt der Register 0x10-0x3C, wobei Bit 7 angibt ob es sich um ein Multifunction-Device handelt oder nicht.
Header Type 0x00
| Register | 31-24 | 23-16 | 15-8 | 7-0 |
|---|---|---|---|---|
| 0x10 | Base Address 0 (BAR0) | |||
| 0x14 | Base Address 1 (BAR1) | |||
| 0x18 | Base Address 2 (BAR2) | |||
| 0x1C | Base Address 3 (BAR3) | |||
| 0x20 | Base Address 4 (BAR4) | |||
| 0x24 | Base Address 5 (BAR5) | |||
| 0x28 | Cardbus CIS Pointer | |||
| 0x2C | Subsystem ID | Subsystem Vendor ID | ||
| 0x30 | Expansion ROM base address | |||
| 0x34 | Reserviert | Capabilities Pointer | ||
| 0x38 | Reserviert | |||
| 0x3C | Max Latency | Min Grant | Interrupt Pin | Interrupt Line |
Header Type 0x01
| Register | 31-24 | 23-16 | 15-8 | 7-0 |
|---|---|---|---|---|
| 0x10 | Base address 0 | |||
| 0x14 | Base address 1 | |||
| 0x18 | Secondary latency timer | Subordinate bus № | Secondary bus № | Primary bus № |
| 0x1C | Secondary Status | I/O Limit | I/O base | |
| 0x20 | Memory limit | Memory base | ||
| 0x24 | Prefetchable memory limit | Prefetchable memory base | ||
| 0x28 | Prefetchable base upper 32 bits | |||
| 0x2C | Prefetchable limit upper 32 bits | |||
| 0x30 | I/O limit upper 16 bits | I/O base upper 16 bits | ||
| 0x34 | Reserviert | Capabilities pointer | ||
| 0x38 | Extension ROM base address | |||
| 0x3C | Bridge control | Interrupt pin | Interrupt line | |
Bedeutung einiger Register
Command-Register
| Bit | Name | Bedeutung |
|---|---|---|
| 0 | IO Space | Nur wenn dieses Bit gesetzt ist, kann der I/O-Raum des Geräts verwendet werden, sonst ist er deaktiviert. |
| 1 | Memory Space | Nur wenn dieses Bit gesetzt ist, können MMIO-Register verwendet werden, sonst sind diese deaktiviert. |
| 2 | Bus Master | Ist dieses Bit gesetzt, so darf das Gerät als Busmaster auf dem PCI-Bus arbeiten. Das heißt, es kann ohne Aufforderung vom Host Daten senden und so z. B. in den Speicher schreiben (wichtig u. a. für Netzwerkkarten). |
| 3 | Special Cycles | Wenn dieses Bit gelöscht ist, dann muss das Gerät alle Special Cycles auf dem PCI-Bus ignorieren. |
| 4 | Memory Write and Invalidate Enable | Falls gesetzt, kann das Gerät diesen Befehl (Memory Write and Invalidate) ausführen, sonst muss es sich mit einem einfachen Memory Write begnügen. |
| 5 | VGA Palette Snoop | Dieses Bit ist nur für VGA-kompatible Geräte interessant (ist es gesetzt, so werden Zugriffe auf die VGA-Palettenregister gesondert behandelt). |
| 6 | Parity Error Response | Ist dieses Bit gelöscht, so wird bei Parityfehlern auf dem PCI-Bus das Detected-Parity-Error-Statusbit im Statusregister gesetzt. |
| 8 | SERR# Enable | TODO |
| 9 | Fast Back-to-Back Enable | TODO |
| 10 | Interrupt Disable | Ist dieses Flag gesetzt, dann kann das entsprechende Gerät keine IRQs auslösen. |
Bit 7 ist auf 0 zu setzen, Bits 11 bis 15 sind reserviert (und undefiniert). Nach dem Reset des Geräts sind alle hier aufgeführten Bits auf 0 gesetzt (wobei das BIOS wohl einige davon setzen wird).
Codebeispiel
<c>
- define PCI_CONFIG_DATA 0xCFC
- define PCI_CONFIG_ADDRESS 0xCF8
/**
* Liest ein Dword aus einem PCI-Konfigurations-Register * @param bus Bus * @param dev Gerät * @param func Funktion * @param offset Registernummer * @return Register content */
int pci_config_readd(int bus,int dev,int func,int offset) {
int val; int address = 0x80000000|(bus<<16)|(dev<<11)|(func<<8)|(offset&0xFC); outl(PCI_CONFIG_ADDRESS,address); val = inl(PCI_CONFIG_DATA); return val;
}
/**
* Schreibt ein Dword in in ein PCI-Konfigurations-Register * @param bus Bus * @param dev Gerät * @param func Funktion * @param offset Registernummer * @param val Wert zum Schreiben */
void pci_config_writed(int bus,int dev,int func,int offset,int val) {
int address = 0x80000000|(bus<<16)|(dev<<11)|(func<<8)|(offset&0xFC); outl(PCI_CONFIG_ADDRESS,address); outl(PCI_CONFIG_DATA,val);
} </c>
Classcodes
| Class | Beschreibung |
|---|---|
| 0x00 | Alle Geräte die gebaut wurden bevor Classcodes eingeführt wurden |
| 0x01 | Massenspeicher |
| 0x02 | Netzwerk-Controller |
| 0x03 | Bildschirm-Controller |
| 0x04 | Multimedia-Geräte |
| 0x05 | Speicher-Controller |
| 0x06 | Bridge-Geräte |
| 0x07 | Controller zur einfachen Kommunikation |
| 0x08 | System-Peripherie |
| 0x09 | Input-Geräte |
| 0x0A | Docking-Stationen |
| 0x0B | Prozessoren |
| 0x0C | Serielle Buscontroller |
| 0x0D | Wireless-Controller |
| 0x0E | Intelligente Controller |
| 0x0F | Satelliten-Kommunikations-Controller |
| 0x10 | Encryption/Decryption-Controller |
| 0x11 | Datenerfassungs- und Signalprozessor-Controller |
| 0x12-0xFE | Reserviert |
| 0xFF | Sonstige |
Class 0x00 - Pre 2.0
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Alle nicht- VGA-Geräte |
| 0x01 | 0x00 | VGA-Geräte |
Class 0x01 - Massenspeicher
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | SCSI |
| 0x01 | 0x?? | IDE |
| 0x02 | 0x00 | Floppy |
| 0x03 | 0x00 | IPI |
| 0x04 | 0x00 | RAID |
| 0x05 | 0x20 | ATA-Controller (Single DMA) |
| 0x05 | 0x30 | ATA-Controller (Chained DMA) |
| 0x80 | 0x00 | Anderer Massenspeicher |
Class 0x02 - Netzwerk-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Ethernet |
| 0x01 | 0x00 | Token Ring |
| 0x02 | 0x00 | FDDI |
| 0x03 | 0x00 | ATM |
| 0x04 | 0x00 | ISDN |
| 0x05 | 0x00 | World FIP (Feldbus) |
| 0x06 | 0x?? | PICMG 2.14, Multi-Computing |
| 0x80 | 0x00 | Anderer Netzwerk-Controller |
Class 0x03 - Bildschirm-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | VGA |
| 0x00 | 0x01 | 8514 |
| 0x01 | 0x00 | XGA |
| 0x02 | 0x00 | 3D |
| 0x80 | 0x00 | Anderer Bildschirm-Controller |
Class 0x04 - Multimedia-Geräte
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Video-Gerät |
| 0x01 | 0x00 | Audio-Gerät |
| 0x02 | 0x00 | Telefonie |
| 0x80 | 0x00 | Anderes Multimedia-Gerät |
Class 0x05 - Speicher-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | RAM |
| 0x01 | 0x00 | Flash-Speicher |
| 0x80 | 0x00 | Anderer Speicher |
Class 0x06 - Bridge-Geräte
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Host/PCI-Bridge |
| 0x01 | 0x00 | PCI/ISA-Bridge |
| 0x02 | 0x00 | PCI/EISA-Bridge |
| 0x03 | 0x00 | PCI/MicroChannel-Bridge |
| 0x04 | 0x00 | PCI/PCI-Bridge |
| 0x04 | 0x01 | PCI/PCI-Bridge (Subtractive Decode) |
| 0x05 | 0x00 | PCI/PCMCIA-Bridge |
| 0x06 | 0x00 | PCI/NuBus-Bridge |
| 0x07 | 0x00 | PCI/CardBus-Bridge |
| 0x08 | 0x?? | Raceway, Switched Fabric |
| 0x09 | 0x40 | Semitransparente PCI/PCI-Bridge
(primär zum Host) |
| 0x09 | 0x80 | Semitransparente PCI/PCI-Bridge (sekundär zum Host) |
| 0x0A | 0x00 | InfiniBand/PCI-Brige |
| 0x80 | Anderer Bridge-Typ |
Class 0x07 - Controller zur einfachen Kommunikation
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Serielle Schnittstelle
(XT-kompatibel) |
| 0x00 | 0x01 | Serielle Schnittstelle (16450) |
| 0x00 | 0x02 | Serielle Schnittstelle (16550) |
| 0x00 | 0x03 | Serielle Schnittstelle (16650) |
| 0x00 | 0x04 | Serielle Schnittstelle (16750) |
| 0x00 | 0x05 | Serielle Schnittstelle (16850) |
| 0x00 | 0x06 | Serielle Schnittstelle (16950) |
| 0x01 | 0x00 | Parallelport
(Standard) |
| 0x01 | 0x01 | Parallelport (Bidirektional) |
| 0x01 | 0x02 | Parallelport (ECP 1.0) |
| 0x01 | 0x03 | Parallelport (IEEE 1284) |
| 0x01 | 0xFE | IEEE-1284-Gerät, Target |
| 0x02 | 0x00 | Multiport Serial Controller |
| 0x03 | 0x00 | Standard-Modem |
| 0x03 | 0x01 | Hayes-kompatibles Modem (16450) |
| 0x04 | 0x00 | GPIB (IEEE488.1/2) Controller |
| 0x04 | 0x02 | Hayes-kompatibles Modem (16550) |
| 0x04 | 0x03 | Hayes-kompatibles Modem (16650) |
| 0x04 | 0x04 | Hayes-kompatibles Modem (16750) |
| 0x05 | 0x00 | SmartCard |
| 0x80 | 0x00 | Andere
Controller |
Class 0x08 - System-Peripherie
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | 8259- PIC |
| 0x00 | 0x01 | ISA-PIC |
| 0x00 | 0x02 | EISA-PIC |
| 0x00 | 0x10 | IO- APIC (EISA) |
| 0x00 | 0x20 | IOx-APIC |
| 0x01 | 0x00 | 8237-DMA-Controller |
| 0x01 | 0x01 | ISA-DMA-Controller |
| 0x01 | 0x02 | EISA-DMA-Controller |
| 0x02 | 0x00 | Standard-8254-Timer |
| 0x02 | 0x01 | ISA-System-Timer |
| 0x02 | 0x02 | EISA-System-Timer |
| 0x03 | 0x00 | Standard Real Time Clock |
| 0x03 | 0x01 | ISA Real Time Clock |
| 0x04 | 0x00 | PCI Hot Plug Controller |
| 0x80 | 0x00 | Andere System-Peripherie |
Class 0x09 - Input-Geräte
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Tastatur |
| 0x01 | 0x00 | Digitizer (Stift) |
| 0x02 | 0x00 | Maus |
| 0x03 | 0x00 | Scanner |
| 0x04 | 0x00 | Standard-Gameport |
| 0x04 | 0x10 | Gameport |
| 0x80 | 0x00 | Anderes Input-Gerät |
Class 0x0A - Docking-Stationen
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Normale Docking-Station |
| 0x80 | 0x00 | Andere Docking-Station |
Class 0x0B - Prozessoren
| Subclass | Programming-Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | 386 |
| 0x01 | 0x00 | 486 |
| 0x02 | 0x00 | Pentium |
| 0x10 | 0x00 | Alpha |
| 0x20 | 0x00 | PowerPC |
| 0x30 | 0x00 | MIPS |
| 0x40 | 0x00 | Coprozessor |
Class 0x0C - Serielle Buscontroller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Firewire (IEEE 1394) |
| 0x00 | 0x10 | Firewire (OHCI) |
| 0x01 | 0x00 | ACCESS-Bus |
| 0x02 | 0x00 | SSA (Serial Storage Architecture) |
| 0x03 | 0x00 | USB (UHCI) |
| 0x03 | 0x10 | USB (OHCI) |
| 0x03 | 0x20 | USB (EHCI) |
| 0x03 | 0x80 | USB (kein HCI) |
| 0x03 | 0xFE | USB-Gerät |
| 0x04 | 0x00 | Fibre Channel |
| 0x05 | 0x00 | SMB (System Management Bus) |
| 0x06 | 0x00 | InfiniBand |
| 0x07 | 0x00 | IPMI SMIC Interface |
| 0x07 | 0x01 | IPMI Keyboard Style Interface |
| 0x07 | 0x02 | IPMI Block Transfer Device |
| 0x08 | 0x00 | SERCOS Interface |
| 0x09 | 0x00 | CANBus |
Class 0x0D - Wireless-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | iRDA |
| 0x01 | 0x00 | Consumer Infrared |
| 0x10 | 0x00 | Radio Frequency |
| 0x11 | 0x00 | Bluetooth |
| 0x12 | 0x00 | Broadband |
| 0x80 | 0x00 | Anderer Wireless-Controller |
Class 0x0E - Intelligente Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x?? | I²O-Architektur |
| 0x00 | 0x00 | Message FIFO |
Class 0x0F - Satelliten-Kommunikations-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x01 | 0x00 | TV |
| 0x02 | 0x00 | Audio |
| 0x03 | 0x00 | Sprache |
| 0x04 | 0x00 | Daten |
Class 0x10 - Encryption/Decryption-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x01 | 0x00 | Netzwerk |
| 0x10 | 0x00 | Entertainment |
| 0x80 | 0x00 | Anderer Controller |
Class 0x11 - Datenerfassungs- und Signalprozessor-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Digital Input/Output Module |
| 0x01 | 0x00 | Zähler |
| 0x10 | 0x00 | Synchronisation und Frequenzmessung |
| 0x20 | 0x00 | Management Card |
| 0x80 | 0x00 | Anderer Controller |
Weblinks
- Linux PCI ID Repositorium - Enthält viele VendorIDs und die dazugehörigen DeviceIDs