![]() |
|
WinDriver - FAQ |
|
|
|
| General Starters.. | |
|
What is WinDriver?
Must I have experience
in device driver programming or kernel programming?
Do I need the 'WinDriver ISA', 'WinDriver PCI' or the 'WinDriver PCI Bundle' package?
Visit our download page to download a 30 day full featured evaluation copy of WinDriver. Using the evaluation copy you will be able go through the whole driver development process (see below), and to create your working driver / hardware access application in no time. Recommended development steps
|
|
| WinDriver advantages | |
What
are the advantages over similar products?
|
|
| License Issues | |
| How
many copies of my driver can I distribute, after developing it with WinDriver?
Must I pay royalties?
After purchasing the license, you own your driver. The executable that is created is yours to distribute freely in as many copies as you wish. No royalties are to be paid. The only exception to this is if you are creating a driver development kit with the WinDriver. If this is the case, please contact KRFTech (sales@krftech.com) for more information. What
will I receive with my license?
How do
I purchase my WinDriver license?
|
|
| Technical Information | |
| I
have a DOS device driver that uses "inp" and "outp" calls to access my
card. How can I get it to work on Win95 and WinNT?
Simple! Include the sample source code "BASIC_IO.C" in your code. Define the I/O range your card uses in MY_IO_BASE and MY_IO_SIZE. For example: to use range 0x378-0x37a define MY_IO_BASE=0x378 and MY_IO_SIZE=3. Call IO_init() at the begining of the driver, and IO_end() before exit. Replace any inp() and outp() in your code to IO_inp() and IO_outp() respectively. Compile and run! How many I/O spaces and
memory spaces does WinDriver support on a single board?
How many cards can WinDriver
handle at one time?
Can WinDriver group I/O
and memory transfers?
Can WinDriver handle multiple
boards of different types at the same time?
Can I debug code easily
using MSVC++?
What are the differences
between device drivers for Windows 3.x, Windows 95, and Windows NT?
In Windows 95, which runs 32Bit code, running applications that access the I/O ports directly is possible, unlike in Windows-NT - where performing an I/O read/write will cause a general Application Fault.
In order to support Both Win-95 and NT two separate kernel-mode drivers need to be written.
I have run into a problem
accessing 32MB of memory on a PCI card. With a 16MB window it works fine.
What's the problem?
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\SystemPages in the registry. (Use REGEDIT.EXE for Win-95 and NT4.0, or REGEDT32.EXE for NT3.51). It is recommended to use a smaller window to access the memory on the board. The card I want to drive
currently has an interrupt service routine in DOS/16-bit. How do I create
an interrupt routine?
Does WinDriver poll the
interrupt (Busy Wait)?
Can I write to disk files
during an interrupt routine?
We are currently developing
NT4.0 drivers and I would like to know if your product supports PNP in
NT4.0...
How do I perform PCI memory
access Read/Writes to/from our card using WinDriver?
Sample code that performs all this is found in "PCI.C" in the WinDriver package. What happens if another
piece of hardware in someone's machine is also using a driver that was
written using WinDriver... does it handle it gracefully? Has it been tested?
How do I perform PCI Interrupt
handling using WinDriver?
Sample code that performs all this is found at "PCI.C" in the WinDriver package. How do I perform PCI Burst
Writes (DMA) from system memory to our card using WinDriver?
To do this, call WD_DMALock(), giving your buffer's linear address as the parameter. WD_DMALock() will lock this buffer in physical memory and give you a list of pages representing the physical addresses of your buffer. Now it is up to you to program your BUS-MASTER device with the page list, and send a command for your card to start transfer. Programing a PCI device for DMA transfer is device specific. If you have any questions, contact us for help with your specific device. At the end of the transfer you should call WD_DMAUnlock() to release your buffer from locked physical memory. A sample can be found in "PCI.C" in the WinDriver package, in the function IO_DMATransferBuffer(). How do I perform Direct
Block transfers from one PCI card to another?
At least one of the cards must be PCI DMA Master Capable. Program it with the physical address of the Slave card. Obtaining this address is possible by using 'I.Mem.dwPhysicalAddr' set by WD_PciGetCardInfo(). A sample can be found in "PCI2PCI.C" in the WinDriver package. How do I prevent two processes
from attaching to the card?
What is the interrupt latency
of WinDriver?
This is OS dependent. As a general rule: the more complex the OS the longer the latency. (i.e. DOS is fastest, Win95 slower and WinNT slowest.) |
|
| PLX API | |
| I am using
the PLX-MON (The monitor software which is included in the PLX design Kit).
The Read/Write functions are working correctly. The WinDriver Wizard can also access memory on the PLX9050. But when I use the WinDriver's PLX9050 Diagnostics utility, I cannot read/write data on the board's memory. What is the problem? WinDriver's PLX 9050 API automatically sets the re-map register on the PLX 9050 prior to reading/writing data from the local bus. This means the you MUST set the values of the re-map register in the p50lib.c (this depends on your hardware), the card may HANG if the wait-states are not set correctly. Since many developers are not aware of this feature, and they prefer to set the re-map register in the EEPROM init (when the computer is turned on), we have created new functions in the V3.03 that access the PLX address ranges without changing the re-map register. These functions are P9050_ReadSpaceByte() and friends. Please download and install WinDriver V3.03 or higher, and use Option 5 (not 6) from the main menu of the WinDriver's PLX diagnostics utility (read/write address spaces). This option uses P9050_ReadSpaceByte() instead of P9050_ReadByte(). P9050_ReadByte() first sets the re-map register, then calls P9050_ReadSpaceByte(). Since you do not want WinDriver to set the re-map register, but prefers a low-level access (like WinDriver Wizard and PLX-MON do), please call the P9050_ReadSpaceByte() functions. |
|