Peripheral Component Interconnect (kurz PCI) ist ein Bus zur leichten Verbindung von Peripheriegeräten mit mit der CPU. == 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 === {| border="1" ! 31 || 30-24 || 23-16 || 15-11 || 10-8 || 7-0 |- | Enable Bit || Reserviert || Busnummer || Gerätenummer || Funktionsnummer || Registernummer |}
=== Aufbau des Konfigurations-Register === {| border="1" ! Register || 31-24 || 23-16 || 15-8 || 7-0 |- | 00 || colspan="2" | Device ID || colspan="2" | Vendor ID |- | 04 || colspan="2" | Status || colspan="2" | Command |- | 08 || Classcode || Subclass || colspan="2" | Revision ID |- | 0x0C || BIST || Header Type || Latency Timer || Cache Line Size |- | 0x10 || colspan="4" | Base Address 0 (BAR0) |- | 0x14 || colspan="4" | Base Address 1 (BAR1) |- | 0x18 || colspan="4" | Base Address 2 (BAR2) |- | 0x1C || colspan="4" | Base Address 3 (BAR3) |- | 0x20 || colspan="4" | Base Address 4 (BAR4) |- | 0x24 || colspan="4" | Base Address 5 (BAR5) |- | 0x28 || colspan="4" | Cardbus CIS Pointer |- | 0x2C || colspan="2" | Subsystem ID || colspan="2" | Subsystem Vendor ID |- | 0x30 || colspan="4" | Expansion ROM base address |- | 0x34 || colspan="4" | Reserviert |- | 0x38 || colspan="4" | Reserviert |- | 0x3C || Max Latency || Min Grant || Interrupt Pin || Interrupt Line |}
=== Codebeispiel === #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); } == Classcodes == {| border="1" ! Class || Beschreibung |- | 0x00 || [[#Subclasses_-_Pre_2.0 | Alle Geräte die gebaut wurden bevor Classcodes eingeführt wurden ]] |- | 0x01 || [[#Subclasses_-_Massenspeicher | Massenspeicher]] |- | 0x02 || [[#Subclasses_-_Netzwerk-Controller | Netzwerk-Controller}} |- | 0x03 || [[#Subclasses_-_Bildschirm-Controller | Bildschirm-Controller]] |- | 0x04 || [[#Subclasses_-_Multimedia-Geräte | Multimedia-Geräte]] |- | 0x05 || [[#Subclasses_-_Speicher-Controller | Speicher-Controller]] |- | 0x06 || [[#Subclasses_-_Bridge-Geräte | Bridge-Geräte]] |- | 0x07 || [[#Subclasses_-_Controller zur einfachen Kommunikation | Controller zur einfachen Kommunikation]] |- | 0x08 || [[#Subclasses_-_System-Peripherie | System-Peripherie]] |- | 0x09 || [[#Subclasses_-_Input-Geräte | Input-Geräte]] |- | 0x0A || [[#Subclasses_-_Docking-Stationen | Docking-Stationen]] |- | 0x0B || [[#Subclasses_-_Prozessoren | Prozessoren]] |- | 0x0C || [[#Subclasses_-_Seriell-Bus-Controller | Seriell-Bus-Controller]] |- | 0x0D-0xFE || Reserviert |- | 0xFF || Sonstige |}
=== Subclasses - Pre 2.0 === {| border="1" ! Subclass || Beschreibung |- | 0x00 || Alle nicht-VGA-Geräte |- | 0x01 || VGA-Geräte |}
=== Subclasses - Massenspeicher === {| border="1" ! Subclass || Beschreibung |- | 0x00 || SCSI |- | 0x01 || IDE |- | 0x02 || Floppy |- | 0x03 || IPI |- | 0x04 || RAID |- | 0x80 || Anderer Massenspeicher |}
=== Subclasses - Netzwerk-Controller === {| border="1" ! Subclass || Beschreibung |- | 0x00 || Ethernet |- | 0x01 || Token Ring |- | 0x02 || FDDI |- | 0x03 || ATM |- | 0x80 || Anderer Netzwerk-Controller |}
=== Subclasses - Bildschirm-Controller === {| border="1" ! Subclass || Beschreibung |- | 0x00 || VGA-Kompatibel |- | 0x01 || XGA |- | 0x80 || Anderer Bildschirm-Controller |}
=== Subclasses - Multimedia-Geräte === {| border="1" ! Subclass || Beschreibung |- | 0x00 || Video-Gerät |- | 0x01 || Audio-Gerät |- | 0x80 || Anderes Multimedia-Gerät |}
=== Subclasses - Speicher-Controller === {| border="1" ! Subclass || Beschreibung |- | 0x00 || RAM |- | 0x01 || Flash-Speicher |- | 0x80 || Anderer Speicher |}
=== Subclasses - Bridge-Geräte === {| border="1" ! Subclass || Beschreibung |- | 0x00 || Host/PCI-Bridge |- | 0x01 || PCI/ISA-Bridge |- | 0x02 || PCI/EISA-Bridge |- | 0x03 || PCI/MicroChannel-Bridge |- | 0x04 || PCI/PCI-Bridge |- | 0x05 || PCI/PCMCIA-Bridge |- | 0x06 || PCI/NuBus-Bridge |- | 0x07 || PCI/CardBus-Bridge |- | 0x80 || Anderer Bridge-Typ |}
=== Subclasses - Controller zur einfachen Kommunikation === {| border="1" ! Subclass || Beschreibung |- | 0x00 || Serielle Schnittstelle |- | 0x01 || Parallelport |- | 0x80 || Andere |}
=== Subclasses - System-Peripherie === {| border="1" ! Subclass || Beschreibung |- | 0x00 || [[Programmable Interrupt Controller]] |- | 0x01 || [[Direct Memory Access]] |- | 0x02 || Timer |- | 0x03 || [[Realtime Clock]] |- | 0x80 || Andere System-Peripherie |}
=== Subclasses - Input-Geräte === {| border="1" ! Subclass || Beschreibung |- | 0x00 || Tastatur |- | 0x01 || Digitizer (Stift) |- | 0x02 || Maus |- | 0x80 || Anderes Input-Gerät |}
=== Subclasses - Docking-Stationen === {| border="1" ! Subclass || Beschreibung |- | 0x00 || Normale Docking-Station |- | 0x80 || Andere Docking-Station |}
=== Subclasses - Processors === {| border="1" ! Subclass || Beschreibung |- | 0x00 || 386 |- | 0x01 || 486 |- | 0x02 || Pentium |- | 0x10 || Alpha |- | 0x20 || PowerPC |- | 0x40 || Co-Processor |- |}
=== Subclasses - Seriell-Bus-Controller === {| border="1" ! Subclass || Beschreibung |- | 0x00 || Firewire (IEEE 1394) |- | 0x01 || ACCESS-Bus |- | 0x02 || SSA (Serial Storage Architecture) |- | 0x03 || [[USB]] (Universal Serial Bus) |}
== Weblinks == * [http://pci-ids.ucw.cz/iii/ Linux PCI ID Repositorium] - Enthält viele VendorIDs und die dazugehörigen DeviceIDs