/* sane - Scanner Access Now Easy.
Copyright (C) 2001 Henning Meier-Geinitz
This file is part of the SANE package.
SANE is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
SANE is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
You should have received a copy of the GNU General Public License
along with sane; see the file COPYING. If not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/** @file sanei_usb.h
* This file provides a generic USB interface.
*
* Currently, only access to device files as provided by the Linux USB
* scanner driver is supported. FreeBSD and OpenBSD with their uscanner
* drivers also work. However, detection and control messages aren't
* supported on these platforms.
*
* @sa sanei_lm983x.h, sanei_pa4s2.h, sanei_pio.h, sanei_scsi.h, and man sane-usb(5)
* for user-oriented documentation
*/
#ifndef sanei_usb_h
#define sanei_usb_h
#include "../include/sane/config.h"
#include "../include/sane/sane.h"
/** Initialize sanei_usb.
*
* Call this before any other sanei_usb function.
*/
extern void
sanei_usb_init (void);
/** Get the vendor and product ids.
*
* Currently, only scanners supported by the Linux USB scanner module can be
* found. The Linux version must be 2.4.8 or higher.
*
* @param fd device file descriptor
* @param vendor vendor id
* @param product product id
*
*@return
* - SANE_STATUS_GOOD - if the ids could be determinded
* - SANE_STATUS_UNSUPPORTED - if the OS doesn't support detection of ids
*/
extern SANE_Status
sanei_usb_get_vendor_product (SANE_Int fd, SANE_Word * vendor,
SANE_Word * product);
/** Find devices that match given vendor and product ids.
*
* For limitations, see function sanei_usb_get_vendor_product().
* The function attach is called for every device which has been found.
*
* @param vendor vendor id
* @param product product id
* @param attach attach function
*
* @return SANE_STATUS_GOOD - on success (even if no scanner was found)
*/
extern SANE_Status
sanei_usb_find_devices (SANE_Int vendor, SANE_Int product,
SANE_Status (*attach) (SANE_String_Const devname));
/** Open a USB device.
*
* The device is opened by its filename devname and the file descriptor is
* returned in fd on success.
*
* @param devname filename of the device file
* @param fd device file descriptor
*
* @return
* - SANE_STATUS_GOOD - on success
* - SANE_STATUS_ACCESS_DENIED - if the file couldn't be accessed due to
* permissions
* - SANE_STATUS_INVAL - on every other error
*/
extern SANE_Status
sanei_usb_open (SANE_String_Const devname, SANE_Int *fd);
/** Close a USB device.
*
* @param fd file descriptor of the device
*/
extern void
sanei_usb_close (SANE_Int fd);
/** Initiate a bulk transfer read.
*
* Read up to size bytes from the device to buffer. After the read, size
* contains the number of bytes actually read.
*
* @param fd file descriptor of the device
* @param buffer buffer to store read data in
* @param size size of the data
*
* @return
* - SANE_STATUS_GOOD - on succes
* - SANE_STATUS_EOF - if zero bytes have been read
* - SANE_STATUS_IO_ERROR - if an error occured during the read
* - SANE_STATUS_INVAL - on every other error
*
*/
extern SANE_Status
sanei_usb_read_bulk (SANE_Int fd, SANE_Byte * buffer, size_t *size);
/** Initiate a bulk transfer write.
*
* Write up to size bytes from buffer to the device. After the write size
* contains the number of bytes actually written.
*
* @param fd file descriptor of the device
* @param buffer buffer to write to device
* @param size size of the data
*
* @return
* - SANE_STATUS_GOOD - on succes
* - SANE_STATUS_IO_ERROR - if an error occured during the write
* - SANE_STATUS_INVAL - on every other error
*/
extern SANE_Status
sanei_usb_write_bulk (SANE_Int fd, SANE_Byte * buffer, size_t *size);
/** Send/receive a control message to/from a USB device.
*
* This function is only supported for Linux 2.4.13 and newer.
* The arguments rtype, req, value, and index are passed directly to
* usb_control_msg (see the Linux
* USB project and
* www.usb.org developers information for documentation).
*
* @param fd file descriptor of the device file
* @param data buffer to send/receive data
* @param len length of data to send/receive
* @param rtype specifies the characteristics of the request (e.g. data
* direction)
* @param req actual request
* @param value parameter specific to the request
* @param index parameter specific to the request (often used to select
* endpoint)
*
* @return
* - SANE_STATUS_GOOD - on success
* - SANE_STATUS_IO_ERROR - on error
* - SANE_STATUS_UNSUPPORTED - if the feature is not supported by the OS or
* SANE.
*/
extern SANE_Status
sanei_usb_control_msg (SANE_Int fd, SANE_Int rtype, SANE_Int req,
SANE_Int value, SANE_Int index, SANE_Int len,
SANE_Byte *data);
/** Expand device name patterns into a list of devices.
*
* Apart from a normal device name (such as /dev/usb/scanner0), this
* function currently supports USB device specifications of the form:
*
* usb VENDOR PRODUCT
*
* VENDOR and PRODUCT are non-negative integer numbers in decimal or
* hexadecimal format. A similar function for SCSI devices can be found
* in include/sane/config.h.
*
* @param name device name pattern
* @param attach attach function
*
*/
extern void
sanei_usb_attach_matching_devices (const char *name,
SANE_Status (*attach) (const char *dev));
#endif /* sanei_usb_h */