Programmieren der PCI Schnittstelle ?

Florian Lohoff flo at rfc822.org
Fri Sep 1 18:36:20 CEST 2000


On Fri, Sep 01, 2000 at 05:05:29PM +0200, Jan Krueger wrote:
> Hallo Leute !
> Ich werde demnächst meine Dimplomarbeit angehen und habe dabei das Problem
> eine PCI Karte mit FPGA's (sind reprogrammierbare Prozessoren) unter Linux
> ansprechen zu müssen. Da ich bis jetzt soetwas noch nie gemacht habe, wollte
> ich hier auf der Liste einmal nachfragen, ob jemand soetwas schon programmiert
> hat bzw. welches Buch / Literatur nötig ist um sich soetwas anzueignen
> (programmierung der PCI - Schnittstelle)!
> Ich wäre wirklich für jede Hilfe dankbar.

Die Doku ist der Kernel source - Im ernst: Wer ein wenig Programmieren
kann der nimmt sich einen Existierenden Treiber einer PCI karte
und schaut dort herein - Wie das ganze funktioniert ist leider
ein wenig Architekturabhaengig d.h. code der auf i386 funktioniert
MUSS nicht auf sparc funktionieren weil die PCI Bridges etc
ander sein koennen.

Grundsaetzlich gibt es aber helperfunktionen zum Finden deiner PCI
Karte und der Resourcen die diese zur verfügung stellt d.h. 
Addressraeume, Rom etc. Wenn du diese hast kannst du die
via ioremap in deinen Addressraum einblenden und dann froehlich 
in den Adressraum der Karte schreiben und lesen.

Hier z.b. ein codesnippet aus drivers/char/specialix.c

   2348             pdev = pci_find_device (PCI_VENDOR_ID_SPECIALIX,
   2349                                     PCI_DEVICE_ID_SPECIALIX_IO8,
   2350                                     pdev);
   2351             if (!pdev) break;
   2352 
   2353             sx_board[i].irq = pdev->irq;
   2354 
   2355             pci_read_config_dword(pdev, PCI_BASE_ADDRESS_2, &tint);

Ersterer findet ein Device anhand von Vendor und Product ID
die du zur Not auch via "lspci -v" herausfinden kannst wenn du sie
nicht weisst.

Die pdev struktur sollte dann alle moeglichen interessanten informationen
enthalten ...

Aus meinem eigenen MultiPort treiber dann noch mal

   1335             plx_base=(ulong) ioremap(pdev->base_address[0] &
   1336                             PCI_BASE_ADDRESS_MEM_MASK,
   1337                         AA_PLX_PCI_SIZE);
   1338 
   1339             cd1865_base=(ulong) ioremap(pdev->base_address[2] &
   1340                             PCI_BASE_ADDRESS_MEM_MASK,
   1341                         AA_CHIP_PCI_SIZE);
   1342 
   1343             port_base=pdev->base_address[1] &
   1344                         PCI_BASE_ADDRESS_MEM_MASK;
   1345 

Wie du hier siehst "ioremap"pe ich mir hier regionen der
PCI Card in meinen Adressraum - Diese Karte basiert aus
2 Addressbereichen. Der eine ist der auf der Karte enthaltene
PLX9060 (PCI Bridge Chip) und zum anderen eine beliebige Anzahlasiert aus
2 Addressbereichen. Der eine ist der auf der Karte enthaltene
von CD1865 (Serial Chip).

Danach kannst du mit den "write" und "read" funktionen auf eben
diese Addressbereiche zugreifen. 

Das ganze hat sich im laufe von 2.0 auf 2.2 und 2.4 mehrfach geaendert
um eben Interoperabilitaet der Architekturen zu erreichen. Mein
Treiber selber laeuft (Bzw laesst sich nicht uebersetzen) auf der
Sparc was vermutlich an mist liegt den ich fabriziert habe.

Flo
-- 
Florian Lohoff		flo at rfc822.org		      	+49-5201-669912
      "Write only memory - Oops. Time for my medication again ..."


-
Hinweise zur Benutzung dieser (und anderer Mailing-Listen) bitte beachten:
--> http://lug-owl.de/mailinglist_hints.html <--



More information about the Linux mailing list