kopia lustrzana https://gitlab.com/sane-project/backends
				
				
				
			hp5400: synching SANE CVS with hp5400backend sourceforge project CVS : added and modified hp5400 files (see Changelog)
							rodzic
							
								
									64ea3dfc5f
								
							
						
					
					
						commit
						c84bdda420
					
				| 
						 | 
				
			
			@ -113,7 +113,9 @@ DISTFILES = abaton.c abaton.conf abaton.h agfafocus.c agfafocus.conf \
 | 
			
		|||
  hp-device.c hp-device.h hp.h hp-handle.c hp-handle.h hp-hpmem.c hp-option.c \
 | 
			
		||||
  hp-option.h hp.README hp-scl.c hp-scl.h hp-scsi.h hp.TODO \
 | 
			
		||||
  hpsj5s.c hpsj5s.conf hpsj5s.h \
 | 
			
		||||
  hp5400.c hp5400.h hp5400.conf hp5400_internal.c hp5400_sanei.c hp5400_xfer.h \
 | 
			
		||||
  hp5400.c hp5400.h hp5400.conf hp5400_debug.c hp5400_debug.h \
 | 
			
		||||
  hp5400_internal.c hp5400_internal.h hp5400_xfer.h \
 | 
			
		||||
  hp5400_sane.c hp5400_sanei.c hp5400_sanei.h \
 | 
			
		||||
  ibm.c ibm.conf ibm.h ibm-scsi.c \
 | 
			
		||||
  jinclude.h \
 | 
			
		||||
  leo.c leo.h leo.conf \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										941
									
								
								backend/hp5400.c
								
								
								
								
							
							
						
						
									
										941
									
								
								backend/hp5400.c
								
								
								
								
							| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
/* sane - Scanner Access Now Easy.
 | 
			
		||||
   Copyright (C) 2003 Martijn van Oosterhout <kleptog@svana.org>
 | 
			
		||||
   
 | 
			
		||||
   Copyright (C) 2003 Thomas Soumarmon <thomas.soumarmon@cogitae.net>
 | 
			
		||||
 | 
			
		||||
   This file was initially copied from the hp3300 testools and adjusted to
 | 
			
		||||
   suit. Original copyright notice follows:
 | 
			
		||||
   
 | 
			
		||||
| 
						 | 
				
			
			@ -50,944 +51,30 @@
 | 
			
		|||
    Parts of this source were inspired by other backends.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* definitions for debug */
 | 
			
		||||
#define BACKEND_NAME hp5400
 | 
			
		||||
#define BUILD 2
 | 
			
		||||
#include "hp5400.h"
 | 
			
		||||
#include "hp5400_debug.h"
 | 
			
		||||
 | 
			
		||||
#include "sane/config.h"
 | 
			
		||||
#include "sane/sane.h"
 | 
			
		||||
#include "sane/sanei.h"
 | 
			
		||||
#include "sane/sanei_backend.h"
 | 
			
		||||
#include "sane/sanei_config.h"
 | 
			
		||||
#include "sane/saneopts.h"
 | 
			
		||||
 | 
			
		||||
#include "../include/sane/config.h"
 | 
			
		||||
#include "../include/sane/sane.h"
 | 
			
		||||
#include "../include/sane/sanei.h"
 | 
			
		||||
#include "../include/sane/sanei_backend.h"
 | 
			
		||||
#include "../include/sane/sanei_config.h"
 | 
			
		||||
#include "../include/sane/saneopts.h"
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>		/* malloc, free */
 | 
			
		||||
#include <string.h>		/* memcpy */
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#define DBG_ASSERT  1
 | 
			
		||||
#define DBG_ERR     16
 | 
			
		||||
#define DBG_MSG     32
 | 
			
		||||
 | 
			
		||||
#define HP5400_CONFIG_FILE "hp5400.conf"
 | 
			
		||||
 | 
			
		||||
#include "hp5400.h"
 | 
			
		||||
#define BUILD   2
 | 
			
		||||
 | 
			
		||||
/* (source) includes for data transfer methods */
 | 
			
		||||
#include "hp5400_debug.c"
 | 
			
		||||
#include "hp5400_internal.c"
 | 
			
		||||
#include "hp5400_sane.c"
 | 
			
		||||
#include "hp5400_sanei.c"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* other definitions */
 | 
			
		||||
#define TRUE 1
 | 
			
		||||
#define FALSE 0
 | 
			
		||||
 | 
			
		||||
#define MM_TO_PIXEL(_mm_, _dpi_)    ((_mm_) * (_dpi_) / 25.4)
 | 
			
		||||
#define PIXEL_TO_MM(_pixel_, _dpi_) ((_pixel_) * 25.4 / (_dpi_))
 | 
			
		||||
 | 
			
		||||
#define NUM_GAMMA_ENTRIES  65536
 | 
			
		||||
 | 
			
		||||
/* Device filename for USB access */
 | 
			
		||||
static char *usb_devfile = "/dev/usb/scanner0";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* options enumerator */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  optCount = 0,
 | 
			
		||||
 | 
			
		||||
  optGroupGeometry,
 | 
			
		||||
  optTLX, optTLY, optBRX, optBRY,
 | 
			
		||||
  optDPI,
 | 
			
		||||
 | 
			
		||||
  optGroupImage,
 | 
			
		||||
 | 
			
		||||
  optGammaTableRed,		/* Gamma Tables */
 | 
			
		||||
  optGammaTableGreen,
 | 
			
		||||
  optGammaTableBlue,
 | 
			
		||||
 | 
			
		||||
  optLast,			/* Disable the offset code */
 | 
			
		||||
 | 
			
		||||
  optGroupMisc,
 | 
			
		||||
  optOffsetX, optOffsetY
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* put temporarily disabled options here after optLast */
 | 
			
		||||
/*  
 | 
			
		||||
  optLamp,
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
EOptionIndex;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef union
 | 
			
		||||
{
 | 
			
		||||
  SANE_Word w;
 | 
			
		||||
  SANE_Word *wa;		/* word array */
 | 
			
		||||
  SANE_String s;
 | 
			
		||||
}
 | 
			
		||||
TOptionValue;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
  SANE_Option_Descriptor aOptions[optLast];
 | 
			
		||||
  TOptionValue aValues[optLast];
 | 
			
		||||
 | 
			
		||||
  TScanParams ScanParams;
 | 
			
		||||
  THWParams HWParams;
 | 
			
		||||
 | 
			
		||||
  TDataPipe DataPipe;
 | 
			
		||||
  int iLinesLeft;
 | 
			
		||||
 | 
			
		||||
  SANE_Int *aGammaTableR;	/* a 16-to-16 bit color lookup table */
 | 
			
		||||
  SANE_Int *aGammaTableG;	/* a 16-to-16 bit color lookup table */
 | 
			
		||||
  SANE_Int *aGammaTableB;	/* a 16-to-16 bit color lookup table */
 | 
			
		||||
 | 
			
		||||
  int fScanning;		/* TRUE if actively scanning */
 | 
			
		||||
  int fCanceled;
 | 
			
		||||
}
 | 
			
		||||
TScanner;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* linked list of SANE_Device structures */
 | 
			
		||||
typedef struct TDevListEntry
 | 
			
		||||
{
 | 
			
		||||
  struct TDevListEntry *pNext;
 | 
			
		||||
  SANE_Device dev;
 | 
			
		||||
}
 | 
			
		||||
TDevListEntry;
 | 
			
		||||
 | 
			
		||||
static TDevListEntry *_pFirstSaneDev = 0;
 | 
			
		||||
static int iNumSaneDev = 0;
 | 
			
		||||
static const SANE_Device **_pSaneDevList = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* option constraints */
 | 
			
		||||
static const SANE_Range rangeGammaTable = { 0, 65535, 1 };
 | 
			
		||||
#ifdef SUPPORT_2400_DPI
 | 
			
		||||
static const SANE_Int setResolutions[] = { 6, 75, 150, 300, 600, 1200, 2400 };
 | 
			
		||||
#else
 | 
			
		||||
static const SANE_Int setResolutions[] = { 5, 75, 150, 300, 600, 1200 };
 | 
			
		||||
#endif
 | 
			
		||||
static const SANE_Range rangeXmm = { 0, 220, 1 };
 | 
			
		||||
static const SANE_Range rangeYmm = { 0, 300, 1 };
 | 
			
		||||
static const SANE_Range rangeXoffset = { 0, 20, 1 };
 | 
			
		||||
static const SANE_Range rangeYoffset = { 0, 70, 1 };
 | 
			
		||||
static const SANE_Int offsetX = 5;
 | 
			
		||||
