<?php echo _title;?> www.prochazka.zde.cz
www.ccsinfo.com/CEH
Server si právě čte 176 lidí, dnes je úterý, 26. Listopad 2024   
Kategorie: USB, Programy, HW

WWIO.DLL s podporou USB2LPT

icons pic Nejnovější verze je určena pro Win7. U Win7 se to mírně komplikuje diky UAE. Tento problém prozatím musíte řešit, že zakážete, ve Win7 řízení učtu (UAE) a nebo ve svém projektu (v *.exe) nastavíte ve vlastnostech linkeru ->manifest file -> UAC execution level na reqire Administrator. Nebo v ikoně *.exe souboru ve vlastnostech nastavíte zaškrtávání políčko spouštět jako administrátor. Knihovna pracuje jak s fyzickým LPT portem, tak i konvertorem USB to LPT port.

Kompletní popis jednotlivých funkcí knihovny wwio.dll najdete zde. Tato verze knihovny nepodporuje USB to LPT převodnik.

Stručný popis práce s fyzickým LPT portem: pro komunikace je použit GiveIO.sys ovladač. Vše potřebného zařídí knihovna wwio.dll sama.
Stručný popis práce s USB to LPT port: je potřeba postavit USB to LPT port, a nainstalovat přiložené ovladače.
Díky tomu že si knihovna wwio.dll zařídí vše potřebné sama je na programátoru jen málo starostí jak používat fyzický LPT port nebo USB to LPT konvertor.

Pro funkci fyzickeho LPT portu je využíváno služeb ovladače GiveIO.sys. Který musí bejt ve stejném adresáři jako wwio.dll.
wwio.dll je testována na Win7 servisní baliček 1 a .NET Framework 4.0..

Knihovny DLL prostředí Visuál C++ jsou zaváděný na adresu 0x10000000. Dovoluji si tvrdit, že se na jednu adresu snaží zavést polovina všech DLL na světě. Musí-li operační systém přesměrovat adresu DLL, musí každé místo v kódu, které s příslušnou adresou DLL knihovny pracuje najít a změnit odkazovou adresu, protože se DLL už nenachází na své výchozí adrese. Kvůli přesměrování nemůže operační systém mapovat příslušný modul paměti. Je-li modul zaveden na svoji výchozí adresu, může jej operační systém načíst přímo z disku, byl-li modul mapován. Pokud je modul přesměrován, mění se adresa paměti modulu pro daný proces a operační systém musí tuto paměť stále udržovat, což počítač zpomaluje. Proto knihovna wwio.dll se zavadí na adresu 0x63000000.

Pomocí této knihovny můžete ve Visuál Basicu a Céčku pracovat s LPT porty. V Biosu nastavte LPT port na ECP + EPP. Toto nastavení není nikterak důležité pro funkci DLL wwio.dll ale s tímto nastavením funguje LPT port obousměrně. Například nastavení režimu portu na SPP znamená že datová sběrnice D0 – D7 je jen výstupní. Podrobnosti ohledně LPT portu v češtině naleznete zde: hw.cz/lpt
Další nastavení jako DMA a adresa portu, muže bejt libovolná.

Tento program, wwio.dll můžete používat neomezeně pro NEKOMERČNÍ účely.

U této verzi je odstraněno samostatné volání funkce UnLock(). Je součástí funkce OpenPort(). Nebudu znovu popisovat všechny funkce knihovny, ale popíšu jen nové a případné změny.

Funkce OpenPort :
C++ code
int WINAPI OpenPort(PORT_CONFIG *PortConfig);

typedef struct snUSB_LPT {//konfigurace USB_LPT
        PTCHAR NamePort;        //out
        int LengthNamePort;     //out
        PTCHAR DeviceDesc;      //out
        int LengthDeviceDesc;   //out
        PTCHAR ServiceName;     //out
        int LengthService;      //out
        PTCHAR Mfg;             //out
        int LengthMfg;          //out
        PTCHAR HardwareID;      //out
        int LengthHardwareID;   //out
        PTCHAR ClassGUID;       //out
        int LengthClassGUID;    //out
}sUSB_LPT;
sUSB_LPT pStrucUSB_LPT;

