Newsgroup: it.comp.os.linux.development
Titolo: output su parallela funziona una sola volta :-|

Ciao a tutti,
Sto portando un vecchio sorgente TurboC (dos) sotto gcc. Il programma,
veramente semplice, genera una temporizzazione sul bit d0 della porta
parallela (0x378). Dopo varie pene sono riuscito a trovare le equivalenti
(piu` o meno) di gettime (mi serve una risoluzione maggiore di 1 secondo, ma
ora mi sono piantato nella scrittura sull'hardware.
Sotto dos c'era un bel(!!) outport(0x378,valore)... cosa che ovviamente
sotto linux non si fa.
Dalla documentazione ho capito di dovervi accedere mediante open, write sul
device /dev/lp0. L'ho fatto. Il programma funziona solo una volta,
dopodiche` se lo rilancio si blocca allo statement di WRITE.
Qualcuno sa per caso cos'altro devo fare per evitare questo problema, e se
ci sono metodi diversi per scrivere su una porta hardware, considerato che
il prossimo passo consistera` nel gestire dati su una seriale, da settare in
modo custom (come li vedro` i registri del chip?...)
cmq posto il pezzetto di programma che butta un 0xFF sulla parallela (e
funziona una sola volta per ogni boot :-))
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
void main(void)
{
 int fd,wr;
 char buf[1];
 fd = open("/dev/lp0", O_RDWR);
 printf("\nopen reported %d\n",fd);
 *buf = 0xff;
 wr = write(fd,&buf,1);
 printf("\nwrite reported %d\n",wr);
 close(fd);
}
note: al primo lancio, ovvero quello in cui il byte esce effettivamente
dalla porta, open riporta 3 e write riporta 1 (byte scritto). Le volte
successive, leggo solo "open reported 3" quindi la porta viene aperta, ma
evidentemente write non ritorna mai.
Qualcuno mi puo` aiutare?
Ciao e grazie!

 sotto linux non si fa.
Volendo puoi fare outb()
Non sono assolutamente pratico della programmazione per parallela ma hai
provato a leggere /usr/src/linux/parport* ?
--
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.mascanc.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! A mathematician is a device for turning coffee into theorems. !>-
                P. Erdos

 provato a leggere /usr/src/linux/parport* ?
No, a dire il vero non ce l'ho ma posso cercarlo... il fatto e` che non mi
interessa specificatamente la parallela, ma sapere qual'e` il modo lecito
per dialogare con l'hardware sotto linux, dato che dovro` fare una cosa
analoga con le seriali.
cmq sono andato avanti nelle prove ed ho scoperto una cosa inquietante: per
sbloccare la /dev/lp0 dopo avervi scritto un byte con write, devo rileggerlo
con read: restituisce -1 e TOGLIE FISICAMENTE IL BYTE dalla porta, che
ritorna come prima della scrittura, ma dopo sara` possibile scrivere un
altro byte senza che si pianti tutto.
Inizio a dubitare che open,write sia il sistema migliore per scrivere sulla
lpt.
Temo che dovro` proprio usare outb... o c'e' una scappatoia?
Ciao e grazie!

 
prova a leggerti l'IO-Port-Programming mini HOWTO, sempre che tu noon
l'abbia già fatto.
-- 
Real name: Fabrizio Chiarello		    | a Debian GNU/Linux "Woody" 
Nickname:  ciccotto			    | is running on Linux 2.4
e-mail:	   
fchia...@inwind.it
             |     because Linux rulez 
GPG Key fingerprint = DD50 3859 67E9 5383 7799  8093 59F2 736E 32CE 0C6D


Non l'avevo fatto (e a dire il vero non sapevo che esistesse), molto
interessante, ora provo con il metodo /dev/port... pero` l'ho trovato in
formato html, c'e' un posto dove potersi scaricare qualche montagna di howto
in pdf o plain text?
Ciao e grazie!

Temo che dovro` proprio usare outb... o c'e' una scappatoia?
No. usare outb č il sistema peggiore.
In rete puoi trovare tutorial e doc. varia su questo argomento.
Ciao

 In rete puoi trovare tutorial e doc. varia su questo argomento.
A parte outb, l'IO-Port-Programming HOWTO riporta solo il sistema con
/dev/port, ma poi l'unico esempio che fa e` con outb.  Quali altri
sistemi ci sono migliori di outb?  Ho provato a cercare su deja ma non
ho trovato nulla di risolutivo.
Massimiliano




