Blame include/ieee1284.h

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 */