typedef struct nPORT_CONFIG{//konfigurace portu
        int DMA;                        //out
        int IRQ;                        //out
        int Type_Port;                  //out
        int adress;                     //out
        int range;                      //in
        CAtlString port;                //in
        struct snUSB_LPT *s_USB_LPT;    //out
}PORT_CONFIG;
PORT_CONFIG Port_Config;

Ověří dostupnost ovladače Giveio.sys a případné nedostatky napraví. Pokud je požadavek na použití fyzického LPT portu. V případě požadavku na USB to LPT port se využívají ovladače nainstalované při prvním připojení tohoto konvertoru k počítači. Toto je jediná funkce která vyžaduje administrátorská práva a to ještě v případu použití fyzického LPT portu.

Návratová hodnota je nula, když funkce uspěla. V případě chyby je vracena odpovídající hodnota určující proč funkce neuspěla.
ErrorKod = 0 -- Všechno je ok.
ErrorKod = 1 -- Nelze najít soubor GiveIO.sys.
ErrorKod = 3 -- Nejde spustit giveio.sys ovladač.
ErrorKod = 4 -- Nejde otevrit OpenSCManager. Aplikace potřebuje práva administrátora.
ErrorKod = 5 -- Parametr range mimo rozsah.
ErrorKod = 6 -- Požadovaný port NEEXISTUJE.
ErrorKod = 7 -- Neplatné označeni portu.
ErrorKod = 8 -- Je indikovaná chyba z předchozí činnosti funkce OpenPort.
ErrorKod = 9 -- Neni provedena funkce UnLock.
ErrorKod = 10 -- Nelze rezervovat paměť pro rozšiřující strukturu USBxLPT konvertor.
ErrorKod = 183 – Nelze vytvořit soubor, který již existuje. Nejedna se o chybu ale o upozorněni, program muže pokračovat dále.
ErrorKod = 1072 – Zadané zařízení je určeno na odstranění. Zkuste to znovu.
ErrorKod = 1073 – Zadaná služba již existuje. Nejedna se o chybu ale o upozorněni, program muže pokračovat dále.
ErrorKod = 1056 - Instance této služby je již spuštěna. Nejedna se o chybu ale o upozorněni, program muže pokračovat dále.
ErrorKod = 1060 -- Nejde nainstalovat giveio.sys ovladač