static const SANE_Int offsetY = 52;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
_InitOptions (TScanner * s)
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
  SANE_Option_Descriptor *pDesc;
 | 
			
		||||
  TOptionValue *pVal;
 | 
			
		||||
 | 
			
		||||
  /* set a neutral gamma */
 | 
			
		||||
  if (s->aGammaTableR == NULL)	/* Not yet allocated */
 | 
			
		||||
    {
 | 
			
		||||
      s->aGammaTableR = malloc (NUM_GAMMA_ENTRIES * sizeof (SANE_Int));
 | 
			
		||||
      s->aGammaTableG = malloc (NUM_GAMMA_ENTRIES * sizeof (SANE_Int));
 | 
			
		||||
      s->aGammaTableB = malloc (NUM_GAMMA_ENTRIES * sizeof (SANE_Int));
 | 
			
		||||
 | 
			
		||||
      for (j = 0; j < NUM_GAMMA_ENTRIES; j++)
 | 
			
		||||
	{
 | 
			
		||||
	  s->aGammaTableR[j] = j;
 | 
			
		||||
	  s->aGammaTableG[j] = j;
 | 
			
		||||
	  s->aGammaTableB[j] = j;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  for (i = optCount; i < optLast; i++)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
      pDesc = &s->aOptions[i];
 | 
			
		||||
      pVal = &s->aValues[i];
 | 
			
		||||
 | 
			
		||||
      /* defaults */
 | 
			
		||||
      pDesc->name = "";
 | 
			
		||||
      pDesc->title = "";
 | 
			
		||||
      pDesc->desc = "";
 | 
			
		||||
      pDesc->type = SANE_TYPE_INT;
 | 
			
		||||
      pDesc->unit = SANE_UNIT_NONE;
 | 
			
		||||
      pDesc->size = sizeof (SANE_Word);
 | 
			
		||||
      pDesc->constraint_type = SANE_CONSTRAINT_NONE;
 | 
			
		||||
      pDesc->cap = 0;
 | 
			
		||||
 | 
			
		||||
      switch (i)
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	case optCount:
 | 
			
		||||
	  pDesc->title = SANE_TITLE_NUM_OPTIONS;
 | 
			
		||||
	  pDesc->desc = SANE_DESC_NUM_OPTIONS;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_DETECT;
 | 
			
		||||
	  pVal->w = (SANE_Word) optLast;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optGroupGeometry:
 | 
			
		||||
	  pDesc->title = "Geometry";
 | 
			
		||||
	  pDesc->type = SANE_TYPE_GROUP;
 | 
			
		||||
	  pDesc->size = 0;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optTLX:
 | 
			
		||||
	  pDesc->name = SANE_NAME_SCAN_TL_X;
 | 
			
		||||
	  pDesc->title = SANE_TITLE_SCAN_TL_X;
 | 
			
		||||
	  pDesc->desc = SANE_DESC_SCAN_TL_X;
 | 
			
		||||
	  pDesc->unit = SANE_UNIT_MM;
 | 
			
		||||
	  pDesc->constraint_type = SANE_CONSTRAINT_RANGE;
 | 
			
		||||
	  pDesc->constraint.range = &rangeXmm;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
 | 
			
		||||
	  pVal->w = rangeXmm.min + offsetX;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optTLY:
 | 
			
		||||
	  pDesc->name = SANE_NAME_SCAN_TL_Y;
 | 
			
		||||
	  pDesc->title = SANE_TITLE_SCAN_TL_Y;
 | 
			
		||||
	  pDesc->desc = SANE_DESC_SCAN_TL_Y;
 | 
			
		||||
	  pDesc->unit = SANE_UNIT_MM;
 | 
			
		||||
	  pDesc->constraint_type = SANE_CONSTRAINT_RANGE;
 | 
			
		||||
	  pDesc->constraint.range = &rangeYmm;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
 | 
			
		||||
	  pVal->w = rangeYmm.min + offsetY;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optBRX:
 | 
			
		||||
	  pDesc->name = SANE_NAME_SCAN_BR_X;
 | 
			
		||||
	  pDesc->title = SANE_TITLE_SCAN_BR_X;
 | 
			
		||||
	  pDesc->desc = SANE_DESC_SCAN_BR_X;
 | 
			
		||||
	  pDesc->unit = SANE_UNIT_MM;
 | 
			
		||||
	  pDesc->constraint_type = SANE_CONSTRAINT_RANGE;
 | 
			
		||||
	  pDesc->constraint.range = &rangeXmm;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
 | 
			
		||||
	  pVal->w = rangeXmm.max + offsetX;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optBRY:
 | 
			
		||||
	  pDesc->name = SANE_NAME_SCAN_BR_Y;
 | 
			
		||||
	  pDesc->title = SANE_TITLE_SCAN_BR_Y;
 | 
			
		||||
	  pDesc->desc = SANE_DESC_SCAN_BR_Y;
 | 
			
		||||
	  pDesc->unit = SANE_UNIT_MM;
 | 
			
		||||
	  pDesc->constraint_type = SANE_CONSTRAINT_RANGE;
 | 
			
		||||
	  pDesc->constraint.range = &rangeYmm;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
 | 
			
		||||
	  pVal->w = rangeYmm.max + offsetY;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optDPI:
 | 
			
		||||
	  pDesc->name = SANE_NAME_SCAN_RESOLUTION;
 | 
			
		||||
	  pDesc->title = SANE_TITLE_SCAN_RESOLUTION;
 | 
			
		||||
	  pDesc->desc = SANE_DESC_SCAN_RESOLUTION;
 | 
			
		||||
	  pDesc->unit = SANE_UNIT_DPI;
 | 
			
		||||
	  pDesc->constraint_type = SANE_CONSTRAINT_WORD_LIST;
 | 
			
		||||
	  pDesc->constraint.word_list = setResolutions;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
 | 
			
		||||
	  pVal->w = setResolutions[1];
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optGroupImage:
 | 
			
		||||
	  pDesc->title = SANE_I18N ("Image");
 | 
			
		||||
	  pDesc->type = SANE_TYPE_GROUP;
 | 
			
		||||
	  pDesc->size = 0;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optGammaTableRed:
 | 
			
		||||
	  pDesc->name = SANE_NAME_GAMMA_VECTOR_R;
 | 
			
		||||
	  pDesc->title = SANE_TITLE_GAMMA_VECTOR_R;
 | 
			
		||||
	  pDesc->desc = SANE_DESC_GAMMA_VECTOR_R;
 | 
			
		||||
	  pDesc->size = NUM_GAMMA_ENTRIES * sizeof (SANE_Int);
 | 
			
		||||
	  pDesc->constraint_type = SANE_CONSTRAINT_RANGE;
 | 
			
		||||
	  pDesc->constraint.range = &rangeGammaTable;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
 | 
			
		||||
	  pVal->wa = s->aGammaTableR;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optGammaTableGreen:
 | 
			
		||||
	  pDesc->name = SANE_NAME_GAMMA_VECTOR_G;
 | 
			
		||||
	  pDesc->title = SANE_TITLE_GAMMA_VECTOR_G;
 | 
			
		||||
	  pDesc->desc = SANE_DESC_GAMMA_VECTOR_G;
 | 
			
		||||
	  pDesc->size = NUM_GAMMA_ENTRIES * sizeof (SANE_Int);
 | 
			
		||||
	  pDesc->constraint_type = SANE_CONSTRAINT_RANGE;
 | 
			
		||||
	  pDesc->constraint.range = &rangeGammaTable;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
 | 
			
		||||
	  pVal->wa = s->aGammaTableG;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optGammaTableBlue:
 | 
			
		||||
	  pDesc->name = SANE_NAME_GAMMA_VECTOR_B;
 | 
			
		||||
	  pDesc->title = SANE_TITLE_GAMMA_VECTOR_B;
 | 
			
		||||
	  pDesc->desc = SANE_DESC_GAMMA_VECTOR_B;
 | 
			
		||||
	  pDesc->size = NUM_GAMMA_ENTRIES * sizeof (SANE_Int);
 | 
			
		||||
	  pDesc->constraint_type = SANE_CONSTRAINT_RANGE;
 | 
			
		||||
	  pDesc->constraint.range = &rangeGammaTable;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
 | 
			
		||||
	  pVal->wa = s->aGammaTableB;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optGroupMisc:
 | 
			
		||||
	  pDesc->title = SANE_I18N ("Miscellaneous");
 | 
			
		||||
	  pDesc->type = SANE_TYPE_GROUP;
 | 
			
		||||
	  pDesc->size = 0;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optOffsetX:
 | 
			
		||||
	  pDesc->title = SANE_I18N ("offset X");
 | 
			
		||||
	  pDesc->desc =
 | 
			
		||||
	    SANE_I18N ("Hardware internal X position of the scanning area.");
 | 
			
		||||
	  pDesc->unit = SANE_UNIT_MM;
 | 
			
		||||
	  pDesc->constraint_type = SANE_CONSTRAINT_RANGE;
 | 
			
		||||
	  pDesc->constraint.range = &rangeXoffset;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_SELECT;
 | 
			
		||||
	  pVal->w = offsetX;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optOffsetY:
 | 
			
		||||
	  pDesc->title = SANE_I18N ("offset Y");
 | 
			
		||||
	  pDesc->desc =
 | 
			
		||||
	    SANE_I18N ("Hardware internal Y position of the scanning area.");
 | 
			
		||||
	  pDesc->unit = SANE_UNIT_MM;
 | 
			
		||||
	  pDesc->constraint_type = SANE_CONSTRAINT_RANGE;
 | 
			
		||||
	  pDesc->constraint.range = &rangeYoffset;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_SELECT;
 | 
			
		||||
	  pVal->w = offsetY;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
	case optLamp:
 | 
			
		||||
	  pDesc->name = "lamp";
 | 
			
		||||
	  pDesc->title = SANE_I18N ("Lamp status");
 | 
			
		||||
	  pDesc->desc = SANE_I18N ("Switches the lamp on or off.");
 | 
			
		||||
	  pDesc->type = SANE_TYPE_BOOL;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
 | 
			
		||||
	  /* switch the lamp on when starting for first the time */
 | 
			
		||||
	  pVal->w = SANE_TRUE;
 | 
			
		||||
	  break;
 | 
			
		||||
#endif
 | 
			
		||||
#if 0
 | 
			
		||||
	case optCalibrate:
 | 
			
		||||
	  pDesc->name = "calibrate";
 | 
			
		||||
	  pDesc->title = SANE_I18N ("Calibrate");
 | 
			
		||||
	  pDesc->desc = SANE_I18N ("Calibrates for black and white level.");
 | 
			
		||||
	  pDesc->type = SANE_TYPE_BUTTON;
 | 
			
		||||
	  pDesc->cap = SANE_CAP_SOFT_SELECT;
 | 
			
		||||
	  pDesc->size = 0;
 | 
			
		||||
	  break;
 | 
			
		||||
#endif
 | 
			
		||||
	default:
 | 
			
		||||
	  DBG (DBG_ERR, "Uninitialised option %d\n", i);
 | 
			
		||||
	  break;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
_ReportDevice (TScannerModel * pModel, char *pszDeviceName)
 | 
			
		||||
{
 | 
			
		||||
  TDevListEntry *pNew, *pDev;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "hp5400: _ReportDevice '%s'\n", pszDeviceName);
 | 
			
		||||
 | 
			
		||||
  pNew = malloc (sizeof (TDevListEntry));
 | 
			
		||||
  if (!pNew)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "no mem\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* add new element to the end of the list */
 | 
			
		||||
  if (_pFirstSaneDev == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      _pFirstSaneDev = pNew;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      for (pDev = _pFirstSaneDev; pDev->pNext; pDev = pDev->pNext)
 | 
			
		||||
	{
 | 
			
		||||
	  ;
 | 
			
		||||
	}
 | 
			
		||||
      pDev->pNext = pNew;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* fill in new element */
 | 
			
		||||
  pNew->pNext = 0;
 | 
			
		||||
  pNew->dev.name = strdup (pszDeviceName);
 | 
			
		||||
  pNew->dev.vendor = pModel->pszVendor;
 | 
			
		||||
  pNew->dev.model = pModel->pszName;
 | 
			
		||||
  pNew->dev.type = "flatbed scanner";
 | 
			
		||||
 | 
			
		||||
  iNumSaneDev++;
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static SANE_Status
 | 
			
		||||
attach_one_device (SANE_String_Const devname)
 | 
			
		||||
{
 | 
			
		||||
  if (HP5400Detect (devname, _ReportDevice) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "attach_one_device: couldn't attach %s\n", devname);
 | 
			
		||||
      return SANE_STATUS_INVAL;
 | 
			
		||||
    }
 | 
			
		||||
  DBG (DBG_MSG, "attach_one_device: attached %s successfully\n", devname);
 | 
			
		||||
  return SANE_STATUS_GOOD;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
SANE_Status
 | 
			
		||||
sane_init (SANE_Int * piVersion, SANE_Auth_Callback pfnAuth)
 | 
			
		||||
{
 | 
			
		||||
  FILE *conf_fp;		/* Config file stream  */
 | 
			
		||||
  SANE_Char line[PATH_MAX];
 | 
			
		||||
  SANE_Char *str = NULL;
 | 
			
		||||
  SANE_String_Const proper_str;
 | 
			
		||||
  int nline = 0;
 | 
			
		||||
 | 
			
		||||
  /* prevent compiler from complaing about unused parameters */
 | 
			
		||||
  pfnAuth = pfnAuth;
 | 
			
		||||
 | 
			
		||||
  DBG_INIT ();
 | 
			
		||||
  DBG (DBG_MSG, "sane_init: SANE hp5400 backend version %d.%d-%d (from %s)\n",
 | 
			
		||||
       V_MAJOR, V_MINOR, BUILD, PACKAGE_STRING);
 | 
			
		||||
 | 
			
		||||
  sanei_usb_init ();
 | 
			
		||||
 | 
			
		||||
  conf_fp = sanei_config_open (HP5400_CONFIG_FILE);
 | 
			
		||||
 | 
			
		||||
  iNumSaneDev = 0;
 | 
			
		||||
 | 
			
		||||
  if (conf_fp)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "Reading config file\n");
 | 
			
		||||
 | 
			
		||||
      while (sanei_config_read (line, sizeof (line), conf_fp))
 | 
			
		||||
	{
 | 
			
		||||
	  ++nline;
 | 
			
		||||
 | 
			
		||||
	  if (str)
 | 
			
		||||
	    {
 | 
			
		||||
	      free (str);
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	  proper_str = sanei_config_get_string (line, &str);
 | 
			
		||||
 | 
			
		||||
	  /* Discards white lines and comments */
 | 
			
		||||
	  if (!str || proper_str == line || str[0] == '#')
 | 
			
		||||
	    {
 | 
			
		||||
	      DBG (DBG_MSG, "Discarding line %d\n", nline);
 | 
			
		||||
	    }
 | 
			
		||||
	  else
 | 
			
		||||
	    {
 | 
			
		||||
	      /* If line's not blank or a comment, then it's the device
 | 
			
		||||
	       * filename or a usb directive. */
 | 
			
		||||
	      DBG (DBG_MSG, "Trying to attach %s\n", line);
 | 
			
		||||
	      sanei_usb_attach_matching_devices (line, attach_one_device);
 | 
			
		||||
	    }
 | 
			
		||||
	}			/* while */
 | 
			
		||||
      fclose (conf_fp);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "Unable to read config file \"%s\": %s\n",
 | 
			
		||||
	   HP5400_CONFIG_FILE, strerror (errno));
 | 
			
		||||
      DBG (DBG_MSG, "Using default built-in values\n");
 | 
			
		||||
      attach_one_device (usb_devfile);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (piVersion != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      *piVersion = SANE_VERSION_CODE (V_MAJOR, V_MINOR, BUILD);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  return SANE_STATUS_GOOD;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
sane_exit (void)
 | 
			
		||||
{
 | 
			
		||||
  TDevListEntry *pDev, *pNext;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "sane_exit\n");
 | 
			
		||||
 | 
			
		||||
  /* free device list memory */
 | 
			
		||||
  if (_pSaneDevList)
 | 
			
		||||
    {
 | 
			
		||||
      for (pDev = _pFirstSaneDev; pDev; pDev = pNext)
 | 
			
		||||
	{
 | 
			
		||||
	  pNext = pDev->pNext;
 | 
			
		||||
	  free ((void *) pDev->dev.name);
 | 
			
		||||
	  free (pDev);
 | 
			
		||||
	}
 | 
			
		||||
      _pFirstSaneDev = 0;
 | 
			
		||||
      free (_pSaneDevList);
 | 
			
		||||
      _pSaneDevList = 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SANE_Status
 | 
			
		||||
sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
 | 
			
		||||
{
 | 
			
		||||
  TDevListEntry *pDev;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "sane_get_devices\n");
 | 
			
		||||
 | 
			
		||||
  local_only = local_only;
 | 
			
		||||
 | 
			
		||||
  if (_pSaneDevList)
 | 
			
		||||
    {
 | 
			
		||||
      free (_pSaneDevList);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  _pSaneDevList = malloc (sizeof (*_pSaneDevList) * (iNumSaneDev + 1));
 | 
			
		||||
  if (!_pSaneDevList)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "no mem\n");
 | 
			
		||||
      return SANE_STATUS_NO_MEM;
 | 
			
		||||
    }
 | 
			
		||||
  i = 0;
 | 
			
		||||
  for (pDev = _pFirstSaneDev; pDev; pDev = pDev->pNext)
 | 
			
		||||
    {
 | 
			
		||||
      _pSaneDevList[i++] = &pDev->dev;
 | 
			
		||||
    }
 | 
			
		||||
  _pSaneDevList[i++] = 0;	/* last entry is 0 */
 | 
			
		||||
 | 
			
		||||
  *device_list = _pSaneDevList;
 | 
			
		||||
 | 
			
		||||
  return SANE_STATUS_GOOD;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SANE_Status
 | 
			
		||||
sane_open (SANE_String_Const name, SANE_Handle * h)
 | 
			
		||||
{
 | 
			
		||||
  TScanner *s;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "sane_open: %s\n", name);
 | 
			
		||||
 | 
			
		||||
  /* check the name */
 | 
			
		||||
  if (strlen (name) == 0)
 | 
			
		||||
    {
 | 
			
		||||
      /* default to first available device */
 | 
			
		||||
      name = _pFirstSaneDev->dev.name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  s = malloc (sizeof (TScanner));
 | 
			
		||||
  if (!s)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "malloc failed\n");
 | 
			
		||||
      return SANE_STATUS_NO_MEM;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  memset (s, 0, sizeof (TScanner));	/* Clear everything to zero */
 | 
			
		||||
  if (HP5400Open (&s->HWParams, (char *) name) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      /* is this OK ? */
 | 
			
		||||
      DBG (DBG_ERR, "HP5400Open failed\n");
 | 
			
		||||
      free ((void *) s);
 | 
			
		||||
      return SANE_STATUS_INVAL;	/* is this OK? */
 | 
			
		||||
    }
 | 
			
		||||
  DBG (DBG_MSG, "Handle=%d\n", s->HWParams.iXferHandle);
 | 
			
		||||
  _InitOptions (s);
 | 
			
		||||
  *h = s;
 | 
			
		||||
 | 
			
		||||
  /* Turn on lamp by default at startup */
 | 
			
		||||
/*  SetLamp(&s->HWParams, TRUE);  */
 | 
			
		||||
 | 
			
		||||
  return SANE_STATUS_GOOD;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
sane_close (SANE_Handle h)
 | 
			
		||||
{
 | 
			
		||||
  TScanner *s;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "sane_close\n");
 | 
			
		||||
 | 
			
		||||
  s = (TScanner *) h;
 | 
			
		||||
 | 
			
		||||
  /* turn of scanner lamp */
 | 
			
		||||
  SetLamp (&s->HWParams, FALSE);
 | 
			
		||||
 | 
			
		||||
  /* close scanner */
 | 
			
		||||
  HP5400Close (&s->HWParams);
 | 
			
		||||
 | 
			
		||||
  /* free scanner object memory */
 | 
			
		||||
  free ((void *) s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const SANE_Option_Descriptor *
 | 
			
		||||
sane_get_option_descriptor (SANE_Handle h, SANE_Int n)
 | 
			
		||||
{
 | 
			
		||||
  TScanner *s;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "sane_get_option_descriptor %d\n", n);
 | 
			
		||||
 | 
			
		||||
  if ((n < optCount) || (n >= optLast))
 | 
			
		||||
    {
 | 
			
		||||
      return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  s = (TScanner *) h;
 | 
			
		||||
  return &s->aOptions[n];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SANE_Status
 | 
			
		||||
sane_control_option (SANE_Handle h, SANE_Int n, SANE_Action Action,
 | 
			
		||||
		     void *pVal, SANE_Int * pInfo)
 | 
			
		||||
{
 | 
			
		||||
  TScanner *s;
 | 
			
		||||
  SANE_Int info;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "sane_control_option: option %d, action %d\n", n, Action);
 | 
			
		||||
 | 
			
		||||
  s = (TScanner *) h;
 | 
			
		||||
  info = 0;
 | 
			
		||||
 | 
			
		||||
  switch (Action)
 | 
			
		||||
    {
 | 
			
		||||
    case SANE_ACTION_GET_VALUE:
 | 
			
		||||
      switch (n)
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	  /* Get options of type SANE_Word */
 | 
			
		||||
	case optBRX:
 | 
			
		||||
	case optTLX:
 | 
			
		||||
	  *(SANE_Word *) pVal = s->aValues[n].w;	/* Not needed anymore  - s->aValues[optOffsetX].w; */
 | 
			
		||||
	  DBG (DBG_MSG,
 | 
			
		||||
	       "sane_control_option: SANE_ACTION_GET_VALUE %d = %d\n", n,
 | 
			
		||||
	       *(SANE_Word *) pVal);
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optBRY:
 | 
			
		||||
	case optTLY:
 | 
			
		||||
	  *(SANE_Word *) pVal = s->aValues[n].w;	/* Not needed anymore - - s->aValues[optOffsetY].w; */
 | 
			
		||||
	  DBG (DBG_MSG,
 | 
			
		||||
	       "sane_control_option: SANE_ACTION_GET_VALUE %d = %d\n", n,
 | 
			
		||||
	       *(SANE_Word *) pVal);
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optOffsetX:
 | 
			
		||||
	case optOffsetY:
 | 
			
		||||
	case optCount:
 | 
			
		||||
	case optDPI:
 | 
			
		||||
	  DBG (DBG_MSG,
 | 
			
		||||
	       "sane_control_option: SANE_ACTION_GET_VALUE %d = %d\n", n,
 | 
			
		||||
	       (int) s->aValues[n].w);
 | 
			
		||||
	  *(SANE_Word *) pVal = s->aValues[n].w;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	  /* Get options of type SANE_Word array */
 | 
			
		||||
	case optGammaTableRed:
 | 
			
		||||
	case optGammaTableGreen:
 | 
			
		||||
	case optGammaTableBlue:
 | 
			
		||||
	  DBG (DBG_MSG, "Reading gamma table\n");
 | 
			
		||||
	  memcpy (pVal, s->aValues[n].wa, s->aOptions[n].size);
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
	  /* Get options of type SANE_Bool */
 | 
			
		||||
	case optLamp:
 | 
			
		||||
	  GetLamp (&s->HWParams, &fLampIsOn);
 | 
			
		||||
	  *(SANE_Bool *) pVal = fLampIsOn;
 | 
			
		||||
	  break;
 | 
			
		||||
#endif
 | 
			
		||||
#if 0
 | 
			
		||||
	case optCalibrate:
 | 
			
		||||
	  /*  although this option has nothing to read,
 | 
			
		||||
	     it's added here to avoid a warning when running scanimage --help */
 | 
			
		||||
	  break;
 | 
			
		||||
#endif
 | 
			
		||||
	default:
 | 
			
		||||
	  DBG (DBG_MSG, "SANE_ACTION_GET_VALUE: Invalid option (%d)\n", n);
 | 
			
		||||
	}
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    case SANE_ACTION_SET_VALUE:
 | 
			
		||||
      if (s->fScanning)
 | 
			
		||||
	{
 | 
			
		||||
	  DBG (DBG_ERR,
 | 
			
		||||
	       "sane_control_option: SANE_ACTION_SET_VALUE not allowed during scan\n");
 | 
			
		||||
	  return SANE_STATUS_INVAL;
 | 
			
		||||
	}
 | 
			
		||||
      switch (n)
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	case optCount:
 | 
			
		||||
	  return SANE_STATUS_INVAL;
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optBRX:
 | 
			
		||||
	case optTLX:
 | 
			
		||||
	  info |= SANE_INFO_RELOAD_PARAMS;
 | 
			
		||||
	  s->ScanParams.iLines = 0;	/* Forget actual image settings */
 | 
			
		||||
	  s->aValues[n].w = *(SANE_Word *) pVal;	/* Not needed anymore - + s->aValues[optOffsetX].w; */
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optBRY:
 | 
			
		||||
	case optTLY:
 | 
			
		||||
	  info |= SANE_INFO_RELOAD_PARAMS;
 | 
			
		||||
	  s->ScanParams.iLines = 0;	/* Forget actual image settings */
 | 
			
		||||
	  s->aValues[n].w = *(SANE_Word *) pVal;	/* Not needed anymore - + s->aValues[optOffsetY].w; */
 | 
			
		||||
	  break;
 | 
			
		||||
	case optDPI:
 | 
			
		||||
	  info |= SANE_INFO_RELOAD_PARAMS;
 | 
			
		||||
	  s->ScanParams.iLines = 0;	/* Forget actual image settings */
 | 
			
		||||
#ifdef SUPPORT_2400_DPI
 | 
			
		||||
	  (s->aValues[n].w) = *(SANE_Word *) pVal;
 | 
			
		||||
#else
 | 
			
		||||
	  (s->aValues[n].w) = min (1200, *(SANE_Word *) pVal);
 | 
			
		||||
#endif
 | 
			
		||||
	  break;
 | 
			
		||||
 | 
			
		||||
	case optGammaTableRed:
 | 
			
		||||
	case optGammaTableGreen:
 | 
			
		||||
	case optGammaTableBlue:
 | 
			
		||||
	  DBG (DBG_MSG, "Writing gamma table\n");
 | 
			
		||||
	  memcpy (s->aValues[n].wa, pVal, s->aOptions[n].size);
 | 
			
		||||
	  break;
 | 
			
		||||
/*
 | 
			
		||||
    case optLamp:
 | 
			
		||||
      fVal = *(SANE_Bool *)pVal;
 | 
			
		||||
      DBG(DBG_MSG, "lamp %s\n", fVal ? "on" : "off");
 | 
			
		||||
      SetLamp(&s->HWParams, fVal);
 | 
			
		||||
      break;
 | 
			
		||||
*/
 | 
			
		||||
#if 0
 | 
			
		||||
	case optCalibrate:
 | 
			
		||||
/*       SimpleCalib(&s->HWParams); */
 | 
			
		||||
	  break;
 | 
			
		||||
#endif
 | 
			
		||||
	default:
 | 
			
		||||
	  DBG (DBG_ERR, "SANE_ACTION_SET_VALUE: Invalid option (%d)\n", n);
 | 
			
		||||
	}
 | 
			
		||||
      if (pInfo != NULL)
 | 
			
		||||
	{
 | 
			
		||||
	  *pInfo = info;
 | 
			
		||||
	}
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case SANE_ACTION_SET_AUTO:
 | 
			
		||||
      return SANE_STATUS_UNSUPPORTED;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      DBG (DBG_ERR, "Invalid action (%d)\n", Action);
 | 
			
		||||
      return SANE_STATUS_INVAL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return SANE_STATUS_GOOD;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SANE_Status
 | 
			
		||||
sane_get_parameters (SANE_Handle h, SANE_Parameters * p)
 | 
			
		||||
{
 | 
			
		||||
  TScanner *s;
 | 
			
		||||
  DBG (DBG_MSG, "sane_get_parameters\n");
 | 
			
		||||
 | 
			
		||||
  s = (TScanner *) h;
 | 
			
		||||
 | 
			
		||||
  /* first do some checks */
 | 
			
		||||
  if (s->aValues[optTLX].w >= s->aValues[optBRX].w)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "TLX should be smaller than BRX\n");
 | 
			
		||||
      return SANE_STATUS_INVAL;	/* proper error code? */
 | 
			
		||||
    }
 | 
			
		||||
  if (s->aValues[optTLY].w >= s->aValues[optBRY].w)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "TLY should be smaller than BRY\n");
 | 
			
		||||
      return SANE_STATUS_INVAL;	/* proper error code? */
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* return the data */
 | 
			
		||||
  p->format = SANE_FRAME_RGB;
 | 
			
		||||
  p->last_frame = SANE_TRUE;
 | 
			
		||||
 | 
			
		||||
  p->depth = 8;
 | 
			
		||||
  if (s->ScanParams.iLines)	/* Initialised by doing a scan */
 | 
			
		||||
    {
 | 
			
		||||
      p->pixels_per_line = s->ScanParams.iBytesPerLine / 3;
 | 
			
		||||
      p->lines = s->ScanParams.iLines;
 | 
			
		||||
      p->bytes_per_line = s->ScanParams.iBytesPerLine;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      p->lines = MM_TO_PIXEL (s->aValues[optBRY].w - s->aValues[optTLY].w,
 | 
			
		||||
			      s->aValues[optDPI].w);
 | 
			
		||||
      p->pixels_per_line =
 | 
			
		||||
	MM_TO_PIXEL (s->aValues[optBRX].w - s->aValues[optTLX].w,
 | 
			
		||||
		     s->aValues[optDPI].w);
 | 
			
		||||
      p->bytes_per_line = p->pixels_per_line * 3;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return SANE_STATUS_GOOD;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define BUFFER_READ_HEADER_SIZE 32
 | 
			
		||||
 | 
			
		||||
SANE_Status
 | 
			
		||||
sane_start (SANE_Handle h)
 | 
			
		||||
{
 | 
			
		||||
  TScanner *s;
 | 
			
		||||
  SANE_Parameters par;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "sane_start\n");
 | 
			
		||||
 | 
			
		||||
  s = (TScanner *) h;
 | 
			
		||||
 | 
			
		||||
  if (sane_get_parameters (h, &par) != SANE_STATUS_GOOD)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "Invalid scan parameters (sane_get_parameters)\n");
 | 
			
		||||
      return SANE_STATUS_INVAL;
 | 
			
		||||
    }
 | 
			
		||||
  s->iLinesLeft = par.lines;
 | 
			
		||||
 | 
			
		||||
  /* fill in the scanparams using the option values */
 | 
			
		||||
  s->ScanParams.iDpi = s->aValues[optDPI].w;
 | 
			
		||||
  s->ScanParams.iLpi = s->aValues[optDPI].w;
 | 
			
		||||
 | 
			
		||||
  /* Guessing here. 75dpi => 1, 2400dpi => 32 */
 | 
			
		||||
  /*  s->ScanParams.iColourOffset = s->aValues[optDPI].w / 75; */
 | 
			
		||||
  /* now we don't need correction => corrected by scan request type ? */
 | 
			
		||||
  s->ScanParams.iColourOffset = 0;
 | 
			
		||||
 | 
			
		||||
  s->ScanParams.iTop =
 | 
			
		||||
    MM_TO_PIXEL (s->aValues[optTLY].w + s->HWParams.iTopLeftY, HW_LPI);
 | 
			
		||||
  s->ScanParams.iLeft =
 | 
			
		||||
    MM_TO_PIXEL (s->aValues[optTLX].w + s->HWParams.iTopLeftX, HW_DPI);
 | 
			
		||||
 | 
			
		||||
  /* Note: All measurements passed to the scanning routines must be in HW_LPI */
 | 
			
		||||
  s->ScanParams.iWidth =
 | 
			
		||||
    MM_TO_PIXEL (s->aValues[optBRX].w - s->aValues[optTLX].w, HW_LPI);
 | 
			
		||||
  s->ScanParams.iHeight =
 | 
			
		||||
    MM_TO_PIXEL (s->aValues[optBRY].w - s->aValues[optTLY].w, HW_LPI);
 | 
			
		||||
 | 
			
		||||
  /* After the scanning, the iLines and iBytesPerLine will be filled in */
 | 
			
		||||
 | 
			
		||||
  /* copy gamma table */
 | 
			
		||||
  WriteGammaCalibTable (s->HWParams.iXferHandle, s->aGammaTableR,
 | 
			
		||||
			s->aGammaTableG, s->aGammaTableB);
 | 
			
		||||
 | 
			
		||||
  /* prepare the actual scan */
 | 
			
		||||
  /* We say normal here. In future we should have a preview flag to set preview mode */
 | 
			
		||||
  if (InitScan (SCAN_TYPE_NORMAL, &s->ScanParams, &s->HWParams) != 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "Invalid scan parameters (InitScan)\n");
 | 
			
		||||
      return SANE_STATUS_INVAL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* for the moment no lines has been read */
 | 
			
		||||
  s->ScanParams.iLinesRead = 0;
 | 
			
		||||
 | 
			
		||||
  s->fScanning = TRUE;
 | 
			
		||||
  return SANE_STATUS_GOOD;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SANE_Status
 | 
			
		||||
sane_read (SANE_Handle h, SANE_Byte * buf, SANE_Int maxlen, SANE_Int * len)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /* Read actual scan from the circular buffer */
 | 
			
		||||
  /* Note: this is already color corrected, though some work still needs to be done
 | 
			
		||||
     to deal with the colour offsetting */
 | 
			
		||||
  TScanner *s;
 | 
			
		||||
  char *buffer = buf;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "sane_read: request %d bytes \n", maxlen);
 | 
			
		||||
 | 
			
		||||
  s = (TScanner *) h;
 | 
			
		||||
 | 
			
		||||
  /* nothing has been read for the moment */
 | 
			
		||||
  *len = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  /* if we read all the lines return EOF */
 | 
			
		||||
  if (s->ScanParams.iLinesRead == s->ScanParams.iLines)
 | 
			
		||||
    {
 | 
			
		||||
/*    FinishScan( &s->HWParams );        *** FinishScan called in sane_cancel */
 | 
			
		||||
      DBG (DBG_MSG, "sane_read: EOF\n");
 | 
			
		||||
      return SANE_STATUS_EOF;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* read as many lines the buffer may contain and while there are lines to be read */
 | 
			
		||||
  while ((*len + s->ScanParams.iBytesPerLine <= maxlen)
 | 
			
		||||
	 && (s->ScanParams.iLinesRead < s->ScanParams.iLines))
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
      /* get one more line from the circular buffer */
 | 
			
		||||
      CircBufferGetLine (s->HWParams.iXferHandle, &s->HWParams.pipe, buffer);
 | 
			
		||||
 | 
			
		||||
      /* increment pointer, size and line number */
 | 
			
		||||
      buffer += s->ScanParams.iBytesPerLine;
 | 
			
		||||
      *len += s->ScanParams.iBytesPerLine;
 | 
			
		||||
      s->ScanParams.iLinesRead++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "sane_read: %d bytes read\n", *len);
 | 
			
		||||
 | 
			
		||||
  return SANE_STATUS_GOOD;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
sane_cancel (SANE_Handle h)
 | 
			
		||||
{
 | 
			
		||||
  TScanner *s;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "sane_cancel\n");
 | 
			
		||||
 | 
			
		||||
  s = (TScanner *) h;
 | 
			
		||||
 | 
			
		||||
  /* to be implemented more thoroughly */
 | 
			
		||||
 | 
			
		||||
  /* Make sure the scanner head returns home */
 | 
			
		||||
  FinishScan (&s->HWParams);
 | 
			
		||||
 | 
			
		||||
  s->fCanceled = TRUE;
 | 
			
		||||
  s->fScanning = FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SANE_Status
 | 
			
		||||
sane_set_io_mode (SANE_Handle h, SANE_Bool m)
 | 
			
		||||
{
 | 
			
		||||
  DBG (DBG_MSG, "sane_set_io_mode %s\n", m ? "non-blocking" : "blocking");
 | 
			
		||||
 | 
			
		||||
  /* prevent compiler from complaining about unused parameters */
 | 
			
		||||
  h = h;
 | 
			
		||||
 | 
			
		||||
  if (m)
 | 
			
		||||
    {
 | 
			
		||||
      return SANE_STATUS_UNSUPPORTED;
 | 
			
		||||
    }
 | 
			
		||||
  return SANE_STATUS_GOOD;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SANE_Status
 | 
			
		||||
sane_get_select_fd (SANE_Handle h, SANE_Int * fd)
 | 
			
		||||
{
 | 
			
		||||
  DBG (DBG_MSG, "sane_select_fd\n");
 | 
			
		||||
 | 
			
		||||
  /* prevent compiler from complaining about unused parameters */
 | 
			
		||||
  h = h;
 | 
			
		||||
  fd = fd;
 | 
			
		||||
 | 
			
		||||
  return SANE_STATUS_UNSUPPORTED;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,17 +1,18 @@
 | 
			
		|||
/* sane - Scanner Access Now Easy.
 | 
			
		||||
   Copyright (C) 2003 Martijn van Oosterhout <kleptog@svana.org>
 | 
			
		||||
   
 | 
			
		||||
   Copyright (C) 2003 Thomas Soumarmon <thomas.soumarmon@cogitae.net>
 | 
			
		||||
 | 
			
		||||
   Originally copied from HP3300 testtools. Original notice follows:
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
   Copyright (C) 2001 Bertrik Sikken (bertrik@zonnet.nl)
 | 
			
		||||
 | 
			
		||||
   This file is part of the SANE package.
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
   This program 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.
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
   This program 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
 | 
			
		||||
| 
						 | 
				
			
			@ -41,10 +42,11 @@
 | 
			
		|||
   If you write modifications of your own for SANE, it is your choice
 | 
			
		||||
   whether to permit this exception to apply to your modifications.
 | 
			
		||||
   If you do not wish that, delete this exception notice.
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
   $Id$
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
    Core HP5400 functions.
 | 
			
		||||
*/
 | 
			
		||||
| 
						 | 
				
			
			@ -137,4 +139,5 @@ typedef struct
 | 
			
		|||
TScanParams;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* NO _HP5400_H_ */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,72 @@
 | 
			
		|||
/* sane - Scanner Access Now Easy.
 | 
			
		||||
   Copyright (C) 2003 Martijn van Oosterhout <kleptog@svana.org>
 | 
			
		||||
   Copyright (C) 2003 Thomas Soumarmon <thomas.soumarmon@cogitae.net>
 | 
			
		||||
 | 
			
		||||
   Originally copied from HP3300 testtools. Original notice follows:
 | 
			
		||||
 | 
			
		||||
   Copyright (C) 2001 Bertrik Sikken (bertrik@zonnet.nl)
 | 
			
		||||
 | 
			
		||||
   This file is part of the SANE package.
 | 
			
		||||
 | 
			
		||||
   This program 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.
 | 
			
		||||
 | 
			
		||||
   This program 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 this program; if not, write to the Free Software
 | 
			
		||||
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
			
		||||
 | 
			
		||||
   As a special exception, the authors of SANE give permission for
 | 
			
		||||
   additional uses of the libraries contained in this release of SANE.
 | 
			
		||||
 | 
			
		||||
   The exception is that, if you link a SANE library with other files
 | 
			
		||||
   to produce an executable, this does not by itself cause the
 | 
			
		||||
   resulting executable to be covered by the GNU General Public
 | 
			
		||||
   License.  Your use of that executable is in no way restricted on
 | 
			
		||||
   account of linking the SANE library code into it.
 | 
			
		||||
 | 
			
		||||
   This exception does not, however, invalidate any other reasons why
 | 
			
		||||
   the executable file might be covered by the GNU General Public
 | 
			
		||||
   License.
 | 
			
		||||
 | 
			
		||||
   If you submit changes to SANE to the maintainers to be included in
 | 
			
		||||
   a subsequent release, you agree by submitting the changes that
 | 
			
		||||
   those changes may be distributed with this exception intact.
 | 
			
		||||
 | 
			
		||||
   If you write modifications of your own for SANE, it is your choice
 | 
			
		||||
   whether to permit this exception to apply to your modifications.
 | 
			
		||||
   If you do not wish that, delete this exception notice.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "hp5400_debug.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef STANDALONE
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
FILE *DBG_ASSERT = NULL;
 | 
			
		||||
FILE *DBG_ERR = NULL;
 | 
			
		||||
FILE *DBG_MSG = NULL;
 | 
			
		||||
 | 
			
		||||
void  hp5400_dbg_start() {
 | 
			
		||||
  DBG_MSG = stdout;
 | 
			
		||||
  DBG_ERR = stderr;
 | 
			
		||||
  DBG_ASSERT = stderr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#undef DEBUG_DECLARE_ONLY
 | 
			
		||||
#undef _SANEI_DEBUG_H
 | 
			
		||||
#include <sane/sanei_debug.h>
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,76 @@
 | 
			
		|||
#ifndef __HP5400_DEBUG_H_
 | 
			
		||||
#define __HP5400_DEBUG_H_
 | 
			
		||||
 | 
			
		||||
/* sane - Scanner Access Now Easy.
 | 
			
		||||
   Copyright (C) 2003 Martijn van Oosterhout <kleptog@svana.org>
 | 
			
		||||
   Copyright (C) 2003 Thomas Soumarmon <thomas.soumarmon@cogitae.net>
 | 
			
		||||
 | 
			
		||||
   Originally copied from HP3300 testtools. Original notice follows:
 | 
			
		||||
 | 
			
		||||
   Copyright (C) 2001 Bertrik Sikken (bertrik@zonnet.nl)
 | 
			
		||||
 | 
			
		||||
   This file is part of the SANE package.
 | 
			
		||||
 | 
			
		||||
   This program 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.
 | 
			
		||||
 | 
			
		||||
   This program 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 this program; if not, write to the Free Software
 | 
			
		||||
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
			
		||||
 | 
			
		||||
   As a special exception, the authors of SANE give permission for
 | 
			
		||||
   additional uses of the libraries contained in this release of SANE.
 | 
			
		||||
 | 
			
		||||
   The exception is that, if you link a SANE library with other files
 | 
			
		||||
   to produce an executable, this does not by itself cause the
 | 
			
		||||
   resulting executable to be covered by the GNU General Public
 | 
			
		||||
   License.  Your use of that executable is in no way restricted on
 | 
			
		||||
   account of linking the SANE library code into it.
 | 
			
		||||
 | 
			
		||||
   This exception does not, however, invalidate any other reasons why
 | 
			
		||||
   the executable file might be covered by the GNU General Public
 | 
			
		||||
   License.
 | 
			
		||||
 | 
			
		||||
   If you submit changes to SANE to the maintainers to be included in
 | 
			
		||||
   a subsequent release, you agree by submitting the changes that
 | 
			
		||||
   those changes may be distributed with this exception intact.
 | 
			
		||||
 | 
			
		||||
   If you write modifications of your own for SANE, it is your choice
 | 
			
		||||
   whether to permit this exception to apply to your modifications.
 | 
			
		||||
   If you do not wish that, delete this exception notice.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef STANDALONE
 | 
			
		||||
 | 
			
		||||
#define DEBUG_DECLARE_ONLY
 | 
			
		||||
#include <sane/sanei_debug.h>
 | 
			
		||||
 | 
			
		||||
#define DBG_ASSERT  1
 | 
			
		||||
#define DBG_ERR     16
 | 
			
		||||
#define DBG_MSG     32
 | 
			
		||||
#define HP5400_DBG DBG
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#define LOCAL_DBG
 | 
			
		||||
#define HP5400_DBG fprintf
 | 
			
		||||
extern FILE *DBG_ASSERT;
 | 
			
		||||
extern FILE *DBG_ERR;
 | 
			
		||||
extern FILE *DBG_MSG;
 | 
			
		||||
 | 
			
		||||
void  hp5400_dbg_start();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,23 +1,27 @@
 | 
			
		|||
/* sane - Scanner Access Now Easy.
 | 
			
		||||
   (c) 2003 Martijn van Oosterhout, kleptog@svana.org
 | 
			
		||||
   (c) 2002 Bertrik Sikken, bertrik@zonnet.nl
 | 
			
		||||
  
 | 
			
		||||
   Copyright (C) 2003 Martijn van Oosterhout <kleptog@svana.org>
 | 
			
		||||
   Copyright (C) 2003 Thomas Soumarmon <thomas.soumarmon@cogitae.net>
 | 
			
		||||
   Copyright (c) 2003 Henning Meier-Geinitz, <henning@meier-geinitz.de>
 | 
			
		||||
 | 
			
		||||
   Originally copied from HP3300 testtools. Original notice follows:
 | 
			
		||||
 | 
			
		||||
   Copyright (C) 2001 Bertrik Sikken (bertrik@zonnet.nl)
 | 
			
		||||
 | 
			
		||||
   This file is part of the SANE package.
 | 
			
		||||
 | 
			
		||||
   This program 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.
 | 
			
		||||
   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.
 | 
			
		||||
 | 
			
		||||
   This program 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.
 | 
			
		||||
   This program 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 this program; if not, write to the Free Software
 | 
			
		||||
   Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 | 
			
		||||
   MA 02111-1307, USA.
 | 
			
		||||
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
			
		||||
 | 
			
		||||
   As a special exception, the authors of SANE give permission for
 | 
			
		||||
   additional uses of the libraries contained in this release of SANE.
 | 
			
		||||
| 
						 | 
				
			
			@ -43,7 +47,7 @@
 | 
			
		|||
   HP5400/5470 Test util.
 | 
			
		||||
   Currently is only able to read back the scanner version string,
 | 
			
		||||
   but this basically demonstrates ability to communicate with the scanner.
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
   Massively expanded. Can do calibration scan, upload gamma and calibration
 | 
			
		||||
   tables and stores the results of a scan. - 19/02/2003 Martijn
 | 
			
		||||
*/
 | 
			
		||||
| 
						 | 
				
			
			@ -51,7 +55,6 @@
 | 
			
		|||
#include <stdio.h>		/* for printf */
 | 
			
		||||
#include <stdlib.h>		/* for exit */
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
/*#include <stdint.h>*/
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -60,6 +63,8 @@
 | 
			
		|||
 | 
			
		||||
#include "hp5400.h"
 | 
			
		||||
#include "hp5400_xfer.h"
 | 
			
		||||
#include "hp5400_internal.h"
 | 
			
		||||
#include "hp5400_debug.h" /* debug functions */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef min
 | 
			
		||||
| 
						 | 
				
			
			@ -75,149 +80,27 @@
 | 
			
		|||
#define PACKED
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* If this is enabled, a copy of the raw data from the scanner will be saved to 
 | 
			
		||||
/* If this is enabled, a copy of the raw data from the scanner will be saved to
 | 
			
		||||
   imagedebug.dat and the attempted conversion to imagedebug.ppm */
 | 
			
		||||
/* #define IMAGE_DEBUG */
 | 
			
		||||
 | 
			
		||||
/* If this is defined you get extra info on the calibration */
 | 
			
		||||
/* #define CALIB_DEBUG */
 | 
			
		||||
 | 
			
		||||
#define CMD_GETVERSION   0x1200
 | 
			
		||||
#define CMD_GETUITEXT    0xf00b
 | 
			
		||||
#define CMD_GETCMDID     0xc500
 | 
			
		||||
#define CMD_SCANREQUEST  0x2505	/* This is for previews */
 | 
			
		||||
#define CMD_SCANREQUEST2 0x2500	/* This is for real scans */
 | 
			
		||||
#define CMD_SCANRESPONSE 0x3400
 | 
			
		||||
 | 
			
		||||
/* Testing stuff to make it work */
 | 
			
		||||
#define CMD_SETDPI       0x1500	/* ??? */
 | 
			
		||||
#define CMD_STOPSCAN     0x1B01	/* 0x40 = lamp in on, 0x00 = lamp is off */
 | 
			
		||||
#define CMD_STARTSCAN    0x1B05	/* 0x40 = lamp in on, 0x00 = lamp is off */
 | 
			
		||||
#define CMD_UNKNOWN      0x2300	/* Send fixed string */
 | 
			
		||||
#define CMD_UNKNOWN2     0xD600	/* ??? Set to 0x04 */
 | 
			
		||||
#define CMD_UNKNOWN3     0xC000	/* ??? Set to 02 03 03 3C */
 | 
			
		||||
#define CMD_SETOFFSET    0xE700	/* two ints in network order. X-offset, Y-offset of full scan */
 | 
			
		||||
				  /* Given values seem to be 0x0054 (=4.57mm) and 0x0282 (=54.36mm) */
 | 
			
		||||
 | 
			
		||||
#define CMD_INITBULK1   0x0087	/* send 0x14 */
 | 
			
		||||
#define CMD_INITBULK2   0x0083	/* send 0x24 */
 | 
			
		||||
#define CMD_INITBULK3   0x0082	/* transfer length 0xf000 */
 | 
			
		||||
 | 
			
		||||
const char MatchVersion[] = "SilitekIBlizd C3 ScannerV0.84";
 | 
			
		||||
const char MatchVersion2[] = "SilitekIBlizd C3 ScannerV0.86";
 | 
			
		||||
/*extern char *usb_devfile;*/	/* Is name of device to link to */
 | 
			
		||||
 | 
			
		||||
static TScannerModel Model_HP54xx =
 | 
			
		||||
  { "Hewlett-Packard", "HP54xx Flatbed Scanner" };
 | 
			
		||||
 | 
			
		||||
#ifdef STANDALONE
 | 
			
		||||
/* Debug messages levels */
 | 
			
		||||
#define DBG fprintf
 | 
			
		||||
FILE *DBG_ASSERT = NULL;
 | 
			
		||||
FILE *DBG_ERR = NULL;
 | 
			
		||||
FILE *DBG_MSG = NULL;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct ScanRequest
 | 
			
		||||
{
 | 
			
		||||
  u_int8_t x1;			/* Set to 0x08 */
 | 
			
		||||
  u_int16_t dpix, dpiy;		/* Set to 75, 150 or 300 in network order */
 | 
			
		||||
  u_int16_t offx, offy;		/* Offset to scan, in 1/300th of dpi, in network order */
 | 
			
		||||
  u_int16_t lenx, leny;		/* Size of scan, in 1/300th of dpi, in network order */
 | 
			
		||||
  u_int16_t flags1, flags2, flags3;	/* Undetermined flag info */
 | 
			
		||||
  /* Known combinations are:
 | 
			
		||||
     1st calibration scan: 0x0000, 0x0010, 0x1820  =  24bpp
 | 
			
		||||
     2nd calibration scan: 0x0000, 0x0010, 0x3020  =  48bpp ???
 | 
			
		||||
     3rd calibration scan: 0x0000, 0x0010, 0x3024  =  48bpp ???
 | 
			
		||||
     Preview scan:         0x0080, 0x0000, 0x18E8  =   8bpp
 | 
			
		||||
     4th & 5th like 2nd and 3rd
 | 
			
		||||
     B&W scan:             0x0080, 0x0040, 0x08E8  =   8bpp
 | 
			
		||||
     6th & 7th like 2nd and 3rd
 | 
			
		||||
     True colour scan      0x0080, 0x0040, 0x18E8  =  24bpp
 | 
			
		||||
   */
 | 
			
		||||
  u_int8_t zero;			/* Seems to always be zero */
 | 
			
		||||
  u_int16_t gamma[3];		/* Set to 100 in network order. Gamma? */
 | 
			
		||||
  u_int16_t pad[3];		/* Zero padding ot 32 bytes??? */
 | 
			
		||||
}
 | 
			
		||||
PACKED;
 | 
			
		||||
 | 
			
		||||
     /* More known combos (All 24-bit):
 | 
			
		||||
        300 x  300 light calibration: 0x0000, 0x0010, 0x1820
 | 
			
		||||
        300 x  300 dark calibration:  0x0000, 0x0010, 0x3024
 | 
			
		||||
        75 x   75 preview scan:      0x0080, 0x0000, 0x18E8
 | 
			
		||||
        300 x  300 full scan:         0x0080, 0x0000, 0x18E8
 | 
			
		||||
        600 x  300 light calibration: 0x0000, 0x0010, 0x3000 
 | 
			
		||||
        600 x  300 dark calibration:  0x0000, 0x0010, 0x3004
 | 
			
		||||
        600 x  600 full scan:         0x0080, 0x0000, 0x18C8
 | 
			
		||||
        1200 x  300 light calibration: 0x0000, 0x0010, 0x3000
 | 
			
		||||
        1200 x  300 dark calibration:  0x0000, 0x0010, 0x3004
 | 
			
		||||
        1200 x 1200 full scan:         0x0080, 0x0000, 0x18C8
 | 
			
		||||
        2400 x  300 light calibration: 0x0000, 0x0010, 0x3000
 | 
			
		||||
        2400 x  300 dark calibration:  0x0000, 0x0010, 0x3004
 | 
			
		||||
        2400 x 2400 full scan:         0x0080, 0x0000, 0x18C0
 | 
			
		||||
      */
 | 
			
		||||
 | 
			
		||||
struct ScanResponse
 | 
			
		||||
{
 | 
			
		||||
  u_int16_t x1;			/* Usually 0x0000 or 0x4000 */
 | 
			
		||||
  u_int32_t transfersize;	/* Number of bytes to be transferred */
 | 
			
		||||
  u_int32_t xsize;		/* Shape of returned bitmap */
 | 
			
		||||
  u_int16_t ysize;		/*   Why does the X get more bytes? */
 | 
			
		||||
  u_int16_t pad[2];		/* Zero padding to 16 bytes??? */
 | 
			
		||||
}
 | 
			
		||||
PACKED;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int InitScan2 (enum ScanType type, struct ScanRequest *req,
 | 
			
		||||
		      THWParams * pHWParams, struct ScanResponse *res,
 | 
			
		||||
		      int iColourOffset, int code);
 | 
			
		||||
static void FinishScan (THWParams * pHWParams);
 | 
			
		||||
 | 
			
		||||
static int WriteByte (int iHandle, int cmd, char data);
 | 
			
		||||
static int SetLamp (THWParams * pHWParams, int fLampOn);
 | 
			
		||||
static int WarmupLamp (int iHandle);
 | 
			
		||||
static int SetCalibration (int iHandle, int numPixels,
 | 
			
		||||
			   unsigned int *low_vals[3],
 | 
			
		||||
			   unsigned int *high_vals[3], int dpi);
 | 
			
		||||
static void WriteGammaCalibTable (int iHandle, const int *pabGammaR,
 | 
			
		||||
				  const int *pabGammaG,
 | 
			
		||||
				  const int *pabGammaB);
 | 
			
		||||
static void SetDefaultGamma (int iHandle);
 | 
			
		||||
static void CircBufferInit (int iHandle, TDataPipe * p, int iBytesPerLine,
 | 
			
		||||
			    int bpp, int iMisAlignment, int blksize, 
 | 
			
		||||
			    int iTransferSize);
 | 
			
		||||
static int CircBufferGetLine (int iHandle, TDataPipe * p, void *pabLine);
 | 
			
		||||
static void CircBufferExit (TDataPipe * p);
 | 
			
		||||
static void DecodeImage (FILE * file, int planes, int bpp, int xsize, int ysize,
 | 
			
		||||
			 const char *filename);
 | 
			
		||||
static int hp5400_test_scan_response (struct ScanResponse *resp,
 | 
			
		||||
				      struct ScanRequest *req);
 | 
			
		||||
static int DoAverageScan (int iHandle, struct ScanRequest *req, int code,
 | 
			
		||||
			  unsigned int **array);
 | 
			
		||||
static int DoScan (int iHandle, struct ScanRequest *req, const char *filename, int code,
 | 
			
		||||
		   struct ScanResponse *res);
 | 
			
		||||
static int Calibrate (int iHandle, int dpi);
 | 
			
		||||
static int hp5400_scan (int iHandle, TScanParams * params, THWParams * pHWParams,
 | 
			
		||||
			const char *filename);
 | 
			
		||||
static int PreviewScan (int iHandle);
 | 
			
		||||
static int InitScanner (int iHandle);
 | 
			
		||||
static int InitScan (enum ScanType scantype, TScanParams * pParams,
 | 
			
		||||
		     THWParams * pHWParams);
 | 
			
		||||
static void FinishScan (THWParams * pHWParams);
 | 
			
		||||
static int HP5400Open (THWParams * params, char *filename);
 | 
			
		||||
static void HP5400Close (THWParams * params);
 | 
			
		||||
static int HP5400Detect (char *filename,
 | 
			
		||||
			 int (*_ReportDevice) (TScannerModel * pModel,
 | 
			
		||||
					       char *pszDeviceName));
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
WriteByte (int iHandle, int cmd, char data)
 | 
			
		||||
{
 | 
			
		||||
  if (hp5400_command_write (iHandle, cmd, 1, &data) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "failed to send byte (cmd=%04X)\n", cmd);
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "failed to send byte (cmd=%04X)\n", cmd);
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
  return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -278,7 +161,7 @@ WarmupLamp (int iHandle)
 | 
			
		|||
     }
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "***WARNING*** Warmup lamp failed...\n");
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "***WARNING*** Warmup lamp failed...\n");
 | 
			
		||||
  return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -411,6 +294,7 @@ void
 | 
			
		|||
