ieee1284_read_control, ieee1284_write_control, ieee1284_frob_control, ieee1284_do_nack_handshake — manipulate control lines
#include <ieee1284.h>
int ieee1284_read_control( | port) ; |
struct parport * | port; |
void ieee1284_write_control( | port, | |
ct) ; |
struct parport * | port; |
unsigned char | ct; |
void ieee1284_frob_control( | port, | |
mask, | ||
val) ; |
struct parport * | port; |
unsigned char | mask; |
unsigned char | val; |
int
ieee1284_do_nack_handshake( | port, | |
ct_before, | ||
ct_after, | ||
timeout) ; |
struct parport * | port; |
unsigned char | ct_before; |
unsigned char | ct_after; |
struct timeval * | timeout; |
There are four control lines, three of which are usually inverted on PC-style ports. Where they differ, libieee1284 operates on the IEEE 1284 values, not the PC-style inverted values. The control lines are represented by the following enumeration:
enum ieee1284_control_bits { C1284_NSTROBE = 0x01, C1284_NAUTOFD = 0x02, C1284_NINIT = 0x04, C1284_NSELECTIN = 0x08, /* To convert those values into PC-style register values, use this: */ C1284_INVERTED = (C1284_NSTROBE| C1284_NAUTOFD| C1284_NSELECTIN), };
These functions all act on the parallel port associated
with port
, which must be
claimed.
The current values on the control lines are available by
calling ieee1284_read_control
, and may
be set by calling
ieee1284_write_control
.
To adjust the values on a set of control lines, use
ieee1284_frob_control
. The effect of
this can be expressed by: ctr = ((ctr & ~mask) ^
val)
; that is, the bits in
mask
are unset, and then those in
val
are inverted.
The special function
ieee1284_do_nack_handshake
is for
responding very quickly in a protocol where the peripheral
sets nAck and the host must respond by setting a control
line. Its operation, which relies on the host machine
knowing which interrupt nAck generates, is as follows:
Set the control lines as indicated in
ct_before
.
Wait for nAck interrupt. If
timeout
elapses, return
E1284_TIMEDOUT.
Set the control lines as indicated in
ct_after
.
On Linux using the ppdev driver, this is performed by the device driver in the kernel, and so is faster than normally possible in a user-space library.
The return value of
ieee1284_read_control
, if non-negative,
is a number representing the value on the control lines.
Possible error codes for
ieee1284_read_control
:
The control lines of this port are not accessible by the application.
The port
parameter is
invalid (for instance, perhaps it is not
claimed).
Possible error codes for
ieee1284_do_nack_handshake
:
The handshake was successful.
This operation is not available on this port type or system. This could be because port interrupts are not available, or because the underlying device driver does not support the operation.
The port
parameter is
invalid (for instance, perhaps it is not
claimed).