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