CircBufferInit (int iHandle, TDataPipe * p, int iBytesPerLine,
 | 
			
		||||
		int bpp, int iMisAlignment, int blksize, int iTransferSize)
 | 
			
		||||
{
 | 
			
		||||
  iHandle = iHandle; /* to avoid compilation warning */
 | 
			
		||||
  p->buffersize = max (BUFFER_SIZE, 3 * blksize);
 | 
			
		||||
 | 
			
		||||
  if (p->buffer)
 | 
			
		||||
| 
						 | 
				
			
			@ -453,7 +337,7 @@ CircBufferInit (int iHandle, TDataPipe * p, int iBytesPerLine,
 | 
			
		|||
  temp = fopen ("imagedebug.dat", "w+b");
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG,
 | 
			
		||||
  HP5400_DBG (DBG_MSG,
 | 
			
		||||
       "Begin: line=%d (%X), pixels=%d (%X), r=%d (%X), g=%d (%X), b=%d (%X), bpp=%d, step=%d\n",
 | 
			
		||||
       p->linelength, p->linelength, p->pixels, p->pixels, p->roff, p->roff,
 | 
			
		||||
       p->goff, p->goff, p->boff, p->boff, bpp, iMisAlignment);
 | 
			
		||||
| 
						 | 
				
			
			@ -467,7 +351,7 @@ CircBufferGetLine (int iHandle, TDataPipe * p, void *pabLine)
 | 
			
		|||
 | 
			
		||||
  int maxoff = 0;
 | 
			
		||||
 | 
			
		||||
/*  DBG(DBG_MSG, "CircBufferGetLine:\n");   */
 | 
			
		||||
/*  HP5400_DBG(DBG_MSG, "CircBufferGetLine:\n");   */
 | 
			
		||||
 | 
			
		||||
  if (p->roff > maxoff)
 | 
			
		||||
    maxoff = p->roff;
 | 
			
		||||
| 
						 | 
				
			
			@ -507,15 +391,15 @@ CircBufferGetLine (int iHandle, TDataPipe * p, void *pabLine)
 | 
			
		|||
 | 
			
		||||
      assert ((p->bufend + p->blksize) <= p->buffersize);
 | 
			
		||||
 | 
			
		||||
      DBG (DBG_MSG, "Reading block, %d bytes remain\n", p->transfersize);
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "Reading block, %d bytes remain\n", p->transfersize);
 | 
			
		||||
      p->transfersize -= p->blksize;
 | 
			
		||||
 | 
			
		||||
      res =
 | 
			
		||||
	hp5400_bulk_read_block (iHandle, CMD_INITBULK3, cmd, sizeof (cmd),
 | 
			
		||||
				p->buffer + p->bufend, p->blksize);
 | 
			
		||||
    				p->buffer + p->bufend, p->blksize);
 | 
			
		||||
      if (res != p->blksize)
 | 
			
		||||
	{
 | 
			
		||||
	  DBG (DBG_ERR, "*** ERROR: Read returned %d. FATAL.", res);
 | 
			
		||||
	  HP5400_DBG (DBG_ERR, "*** ERROR: Read returned %d. FATAL.", res);
 | 
			
		||||
	  return -1;
 | 
			
		||||
	}
 | 
			
		||||
