Forum: PC-Programmierung Parallelport mit C ansteuern in Linux und Digitus Interface Karte


von Stefan E. (attiny45) Benutzerseite


Lesenswert?

Hallo,
mein C Programm soll eigentlich den Parallelport ansteuern, tut sich 
aber nix. ich habe diese Karte hier:
https://www.amazon.de/dp/B0093LI2UM
die Adresse des Parallelports hab ich so rausgefunden:
root@pc1:/home/user1/lernen/ctest# cat /proc/ioports | grep parport
      d000-d002 : parport0
      d010-d012 : parport0
      d013-d017 : parport0
root@pc1:/home/user1/lernen/ctest# ./lpt
root@pc1:/home/user1/lernen/ctest#
das C Programm schaut so aus:
root@pc1:/home/user1/lernen/ctest# cat lpt.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#define base 0xd000
//compile:  gcc -O lpt.c -o lpt
//after compiling, set suid:  chmod +s parport   then, copy to 
/usr/sbin/
int main(void) {
  if(ioperm(base,1,1)){
    fprintf(stderr, "Couldn't open parallel port"), exit(1);
  }
  outb(255,base);  //set all pins hi
  sleep(3);
  outb(0,base);    //set all pins lo
  return 0;
}
root@pc1:/home/user1/lernen/ctest#

Wisst ihr was da schieflaeuft? Also ich hab das genauso auf einem 
anderen Mainboard laufen lassen mit onboard lpt port, und da gings, halt 
mit 0x0378 als Adresse.
aber hier auf diesem Mainboard leuchtet die LED einfach nicht. aber das 
Programm liefert auch keinen Error. also permissions sind schon da.

Gruss attiny

: Bearbeitet durch User
von Johnny (Gast)


Lesenswert?

Ich vermute mal dass das was du mit grep parport zu sehen bekommst die 
mainboard-Ressourcen sind und eben nicht die Karte.

von Route_66 H. (route_66)


Lesenswert?

Hallo!
Man kann auf Periferie an einem PCI-E Adapter nicht über einfache 
OUTB(irgendwas) zugreifen! Es geht nur über passende Treiber.

von Stefan E. (attiny45) Benutzerseite


Lesenswert?

Hi Johnny, danke fuer den Hinweis. Jetz hab ich nochmal anders die 
Adresse geprueft:
root@pc1:/home/user1/lernen/ctest# lspci -v

03:00.2 Parallel controller: MosChip Semiconductor Technology Ltd. PCIe 
9912 Multi-I/O Controller (prog-if 03 [IEEE1284])
  Subsystem: Device a000:2000
  Flags: bus master, fast devsel, latency 0, IRQ 19
  I/O ports at d010 [size=8]
  I/O ports at d000 [size=8]
  Memory at f0401000 (32-bit, non-prefetchable) [size=4K]
  Memory at f0400000 (32-bit, non-prefetchable) [size=4K]
  Capabilities: [50] MSI: Enable- Count=1/1 Maskable- 64bit+
  Capabilities: [78] Power Management version 3
  Capabilities: [80] Express Legacy Endpoint, MSI 00
  Capabilities: [100] Advanced Error Reporting
  Kernel driver in use: parport_serial
  Kernel modules: parport_serial

root@pc1:/home/user1/lernen/ctest#
und da steht wirklich was von 2 verschiedenen Startadressen fuer die io 
Ports, d000 hatte ich ja schon, der ging ja nicht. aber da steht auch 
der d010, und dieser hat jetz funktioniert.
muss ich mal ueberlegen warum das so ist...
naja, jetz gehts jedenfalls, also Problem geloest.

Gruss Stefan

von Stefan E. (attiny45) Benutzerseite


Lesenswert?

Route 6. schrieb:
> Man kann auf Periferie an einem PCI-E Adapter nicht über einfache
> OUTB(irgendwas) zugreifen! Es geht nur über passende Treiber.

Hi, die Treiber sind dann anscheinend im Linuxkernel schon von Haus aus 
mit dabei.
weil wie gesagt, jetz gehts.

von Rolf M. (rmagnus)


Lesenswert?

ioperm sollte man höchstens nutzen, wenn es überhaupt nicht anders geht. 
Und selbst dann sollte man dreimal drüber nachdenken.
Besser ist es, auf den Parallelport über den Treiber statt am Treiber 
vorbei zuzugreifen.

Stefan E. schrieb:
> root@pc1:/home/user1/lernen/ctest# cat /proc/ioports | grep parport
>       d000-d002 : parport0
>       d010-d012 : parport0
>       d013-d017 : parport0

Warum nutzt du dann nicht einfach /dev/parport0?
Siehe 
https://mockmoon-cybernetics.ch/computer/linux/programming/parport.html
(nicht den Teil unter "not recommended", sondern den unter "Full access 
via /dev/parport".

: Bearbeitet durch User
von Stefan E. (attiny45) Benutzerseite


Lesenswert?


von Gustl Buheidl (Gast)


Lesenswert?

Route 6. schrieb:
> Hallo!
> Man kann auf Periferie an einem PCI-E Adapter nicht über einfache
> OUTB(irgendwas) zugreifen! Es geht nur über passende Treiber.

Stefan E. schrieb:

> Hi, die Treiber sind dann anscheinend im Linuxkernel schon von Haus aus
> mit dabei.
> weil wie gesagt, jetz gehts.

Dann mach das bitte rückgängig, sonst hat die Route scheissdreck 
geschrieben und das darf nicht sein...

von R.Fischer (Gast)


Lesenswert?

Rolf M. schrieb:
> Warum nutzt du dann nicht einfach /dev/parport0?
> Siehe
> https://mockmoon-cybernetics.ch/computer/linux/programming/parport.html
> (nicht den Teil unter "not recommended", sondern den unter "Full access
> via /dev/parport".

Da sage ich auch mal schnell Danke für den Link!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.