Peripheral Component Interconnect

Aus Lowlevel

(Weitergeleitet von PCI)
Wechseln zu: Navigation, Suche

Peripheral Component Interconnect (kurz PCI) ist ein Bus zur leichten Verbindung von Peripheriegeräten mit der CPU.

Inhaltsverzeichnis

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


Aufbau des Konfigurations-Register

Register 31-24 23-16 15-8 7-0
00 Device ID Vendor ID
04 Status Command
08 Classcode Subclass Revision ID
0x0C BIST Header Type Latency Timer Cache Line Size
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
0x38 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

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 Seriell-Bus-Controller
0x0D-0xFE Reserviert
0xFF Sonstige


Subclasses - Pre 2.0

Subclass Beschreibung
0x00 Alle nicht-VGA-Geräte
0x01 VGA-Geräte


Subclasses - Massenspeicher

Subclass Beschreibung
0x00 SCSI
0x01 IDE
0x02 Floppy
0x03 IPI
0x04 RAID
0x80 Anderer Massenspeicher


Subclasses - Netzwerk-Controller

Subclass Beschreibung
0x00 Ethernet
0x01 Token Ring
0x02 FDDI
0x03 ATM
0x80 Anderer Netzwerk-Controller


Subclasses - Bildschirm-Controller

Subclass Beschreibung
0x00 VGA-Kompatibel
0x01 XGA
0x80 Anderer Bildschirm-Controller


Subclasses - Multimedia-Geräte

Subclass Beschreibung
0x00 Video-Gerät
0x01 Audio-Gerät
0x80 Anderes Multimedia-Gerät


Subclasses - Speicher-Controller

Subclass Beschreibung
0x00 RAM
0x01 Flash-Speicher
0x80 Anderer Speicher


Subclasses - Bridge-Geräte

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

Subclass Beschreibung
0x00 Serielle Schnittstelle
0x01 Parallelport
0x80 Andere


Subclasses - System-Peripherie

Subclass Beschreibung
0x00 Programmable Interrupt Controller
0x01 Direct Memory Access
0x02 Timer
0x03 Realtime Clock
0x80 Andere System-Peripherie


Subclasses - Input-Geräte

Subclass Beschreibung
0x00 Tastatur
0x01 Digitizer (Stift)
0x02 Maus
0x80 Anderes Input-Gerät


Subclasses - Docking-Stationen

Subclass Beschreibung
0x00 Normale Docking-Station
0x80 Andere Docking-Station


Subclasses - Processors

Subclass Beschreibung
0x00 386
0x01 486
0x02 Pentium
0x10 Alpha
0x20 PowerPC
0x40 Co-Processor


Subclasses - Seriell-Bus-Controller

Subclass Beschreibung
0x00 Firewire (IEEE 1394)
0x01 ACCESS-Bus
0x02 SSA (Serial Storage Architecture)
0x03 USB (Universal Serial Bus)


Weblinks

Persönliche Werkzeuge