#ifdef IMAGE_DEBUG
 | 
			
		||||
| 
						 | 
				
			
			@ -611,7 +495,7 @@ DecodeImage (FILE * file, int planes, int bpp, int xsize, int ysize,
 | 
			
		|||
  /* xsize is byte width, not pixel width */
 | 
			
		||||
  xsize /= planes * bpp;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG,
 | 
			
		||||
  HP5400_DBG (DBG_MSG,
 | 
			
		||||
       "DecodeImage(planes=%d,bpp=%d,xsize=%d,ysize=%d) => %d (file=%s)\n",
 | 
			
		||||
       planes, bpp, xsize, ysize, planes * bpp * xsize * ysize, filename);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -659,12 +543,13 @@ DecodeImage (FILE * file, int planes, int bpp, int xsize, int ysize,
 | 
			
		|||
int
 | 
			
		||||
hp5400_test_scan_response (struct ScanResponse *resp, struct ScanRequest *req)
 | 
			
		||||
{
 | 
			
		||||
  DBG (DBG_MSG, "Scan response:\n");
 | 
			
		||||
  DBG (DBG_MSG, "  transfersize=%d   htonl-> %d\n", resp->transfersize,
 | 
			
		||||
  req = req; /* to avoid compilation warning */
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Scan response:\n");
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "  transfersize=%d   htonl-> %d\n", resp->transfersize,
 | 
			
		||||
       htonl (resp->transfersize));
 | 
			
		||||
  DBG (DBG_MSG, "  xsize=%d    htonl-> %d\n", resp->xsize,
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "  xsize=%d    htonl-> %d\n", resp->xsize,
 | 
			
		||||
       htonl (resp->xsize));
 | 
			
		||||
  DBG (DBG_MSG, "  ysize=%d    htons-> %d\n", resp->ysize,
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "  ysize=%d    htons-> %d\n", resp->ysize,
 | 
			
		||||
       htons (resp->ysize));
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -694,7 +579,7 @@ DoAverageScan (int iHandle, struct ScanRequest *req, int code,
 | 
			
		|||
 | 
			
		||||
  length = htonl (res.xsize) / 6;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "Calibration scan: %d pixels wide\n", length);
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Calibration scan: %d pixels wide\n", length);
 | 
			
		||||
 | 
			
		||||
  for (j = 0; j < 3; j++)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -736,6 +621,8 @@ DoScan (int iHandle, struct ScanRequest *req, const char *filename, int code,
 | 
			
		|||
/*  int bpp, planes; */
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  code = code; /*to avoid compilation warning*/
 | 
			
		||||
 | 
			
		||||
  if (res == NULL)
 | 
			
		||||
    res = &res_temp;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -744,7 +631,7 @@ DoScan (int iHandle, struct ScanRequest *req, const char *filename, int code,
 | 
			
		|||
  file = fopen (filename, "w+b");
 | 
			
		||||
  if (!file)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "Couldn't open outputfile (%s)\n", strerror (errno));
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "Couldn't open outputfile (%s)\n", strerror (errno));
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -838,7 +725,7 @@ Calibrate (int iHandle, int dpi)
 | 
			
		|||
      strcat (buffer, " ... \n");
 | 
			
		||||
      len += 6;
 | 
			
		||||
 | 
			
		||||
      DBG (DBG_MSG, buffer);
 | 
			
		||||
      HP5400_DBG (DBG_MSG, buffer);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -896,7 +783,7 @@ Calibrate (int iHandle, int dpi)
 | 
			
		|||
      strcat (buffer, " ... \n");
 | 
			
		||||
      len += 6;
 | 
			
		||||
 | 
			
		||||
      DBG (DBG_MSG, buffer);
 | 
			
		||||
      HP5400_DBG (DBG_MSG, buffer);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -913,15 +800,17 @@ hp5400_scan (int iHandle, TScanParams * params, THWParams * pHWParams,
 | 
			
		|||
  struct ScanResponse res;
 | 
			
		||||
  int result;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "\n");
 | 
			
		||||
  DBG (DBG_MSG, "Scanning :\n");
 | 
			
		||||
  DBG (DBG_MSG, "   dpi(x) : %d\n", params->iDpi);
 | 
			
		||||
  DBG (DBG_MSG, "   dpi(y) : %d\n", params->iLpi);
 | 
			
		||||
  DBG (DBG_MSG, "   x0 : %d\n", params->iLeft);
 | 
			
		||||
  DBG (DBG_MSG, "   y0 : %d\n", params->iTop);
 | 
			
		||||
  DBG (DBG_MSG, "   width : %d\n", params->iWidth);
 | 
			
		||||
  DBG (DBG_MSG, "   height : %d\n", params->iHeight);
 | 
			
		||||
  DBG (DBG_MSG, "\n");
 | 
			
		||||
  pHWParams = pHWParams; /*to avoid compilation warning*/
 | 
			
		||||
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "\n");
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Scanning :\n");
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "   dpi(x) : %d\n", params->iDpi);
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "   dpi(y) : %d\n", params->iLpi);
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "   x0 : %d\n", params->iLeft);
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "   y0 : %d\n", params->iTop);
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "   width : %d\n", params->iWidth);
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "   height : %d\n", params->iHeight);
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "\n");
 | 
			
		||||
 | 
			
		||||
  bzero (&req, sizeof (req));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1018,7 +907,7 @@ InitScanner (int iHandle)
 | 
			
		|||
 | 
			
		||||
  if (hp5400_command_write (iHandle, 0xF10B, sizeof (UISetup1), UISetup1) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "failed to send UISetup1 (%d)\n", sizeof (UISetup1));
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "failed to send UISetup1 (%d)\n", sizeof (UISetup1));
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1027,7 +916,7 @@ InitScanner (int iHandle)
 | 
			
		|||
 | 
			
		||||
  if (hp5400_command_write (iHandle, 0xF10C, sizeof (UISetup2), UISetup2) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "failed to send UISetup2\n");
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "failed to send UISetup2\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
  return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -1070,11 +959,11 @@ InitScan (enum ScanType scantype, TScanParams * pParams,
 | 
			
		|||
    return -1;
 | 
			
		||||
/*  SetDefaultGamma( pHWParams->iXferHandle ); ** Must be done by caller */
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "Calibration complete\n");
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Calibration complete\n");
 | 
			
		||||
  ret =
 | 
			
		||||
    InitScan2 (scantype, &req, pHWParams, &res, pParams->iColourOffset, 0x40);
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "InitScan2 returned %d\n", ret);
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "InitScan2 returned %d\n", ret);
 | 
			
		||||
 | 
			
		||||
  /* Pass the results back to the parent */
 | 
			
		||||
  pParams->iBytesPerLine = htonl (res.xsize);
 | 
			
		||||
