Linux: Treiber für PCI-Device programmieren
DJ_Cyberdance 10.01.2005 - 17:19 784 3
DJ_Cyberdance
Here to stay
|
Ich möchte nicht mehr und weniger als ein paar Werte auf Register einer PCI-Karte schreiben und das Ergebnis einer von dieser Karte durchgeführten Operation wieder auslesen. (Was diese Karte genau macht, spielt dabei keine Rolle, es geht nur um den Treiber.) Das ganze soll unterm 2.6er Kernel funktionieren. Ich hab einige Literatur zum Thema, allerdings für Kernel 2.4. Was Treiber angeht, so unterscheidet sich 2.6 sehr deutlich von 2.4.
Soweit mir bekannt, gibts unterschiedliche Möglichkeiten, mit einem PCI-Device zu kommunzieren. Zum einen über ein Character-Device /dev/device, auf das man mit beliebigen c-Programmen mittels fopen, fputc, ... zugreifen kann, oder direkt übers Memory mapping vom Kernel.
Leider ist mir noch nicht ganz klar, wie genau das funktionieren soll. Mit pci_request_regions kann ich den Speicherbereich reservieren - aber wie kann ich nachher aus dem Userspace darauf zugreifen, woher weiß ich, welcher Speicherbereich nun verwendet wird?
Hat irgendjemand auf diesem Gebiet Erfahrung und kann mir ein paar wertvolle Tips geben?
|
SYSMATRIX
Legend Legend
|
ich würde erstmal abklären ob dir das setpci tool aus dem pciutils package nicht sowieso schon dein problem löst (was ich mir gut vorstellen kann ), falls nicht: userspace library schnappen, damit hält sich der aufwand in grenzen wenn man noch ein `greenhorn' ist. 'pcilib' wird übrigens von den pciutils (lspci, setpci) verwendet-> http://atrey.karlin.mff.cuni.cz/~mj/pciutils.shtmljedoch gibt es anscheinend nur wenig doku darüber, aber die tools lspci und setpci werden dich sicherlich weiterbringen und code lesen is sowieso die einzig vernünftige möglichkeit sowas zu lernen hf! btw: eistee pfo # setpci
Usage: setpci [<options>] (<device>+ <reg>[=<values>]*)*
-f Don't complain if there's nothing to do
-v Be verbose
-D List changes, don't commit them
-P <dir> Use specified directory instead of /proc/bus/pci
-H <mode> Use direct hardware access (<mode> = 1 or 2)
-F <file> Read configuration data from given file
-G Enable PCI access debugging
<device>: -s [[<bus>]:][<slot>][.[<func>]]
| -d [<vendor>]:[<device>]
<reg>: <number>[.(B|W|L)]
| <name>
<values>: <value>[,<value>...]
eistee pfo #
und eistee pfo # lspci -x
0000:00:00.0 Host bridge: Intel Corp. 915G/P/GV Processor to I/O Controller (rev 04)
00: 86 80 80 25 06 01 90 20 04 00 00 06 00 00 00 00
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 86 80 56 41
30: 00 00 00 00 e0 00 00 00 00 00 00 00 00 00 00 00
0000:00:01.0 PCI bridge: Intel Corp. 915G/P/GV PCI Express Root Port (rev 04)
00: 86 80 81 25 06 01 10 00 04 00 04 06 10 00 01 00
10: 00 00 00 00 00 00 00 00 00 01 01 00 f0 00 00 00
20: 20 ff 20 ff 90 bf 90 bf 00 00 00 00 00 00 00 00
30: 00 00 00 00 88 00 00 00 00 00 00 00 ff 01 06 00
find beiden tools sind relativ brauchbar, lspci output ich echt gut leserlich usw. ...
|
Ringding
Pilot
|
|
DJ_Cyberdance
Here to stay
|
Jo danke für eure Tips... eine Frage bleibt offen, wie kann ich nun ein PCI-device ansprechen? Wenn der Treiber eine Gerätedatei /dev/device anlegt, dann is es klar. Wenn aber nicht, wie zB bei einer NIC, wie dann? Über mapped memory? Wie sieht das dann aus?
|