Pomoci této funkce zjistíte fyzickou adresu zjišťovaného portu, za předpokladu že se ptáte na fyzický LPT port. Funkce OpenPort používá strukturu PORT_CONFIG, kde je patrné že jsou pouze dva parametry vstupní a zbytek funkce po úspěšném provedení dodá. Jako velice důležitý vstupní parametr je název portu, kde můžete se dotazovat na LPT1 až LPT 9, COM1 až COM9 a nejnovější verze ještě podporuje USB_LPT (to pro emulovaný LPT port přes USB rozhraní pomocí USB to LPT port . Názvy portu není třeba psát jen velkýma písmeny ale můžete použit jakoukoliv kombinaci velkých a malých písmen. Za tímto názvem je číslo požadovaného portu. Knihovna wwio.dll je určena pro práci s LPT porty počítače, to že dokáže zjistit fyzickou adresu COM portu je pouze vedlejší efekt, na komunikaci s COM porty existuje slušná sada API funkcí systému, proto tato knihovna wwio.dll nikterak nekomunikuje s COM porty. I když dokáže zjistit jeho fyzickou adresu.
Jako další vstupní parametr je funkce OpenPort v datové struktuře PORT_CONFIG je integer range, pro normální činnost používejte hodnotu 0. Při zadání hodnoty 1 se vrátí jiná adresa portu, kde by se měly nacházet další konfigurační registry LPT portu.
Poslední položkou je odkaz na strukturu snUSB_LPT, je to rozšiřující výčet pro USB to LPT port. Struktura by měla bejt definována, i když budete používat jen fyzický LPT port. V takovém případě po úspěšném návratu funkce OpenPort jsou všechny odkazy NULL. Při použití konvertoru je struktura snUSB_LPT naplněna hodnotami. Pro které se nealokuje žádná paměť. Funkce si vše zařídí sama a při použití funkce Lock se uvolni zabraná paměť strukturou snUSB_LPT. Funkce OpenPort si sama řídí správu paměti struktury snUSB_LPT. Ostatní položky datové struktury PORT_CONFIG jsou už zjištěny funkcí OpenPort:

  • DMA – hodnota dma kanálu.
  • IRQ – číslo přerušení portu.
  • Adress – je adresa LPT/COM portu.
  • Type_Port
    • – pokud obsahuje hodnotu 2, jedná se o port SPP nebo EPP.
    • - pokud obsahuje hodnotu 4, jedna se o port ECP a jeho kombinace.

Poznámka: funkce OpenPort není párová funkce, neexistuje něco jako ClosePort. Při ukončení programu se pouze provede funkce Lock();.

Funkce Write, Write_Data, Write_Status, Write_Control, Read, Read_Data, Read_Status a Read_Control jsou určeny jen pro práci s fyzickým LPT portem. Pro konvertor USB to LPT jsou zbrusu nové funkce.

Funkce GetHandleLpt :

Vrátí handle úspěšně otevřeného fyzického LPT portu příkazem:

C++ code
CreateFile(TEXT("\\\\.\\giveio"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
Funkce GetHandleLptUsb :

Vrátí handle úspěšně otevřeného přístupu na USB to LPT port, příkazem:

C++ code
CreateFile(Port_Config.s_USB_LPT->NamePort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);

Následující funkce jsou opsány z originální dokumentace umístěna na: www-user.tu-chemnitz.de/~heha/bastelecke/Rund%20um%20den%20PC/USB2LPT/API.de.htm Doporučuji používat německou verzi dokumentace, je komplexnější.

Funkce ReadSerialAndDate :

Celý kód funkce v knihovně:

C++ code
bool WINAPI ReadSerialAndDate(WORD adr, WORD date, DWORD BytesRet,
 FILETIME ft, SYSTEMTIME st, LPTSTR sBuffer, int LenghtsBuffer){
 if (DeviceIoControl(hUSB_LPT,IOCTL_VLPT_XramRead,&adr,sizeof(adr),&date,sizeof(date),&BytesRet,NULL)) {
   DosDateTimeToFileTime(date,0,&ft);
   FileTimeToSystemTime(&ft,&st);
   GetDateFormat(LOCALE_USER_DEFAULT,0,&st,NULL,sBuffer,LenghtsBuffer);
   }else{
      return false;
   }
   return true;
}

Její Použití:

C++ code
WORD adr = 6;
WORD date = 0;   // Date as FAT date
DWORD BytesRet = 0;
FILETIME ft;
SYSTEMTIME st;
WCHAR sBuffer1[LenghtsBuffer];// the string buffer where the date is put
bool fRnt;
fRnt = wwio_USB2LPT::ReadSerialAndDate(adr, date, BytesRet, ft, st, (LPTSTR)sBuffer1, LenghtsBuffer);
//Kdyz vrati true funkce uspela. Kdyz vrati false jedna se o fyzicky LPT port ne emulovany.

Pomocí této funkce můžete zjistí zda se jedná o fyzický LPT port v počítači nebo emulovaný port. Jelikož se používá na zjištění požadováného portu funkce: int WINAPI OpenPort(PORT_CONFIG *PortConfig); je bool WINAPI ReadSerialAndDate (WORD adr, WORD date, DWORD BytesRet, FILETIME ft, SYSTEMTIME st, LPTSTR sBuffer, int LenghtsBuffer); je celkem tato funkce neužitečná pro toto použití, lze ji pouze použít pro přečtení datumu firmware.

Funkce WriteData :

Zapíše data. První hodnota určuje kam a druhá hodnota co zapsat.

Celý kód funkce v knihovně:

C++ code
void WINAPI WriteData(BYTE a, BYTE b) {
 BYTE IoData[2];
 DWORD BytesRet;
 IoData[0] = a;
 IoData[1] = b;
 DeviceIoControl(hUSB_LPT,CTL_CODE(FILE_DEVICE_UNKNOWN,0x804,METHOD_BUFFERED,FILE_ANY_ACCESS),
  IoData,sizeof(IoData),NULL,0,&BytesRet,NULL);
}

Same as for OUT, a is a relative address. The operation reads the levels at port pins (not necessarily the same as the data output). The results are:

0 = data port
1 = status port (with bits “Busy”, “Acknowledge”, “Paper End” etc.)
2 = control port (real line states)
3 = EPP address read cycle (see Beyond Logic)
4 = EPP data read cycle (a = 5, 6 and 7 do data cycles too)
8 = ECP FIFO read or reading of “Configuration Register A
9 = read “Configuration Register B” (always 0)
10 = read ECP Configuration Register “ECR” (e.g. FIFO state)

Note that one bit at status port (a=1) and three bits at control port (a=2) are inverted! You can avoid inversion by an “extra” register, see later.

12 = direction register for data port (default: 0xFF, i.e. all outputs)
13 = direction register for status port (default: 0x07)
14 = direction register for control port (default: 0x0F)
15 = USB2LPT Feature Register (default: 0x00, High-Speed: 0x24)
Direction bits = 1 are outputs, otherwise inputs.

Pro snazší obsluhu emulovaného portu doporučuji k projektu přidat následující deklarace:

C++ code
#define S0_R 1
#define S1_R 2
#define S2_nIRQ 4
#define S3_nERR 8
#define S4_ONL 16
#define S5_PE 32
#define S6_nACK 64
#define S7_nBSY 128

#define C0_nSTB 1
#define C1_nAF 2
#define C2_nINT 4
#define C3_nSEL 8
#define C4_IEN 16
#define C5_DIR 32
#define C6_nc 64
#define C7_nc 128

#define SPP 0x5
#define Bidirection 0x25
#define AutoStrobe 0x45
#define ECP 0x65
#define EPP 0x85
#define RESERVED 0xA5
#define TestMode 0xC5
#define Configuration 0xE5

#define DataPort 0
#define Status 1
#define Control 2
#define ECR 10

potom můžete psát třeba toto:

C++ code
wwio_USB2LPT::WriteData( ECR,  SPP); //konfigurace portu
wwio_USB2LPT::WriteData( Control, 0);
wwio_USB2LPT::WriteData( Status, 255);
wwio_USB2LPT::WriteData( DataPort, 0);
Funkce ReadData :

Přečte hodnotu z registru.

Celý kód funkce v knihovně:

C++ code
BYTE WINAPI ReadData(BYTE a) {
 BYTE IoData[1];
 DWORD BytesRet;
 IoData[0] = a|0x10;    // set the bit for read operations
 DeviceIoControl(hUSB_LPT,IOCTL_VLPT_OutIn,IoData,sizeof(IoData),IoData,sizeof(IoData),&BytesRet,NULL);
 return IoData[0];
}
Funkce GetPinStates :

Celý kód funkce v knihovně:

C++ code
void WINAPI GetPinStates(BYTE states[], DWORD BytesRet) {
 DeviceIoControl(hUSB_LPT,IOCTL_VLPT_OutIn,(LPVOID)states,sizeof(states),
 states,sizeof(states),&BytesRet,NULL);
}

K projektu v C nebo C++ je třeba přilinkovat aktualní wwio.lib soubor.

Stáhnout soubor wwio.dll_usb2lpt.rar

Ujednání:
Tento archív můžete neomezeně šířit pouze kompletní! Tento archív se nesmí za úplatu kopírovat a šířit. Nesmí být použit v KOMERČNÍCH projektech bez souhlasu autora. Pokud používáte tyto knihovny ve svém programu, už nemusíte přikládat kompletní archív ani dokumentaci. Postačí, ze uvedete zdroj a odkaz na server www.prochazka.zde.cz těchto knihoven v dokumentaci o vašem programu nebo aboutu (O Aplikaci ...).

Děkuji, že používáte tyto produkty.

Autor ovladaču Giveio.SYS je:
Dale Roberts, Direct I/O and Windows NT.
ftp://ftp.mfi.com/pub/windev/1995/may95.zip

print Formát pro tisk

Komentáře rss

Zasílate odpověď ke stávajícímu příspěvku (zrušit).

Nemáte oprávnění přidávat příspěvky.

Uživatelské jméno
Heslo
     

Registrace >
Ztracené heslo >


icon , Blikani LEDkama... odpovědět
avatar
Jednoduchá ukázka Blikaní s LEDkama na emulovaném LPT portu.
[geshi]lang=cpp,
#define InitStatus ~(S2_nIRQ | S3_nERR | S4_ONL | S5_PE | S6_nACK )
#define InitControl ~( C2_nINT | C4_IEN | C5_DIR )

Same as for OUT, a is a relative address. The operation reads the levels at port pins (not necessarily the same as the data output). The results are:
0 = data port
1 = status port (with bits “Busy”, “Acknowledge”, “Paper End” etc.)
2 = control port (real line states)
3 = EPP address read cycle (see Beyond Logic)
4 = EPP data read cycle (a = 5, 6 and 7 do data cycles too)
8 = ECP FIFO read or reading of “Configuration Register A”
9 = read “Configuration Register B” (always 0)
10 = read ECP Configuration Register “ECR” (e.g. FIFO state)
Note that one bit at status port (a=1) and three bits at control port (a=2) are inverted! You can avoid inversion by an “extra” register, see later.

12 = direction register for data port (default: 0xFF, i.e. all outputs)
13 = direction register for status port (default: 0x07)
14 = direction register for control port (default: 0x0F)
15 = USB2LPT Feature Register (default: 0x00, High-Speed: 0x24)
Direction bits = 1 are outputs, otherwise inputs.

*/

wwio_USB2LPT::WriteData( ECR, SPP); //konfigurace portu

wwio_USB2LPT::WriteData( Control, 0);
wwio_USB2LPT::WriteData( Status, 255);

wwio_USB2LPT::WriteData( Status, InitStatus);
wwio_USB2LPT::WriteData( DataPort, 0);
wwio_USB2LPT::WriteData( Control, InitControl);

wwio_USB2LPT::WriteData( DataPort, 1);
wwio_USB2LPT::WriteData( DataPort, 2);
wwio_USB2LPT::WriteData( DataPort, 4);
wwio_USB2LPT::WriteData( DataPort, 8);
wwio_USB2LPT::WriteData( DataPort, 16);
wwio_USB2LPT::WriteData( DataPort, 32);
wwio_USB2LPT::WriteData( DataPort, 64);
wwio_USB2LPT::WriteData( DataPort, 128);

wwio_USB2LPT::WriteData( DataPort, 255);
wwio_USB2LPT::WriteData( DataPort, 0);

////////////////set all LEDs ///////

wwio_USB2LPT::WriteData( DataPort, 255);
wwio_USB2LPT::WriteData( Status, ~InitStatus);
wwio_USB2LPT::WriteData( Control, ~( C0_nSTB | C1_nAF | C3_nSEL| C5_DIR ));

wwio_USB2LPT::WriteData( DataPort, 0);
wwio_USB2LPT::WriteData( DataPort, 255);[/geshi]

Všechny informace jsou zahrnuty pod GPL licenci, pokud není explicitně uveden jiný typ licence.
Používání těchto stránek ke komerčním účelům lze jen se souhlasem autora.
Všechna práva vyhrazena (c) 1997 - 2024 hacesoft.
Jste návštevník číslo: 445382
Celkem zobrazeno stránek: 17752431
Přihlásit do administrace