"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Linux: Treiber für PCI-Device programmieren

DJ_Cyberdance 10.01.2005 - 17:19 784 3
Posts

DJ_Cyberdance

Here to stay
Avatar
Registered: Jun 2002
Location: Vesterålen
Posts: 1838
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
Registered: May 2000
Location: ~
Posts: 5020
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. :D

'pcilib' wird übrigens von den pciutils (lspci, setpci) verwendet->
http://atrey.karlin.mff.cuni.cz/~mj/pciutils.shtml

jedoch 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:
Code:
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
Code:
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
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Solltest du es dennoch brauchen: http://lwn.net/Articles/driver-porting/

DJ_Cyberdance

Here to stay
Avatar
Registered: Jun 2002
Location: Vesterålen
Posts: 1838
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?
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz