'''Peripheral Component Interconnect''' (kurz '''PCI''') ist ein [[:Kategorie:Bus | Bus]] zur leichten Verbindung von Peripheriegeräten 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
[[Kategorie:Hardware]]
[[Kategorie:Bus]]