Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

[VYŘEŠENO] C: Jak zprovoznit program na čtení 2 portů LPT?

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Výpočetní technika
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
MetalGod



Založen: May 30, 2006
Příspěvky: 6558
Bydliště: Seč

PříspěvekZaslal: st říjen 21 2020, 9:42    Předmět: [VYŘEŠENO] C: Jak zprovoznit program na čtení 2 portů LPT? Citovat

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:

kód:
#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:
#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)));
}

_________________
Kdo není ve dvaceti levičák, nemá srdce,
kdo je levičák ve čtyřiceti, nemá rozum.
— Winston Churchill


Naposledy upravil MetalGod dne st říjen 21 2020, 11:03, celkově upraveno 2 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
p32



Založen: Jan 13, 2007
Příspěvky: 15515
Bydliště: Olomouc

PříspěvekZaslal: st říjen 21 2020, 10:40    Předmět: Citovat

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. Wink

Zkus si to psát od začátku ve stylu:

#define portC 0x37a
#define portD 0x37c

místo

#define portD 0x37c
#define portC 0x37a

atd.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rnbw



Založen: Mar 21, 2006
Příspěvky: 33896
Bydliště: Bratislava

PříspěvekZaslal: st říjen 21 2020, 10:48    Předmět: Citovat

ioperm() volas len pre portD.

P.S. Pri praci s bitmi pouzivaj bitove operacie.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
MetalGod



Založen: May 30, 2006
Příspěvky: 6558
Bydliště: Seč

PříspěvekZaslal: st říjen 21 2020, 10:59    Předmět: Citovat

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.

Takže tohle funguje:
kód:
#include <stdlib.h>
#include <stdio.h>
#include <sys/io.h>

#define portD 0x37c
#define portC 0x37a

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Zmije



Založen: Jun 30, 2005
Příspěvky: 1569
Bydliště: Pardubický kraj

PříspěvekZaslal: čt říjen 22 2020, 23:59    Předmět: Citovat

Předpokládám, že to řešení je pro Linux. Ve zdrojácích Avrdude je řešení pro Linux, FreeBSD a Windows

Speciální oprávnění (root, skupina, výjimka v sudores, ...) bude asi potřeba vždy, když se šahá přímo na HW.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
rnbw



Založen: Mar 21, 2006
Příspěvky: 33896
Bydliště: Bratislava

PříspěvekZaslal: pá říjen 23 2020, 7:32    Předmět: Citovat

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").
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zmije



Založen: Jun 30, 2005
Příspěvky: 1569
Bydliště: Pardubický kraj

PříspěvekZaslal: pá říjen 23 2020, 9:36    Předmět: Citovat

/dev/parport vypadá zajímavě
https://mockmoon-cybernetics.ch/computer/linux/programming/parport.html
https://www.kernel.org/doc/html/latest/admin-guide/parport.html
https://github.com/spotify/linux/blob/master/Documentation/parport.txt
https://www.htlinux.com/parallel_port_control_in_linux

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
rnbw



Založen: Mar 21, 2006
Příspěvky: 33896
Bydliště: Bratislava

PříspěvekZaslal: pá říjen 23 2020, 10:07    Předmět: Citovat

V Debiane su seriove porty v skupine dialout, paralelne v skupine lp. Takze staci pridat pouzivatela do potrebnej skupiny.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zmije



Založen: Jun 30, 2005
Příspěvky: 1569
Bydliště: Pardubický kraj

PříspěvekZaslal: pá říjen 23 2020, 10:18    Předmět: Citovat

V tom případě by mohla existovat možnost vytvořit novou skupinu třeba directio a tu nastavit tak, aby uživatele v ní mohli přistupovat přímo k HW.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
rnbw



Založen: Mar 21, 2006
Příspěvky: 33896
Bydliště: Bratislava

PříspěvekZaslal: pá říjen 23 2020, 10:30    Předmět: Citovat

To nejde, pre priamy pristup na I/O porty musi mat proces pravo CAP_SYS_RAWIO a k tomu sa bez roota nedostane.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zmije



Založen: Jun 30, 2005
Příspěvky: 1569
Bydliště: Pardubický kraj

PříspěvekZaslal: pá říjen 23 2020, 12:48    Předmět: Citovat

A co takhle
sudo setcap cap_sys_rawio jmeno_programu

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
rnbw



Založen: Mar 21, 2006
Příspěvky: 33896
Bydliště: Bratislava

PříspěvekZaslal: pá říjen 23 2020, 13:09    Předmět: Citovat

Rucne zavadzat modul bolo potrebne naposledy pri ISA LPT portoch.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Výpočetní technika Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
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

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

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.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.14 sekund