[VYŘEŠENO] C: Jak zprovoznit program na čtení 2 portů LPT?
Napsal: 21 říj 2020, 10:42
Dělám prográmek, kterej má zobrazit údaje sebraný paralelním portem o šířce až 12 bitů (8x data na 0x37c, 4x řídící na 0x37a). V Cčku skoro neumím, ale podařilo se mi sesmolit aspoň tohle:
Tady pracuju s portem 0x37a (řídicí; data lze číst i na portu 0x37c v režimu EPP).
Podmínka zjišťuje oprávnění, jestli lze číst a zapisovat, outb zajišťuje nulování, pak se vstup přečte, printfem převede na desítkovou soustavu, odečte 192 (horní 4 bity nelze ovládat a nejsou k nim dráty) a, protože to budou horní 4 bity, vynásobí se to 256. Přestože jsou 3 ze 4 vstupů za invertorem, funguje to na jednom i druhým portu.
Jenže jsem se pokusil do toho nabastlit i čtení z datovýho portu, nevím, kde dělám chybu, sestaví se bez keců, ale hází mi po spuštění SIGSEGV, a to už od druhýho outb (kdy zbytek kódu je z předchozího) a vlastně u další "zdvojený" definice dataC:
Kód: Vybrat vše
#include <stdlib.h>
#include <stdio.h>
#include <sys/io.h>
#define portC 0x37a
int main()
{
if (ioperm(portC, 1, 1))
fprintf(stderr, "\e[31;43m Nemáš oprávnění \e[0m\n"), exit(1);
outb(0, portC);
int dataC = inb(portC);
printf("%i\n", (256*(dataC-192)));
}Tady pracuju s portem 0x37a (řídicí; data lze číst i na portu 0x37c v režimu EPP).
Podmínka zjišťuje oprávnění, jestli lze číst a zapisovat, outb zajišťuje nulování, pak se vstup přečte, printfem převede na desítkovou soustavu, odečte 192 (horní 4 bity nelze ovládat a nejsou k nim dráty) a, protože to budou horní 4 bity, vynásobí se to 256. Přestože jsou 3 ze 4 vstupů za invertorem, funguje to na jednom i druhým portu.
Jenže jsem se pokusil do toho nabastlit i čtení z datovýho portu, nevím, kde dělám chybu, sestaví se bez keců, ale hází mi po spuštění SIGSEGV, a to už od druhýho outb (kdy zbytek kódu je z předchozího) a vlastně u další "zdvojený" definice dataC:
Kód: Vybrat vše
#include <stdlib.h>
#include <stdio.h>
#include <sys/io.h>
#define portD 0x37c
#define portC 0x37a
int main()
{
if (ioperm(portD, 1, 1))
fprintf(stderr, "\e[31;43m Nemáš oprávnění \e[0m\n"), exit(1);
outb(0, portD);
outb(0, portC);
int dataD = inb(portD);
int dataC = inb(portC);
printf("%i\n", (dataD+256*(dataC-192)));
}