Založen: May 30, 2006 Příspěvky: 6558 Bydliště: Seč
Zaslal: st říjen 21 2020, 9:42 Předmět: [VYŘEŠENO] C: Jak zprovoznit program na čtení 2 portů LPT?
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:
{
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:
Založen: Jan 13, 2007 Příspěvky: 15515 Bydliště: Olomouc
Zaslal: st říjen 21 2020, 10:40 Předmět:
Nechci ti do toho moc kecat, ale pokud chceš číst ze dvou paralelních portů, tak bych si to vyzkoušel napřed na jednom (podprogramem A) a potom na druhém (podprogramem B). Oba podprogramy A i B by měly mít svoje proměnné, protože nakonec jejich vyselektované části jen na čtení jako A1 a B1 budeš volat z jednoho hlavního programu do dalších proměnných (či adresového buffru). Ten zbytek pro inicializaci portů z programů A a B po vyselektování A1 a B1 dáš do části hlavního programu na začátek a případně na konec pro zavření portů apod.
Schválně jsem to tak psal (selsky), protože si to upravíš už podle svého. Jsem zvyklý psát programy s padesáti tisíci řádků a více, takže vím, že každý si to výsledně zmuchlá podle svého. Tzn. že každý si to udělá tak, aby se v tom za týden ještě vyznal nebo ne a potom je ztracenej.
Založen: May 30, 2006 Příspěvky: 6558 Bydliště: Seč
Zaslal: st říjen 21 2020, 10:59 Předmět:
rnbw: Aha, to je ono! Už to funguje!
Měl jsem za to, že tím iopermem akorát zjišťuju dostupnost jednoho z portů, kdy je logický, že druhej bude spolu s ním stejně dostupnej.
int main()
{
if ((ioperm(portD, 1, 1)) | (ioperm(portC, 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)));
}
Díky, chlapi!
P. S.: Asi by to nešlo zaonačit, abych to nemusel spouštět přes roota, co? Třeba kouzlením s /dev/lp0. _________________ Kdo není ve dvaceti levičák, nemá srdce,
kdo je levičák ve čtyřiceti, nemá rozum.
— Winston Churchill
Založen: Mar 21, 2006 Příspěvky: 33896 Bydliště: Bratislava
Zaslal: pá říjen 23 2020, 7:32 Předmět:
Inak v Linuxe sa da pouzit namiesto priameho pristupu k HW zariadenie /dev/parport*. Potom to nemusi bezat pod rootom a moze to fungovat aj na inych paralelnych portoch (nielen "typu PC").
U těch oprávnění asi hodně záleží jak je to nastavené v distribuci, třeba Ubuntu po mě chce sudo i když přistupuji na obyčejnou USB-seriovku /dev/ttyUSB*
Naposledy upravil Zmije dne st listopad 18 2020, 11:30, celkově upraveno 1 krát.
Ono se ani to /dev/parport možná neobejde bez roota, protože je potřeba udělat insmod ovladače, pokud s ním není kernel už přeložený.
Potom se nabízí obejít to pomocí démona pod rootem, který se spustí během initu a bude poslouchat na tcp / udp na loopbacku, nebo unix socketu, případně přes IPC.
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.