| 
						 | 
				
			
			@ -1104,7 +993,7 @@ InitScan2 (enum ScanType scantype, struct ScanRequest *req,
 | 
			
		|||
 | 
			
		||||
  if (scantype != SCAN_TYPE_CALIBRATION)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "Off(%d,%d) : Len(%d,%d)\n", htons (req->offx),
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "Off(%d,%d) : Len(%d,%d)\n", htons (req->offx),
 | 
			
		||||
	   htons (req->offy), htons (req->lenx), htons (req->leny));
 | 
			
		||||
      /* Yes, all the htons() is silly but we want this check as late as possible */
 | 
			
		||||
      if (htons (req->offx) > 0x09F8)
 | 
			
		||||
| 
						 | 
				
			
			@ -1133,7 +1022,7 @@ InitScan2 (enum ScanType scantype, struct ScanRequest *req,
 | 
			
		|||
    if (hp5400_command_write (iHandle, CMD_STOPSCAN, sizeof (flag), &flag) <
 | 
			
		||||
	0)
 | 
			
		||||
      {
 | 
			
		||||
	DBG (DBG_MSG, "failed to cancel scan flag\n");
 | 
			
		||||
	HP5400_DBG (DBG_MSG, "failed to cancel scan flag\n");
 | 
			
		||||
	return -1;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -1142,7 +1031,7 @@ InitScan2 (enum ScanType scantype, struct ScanRequest *req,
 | 
			
		|||
    char data[4] = { 0x02, 0x03, 0x03, 0x3C };
 | 
			
		||||
    if (hp5400_command_write (iHandle, CMD_UNKNOWN3, sizeof (data), data) < 0)
 | 
			
		||||
      {
 | 
			
		||||
	DBG (DBG_MSG, "failed to set unknown1\n");
 | 
			
		||||
	HP5400_DBG (DBG_MSG, "failed to set unknown1\n");
 | 
			
		||||
	return -1;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -1152,7 +1041,7 @@ InitScan2 (enum ScanType scantype, struct ScanRequest *req,
 | 
			
		|||
    if (hp5400_command_write (iHandle, CMD_UNKNOWN2, sizeof (flag), &flag) <
 | 
			
		||||
	0)
 | 
			
		||||
      {
 | 
			
		||||
	DBG (DBG_MSG, "failed to set unknown2\n");
 | 
			
		||||
	HP5400_DBG (DBG_MSG, "failed to set unknown2\n");
 | 
			
		||||
	return -1;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -1161,7 +1050,7 @@ InitScan2 (enum ScanType scantype, struct ScanRequest *req,
 | 
			
		|||
    short dpi = htons (HW_LPI);
 | 
			
		||||
    if (hp5400_command_write (iHandle, CMD_SETDPI, sizeof (dpi), &dpi) < 0)
 | 
			
		||||
      {
 | 
			
		||||
	DBG (DBG_MSG, "failed to set dpi\n");
 | 
			
		||||
	HP5400_DBG (DBG_MSG, "failed to set dpi\n");
 | 
			
		||||
	return -1;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -1176,19 +1065,19 @@ InitScan2 (enum ScanType scantype, struct ScanRequest *req,
 | 
			
		|||
      if (hp5400_command_write
 | 
			
		||||
	  (iHandle, CMD_SETOFFSET, sizeof (offsets), offsets) < 0)
 | 
			
		||||
	{
 | 
			
		||||
	  DBG (DBG_MSG, "failed to set offsets\n");
 | 
			
		||||
	  HP5400_DBG (DBG_MSG, "failed to set offsets\n");
 | 
			
		||||
	  return -1;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "Scan request: \n  ");
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Scan request: \n  ");
 | 
			
		||||
  {
 | 
			
		||||
    int i;
 | 
			
		||||
    size_t i;
 | 
			
		||||
    for (i = 0; i < sizeof (*req); i++)
 | 
			
		||||
      {
 | 
			
		||||
	DBG (DBG_MSG, "%02X ", ((unsigned char *) req)[i]);
 | 
			
		||||
	HP5400_DBG (DBG_MSG, "%02X ", ((unsigned char *) req)[i]);
 | 
			
		||||
      }
 | 
			
		||||
    DBG (DBG_MSG, "\n");
 | 
			
		||||
    HP5400_DBG (DBG_MSG, "\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (hp5400_command_write
 | 
			
		||||
| 
						 | 
				
			
			@ -1197,7 +1086,7 @@ InitScan2 (enum ScanType scantype, struct ScanRequest *req,
 | 
			
		|||
	SCAN_TYPE_CALIBRATION) ? CMD_SCANREQUEST2 : CMD_SCANREQUEST,
 | 
			
		||||
       sizeof (*req), req) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "failed to send scan request\n");
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "failed to send scan request\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1206,35 +1095,35 @@ InitScan2 (enum ScanType scantype, struct ScanRequest *req,
 | 
			
		|||
    if (hp5400_command_write (iHandle, CMD_STARTSCAN, sizeof (flag), &flag) <
 | 
			
		||||
	0)
 | 
			
		||||
      {
 | 
			
		||||
	DBG (DBG_MSG, "failed to set gamma flag\n");
 | 
			
		||||
	HP5400_DBG (DBG_MSG, "failed to set gamma flag\n");
 | 
			
		||||
	return -1;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (hp5400_command_read (iHandle, CMD_SCANRESPONSE, sizeof (res), &res) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "failed to read scan response\n");
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "failed to read scan response\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "Scan response: \n  ");
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Scan response: \n  ");
 | 
			
		||||
  {
 | 
			
		||||
    int i;
 | 
			
		||||
    size_t i;
 | 
			
		||||
    for (i = 0; i < sizeof (res); i++)
 | 
			
		||||
      {
 | 
			
		||||
	DBG (DBG_MSG, "%02X ", ((unsigned char *) &res)[i]);
 | 
			
		||||
	HP5400_DBG (DBG_MSG, "%02X ", ((unsigned char *) &res)[i]);
 | 
			
		||||
      }
 | 
			
		||||
    DBG (DBG_MSG, "\n");
 | 
			
		||||
    HP5400_DBG (DBG_MSG, "\n");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "Bytes to transfer: %d\nBitmap resolution: %d x %d\n",
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Bytes to transfer: %d\nBitmap resolution: %d x %d\n",
 | 
			
		||||
       htonl (res.transfersize), htonl (res.xsize), htons (res.ysize));
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "Proceeding to scan\n");
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Proceeding to scan\n");
 | 
			
		||||
 | 
			
		||||
  if (htonl (res.transfersize) == 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "Hmm, size is zero. Obviously a problem. Aborting...\n");
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "Hmm, size is zero. Obviously a problem. Aborting...\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1248,7 +1137,7 @@ InitScan2 (enum ScanType scantype, struct ScanRequest *req,
 | 
			
		|||
    int planes = (bpp == 1) ? 1 : 3;
 | 
			
		||||
    bpp /= planes;
 | 
			
		||||
 | 
			
		||||
    DBG (DBG_MSG, "bpp = %d / ( (%d * %d) * (%d * %d) / (%d * %d) ) = %d\n",
 | 
			
		||||
    HP5400_DBG (DBG_MSG, "bpp = %d / ( (%d * %d) * (%d * %d) / (%d * %d) ) = %d\n",
 | 
			
		||||
	 htonl (res.transfersize),
 | 
			
		||||
	 htons (req->lenx), htons (req->leny),
 | 
			
		||||
	 htons (req->dpix), htons (req->dpiy), HW_LPI, HW_LPI, bpp);
 | 
			
		||||
| 
						 | 
				
			
			@ -1282,7 +1171,7 @@ FinishScan (THWParams * pHWParams)
 | 
			
		|||
    if (hp5400_command_write (iHandle, CMD_STOPSCAN, sizeof (flag), &flag) <
 | 
			
		||||
	0)
 | 
			
		||||
      {
 | 
			
		||||
	DBG (DBG_MSG, "failed to set gamma flag\n");
 | 
			
		||||
	HP5400_DBG (DBG_MSG, "failed to set gamma flag\n");
 | 
			
		||||
	return;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -1293,10 +1182,11 @@ HP5400Open (THWParams * params, char *filename)
 | 
			
		|||
{
 | 
			
		||||
  int iHandle = hp5400_open (filename);
 | 
			
		||||
  char szVersion[32];
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  if (iHandle < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "hp5400_open failed\n");
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "hp5400_open failed\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1306,10 +1196,15 @@ HP5400Open (THWParams * params, char *filename)
 | 
			
		|||
  if (hp5400_command_read
 | 
			
		||||
      (iHandle, CMD_GETVERSION, sizeof (szVersion), szVersion) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "failed to read version string\n");
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "failed to read version string\n");
 | 
			
		||||
      goto hp5400_close_exit;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	  HP5400_DBG (DBG_MSG, "version String :\n");
 | 
			
		||||
    for (i=0; i < 32; i++) {
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "%c", szVersion[i]);    
 | 
			
		||||
    }
 | 
			
		||||
    HP5400_DBG (DBG_MSG, "\n");
 | 
			
		||||
 | 
			
		||||
#ifndef NO_STRING_VERSION_MATCH
 | 
			
		||||
  /* Match on everything except the version number */
 | 
			
		||||
| 
						 | 
				
			
			@ -1317,15 +1212,15 @@ HP5400Open (THWParams * params, char *filename)
 | 
			
		|||
    {
 | 
			
		||||
      if (memcmp (szVersion + 1, MatchVersion2, sizeof (MatchVersion2) - 4))
 | 
			
		||||
	{
 | 
			
		||||
	  DBG (DBG_MSG,
 | 
			
		||||
	  HP5400_DBG (DBG_MSG,
 | 
			
		||||
	       "Sorry, unknown scanner version. Attempted match on '%s' and '%s'\n",
 | 
			
		||||
	       MatchVersion, MatchVersion2);
 | 
			
		||||
	  DBG (DBG_MSG, "Vesion is '%s'\n", szVersion);
 | 
			
		||||
	  HP5400_DBG (DBG_MSG, "Vesion is '%s'\n", szVersion);
 | 
			
		||||
	  goto hp5400_close_exit;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
  DBG (DBG_MSG, "Warning, Version match is disabled. Version is '%s'\n",
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Warning, Version match is disabled. Version is '%s'\n",
 | 
			
		||||
       szVersion);
 | 
			
		||||
#endif /* NO_STRING_VERSION_MATCH */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1361,7 +1256,7 @@ HP5400Detect (char *filename,
 | 
			
		|||
 | 
			
		||||
  if (iHandle < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "hp5400_open failed\n");
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "hp5400_open failed\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1369,7 +1264,7 @@ HP5400Detect (char *filename,
 | 
			
		|||
  if (hp5400_command_read
 | 
			
		||||
      (iHandle, CMD_GETVERSION, sizeof (szVersion), szVersion) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "failed to read version string\n");
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "failed to read version string\n");
 | 
			
		||||
      ret = -1;
 | 
			
		||||
      goto hp5400_close_exit;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1379,16 +1274,16 @@ HP5400Detect (char *filename,
 | 
			
		|||
    {
 | 
			
		||||
      if (memcmp (szVersion + 1, MatchVersion2, sizeof (MatchVersion2) - 1))
 | 
			
		||||
	{
 | 
			
		||||
	  DBG (DBG_MSG,
 | 
			
		||||
	  HP5400_DBG (DBG_MSG,
 | 
			
		||||
	       "Sorry, unknown scanner version. Attempted match on '%s' and '%s'\n",
 | 
			
		||||
	       MatchVersion, MatchVersion2);
 | 
			
		||||
	  DBG (DBG_MSG, "Vesion is '%s'\n", szVersion);
 | 
			
		||||
	  HP5400_DBG (DBG_MSG, "Vesion is '%s'\n", szVersion);
 | 
			
		||||
	  ret = -1;
 | 
			
		||||
	  goto hp5400_close_exit;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
  DBG (DBG_MSG, "Warning, Version match is disabled. Version is '%s'\n",
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Warning, Version match is disabled. Version is '%s'\n",
 | 
			
		||||
       szVersion);
 | 
			
		||||
#endif /* NO_STRING_VERSION_MATCH */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1409,13 +1304,11 @@ main (int argc, char *argv[])
 | 
			
		|||
  assert (sizeof (struct ScanRequest) == 32);
 | 
			
		||||
  assert (sizeof (struct ScanResponse) == 16);
 | 
			
		||||
 | 
			
		||||
  DBG_MSG = stdout;
 | 
			
		||||
  DBG_ERR = stderr;
 | 
			
		||||
  DBG_ASSERT = stderr;
 | 
			
		||||
  hp5400_dbg_start();
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG,
 | 
			
		||||
  HP5400_DBG (DBG_MSG,
 | 
			
		||||
       "HP5400/5470C sample scan utility, by Martijn van Oosterhout <kleptog@svana.org>\n");
 | 
			
		||||
  DBG (DBG_MSG,
 | 
			
		||||
  HP5400_DBG (DBG_MSG,
 | 
			
		||||
       "Based on the testutils by Bertrik Sikken (bertrik@zonnet.nl)\n");
 | 
			
		||||
 | 
			
		||||
  if ((argc == 6) && (!strcmp (argv[1], "-decode")))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,235 @@
 | 
			
		|||
#ifndef _HP5400_INTERNAL_H_
 | 
			
		||||
#define _HP5400_INTERNAL_H_
 | 
			
		||||
 | 
			
		||||
/* sane - Scanner Access Now Easy.
 | 
			
		||||
   (C) 2003 Thomas Soumarmon <thomas.soumarmon@cogitae.net>
 | 
			
		||||
   (c) 2003 Martijn van Oosterhout, kleptog@svana.org
 | 
			
		||||
   (c) 2002 Bertrik Sikken, bertrik@zonnet.nl
 | 
			
		||||
 | 
			
		||||
   This file is part of the SANE package.
 | 
			
		||||
 | 
			
		||||
   This program 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.
 | 
			
		||||
 | 
			
		||||
   This program 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 this program; if not, write to the Free Software
 | 
			
		||||
   Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 | 
			
		||||
   MA 02111-1307, USA.
 | 
			
		||||
 | 
			
		||||
   As a special exception, the authors of SANE give permission for
 | 
			
		||||
   additional uses of the libraries contained in this release of SANE.
 | 
			
		||||
 | 
			
		||||
   The exception is that, if you link a SANE library with other files
 | 
			
		||||
   to produce an executable, this does not by itself cause the
 | 
			
		||||
   resulting executable to be covered by the GNU General Public
 | 
			
		||||
   License.  Your use of that executable is in no way restricted on
 | 
			
		||||
   account of linking the SANE library code into it.
 | 
			
		||||
 | 
			
		||||
   This exception does not, however, invalidate any other reasons why
 | 
			
		||||
   the executable file might be covered by the GNU General Public
 | 
			
		||||
   License.
 | 
			
		||||
 | 
			
		||||
   If you submit changes to SANE to the maintainers to be included in
 | 
			
		||||
   a subsequent release, you agree by submitting the changes that
 | 
			
		||||
   those changes may be distributed with this exception intact.
 | 
			
		||||
 | 
			
		||||
   If you write modifications of your own for SANE, it is your choice
 | 
			
		||||
   whether to permit this exception to apply to your modifications.
 | 
			
		||||
   If you do not wish that, delete this exception notice.
 | 
			
		||||
 | 
			
		||||
   HP5400/5470 Test util.
 | 
			
		||||
   Currently is only able to read back the scanner version string,
 | 
			
		||||
   but this basically demonstrates ability to communicate with the scanner.
 | 
			
		||||
 | 
			
		||||
   Massively expanded. Can do calibration scan, upload gamma and calibration
 | 
			
		||||
   tables and stores the results of a scan. - 19/02/2003 Martijn
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
#define PACKED __attribute__ ((packed))
 | 
			
		||||
#else
 | 
			
		||||
#define PACKED
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* If this is enabled, a copy of the raw data from the scanner will be saved to
 | 
			
		||||
   imagedebug.dat and the attempted conversion to imagedebug.ppm */
 | 
			
		||||
/* #define IMAGE_DEBUG */
 | 
			
		||||
 | 
			
		||||
/* If this is defined you get extra info on the calibration */
 | 
			
		||||
/* #define CALIB_DEBUG */
 | 
			
		||||
 | 
			
		||||
#define CMD_GETVERSION   0x1200
 | 
			
		||||
#define CMD_GETUITEXT    0xf00b
 | 
			
		||||
#define CMD_GETCMDID     0xc500
 | 
			
		||||
#define CMD_SCANREQUEST  0x2505	/* This is for previews */
 | 
			
		||||
#define CMD_SCANREQUEST2 0x2500	/* This is for real scans */
 | 
			
		||||
#define CMD_SCANRESPONSE 0x3400
 | 
			
		||||
 | 
			
		||||
/* Testing stuff to make it work */
 | 
			
		||||
#define CMD_SETDPI       0x1500	/* ??? */
 | 
			
		||||
#define CMD_STOPSCAN     0x1B01	/* 0x40 = lamp in on, 0x00 = lamp is off */
 | 
			
		||||
#define CMD_STARTSCAN    0x1B05	/* 0x40 = lamp in on, 0x00 = lamp is off */
 | 
			
		||||
#define CMD_UNKNOWN      0x2300	/* Send fixed string */
 | 
			
		||||
#define CMD_UNKNOWN2     0xD600	/* ??? Set to 0x04 */
 | 
			
		||||
#define CMD_UNKNOWN3     0xC000	/* ??? Set to 02 03 03 3C */
 | 
			
		||||
#define CMD_SETOFFSET    0xE700	/* two ints in network order. X-offset, Y-offset of full scan */
 | 
			
		||||
				  /* Given values seem to be 0x0054 (=4.57mm) and 0x0282 (=54.36mm) */
 | 
			
		||||
 | 
			
		||||
#define CMD_INITBULK1   0x0087	/* send 0x14 */
 | 
			
		||||
#define CMD_INITBULK2   0x0083	/* send 0x24 */
 | 
			
		||||
#define CMD_INITBULK3   0x0082	/* transfer length 0xf000 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct ScanRequest
 | 
			
		||||
{
 | 
			
		||||
  u_int8_t x1;			/* Set to 0x08 */
 | 
			
		||||
  u_int16_t dpix, dpiy;		/* Set to 75, 150 or 300 in network order */
 | 
			
		||||
  u_int16_t offx, offy;		/* Offset to scan, in 1/300th of dpi, in network order */
 | 
			
		||||
  u_int16_t lenx, leny;		/* Size of scan, in 1/300th of dpi, in network order */
 | 
			
		||||
  u_int16_t flags1, flags2, flags3;	/* Undetermined flag info */
 | 
			
		||||
  /* Known combinations are:
 | 
			
		||||
     1st calibration scan: 0x0000, 0x0010, 0x1820  =  24bpp
 | 
			
		||||
     2nd calibration scan: 0x0000, 0x0010, 0x3020  =  48bpp ???
 | 
			
		||||
     3rd calibration scan: 0x0000, 0x0010, 0x3024  =  48bpp ???
 | 
			
		||||
     Preview scan:         0x0080, 0x0000, 0x18E8  =   8bpp
 | 
			
		||||
     4th & 5th like 2nd and 3rd
 | 
			
		||||
     B&W scan:             0x0080, 0x0040, 0x08E8  =   8bpp
 | 
			
		||||
     6th & 7th like 2nd and 3rd
 | 
			
		||||
     True colour scan      0x0080, 0x0040, 0x18E8  =  24bpp
 | 
			
		||||
   */
 | 
			
		||||
  u_int8_t zero;			/* Seems to always be zero */
 | 
			
		||||
  u_int16_t gamma[3];		/* Set to 100 in network order. Gamma? */
 | 
			
		||||
  u_int16_t pad[3];		/* Zero padding ot 32 bytes??? */
 | 
			
		||||
}
 | 
			
		||||
PACKED;
 | 
			
		||||
 | 
			
		||||
     /* More known combos (All 24-bit):
 | 
			
		||||
        300 x  300 light calibration: 0x0000, 0x0010, 0x1820
 | 
			
		||||
        300 x  300 dark calibration:  0x0000, 0x0010, 0x3024
 | 
			
		||||
        75 x   75 preview scan:      0x0080, 0x0000, 0x18E8
 | 
			
		||||
        300 x  300 full scan:         0x0080, 0x0000, 0x18E8
 | 
			
		||||
        600 x  300 light calibration: 0x0000, 0x0010, 0x3000
 | 
			
		||||
        600 x  300 dark calibration:  0x0000, 0x0010, 0x3004
 | 
			
		||||
        600 x  600 full scan:         0x0080, 0x0000, 0x18C8
 | 
			
		||||
        1200 x  300 light calibration: 0x0000, 0x0010, 0x3000
 | 
			
		||||
        1200 x  300 dark calibration:  0x0000, 0x0010, 0x3004
 | 
			
		||||
        1200 x 1200 full scan:         0x0080, 0x0000, 0x18C8
 | 
			
		||||
        2400 x  300 light calibration: 0x0000, 0x0010, 0x3000
 | 
			
		||||
        2400 x  300 dark calibration:  0x0000, 0x0010, 0x3004
 | 
			
		||||
        2400 x 2400 full scan:         0x0080, 0x0000, 0x18C0
 | 
			
		||||
      */
 | 
			
		||||
 | 
			
		||||
struct ScanResponse
 | 
			
		||||
{
 | 
			
		||||
  u_int16_t x1;			/* Usually 0x0000 or 0x4000 */
 | 
			
		||||
  u_int32_t transfersize;	/* Number of bytes to be transferred */
 | 
			
		||||
  u_int32_t xsize;		/* Shape of returned bitmap */
 | 
			
		||||
  u_int16_t ysize;		/*   Why does the X get more bytes? */
 | 
			
		||||
  u_int16_t pad[2];		/* Zero padding to 16 bytes??? */
 | 
			
		||||
}
 | 
			
		||||
PACKED;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
InitScan2 (enum ScanType type, struct ScanRequest *req,
 | 
			
		||||
		      THWParams * pHWParams, struct ScanResponse *res,
 | 
			
		||||
		      int iColourOffset, int code);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
FinishScan (THWParams * pHWParams);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
WriteByte (int iHandle, int cmd, char data);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
SetLamp (THWParams * pHWParams, int fLampOn);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
WarmupLamp (int iHandle);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
SetCalibration (int iHandle, int numPixels,
 | 
			
		||||
			   unsigned int *low_vals[3],
 | 
			
		||||
			   unsigned int *high_vals[3], int dpi);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
WriteGammaCalibTable (int iHandle, const int *pabGammaR,
 | 
			
		||||
				  const int *pabGammaG,
 | 
			
		||||
				  const int *pabGammaB);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
SetDefaultGamma (int iHandle);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
CircBufferInit (int iHandle, TDataPipe * p, int iBytesPerLine,
 | 
			
		||||
			    int bpp, int iMisAlignment, int blksize,
 | 
			
		||||
			    int iTransferSize);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
CircBufferGetLine (int iHandle, TDataPipe * p, void *pabLine);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
CircBufferExit (TDataPipe * p);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
DecodeImage (FILE * file, int planes, int bpp, int xsize, int ysize,
 | 
			
		||||
			 const char *filename);
 | 
			
		||||
int
 | 
			
		||||
hp5400_test_scan_response (struct ScanResponse *resp,
 | 
			
		||||
				      struct ScanRequest *req);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
DoAverageScan (int iHandle, struct ScanRequest *req, int code,
 | 
			
		||||
			  unsigned int **array);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
DoScan (int iHandle, struct ScanRequest *req, const char *filename, int code,
 | 
			
		||||
		   struct ScanResponse *res);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
Calibrate (int iHandle, int dpi);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
hp5400_scan (int iHandle, TScanParams * params, THWParams * pHWParams,
 | 
			
		||||
			const char *filename);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
PreviewScan (int iHandle);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
InitScanner (int iHandle);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
InitScan (enum ScanType scantype, TScanParams * pParams,
 | 
			
		||||
		     THWParams * pHWParams);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
FinishScan (THWParams * pHWParams);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
HP5400Open (THWParams * params, char *filename);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
HP5400Close (THWParams * params);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
HP5400Detect (char *filename,
 | 
			
		||||
			 int (*_ReportDevice) (TScannerModel * pModel,
 | 
			
		||||
					       char *pszDeviceName));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef STANDALONE
 | 
			
		||||
int
 | 
			
		||||
main (int argc, char *argv[]);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
										
											
												Plik diff jest za duży
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -1,24 +1,27 @@
 | 
			
		|||
/* sane - Scanner Access Now Easy.
 | 
			
		||||
   (c) 2003 Henning Meier-Geinitz, <henning@meier-geinitz.de>
 | 
			
		||||
   (c) 2003 Martijn van Oosterhout, kleptog@svana.org
 | 
			
		||||
   (c) 2002 Bertrik Sikken, bertrik@zonnet.nl
 | 
			
		||||
   Copyright (C) 2003 Martijn van Oosterhout <kleptog@svana.org>
 | 
			
		||||
   Copyright (C) 2003 Thomas Soumarmon <thomas.soumarmon@cogitae.net>
 | 
			
		||||
   Copyright (c) 2003 Henning Meier-Geinitz, <henning@meier-geinitz.de>
 | 
			
		||||
 | 
			
		||||
   Originally copied from HP3300 testtools. Original notice follows:
 | 
			
		||||
 | 
			
		||||
   Copyright (C) 2001 Bertrik Sikken (bertrik@zonnet.nl)
 | 
			
		||||
 | 
			
		||||
   This file is part of the SANE package.
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
   This program 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.
 | 
			
		||||
   
 | 
			
		||||
   This program 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.
 | 
			
		||||
  
 | 
			
		||||
   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.
 | 
			
		||||
 | 
			
		||||
   This program 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 this program; if not, write to the Free Software
 | 
			
		||||
   Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 | 
			
		||||
   MA 02111-1307, USA.
 | 
			
		||||
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
			
		||||
 | 
			
		||||
   As a special exception, the authors of SANE give permission for
 | 
			
		||||
   additional uses of the libraries contained in this release of SANE.
 | 
			
		||||
| 
						 | 
				
			
			@ -44,15 +47,16 @@
 | 
			
		|||
   Transport layer for communication with HP5400/5470 scanner.
 | 
			
		||||
 | 
			
		||||
   Implementation using sanei_usb
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
   Additions to support bulk data transport. Added debugging info - 19/02/2003 Martijn
 | 
			
		||||
   Changed to use sanei_usb instead of direct /dev/usb/scanner access - 15/04/2003 Henning
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "hp5400_xfer.h"
 | 
			
		||||
#include "hp5400_debug.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include "../include/sane/sanei_usb.h"
 | 
			
		||||
#include "sane/sanei_usb.h"
 | 
			
		||||
 | 
			
		||||
#define CMD_INITBULK1   0x0087	/* send 0x14 */
 | 
			
		||||
#define CMD_INITBULK2   0x0083	/* send 0x24 */
 | 
			
		||||
| 
						 | 
				
			
			@ -66,19 +70,19 @@ _UsbWriteControl (int fd, int iValue, int iIndex, void *pabData, int iSize)
 | 
			
		|||
  int requesttype = USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT;
 | 
			
		||||
  int request = (iSize > 1) ? 0x04 : 0x0C;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG,
 | 
			
		||||
  HP5400_DBG (DBG_MSG,
 | 
			
		||||
       "Write: reqtype = 0x%02X, req = 0x%02X, value = %04X, len = %d\n",
 | 
			
		||||
       requesttype, request, iValue, iSize);
 | 
			
		||||
 | 
			
		||||
  if (iSize > 0)
 | 
			
		||||
    {
 | 
			
		||||
      int i;
 | 
			
		||||
      DBG (DBG_MSG, "  Data: ");
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "  Data: ");
 | 
			
		||||
      for (i = 0; i < iSize && i < 8; i++)
 | 
			
		||||
	DBG (DBG_MSG, "%02X ", ((unsigned char *) pabData)[i]);
 | 
			
		||||
	HP5400_DBG (DBG_MSG, "%02X ", ((unsigned char *) pabData)[i]);
 | 
			
		||||
      if (iSize > 8)
 | 
			
		||||
	DBG (DBG_MSG, "...");
 | 
			
		||||
      DBG (DBG_MSG, "\n");
 | 
			
		||||
	HP5400_DBG (DBG_MSG, "...");
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "\n");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (fd != -1)
 | 
			
		||||
| 
						 | 
				
			
			@ -102,7 +106,7 @@ _UsbReadControl (int fd, int iValue, int iIndex, void *pabData, int iSize)
 | 
			
		|||
  int requesttype = USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN;
 | 
			
		||||
  int request = (iSize > 1) ? 0x04 : 0x0C;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "Read: reqtype = 0x%02X, req = 0x%02X, value = %04X\n",
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Read: reqtype = 0x%02X, req = 0x%02X, value = %04X\n",
 | 
			
		||||
       requesttype, request, iValue);
 | 
			
		||||
 | 
			
		||||
  if (fd != -1)
 | 
			
		||||
| 
						 | 
				
			
			@ -125,7 +129,7 @@ hp5400_open (const char *filename)
 | 
			
		|||
  status = sanei_usb_open (filename, &fd);
 | 
			
		||||
  if (status != SANE_STATUS_GOOD)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "hp5400_open: open returned %s\n", 
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "hp5400_open: open returned %s\n",
 | 
			
		||||
	   sane_strstatus (status));
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -133,7 +137,7 @@ hp5400_open (const char *filename)
 | 
			
		|||
  status = sanei_usb_get_vendor_product (fd, &iVendor, &iProduct);
 | 
			
		||||
  if (status != SANE_STATUS_GOOD)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "hp5400_open: can't get vendor/product ids: %s\n", 
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "hp5400_open: can't get vendor/product ids: %s\n",
 | 
			
		||||
	   sane_strstatus (status));
 | 
			
		||||
      sanei_usb_close (fd);
 | 
			
		||||
      return -1;
 | 
			
		||||
| 
						 | 
				
			
			@ -141,13 +145,13 @@ hp5400_open (const char *filename)
 | 
			
		|||
 | 
			
		||||
  if ((iVendor != 0x03F0) || ((iProduct != 0x1005) && (iProduct != 0x1105)))
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_MSG, "hp5400_open: vendor/product 0x%04X-0x%04X is not "
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "hp5400_open: vendor/product 0x%04X-0x%04X is not "
 | 
			
		||||
	   "supported\n", iVendor, iProduct);
 | 
			
		||||
      sanei_usb_close (fd);
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "vendor/product 0x%04X-0x%04X opened\n", iVendor, iProduct);
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "vendor/product 0x%04X-0x%04X opened\n", iVendor, iProduct);
 | 
			
		||||
 | 
			
		||||
  return fd;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -169,7 +173,7 @@ hp5400_command_verify (int iHandle, int iCmd)
 | 
			
		|||
 | 
			
		||||
  if (iHandle < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "hp5400_command_verify: invalid handle\n");
 | 
			
		||||
      HP5400_DBG (DBG_ERR, "hp5400_command_verify: invalid handle\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
  fd = iHandle;
 | 
			
		||||
| 
						 | 
				
			
			@ -179,7 +183,7 @@ hp5400_command_verify (int iHandle, int iCmd)
 | 
			
		|||
 | 
			
		||||
  if (abData[0] != (iCmd >> 8))
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR,
 | 
			
		||||
      HP5400_DBG (DBG_ERR,
 | 
			
		||||
	   "hp5400_command_verify failed, expected 0x%02X%02X, got 0x%02X%02X\n",
 | 
			
		||||
	   (int) (iCmd >> 8), (int) (iCmd & 0xff), (int) abData[0],
 | 
			
		||||
	   (int) abData[1]);
 | 
			
		||||
| 
						 | 
				
			
			@ -190,13 +194,13 @@ hp5400_command_verify (int iHandle, int iCmd)
 | 
			
		|||
  if (abData[1] != 0)		/* Error code non-zero */
 | 
			
		||||
    {
 | 
			
		||||
      _UsbReadControl (fd, 0x0300, 0, (char *) abData, 3);
 | 
			
		||||
      DBG (DBG_ERR, "  error response is: %02X %02X %02X\n", abData[0],
 | 
			
		||||
      HP5400_DBG (DBG_ERR, "  error response is: %02X %02X %02X\n", abData[0],
 | 
			
		||||
	   abData[1], abData[2]);
 | 
			
		||||
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "Command %02X verified\n", abData[0]);
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Command %02X verified\n", abData[0]);
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -209,7 +213,7 @@ hp5400_command_read_noverify (int iHandle, int iCmd, int iLen, void *pbData)
 | 
			
		|||
 | 
			
		||||
  if (iHandle < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "hp5400_command_read: invalid handle\n");
 | 
			
		||||
      HP5400_DBG (DBG_ERR, "hp5400_command_read: invalid handle\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
  fd = iHandle;
 | 
			
		||||
| 
						 | 
				
			
			@ -237,7 +241,7 @@ hp5400_command_write (int iHandle, int iCmd, int iLen, void *pbData)
 | 
			
		|||
 | 
			
		||||
  if (iHandle < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "hp5400_command_write: invalid handle\n");
 | 
			
		||||
      HP5400_DBG (DBG_ERR, "hp5400_command_write: invalid handle\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
  fd = iHandle;
 | 
			
		||||
| 
						 | 
				
			
			@ -261,12 +265,12 @@ hp5400_bulk_read (int iHandle, int len, int block, FILE * file)
 | 
			
		|||
 | 
			
		||||
  if (iHandle < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "hp5400_command_read: invalid handle\n");
 | 
			
		||||
      HP5400_DBG (DBG_ERR, "hp5400_command_read: invalid handle\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
  fd = iHandle;
 | 
			
		||||
 | 
			
		||||
  buffer = malloc (block);
 | 
			
		||||
  buffer = (unsigned char*) malloc (block);
 | 
			
		||||
 | 
			
		||||
  _UsbWriteControl (fd, CMD_INITBULK1, 0, &x1, 1);
 | 
			
		||||
  _UsbWriteControl (fd, CMD_INITBULK2, 0, &x2, 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -277,7 +281,7 @@ hp5400_bulk_read (int iHandle, int len, int block, FILE * file)
 | 
			
		|||
			sizeof (buf));
 | 
			
		||||
      res = block;
 | 
			
		||||
      sanei_usb_read_bulk (fd, buffer, &res);
 | 
			
		||||
      DBG (DBG_MSG, "Read bulk returned %d, %d remain\n", res, len);
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "Read bulk returned %d, %d remain\n", res, len);
 | 
			
		||||
      if (res > 0)
 | 
			
		||||
	{
 | 
			
		||||
	  fwrite (buffer, (len < res) ? len : res, 1, file);
 | 
			
		||||
| 
						 | 
				
			
			@ -298,7 +302,7 @@ hp5400_bulk_read_block (int iHandle, int iCmd, void *cmd, int cmdlen,
 | 
			
		|||
 | 
			
		||||
  if (iHandle < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "hp5400_command_write: invalid handle\n");
 | 
			
		||||
      HP5400_DBG (DBG_ERR, "hp5400_command_read_block: invalid handle\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
  fd = iHandle;
 | 
			
		||||
| 
						 | 
				
			
			@ -306,7 +310,7 @@ hp5400_bulk_read_block (int iHandle, int iCmd, void *cmd, int cmdlen,
 | 
			
		|||
  _UsbWriteControl (fd, iCmd, 0, cmd, cmdlen);
 | 
			
		||||
  res = len;
 | 
			
		||||
  sanei_usb_read_bulk (fd, buffer, &res);
 | 
			
		||||
  DBG (DBG_MSG, "Read block returned %d when reading %d\n", res, len);
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "Read block returned %d when reading %d\n", res, len);
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -320,12 +324,12 @@ hp5400_bulk_command_write (int iHandle, int iCmd, void *cmd, int cmdlen,
 | 
			
		|||
 | 
			
		||||
  if (iHandle < 0)
 | 
			
		||||
    {
 | 
			
		||||
      DBG (DBG_ERR, "hp5400_command_write: invalid handle\n");
 | 
			
		||||
      HP5400_DBG (DBG_ERR, "hp5400_bulk_command_write: invalid handle\n");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
  fd = iHandle;
 | 
			
		||||
 | 
			
		||||
  DBG (DBG_MSG, "bulk_command_write(%04X,<%d bytes>,<%d bytes>)\n", iCmd,
 | 
			
		||||
  HP5400_DBG (DBG_MSG, "bulk_command_write(%04X,<%d bytes>,<%d bytes>)\n", iCmd,
 | 
			
		||||
       cmdlen, datalen);
 | 
			
		||||
 | 
			
		||||
  _UsbWriteControl (fd, iCmd, 0, cmd, cmdlen);
 | 
			
		||||
| 
						 | 
				
			
			@ -334,16 +338,16 @@ hp5400_bulk_command_write (int iHandle, int iCmd, void *cmd, int cmdlen,
 | 
			
		|||
    {
 | 
			
		||||
      {
 | 
			
		||||
	int i;
 | 
			
		||||
	DBG (DBG_MSG, "  Data: ");
 | 
			
		||||
	HP5400_DBG (DBG_MSG, "  Data: ");
 | 
			
		||||
	for (i = 0; i < datalen && i < block && i < 8; i++)
 | 
			
		||||
	  DBG (DBG_MSG, "%02X ", ((unsigned char *) data + offset)[i]);
 | 
			
		||||
	  HP5400_DBG (DBG_MSG, "%02X ", ((unsigned char *) data + offset)[i]);
 | 
			
		||||
	if (i >= 8)
 | 
			
		||||
	  DBG (DBG_MSG, "...");
 | 
			
		||||
	DBG (DBG_MSG, "\n");
 | 
			
		||||
	  HP5400_DBG (DBG_MSG, "...");
 | 
			
		||||
	HP5400_DBG (DBG_MSG, "\n");
 | 
			
		||||
      }
 | 
			
		||||
      res = (datalen < block) ? datalen : block;
 | 
			
		||||
      sanei_usb_write_bulk (fd, data + offset, &res);
 | 
			
		||||
      DBG (DBG_MSG, "Write returned %d, %d remain\n", res, datalen);
 | 
			
		||||
      HP5400_DBG (DBG_MSG, "Write returned %d, %d remain\n", res, datalen);
 | 
			
		||||
      datalen -= block;
 | 
			
		||||
      offset += block;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,106 @@
 | 
			
		|||
#ifndef _HP5400_SANEI_H_
 | 
			
		||||
#define _HP5400_SANEI_H_
 | 
			
		||||
 | 
			
		||||
/* sane - Scanner Access Now Easy.
 | 
			
		||||
   Copyright (C) 2003 Martijn van Oosterhout <kleptog@svana.org>
 | 
			
		||||
   Copyright (C) 2003 Thomas Soumarmon <thomas.soumarmon@cogitae.net>
 | 
			
		||||
   Copyright (c) 2003 Henning Meier-Geinitz, <henning@meier-geinitz.de>
 | 
			
		||||
 | 
			
		||||
   Originally copied from HP3300 testtools. Original notice follows:
 | 
			
		||||
 | 
			
		||||
   Copyright (C) 2001 Bertrik Sikken (bertrik@zonnet.nl)
 | 
			
		||||
 | 
			
		||||
   This file is part of the SANE package.
 | 
			
		||||
 | 
			
		||||
   This program 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.
 | 
			
		||||
 | 
			
		||||
   This program 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 this program; if not, write to the Free Software
 | 
			
		||||
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
			
		||||
 | 
			
		||||
   As a special exception, the authors of SANE give permission for
 | 
			
		||||
   additional uses of the libraries contained in this release of SANE.
 | 
			
		||||
 | 
			
		||||
   The exception is that, if you link a SANE library with other files
 | 
			
		||||
   to produce an executable, this does not by itself cause the
 | 
			
		||||
   resulting executable to be covered by the GNU General Public
 | 
			
		||||
   License.  Your use of that executable is in no way restricted on
 | 
			
		||||
   account of linking the SANE library code into it.
 | 
			
		||||
 | 
			
		||||
   This exception does not, however, invalidate any other reasons why
 | 
			
		||||
   the executable file might be covered by the GNU General Public
 | 
			
		||||
   License.
 | 
			
		||||
 | 
			
		||||
   If you submit changes to SANE to the maintainers to be included in
 | 
			
		||||
   a subsequent release, you agree by submitting the changes that
 | 
			
		||||
   those changes may be distributed with this exception intact.
 | 
			
		||||
 | 
			
		||||
   If you write modifications of your own for SANE, it is your choice
 | 
			
		||||
   whether to permit this exception to apply to your modifications.
 | 
			
		||||
   If you do not wish that, delete this exception notice.
 | 
			
		||||
 | 
			
		||||
   Transport layer for communication with HP5400/5470 scanner.
 | 
			
		||||
 | 
			
		||||
   Implementation using sanei_usb
 | 
			
		||||
 | 
			
		||||
   Additions to support bulk data transport. Added debugging info - 19/02/2003 Martijn
 | 
			
		||||
   Changed to use sanei_usb instead of direct /dev/usb/scanner access - 15/04/2003 Henning
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define CMD_INITBULK1   0x0087	/* send 0x14 */
 | 
			
		||||
#define CMD_INITBULK2   0x0083	/* send 0x24 */
 | 
			
		||||
#define CMD_INITBULK3   0x0082	/* transfer length 0xf000 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void _UsbWriteControl (int fd, int iValue, int iIndex, void *pabData, int iSize);
 | 
			
		||||
 | 
			
		||||
void hp5400_command_write_noverify (int fd, int iValue, void *pabData, int iSize);
 | 
			
		||||
 | 
			
		||||
void _UsbReadControl (int fd, int iValue, int iIndex, void *pabData, int iSize);
 | 
			
		||||
 | 
			
		||||
int hp5400_open (const char *filename);
 | 
			
		||||
 | 
			
		||||
void hp5400_close (int iHandle);
 | 
			
		||||
 | 
			
		||||
/* returns value > 0 if verify ok */
 | 
			
		||||
int hp5400_command_verify (int iHandle, int iCmd);
 | 
			
		||||
 | 
			
		||||
/* returns > 0 if command OK */
 | 
			
		||||
int hp5400_command_read_noverify (int iHandle, int iCmd, int iLen, void *pbData);
 | 
			
		||||
 | 
			
		||||
/* returns > 0 if command OK */
 | 
			
		||||
int hp5400_command_read (int iHandle, int iCmd, int iLen, void *pbData);
 | 
			
		||||
 | 
			
		||||
/* returns >0 if command OK */
 | 
			
		||||
int hp5400_command_write (int iHandle, int iCmd, int iLen, void *pbData);
 | 
			
		||||
 | 
			
		||||
/* returns >0 if command OK */
 | 
			
		||||
int hp5400_bulk_read (int iHandle, int len, int block, FILE * file);
 | 
			
		||||
 | 
			
		||||
/* returns >0 if command OK */
 | 
			
		||||
int hp5400_bulk_read_block (int iHandle, int iCmd, void *cmd, int cmdlen,
 | 
			
		||||
			void *buffer, int len);
 | 
			
		||||
 | 
			
		||||
/* returns >0 if command OK */
 | 
			
		||||
int hp5400_bulk_command_write (int iHandle, int iCmd, void *cmd, int cmdlen,
 | 
			
		||||
			   int datalen, int block, char *data);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  ScannerIsOn
 | 
			
		||||
    retrieve on/off status from scanner
 | 
			
		||||
    @return 1 if is on 0 if is off -1 if is not reachable
 | 
			
		||||
*/
 | 
			
		||||
int hp5400_isOn (int iHandle);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,23 +1,29 @@
 | 
			
		|||
#ifndef _HP5400_XFER_H_
 | 
			
		||||
#define _HP5400_XFER_H_
 | 
			
		||||
 | 
			
		||||
/* sane - Scanner Access Now Easy.
 | 
			
		||||
   (c) 2003 Martijn van Oosterhout, kleptog@svana.org
 | 
			
		||||
   (c) 2002 Bertrik Sikken, bertrik@zonnet.nl
 | 
			
		||||
   Copyright (C) 2003 Martijn van Oosterhout <kleptog@svana.org>
 | 
			
		||||
   Copyright (C) 2003 Thomas Soumarmon <thomas.soumarmon@cogitae.net>
 | 
			
		||||
 | 
			
		||||
   Originally copied from HP3300 testtools. Original notice follows:
 | 
			
		||||
 | 
			
		||||
   Copyright (C) 2001 Bertrik Sikken (bertrik@zonnet.nl)
 | 
			
		||||
 | 
			
		||||
   This file is part of the SANE package.
 | 
			
		||||
 | 
			
		||||
   This program 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.
 | 
			
		||||
   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.
 | 
			
		||||
 | 
			
		||||
   This program 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.
 | 
			
		||||
   This program 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 this program; if not, write to the Free Software
 | 
			
		||||
   Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 | 
			
		||||
   MA 02111-1307, USA.
 | 
			
		||||
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
			
		||||
 | 
			
		||||
   As a special exception, the authors of SANE give permission for
 | 
			
		||||
   additional uses of the libraries contained in this release of SANE.
 | 
			
		||||
| 
						 | 
				
			
			@ -45,19 +51,23 @@
 | 
			
		|||
   Add support for bulk transport of data - 19/02/2003 Martijn
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
static int hp5400_open (const char *filename);
 | 
			
		||||
static void hp5400_close (int iHandle);
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
static int hp5400_command_verify (int iHandle, int iCmd);
 | 
			
		||||
static int hp5400_command_read (int iHandle, int iCmd, int iLen, void *pbData);
 | 
			
		||||
static int hp5400_command_read_noverify (int iHandle, int iCmd, int iLen,
 | 
			
		||||
int hp5400_open (const char *filename);
 | 
			
		||||
void hp5400_close (int iHandle);
 | 
			
		||||
 | 
			
		||||
int hp5400_command_verify (int iHandle, int iCmd);
 | 
			
		||||
int hp5400_command_read (int iHandle, int iCmd, int iLen, void *pbData);
 | 
			
		||||
int hp5400_command_read_noverify (int iHandle, int iCmd, int iLen,
 | 
			
		||||
					 void *pbData);
 | 
			
		||||
static int hp5400_command_write (int iHandle, int iCmd, int iLen, void *pbData);
 | 
			
		||||
static void hp5400_command_write_noverify (int fd, int iValue, void *pabData,
 | 
			
		||||
int hp5400_command_write (int iHandle, int iCmd, int iLen, void *pbData);
 | 
			
		||||
void hp5400_command_write_noverify (int fd, int iValue, void *pabData,
 | 
			
		||||
					   int iSize);
 | 
			
		||||
static int hp5400_bulk_read (int iHandle, int size, int block, FILE * file);
 | 
			
		||||
static int hp5400_bulk_read_block (int iHandle, int iCmd, void *cmd, int cmdlen,
 | 
			
		||||
int hp5400_bulk_read (int iHandle, int size, int block, FILE * file);
 | 
			
		||||
int hp5400_bulk_read_block (int iHandle, int iCmd, void *cmd, int cmdlen,
 | 
			
		||||
				   void *buffer, int len);
 | 
			
		||||
static int hp5400_bulk_command_write (int iHandle, int iCmd, void *cmd, int cmdlen,
 | 
			
		||||
int hp5400_bulk_command_write (int iHandle, int iCmd, void *cmd, int cmdlen,
 | 
			
		||||
				      int len, int block, char *data);
 | 
			
		||||
static int hp5400_isOn (int iHandle);
 | 
			
		||||
int hp5400_isOn (int iHandle);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue