Newsgroup: it.comp.programmare.win32
Titolo: Configurazione porta parallela

Salve,
ho la necessita' di settare la modalità di funzionamento della porta
parallela, cioe' in base alla periferica collegata devo poter scegliere tra:
- Standard Mode
- Byte Mode
- Parallel Port FIFO Mode
- ECP FIFO Mode
- EPP Mode
devo quindi configurare la porta a seconda delle mie necessita'. La
documentazione che sono riuscito a trovare parla di Extended Control
Register e relativi bit di configurazione:
Bit Function
7:5 Selects Current Mode of Operation
      000 Standard Mode
      001 Byte Mode
      010 Parallel Port FIFO Mode
      011 ECP FIFO Mode
      100 EPP Mode
      101 Reserved
      110 FIFO Test Mode
      111 Configuration Mode
4   ECP Interrupt Bit
3   DMA Enable Bit
2   ECP Service Bit
1   FIFO Full
0   FIFO Empty
La domanda e': posso settare direttamente i bit 7-5 a seconda delle mie
necessita' o c'e' un modo piu' sicuro e completo per configurare la
porta? Una nota infatti riporta: "The above modes are configurable via
BIOS. You can reconfigure them by using your own software, but this is
NOT RECOMMENDED".
Altra domanda: ho cercato altra documentazione a proposito delle porte
parallele (uso e configurazione via software) ma non ho trovato molto,
qualcuno puo' indicarmi dove trovare piu' esaurienti informazioni? (siti
web o libri).
Grazie, Marco

Con che sistema operativo ?
Con DOS basta veramente poco, poi le cose si complicano via via che si
procede verso win 95 (VxD), poi win98 (VxD, WDM), poi winnt4 (SYS), poi
win2000 (SYS, WDM...)
In DOS basta sapere l'indirizzo base della parallela, che e' oltretutto
standard e comunque e' riportato in RAM perche' il BIOS lo calcola
automaticamente al boot (non ricordo dove ma posso cercarlo se ti serve).
Devi poi sapere anche quale e' il chip dove e' integrata la porta parallela.
Una volta la porta era costruita con una schedina ed alcuni componenti.
Molto bello e comodo per giocarci.....
Adesso e' in un chipset, assieme alle seriali, al floppy controller e cosi'
via.
Giorgio

 Con che sistema operativo ?
  Windows95/98
Il mio problema e' che alcune periferiche funzionano in modalità
Standard, altre in modalita' ECP e cosi' via. Per non costringere
l'utente ad agire direttamente sul BIOS volevo cofigurare la porta
direttamente via software. 
Mi armo di coraggio, cerco la documentazione necessaria a riguardo e trovo:
The above modes are configurable via BIOS. You can reconfigure them by
using your own
software, but this is not recommended. These software registers,
typically found at 0x2FA, 0x3F0,
0x3F1 etc are only intended to be accessed by BIOS. There is no set
standard for these configuration
registers, thus if you were to use these registers, your software would
not be very portable. With
today’s multitasking operating systems, its also not a good idea to
change them when it suits you.
A better option is to select ECP and EPP1.7 Mode or ECP and EPP1.9 Mode
from BIOS and
then use the ECP’s Extended Control Register to select your Parallel
Port’s Mode.
Quindi per essere sicuro che la mia applicazione lavori sempre
correttamente devo in ogni caso configurare la porta direttamente da
BIOS in modalita' ECP per potere utilizzare l'Extended Control Register
e dopo modificarne i settaggi. Quindi quello che io volevo ( evitare che
l'utente sia obbligato a configurarsi manualmente la porta da BIOS ) non
e' attuabile.
E' mai possibile che non cia sia un'altra maniera, per configurare la
parallela che non sia quella di costringere l'utente ad agire sul BIOS?
Esempio: per configurare la seriale esiste la chiamata SetCommState
mediante la quale posso settare BaudRate, Parity, Handshake etc etc, in
base alle mie esigenze.
Per configuare la parallela, seguendo le istruzioni della documentazione
in mio possesso, e sempre dando per scontato che sia già stata impostata
in modalita' ECP !!!!!!! devo:
- Innanzitutto cercarmi l'indirizzo della porta, e a tal proposito
riporto testualmente:
What can make this even confusing, is that some manufacturers of
Parallel Port Cards, have
jumpers which allow you to set your Port to LPT1, LPT2, LPT3. Now what
address is LPT1? - On the
majority of cards LPT1 is 378h, and LPT2, 278h, but some will use 3BCh
as LPT1, 378h as LPT1 and
278h as LPT2. "Life wasn’t meant to be easy". (andiamo bene...)
Poi pero' prosegue:
However should you want to find the address of LPT1 or any of the Line PrinTer
Devices, you can use a lookup table provided by BIOS. When BIOS assigns
addresses to your printer
devices, it stores the address at specific locations in memory, so we
can find them.
Start Address     Function
  0000:0408      LPT1's Base Address
  0000:040A      LPT2's Base Address
  0000:040C      LPT3's Base Address
  0000:040E      LPT4's Base Address (Note 1)
Quindi per trovare l'indirizzo delle porte basta per esempio:
void GetPorts(void)
{
  unsigned int far *ptraddr; /* Pointer to location of Port Addresses */
  unsigned int address;      /* Address of Port */
  int a;
  ptraddr=(unsigned int far *)0x00000408;
  for (a = 0; a < 3; a++)
  {
    address = *ptraddr;
    if (address == 0)
     printf("No port found for LPT%d \n",a+1);
    else
     printf("Address assigned to LPT%d is %Xh\n",a+1,address);
    *ptraddr++;
  }
}
A questo punto, se ho capito bene, una volta trovato l'indirizzo della
porta e dopo essermi assicurato che la porta sia impostata in modalita'
ECP dal BIOS posso trovare l'indirizzo dell'Extended Control Register,
che dovrebbe trovarsi a:
baseAddress + 0x400h.  dove baseAddress è l'indirizzo della porta(spero)
e solo a questo punto settare i bit 7-5 a seconda delle mie necessita'.
Per favore ditemi che non ho capito niente e che esiste la chiamata
SettaPorta( mode ) e tutto funziona.
Ciao, Marco

Se sei in Win98 allora la sola cosa da fare per evitarsi dispiaceri misti
(crash e simili) e' cercare di modificare la configurazione dell'hardware
delle seriali con un device driver. Al momento non so se sia possibile fare
quello che vuoi con poco sforzo. Se hai sotto mano il DDK di WIn98 non
dovresti avere problemi a trovare documentazione ed esempi.
Giorgio