Linux: Treiber für PCI-Device programmieren

Seite 1 von 1 - Forum: Linux and other OS auf overclockers.at

URL: https://www.overclockers.at/linux/linux_treiber_fuer_pci-device_programmieren_134112/page_1 - zur Vollversion wechseln!


DJ_Cyberdance schrieb am 10.01.2005 um 17:19

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 schrieb am 10.01.2005 um 22:28

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 schrieb am 10.01.2005 um 23:09

Solltest du es dennoch brauchen: http://lwn.net/Articles/driver-porting/


DJ_Cyberdance schrieb am 11.01.2005 um 07:38

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?




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025