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.
Google nach "giveio.sys" Da findest Du z.B. http://www.nf.fh-nuernberg.de/~jesorsky/skript-c/port.htm
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?
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
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 | }
|
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; }
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 | }
|
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 */
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?
- 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.
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 ); |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.