Puoi usare solo outb per scrivere /leggere da una porta del bus. (1)
Puoi farlo da spazio utente, ma devi avere i privilegi di root ( e non
è bello ) oppure farlo fare al  device driver della parallela ( e che
quindi sarà quello che andrai ad utilizzare implicitamente andando ad
aprire /dev/port ) oppure ti scrivi un device driver che fa quello che
vuoi , andando a scrivere/ leggere sulla porta parallela.
Altro non mi pare che si possa fare.
Ciao
(1) se vai a vedere il codice del kernel driver della porta parallela
vedrai che usa outb() ....


se vuoi usare /dev/port, lo apri come un normale file(occhio ai
permessi), e prima di andare  a scrivere ti posizioni con lseek al byte
0x378, o l'indirizzo della porta cui vuoi accedere, e scrivi.
non ci sono altri modi, se non usare /dev/lp0, oppure scriverti un
device driver. 
ps: puoi usare anche un cat "testo" > /dev/lp0, che scrive nella lp0,
ma pero creso che non butti fuori soltanto il testo, ma anche
qualcos'altro, dovresti vedere il driver nel kernel.
prova a vedere in 
linuxdoc.org
, magari li trovi qualcosa.


 qualcos'altro, dovresti vedere il driver nel kernel.
Proprio cosi`, infatti, aprendola in modo non bufferizzato e
scrivendoci un byte, aspetta a tempo indefinito.
Massimiliano

 vuoi , andando a scrivere/ leggere sulla porta parallela.
Grazie anche a te. :-) Risolto (pero` l'idea di scrivere un device
driver stuzzica).
Massimiliano

 lpt.
Il problema e' probailmente che non devi usare lp0. Infatti lp0 serve per
comunicare con una stampante e quando ci scrivi qualcosa si blocca in attesa
della risposta (ACK) della stampante. Se la stampante non c'e' non puo'
rispondere e quindi lp si blocca.
Per accedere alla parallela dovresti invece usare /dev/parport (credo)
disponibile nei kernel della serie 2.4.x.
Vedi anche
http://people.redhat.com/twaugh/parport/
--
Alessandro Staltari
staltari(a)
geocities.com

 (credo) disponibile nei kernel della serie 2.4.x.
Si puo` accedere anche tramite /dev/port e lseek'ando a 0x378 prima di
ogni operazione.
Massimiliano


Si ma nell'altro modo secondo me e' piu' elegante...
--
Alessandro Staltari
staltari(a)
geocities.com

 Si ma nell'altro modo secondo me e' piu' elegante...
Senz'altro.  Lo dicevo a titolo informativo. :-)
Massimiliano

 Si ma nell'altro modo secondo me e' piu' elegante...
Fa piu' scena ma alla fine il driver del kernel lo implementa con un outb.
Quindi alla fine e' la stessa cosa, ma se lo fai tu e' leggermente piu'
performante. 
--
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.mascanc.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! I Never Wanted To Be What They Told Me To Be
  		Fulfill My Fate Then I'll Be Free >!-
  			Blind Guardian - Mordred's Song

 Quindi alla fine e' la stessa cosa, 
No. outb() impone l'accesso da root, /dev/port e /dev/parport consentono
l'accesso da utente.
Massimiliano


Inoltre /dev/parport consentirebbe (credo) di astrarsi all'indirizzo I/O
della parallela (chi l'ha detto che deve essere 0x378?) e gestire la
convivenza con altri driver (stampanti,scanner etc.) delegando questi
dettagli al driver sottostante.
--
Alessandro Staltari
staltari(a)
geocities.com

 delegando questi dettagli al driver sottostante.
Vero, ma penso ci sia comunque da mettere mano al kernel e creare un
device apposito.  Un driver per stampante o scanner ce lo vedo poco in
spazio utente...  magari per una scheda di I/O ha gia` piu` senso.
Massimiliano

 spazio utente...  magari per una scheda di I/O ha gia` piu` senso.
Puo' essere. Ma (credo) tutti (sia quelli kernel mode che quelli user mode)
si possano appoggiare a /dev/parport.
Con questo non voglio sembrare integralista. Io stesso ho realizzato dei
programmi che usano outb() per realizzare velocemente soluzioni ad oc.
La teoria probabilmente suggerirebbe soluzioni diverse ma all'atto pratico
non sempre si riesce a seguirla.
--
Alessandro Staltari
staltari(a)
geocities.com