Zdroj: http://prochazka.clanweb.eu/index.php?a=programy/wwio.dll-s-podporou-usb2lpt • Vydáno: 25.8.2013 19:55 • Autor: hacesoft
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.
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:
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.
Vrátí handle úspěšně otevřeného fyzického LPT portu příkazem:
Vrátí handle úspěšně otevřeného přístupu na USB to LPT port, příkazem:
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ší.
Celý kód funkce v knihovně:
Její Použití:
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.
Zapíše data. První hodnota určuje kam a druhá hodnota co zapsat.
Celý kód funkce v knihovně:
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:
potom můžete psát třeba toto:
Přečte hodnotu z registru.
Celý kód funkce v knihovně:
Celý kód funkce v knihovně:
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