Forum: PC-Programmierung Wie Ports unter MS-Win auslesen/beschreiben?


von Rolf (Gast)


Lesenswert?

Ich habe versucht ein einfaches C-Programm, das auf ein paar Ports 
liest/schreibt und unter Linux problemlos arbeitet, unter MS-Win 
(Cygwin) mit dem gcc zu compilieren, aber dort fehlen die üblichen 
Port-Befehle und die Linux-spezifischen Include-Dateien (speziell 
<sys/io.h>).
Wie kann man denn die Ports unter MS-Win auslesen und beschreiben?

Als Workaround könnte man die Assembler-Definitionen der 
Port-Funktionien nehmen, aber es sollte doch auch einfacher gehen.

von peter (Gast)


Lesenswert?

Google nach "giveio.sys"

Da findest Du z.B.

http://www.nf.fh-nuernberg.de/~jesorsky/skript-c/port.htm

von Rolf (Gast)


Lesenswert?

Danke, aber nun habe ich mit dem Beispiel-Programm ein anderes Problem:

Zuerst:

$ gcc -O2 -o port.exe port.c
port.c:12:19: conio.h: No such file or directory

und dann, nach ändern von

#include <conio.h>

in

#include <mingw/conio.h>

gibt es das Problem, das _mingw.h nicht gefunden wird.
Irgendwelche Vorschläge?

von Stefan (Gast)


Lesenswert?

Suche nach den Stichworten, hier cygwin + gcc + conio.h + No such file 
or directory

Du findest z.B. http://www.cygwin.com/ml/cygwin/1999-09/msg00198.html

von Feadi F. (feadi)


Lesenswert?

Nimm einfach meinen Code, der braucht nur eine einzige include Datei:
1
#include <windows.h>
2
3
4
uint8_t inb( uint16_t portaddr )
5
{
6
  uint8_t value;
7
8
  asm volatile
9
  (
10
    "in %1, %0" :
11
    "=a" (value) :
12
    "d" (portaddr)
13
  );
14
15
  return value;
16
}
17
18
void outb( uint8_t value, uint16_t portaddr )
19
{
20
  asm volatile
21
  (
22
    "out %1, %0" ::
23
    "d" (portaddr), "a" (value)
24
  );
25
}
26
27
bool iopl()
28
{
29
  bool ret;
30
31
  HANDLE h;
32
  h = CreateFile("\\\\.\\giveio", GENERIC_READ,
33
    0, NULL, OPEN_EXISTING,
34
    FILE_ATTRIBUTE_NORMAL, NULL);
35
36
  ret = h != INVALID_HANDLE_VALUE;
37
  CloseHandle(h);
38
39
  return ret;
40
}

  

von Rolf (Gast)


Lesenswert?

Ok, also mit diesem Beispiel-Programm scheint es zu funktionieren:

#include <windows.h>
#include <stdint.h>
#include <stdio.h>

uint8_t inb( uint16_t portaddr )
{
  uint8_t value;

  asm volatile
  (
    "in %1, %0" :
    "=a" (value) :
    "d" (portaddr)
  );

  return value;
}

void outb( uint8_t value, uint16_t portaddr )
{
  asm volatile
  (
    "out %1, %0" ::
    "d" (portaddr), "a" (value)
  );
}

int iopl()
{
  int ret;

  HANDLE h;
  h = CreateFile("\\\\.\\giveio", GENERIC_READ,
    0, NULL, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, NULL);

  ret = h != INVALID_HANDLE_VALUE;
  CloseHandle(h);

  return ret;
}

int main ()
{
  uint8_t u8=0;

  iopl();
  u8 = inb(888); // read from the parallel port
  fprintf(stdout,  "Read %hu from port 888.\n");
  return 0;
}

von Feadi F. (feadi)


Lesenswert?

Wieso hast Du den Rückgabewert von iopl nach int gewechselt? Ich habe 
mir ursprünglich dabei gedacht, dass diese Funktione den Erfolg mit true 
signalisiert.

So zu benutzen:
1
int main()
2
{
3
  if ( !iopl() )
4
  {
5
    // giveio.sys ist auf diesem system nicht installiert
6
    error( "giveio.sys nicht installiert!" );
7
    return -1;
8
  }
9
10
  return 0;
11
}

  

von Rolf (Gast)


Lesenswert?

Ich habe das bool rausgenommen, a) weil es das in ANSI-C nicht gibt (da 
gibt's nur _Bool und dafür benötigt man stdbool.h) und b) ist _Bool 
überflüssig (>0 ist true, 0 ist false). Meist ist es nämlich so 
implementiert:

#ifndef __cplusplus

#define bool  _Bool
#define true  1
#define false  0

#else /* __cplusplus */

von Rolf (Gast)


Lesenswert?

Also das Testen ergab, das das Schreiben funktioniert, aber das Lesen 
nicht: Ich lese immer 4304, beispielsweise von 888 und 889, selbst wenn 
dort am Parallelport Signale anliegen.
Irgendwelche Vorschläge?

von Feadi F. (feadi)


Lesenswert?

- Du solltest auf jeden Fall den Rückgabewert von iopl prüfen:
1
  if ( !iopl() )
2
  {
3
    // giveio.sys ist auf diesem system nicht installiert
4
    error( "giveio.sys nicht installiert!" );
5
    return -1;
6
  }

- Welches Windows benutzt Du? Mit der 64 Bit Edition funktioniert das 
nämlich nicht.

von Feadi F. (feadi)


Lesenswert?

aber mit dieser Zeile wird das auch nichts:
1
  fprintf(stdout,  "Read %hu from port 888.\n");

besser ist:
1
  fprintf(stdout,  "Read %hu from port 888.\n", u8 );

  

von Rolf (Gast)


Lesenswert?

Ok, also:

- mit Argument liefert das fprintf auch einen Wert

- das Einlesen klappte nicht, weil die Status-Pins einen kleinen 
Eingangswiderstand haben; mit stärkeren Signalen, z. B. Ping 10 auf 
Masse, geht es

- iopl gibt 1 zurück, aber es funktioniert trotzdem

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.