|
Packit |
d36e9b |
/*
|
|
Packit |
d36e9b |
* libieee1284 - IEEE 1284 library
|
|
Packit |
d36e9b |
* Copyright (C) 2001, 2002, 2003 Tim Waugh <twaugh@redhat.com>
|
|
Packit |
d36e9b |
*
|
|
Packit |
d36e9b |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
d36e9b |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
d36e9b |
* the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
d36e9b |
* (at your option) any later version.
|
|
Packit |
d36e9b |
*
|
|
Packit |
d36e9b |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
d36e9b |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
d36e9b |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
d36e9b |
* GNU General Public License for more details.
|
|
Packit |
d36e9b |
*
|
|
Packit |
d36e9b |
* You should have received a copy of the GNU General Public License
|
|
Packit |
d36e9b |
* along with this program; if not, write to the Free Software
|
|
Packit |
d36e9b |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
Packit |
d36e9b |
*/
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
#ifndef HAVE_IEEE1284_H
|
|
Packit |
d36e9b |
#define HAVE_IEEE1284_H
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
#include <sys/types.h> /* for size_t */
|
|
Packit |
d36e9b |
#ifndef _MSC_VER
|
|
Packit |
d36e9b |
#include <sys/time.h> /* for struct timeval */
|
|
Packit |
d36e9b |
#else
|
|
Packit |
d36e9b |
#include <winsock2.h> /* for struct timeval */
|
|
Packit |
d36e9b |
#endif
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
#if (defined __MINGW32__ || defined _MSC_VER) && !defined OWN_SSIZE_T
|
|
Packit |
d36e9b |
#include <basetsd.h> /* for SSIZE_T */
|
|
Packit |
d36e9b |
#define OWN_SSIZE_T
|
|
Packit |
d36e9b |
typedef SSIZE_T ssize_t;
|
|
Packit |
d36e9b |
#endif
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
#ifdef __cplusplus
|
|
Packit |
d36e9b |
extern "C" {
|
|
Packit |
d36e9b |
#endif
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* Errors. When a function returns a negative number, it's one of
|
|
Packit |
d36e9b |
* these errors. */
|
|
Packit |
d36e9b |
enum E1284 {
|
|
Packit |
d36e9b |
E1284_OK = 0, /* Everything went fine */
|
|
Packit |
d36e9b |
E1284_NOTIMPL = -1, /* Not implemented in libieee1284 */
|
|
Packit |
d36e9b |
E1284_NOTAVAIL = -2, /* Not available on this system */
|
|
Packit |
d36e9b |
E1284_TIMEDOUT = -3, /* Operation timed out */
|
|
Packit |
d36e9b |
E1284_REJECTED = -4, /* IEEE 1284 negotiation rejected */
|
|
Packit |
d36e9b |
E1284_NEGFAILED = -5, /* Negotiation went wrong */
|
|
Packit |
d36e9b |
E1284_NOMEM = -6, /* No memory left */
|
|
Packit |
d36e9b |
E1284_INIT = -7, /* Error initialising port */
|
|
Packit |
d36e9b |
E1284_SYS = -8, /* Error interfacing system */
|
|
Packit |
d36e9b |
E1284_NOID = -9, /* No IEEE 1284 ID available */
|
|
Packit |
d36e9b |
E1284_INVALIDPORT = -10 /* Invalid port */
|
|
Packit |
d36e9b |
};
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* A parallel port. */
|
|
Packit |
d36e9b |
struct parport {
|
|
Packit |
d36e9b |
/* An arbitrary name for the port */
|
|
Packit |
d36e9b |
const char *name;
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* The base address of the port, if that has any meaning, or zero. */
|
|
Packit |
d36e9b |
unsigned long base_addr;
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* The ECR address of the port, if that has any meaning, or zero. */
|
|
Packit |
d36e9b |
unsigned long hibase_addr;
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* For internal use only: */
|
|
Packit |
d36e9b |
void *priv;
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* The filename associated with this port,
|
|
Packit |
d36e9b |
* if that has any meaning, or NULL. */
|
|
Packit |
d36e9b |
const char *filename;
|
|
Packit |
d36e9b |
};
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* Some parallel ports. */
|
|
Packit |
d36e9b |
struct parport_list {
|
|
Packit |
d36e9b |
int portc;
|
|
Packit |
d36e9b |
struct parport **portv;
|
|
Packit |
d36e9b |
};
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* The first function to be called. This gives the library a chance
|
|
Packit |
d36e9b |
* to look around and see what's available, and gives the program a
|
|
Packit |
d36e9b |
* chance to choose a port to use. */
|
|
Packit |
d36e9b |
extern int ieee1284_find_ports (struct parport_list *list, int flags);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* The last function to be called. After calling this, only
|
|
Packit |
d36e9b |
* ieee1284_find_ports may be used. */
|
|
Packit |
d36e9b |
extern void ieee1284_free_ports (struct parport_list *list);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/*
|
|
Packit |
d36e9b |
* Retrieving the Device ID of a device on a port.
|
|
Packit |
d36e9b |
* This is a special operation since there are some shortcuts on some
|
|
Packit |
d36e9b |
* operating systems (i.e. Linux) that allow us to elide any actual
|
|
Packit |
d36e9b |
* communications.
|
|
Packit |
d36e9b |
*/
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
enum ieee1284_devid_flags
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
F1284_FRESH = (1<<1) /* Guarantee a fresh Device ID */
|
|
Packit |
d36e9b |
};
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
extern ssize_t ieee1284_get_deviceid (struct parport *port, int daisy,
|
|
Packit |
d36e9b |
int flags, char *buffer, size_t len);
|
|
Packit |
d36e9b |
/* daisy is the daisy chain address (0-3), or -1 for normal IEEE 1284. */
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/*
|
|
Packit |
d36e9b |
* Sharing hooks
|
|
Packit |
d36e9b |
*/
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
enum ieee1284_open_flags
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
F1284_EXCL = (1<<0) /* Require exclusive access to the port */
|
|
Packit |
d36e9b |
};
|
|
Packit |
d36e9b |
enum ieee1284_capabilities
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
CAP1284_RAW = (1<<0), /* Pin-level access */
|
|
Packit |
d36e9b |
CAP1284_NIBBLE = (1<<1),
|
|
Packit |
d36e9b |
CAP1284_BYTE = (1<<2),
|
|
Packit |
d36e9b |
CAP1284_COMPAT = (1<<3),
|
|
Packit |
d36e9b |
CAP1284_BECP = (1<<4),
|
|
Packit |
d36e9b |
CAP1284_ECP = (1<<5),
|
|
Packit |
d36e9b |
CAP1284_ECPRLE = (1<<6),
|
|
Packit |
d36e9b |
CAP1284_ECPSWE = (1<<7),
|
|
Packit |
d36e9b |
CAP1284_EPP = (1<<8),
|
|
Packit |
d36e9b |
CAP1284_EPPSL = (1<<9),
|
|
Packit |
d36e9b |
CAP1284_EPPSWE = (1<<10),
|
|
Packit |
d36e9b |
CAP1284_IRQ = (1<<11),
|
|
Packit |
d36e9b |
CAP1284_DMA = (1<<12)
|
|
Packit |
d36e9b |
};
|
|
Packit |
d36e9b |
extern int ieee1284_open (struct parport *port, int flags, int *capabilities);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
extern int ieee1284_close (struct parport *port);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
extern int ieee1284_ref (struct parport *port);
|
|
Packit |
d36e9b |
extern int ieee1284_unref (struct parport *port);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
extern int ieee1284_claim (struct parport *port);
|
|
Packit |
d36e9b |
/* Must be called before any function below. May fail. */
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
extern void ieee1284_release (struct parport *port);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/*
|
|
Packit |
d36e9b |
* Interrupt notification
|
|
Packit |
d36e9b |
*/
|
|
Packit |
d36e9b |
extern int ieee1284_get_irq_fd (struct parport *port);
|
|
Packit |
d36e9b |
extern int ieee1284_clear_irq (struct parport *port, unsigned int *count);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/*
|
|
Packit |
d36e9b |
* Raw port access (PC-style port registers but within inversions)
|
|
Packit |
d36e9b |
* Functions returning int may fail.
|
|
Packit |
d36e9b |
*/
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
extern int ieee1284_read_data (struct parport *port);
|
|
Packit |
d36e9b |
extern void ieee1284_write_data (struct parport *port, unsigned char dt);
|
|
Packit |
d36e9b |
extern int ieee1284_wait_data (struct parport *port, unsigned char mask,
|
|
Packit |
d36e9b |
unsigned char val, struct timeval *timeout);
|
|
Packit |
d36e9b |
extern int ieee1284_data_dir (struct parport *port, int reverse);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* The status pin functions operate in terms of these bits: */
|
|
Packit |
d36e9b |
enum ieee1284_status_bits
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
S1284_NFAULT = 0x08,
|
|
Packit |
d36e9b |
S1284_SELECT = 0x10,
|
|
Packit |
d36e9b |
S1284_PERROR = 0x20,
|
|
Packit |
d36e9b |
S1284_NACK = 0x40,
|
|
Packit |
d36e9b |
S1284_BUSY = 0x80,
|
|
Packit |
d36e9b |
/* To convert those values into PC-style register values, use this: */
|
|
Packit |
d36e9b |
S1284_INVERTED = S1284_BUSY
|
|
Packit |
d36e9b |
};
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
extern int ieee1284_read_status (struct parport *port);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* Wait until those status pins in mask have the values in val.
|
|
Packit |
d36e9b |
* Return E1284_OK when condition met, E1284_TIMEDOUT on timeout.
|
|
Packit |
d36e9b |
* timeout may be modified. */
|
|
Packit |
d36e9b |
extern int ieee1284_wait_status (struct parport *port,
|
|
Packit |
d36e9b |
unsigned char mask,
|
|
Packit |
d36e9b |
unsigned char val,
|
|
Packit |
d36e9b |
struct timeval *timeout);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* The control pin functions operate in terms of these bits: */
|
|
Packit |
d36e9b |
enum ieee1284_control_bits
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
C1284_NSTROBE = 0x01,
|
|
Packit |
d36e9b |
C1284_NAUTOFD = 0x02,
|
|
Packit |
d36e9b |
C1284_NINIT = 0x04,
|
|
Packit |
d36e9b |
C1284_NSELECTIN = 0x08,
|
|
Packit |
d36e9b |
/* To convert those values into PC-style register values, use this: */
|
|
Packit |
d36e9b |
C1284_INVERTED = (C1284_NSTROBE|
|
|
Packit |
d36e9b |
C1284_NAUTOFD|
|
|
Packit |
d36e9b |
C1284_NSELECTIN)
|
|
Packit |
d36e9b |
};
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
extern int ieee1284_read_control (struct parport *port);
|
|
Packit |
d36e9b |
/* ieee1284_read_control may be unreliable */
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
extern void ieee1284_write_control (struct parport *port, unsigned char ct);
|
|
Packit |
d36e9b |
/* NOTE: This will not change the direction of the data lines; use
|
|
Packit |
d36e9b |
* ieee1284_data_dir for that. */
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
extern void ieee1284_frob_control (struct parport *port, unsigned char mask,
|
|
Packit |
d36e9b |
unsigned char val);
|
|
Packit |
d36e9b |
/* frob is "out ((in & ~mask) ^ val)" */
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* This function may or may not be available, depending on PPWCTLONIRQ
|
|
Packit |
d36e9b |
* availability. Its operation is:
|
|
Packit |
d36e9b |
* If operation unavailable, return E1284_NOTAVAIL. Otherwise:
|
|
Packit |
d36e9b |
* Set control pins to ct_before.
|
|
Packit |
d36e9b |
* Wait for nAck interrupt. If timeout elapses, return E1284_TIMEDOUT.
|
|
Packit |
d36e9b |
* Otherwise, set control pins to ct_after and return 0.
|
|
Packit |
d36e9b |
* timeout may be modified. */
|
|
Packit |
d36e9b |
extern int ieee1284_do_nack_handshake (struct parport *port,
|
|
Packit |
d36e9b |
unsigned char ct_before,
|
|
Packit |
d36e9b |
unsigned char ct_after,
|
|
Packit |
d36e9b |
struct timeval *timeout);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/*
|
|
Packit |
d36e9b |
* IEEE 1284 operations
|
|
Packit |
d36e9b |
*/
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* Negotiation/termination */
|
|
Packit |
d36e9b |
enum ieee1284_modes
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
M1284_NIBBLE = 0,
|
|
Packit |
d36e9b |
M1284_BYTE = (1<<0),
|
|
Packit |
d36e9b |
M1284_COMPAT = (1<<8),
|
|
Packit |
d36e9b |
M1284_BECP = (1<<9),
|
|
Packit |
d36e9b |
M1284_ECP = (1<<4),
|
|
Packit |
d36e9b |
M1284_ECPRLE = ((1<<4) | (1<<5)),
|
|
Packit |
d36e9b |
M1284_ECPSWE = (1<<10), /* Software emulated */
|
|
Packit |
d36e9b |
M1284_EPP = (1<<6),
|
|
Packit |
d36e9b |
M1284_EPPSL = (1<<11), /* EPP 1.7 */
|
|
Packit |
d36e9b |
M1284_EPPSWE = (1<<12), /* Software emulated */
|
|
Packit |
d36e9b |
M1284_FLAG_DEVICEID = (1<<2),
|
|
Packit |
d36e9b |
M1284_FLAG_EXT_LINK = (1<<14) /* Uses bits in 0x7f */
|
|
Packit |
d36e9b |
};
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
extern int ieee1284_negotiate (struct parport *port, int mode);
|
|
Packit |
d36e9b |
extern void ieee1284_terminate (struct parport *port);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* ECP direction switching */
|
|
Packit |
d36e9b |
extern int ieee1284_ecp_fwd_to_rev (struct parport *port);
|
|
Packit |
d36e9b |
extern int ieee1284_ecp_rev_to_fwd (struct parport *port);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
/* Block I/O
|
|
Packit |
d36e9b |
* The return value is the number of bytes successfully transferred,
|
|
Packit |
d36e9b |
* or an error code (only if no transfer took place). */
|
|
Packit |
d36e9b |
enum ieee1284_transfer_flags
|
|
Packit |
d36e9b |
{
|
|
Packit |
d36e9b |
F1284_NONBLOCK = (1<<0), /* Non-blocking semantics */
|
|
Packit |
d36e9b |
F1284_SWE = (1<<2), /* Don't use hardware assistance */
|
|
Packit |
d36e9b |
F1284_RLE = (1<<3), /* Use ECP RLE */
|
|
Packit |
d36e9b |
F1284_FASTEPP = (1<<4) /* Use faster EPP (counts are unreliable) */
|
|
Packit |
d36e9b |
};
|
|
Packit |
d36e9b |
extern ssize_t ieee1284_nibble_read (struct parport *port, int flags,
|
|
Packit |
d36e9b |
char *buffer, size_t len);
|
|
Packit |
d36e9b |
extern ssize_t ieee1284_compat_write (struct parport *port, int flags,
|
|
Packit |
d36e9b |
const char *buffer, size_t len);
|
|
Packit |
d36e9b |
extern ssize_t ieee1284_byte_read (struct parport *port, int flags,
|
|
Packit |
d36e9b |
char *buffer, size_t len);
|
|
Packit |
d36e9b |
extern ssize_t ieee1284_epp_read_data (struct parport *port, int flags,
|
|
Packit |
d36e9b |
char *buffer, size_t len);
|
|
Packit |
d36e9b |
extern ssize_t ieee1284_epp_write_data (struct parport *port, int flags,
|
|
Packit |
d36e9b |
const char *buffer, size_t len);
|
|
Packit |
d36e9b |
extern ssize_t ieee1284_epp_read_addr (struct parport *port, int flags,
|
|
Packit |
d36e9b |
char *buffer, size_t len);
|
|
Packit |
d36e9b |
extern ssize_t ieee1284_epp_write_addr (struct parport *port, int flags,
|
|
Packit |
d36e9b |
const char *buffer, size_t len);
|
|
Packit |
d36e9b |
extern ssize_t ieee1284_ecp_read_data (struct parport *port, int flags,
|
|
Packit |
d36e9b |
char *buffer, size_t len);
|
|
Packit |
d36e9b |
extern ssize_t ieee1284_ecp_write_data (struct parport *port, int flags,
|
|
Packit |
d36e9b |
const char *buffer, size_t len);
|
|
Packit |
d36e9b |
extern ssize_t ieee1284_ecp_read_addr (struct parport *port, int flags,
|
|
Packit |
d36e9b |
char *buffer, size_t len);
|
|
Packit |
d36e9b |
extern ssize_t ieee1284_ecp_write_addr (struct parport *port, int flags,
|
|
Packit |
d36e9b |
const char *buffer, size_t len);
|
|
Packit |
d36e9b |
extern struct timeval *ieee1284_set_timeout (struct parport *port,
|
|
Packit |
d36e9b |
struct timeval *timeout);
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
#ifdef __cplusplus
|
|
Packit |
d36e9b |
} /* extern "C" */
|
|
Packit |
d36e9b |
#endif
|
|
Packit |
d36e9b |
|
|
Packit |
d36e9b |
#endif /* HAVE_IEEE1284_H */
|