Link to home
Start Free TrialLog in
Avatar of keithcsl
keithcsl

asked on

Device Driver for LPT1

I have written a delphi code to access my parallel port. However, I could only get 200K bytes per second from my CCD camera. Will a device driver speed things up? The QuickCam camera seems to be doing at least 600K bytes per second.

If a device driver is the way to go, how hard is it to write one for my application? Can I convert my ASM code to a VxD code?

Kind Regards
Keith
ASKER CERTIFIED SOLUTION
Avatar of kkp
kkp

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of keithcsl
keithcsl

ASKER

I am running in Win95. And yes, you are right, the slow rate of data transfer is because of manual strobes:
Strobe high
Strobe low
Read Data

and the configuration is bi-directional mode, 8 bit.

According to you answer, I can use the EPP bidirectional, 8 bit immediate acknowledge with a transfer rate of 1M/S. I would like to use this mode on my CCD camera. Are the pin configurations for EPP the same as for the bi-directional pin config? Can I use my same instructions to get the data?

And no, my CCD camera does not have a driver. I have to communicate with it directly. The protocol to access the data is as described above,
Strobe high
Strobe low
Read Data

The CCD has a DSP to transmit data at a very very fast rate. i am writing the DSP code to transmit/receive data to/from the PC. This means that I have total control over the CCD camera to do what I want. If the EPP mode is different from the bi-directional mode, this means that I have to change the protocol in the DSP to suit the EPP mode. Do you know the difference between the 2 modes?

The only problem is the PC is too slow to get the data (in bi-directional mode). I think if I use the EPP mode, I should be able to get data at a much better rate.

OK, where should I go from here? Do I still need to write a device driver? Currently,
- data is accessed from the port directly in Delphi.
- the port is configured in bi-directional mode
- data rate of 200K/S

Ideally, I would still like to use my Delphi code to read/write to the CCD, but at a faster rate. What do I have to change in order to operate in the EPP mode?
No problem! My EPP knowledge comes from the IEEE P1284/D2 september 1993 unapproved draft marked DS02709, but to my experience it is valid.

I'll try to explain how it works:
In EPP mode the port works like a bus port. it has two adresses, we'll name then DATA (base+3) and ADDR (base+4).
The physical pins are named nWrite (1), d0..d7 (2..9), Intr (10), nWait (11), nDstrb (14), nAstrb(17).

First, set all outputs (nWrite, nDstrb, nAstrb) high (electrically high measured at the physical pin). The DSP should respond with a low->nWait. This is the idle state.

Second, do a read of address [data]. nDstrb will go 0, and d0..d7 will go high impedance (simultaneously). Your DSP drives d0..d7, and responds high->nWait, WITHIN 10 uS of nDstrb-Low-edge. The data-setup-time-to-nWait-high is 0. The EPP will remove nAstrb, indicating that data has been fetched. (At this point, the ISA bus becomes 'ready' and data is returned to the x86) Your DSP floats its d0..d7 outputs and responds with low-nWait WITHIN 125* nS. (*My experience with my clone ports here is that the timing constraint is 10uS, meaning that the EPP also waits for nWait going active again. This makes sense, but I can't check it in the new spec before monday.)
The 10uS is a timer on the EPP which aborts 'never-ending-cycles', so that you can't hang the PC this way.

If the address used was ADDR instead, nAdstrb would have been set low instead.
If you WRITE to these two addresses, it will look like a read cycle, but data will be driven by the PC while nA/Dstrb is low, and the nWrite signal will be low from start (falling edge of nA/Dstrb) to finish (falling edge of nWait). Draw it on paper!

One last thing: Your DSP program should terminate a read if the EPP doesn't respond in 1 Sec (yes,10^6 uS!). This 1S comes from the spec. Otherwise a continous collision would occur, frying the weak end of the data bus. Also, BEWARE of capacitive wire-to-wire  capacitive coupling - use a 34 wire flat cable and 'fan' the cable at the PC connector. Otherwise you'll get bugged by glitches (I DID!).

Your delphi transfer code in asm will look like this:

MOV DX,portbase
ADD DX,3         //get to data port
MOV EDI, bufferpointer
MOV ECX, buffersize_in_byte
CLD
REP INSB         //get busy!
<end>

No manual strobes. Just speed. REP INSB does it all. And there's no reason to go VxD yet.
Thank you very much kkp. I feel very excited about using this EPP protocol. I have finished testing and debugging my bi-directional program and sadly, it could only run at a maximum rate of 2.6 frames per second. Very slow. If I follow according to your advise, I should be reaching near 15 frames per second!! I will start coding the software immediately.

Oh yes, I was wondering if I could reach you by e-mail if I bump into any problems with the EPP protocol. If possible, just mail me at:
 keithcsl@ihug.co.nz

If, not just tell me how I can contact you. Once again, thanks a million...

Kind Regards,
keith