kopia lustrzana https://gitlab.com/sane-project/backends
				
				
				
			Added support for Mustek Paragon 600 II EP (SCSI-over-parallel port). This is
based on a patch from James Perry. Support for libiee1284 is missing until now. Closes bug #300143.merge-requests/1/head
							rodzic
							
								
									234f24f694
								
							
						
					
					
						commit
						08486e6be4
					
				|  | @ -3,6 +3,14 @@ | |||
| 	* doc/descriptions-external/niash.desc: Added information that | ||||
| 	  this backend will be included soon. Fixed "Snapscan" to | ||||
| 	  "SnapScan" (bug #300394). | ||||
| 	* backend/mustek_scsi_pp.c backend/mustek_scsi_pp.h | ||||
| 	  backend/Makefile.in  backend/mustek.c | ||||
| 	  backend/mustek.conf backend/mustek.h doc/sane-mustek.man | ||||
| 	  doc/sane.man doc/descriptions/mustek.desc | ||||
| 	  include/sane/sanei_pa4s2.h sanei/sanei_pa4s2.c: Added support | ||||
| 	  for Mustek Paragon 600 II EP (SCSI-over-parallel port). This is | ||||
| 	  based on a patch from James Perry. Support for libiee1284 is | ||||
| 	  missing until now. Closes bug #300143. | ||||
| 
 | ||||
| 2003-12-23  Henning Meier-Geinitz <henning@meier-geinitz.de> | ||||
| 
 | ||||
|  |  | |||
|  | @ -115,7 +115,7 @@ DISTFILES = abaton.c abaton.conf abaton.h agfafocus.c agfafocus.conf \ | |||
|   microtek.c microtek.conf microtek.h mustek.c mustek.conf mustek.h \
 | ||||
|   mustek_pp.c mustek_pp.conf mustek_pp.h mustek_pp_cis.c mustek_pp_cis.h \
 | ||||
|   mustek_pp_decl.h mustek_pp_drivers.h mustek_pp_null.c mustek_pp_ccd300.c \
 | ||||
|   mustek_pp_ccd300.h mustek_usb.c mustek_usb.conf \
 | ||||
|   mustek_pp_ccd300.h mustek_scsi_pp.c mustek_scsi_pp.h mustek_usb.c mustek_usb.conf \
 | ||||
|   mustek_usb.h mustek_usb_high.c mustek_usb_high.h mustek_usb_low.c \
 | ||||
|   mustek_usb_low.h mustek_usb_mid.c mustek_usb_mid.h nec.c nec.conf nec.h \
 | ||||
|   net.c net.conf net.h pie.c pie.conf pie-scsidef.h pint.c pint.h plustek.c \
 | ||||
|  | @ -346,6 +346,7 @@ libsane-mustek.la: ../sanei/sanei_constrain_value.lo | |||
| libsane-mustek.la: ../sanei/sanei_scsi.lo | ||||
| libsane-mustek.la: ../sanei/sanei_ab306.lo | ||||
| libsane-mustek.la: ../sanei/sanei_thread.lo | ||||
| libsane-mustek.la: ../sanei/sanei_pa4s2.lo | ||||
| libsane-mustek_pp.la: ../sanei/sanei_constrain_value.lo | ||||
| libsane-mustek_pp.la: ../sanei/sanei_pa4s2.lo | ||||
| libsane-mustek_usb.la: ../sanei/sanei_constrain_value.lo | ||||
|  |  | |||
							
								
								
									
										181
									
								
								backend/mustek.c
								
								
								
								
							
							
						
						
									
										181
									
								
								backend/mustek.c
								
								
								
								
							|  | @ -1,7 +1,9 @@ | |||
| /* sane - Scanner Access Now Easy.
 | ||||
|    Copyright (C) 1996, 1997 David Mosberger-Tang and Andreas Czechanowski, | ||||
|    1998 Andreas Bolsch for extension to ScanExpress models version 0.6, | ||||
|    2000-2003 Henning Meier-Geinitz. | ||||
|    2000-2003 Henning Meier-Geinitz, | ||||
|    2003 James Perry (600 EP). | ||||
|     | ||||
|    This file is part of the SANE package. | ||||
| 
 | ||||
|    This program is free software; you can redistribute it and/or | ||||
|  | @ -41,12 +43,12 @@ | |||
|    If you do not wish that, delete this exception notice. | ||||
| 
 | ||||
|    This file implements a SANE backend for Mustek and some Trust flatbed | ||||
|    scanners with SCSI or proprietary interface.  */ | ||||
|    scanners with SCSI, parallel port (600 EP)  or proprietary interface.  */ | ||||
| 
 | ||||
| 
 | ||||
| /**************************************************************************/ | ||||
| /* Mustek backend version                                                 */ | ||||
| #define BUILD 134 | ||||
| #define BUILD 135 | ||||
| /**************************************************************************/ | ||||
| 
 | ||||
| #include "../include/sane/config.h" | ||||
|  | @ -76,6 +78,7 @@ | |||
| #include "../include/sane/sanei_config.h" | ||||
| 
 | ||||
| #include "mustek.h" | ||||
| #include "mustek_scsi_pp.h" | ||||
| 
 | ||||
| #ifndef SANE_I18N | ||||
| #define SANE_I18N(text) text | ||||
|  | @ -441,11 +444,39 @@ n_wait_ready (Mustek_Scanner * s) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| static SANE_Status | ||||
| scsi_pp_wait_ready (Mustek_Scanner * s) | ||||
| { | ||||
|   struct timeval now, start; | ||||
|   SANE_Status status; | ||||
| 
 | ||||
|   gettimeofday (&start, 0); | ||||
| 
 | ||||
|   DBG (5, "scsi_pp_wait_ready\n"); | ||||
|   while (1) | ||||
|     { | ||||
|       status = mustek_scsi_pp_test_ready (s->fd); | ||||
|       if (status == SANE_STATUS_GOOD) | ||||
| 	return SANE_STATUS_GOOD; | ||||
| 
 | ||||
|       gettimeofday (&now, 0); | ||||
|       if (now.tv_sec - start.tv_sec >= MAX_WAITING_TIME) | ||||
| 	{ | ||||
| 	  DBG (1, "scsi_pp_wait_ready: timed out after %lu seconds\n", | ||||
| 	       (u_long) (now.tv_sec - start.tv_sec)); | ||||
| 	  return SANE_STATUS_INVAL; | ||||
| 	} | ||||
|       usleep (100000);		/* retry after 100ms */ | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static SANE_Status | ||||
| dev_wait_ready (Mustek_Scanner * s) | ||||
| { | ||||
|   if (s->hw->flags & MUSTEK_FLAG_N) | ||||
|     return n_wait_ready (s); | ||||
|   else if (s->hw->flags & MUSTEK_FLAG_SCSI_PP) | ||||
|     return scsi_pp_wait_ready (s); | ||||
|   else if (s->hw->flags & MUSTEK_FLAG_THREE_PASS) | ||||
|     { | ||||
|       SANE_Status status; | ||||
|  | @ -510,8 +541,22 @@ dev_open (SANE_String_Const devname, Mustek_Scanner * s, | |||
| 	{ | ||||
| 	  DBG (3, "dev_open: %s: can't open %s as an AB306N device\n", | ||||
| 	       sane_strstatus (status), devname); | ||||
| 	  DBG (1, "dev_open: can't open %s\n", devname); | ||||
| 	  return SANE_STATUS_INVAL; | ||||
| 
 | ||||
| 	  status = mustek_scsi_pp_open (devname, &s->fd); | ||||
| 	  if (status == SANE_STATUS_GOOD) | ||||
| 	    { | ||||
| 	      s->hw->flags |= MUSTEK_FLAG_SCSI_PP; | ||||
| 	      DBG (3, "dev_open: %s is a SCSI-over-parallel device\n", | ||||
| 		   devname); | ||||
| 	    } | ||||
| 	  else | ||||
| 	    { | ||||
| 	      DBG (3, | ||||
| 		   "dev_open: %s: can't open %s as a SCSI-over-parallel device\n", | ||||
| 		   sane_strstatus (status), devname); | ||||
| 	      DBG (1, "dev_open: can't open %s\n", devname); | ||||
| 	      return SANE_STATUS_INVAL; | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
|   return SANE_STATUS_GOOD; | ||||
|  | @ -548,6 +593,8 @@ dev_cmd (Mustek_Scanner * s, const void *src, size_t src_size, | |||
|     } | ||||
|   if (s->hw->flags & MUSTEK_FLAG_N) | ||||
|     status = sanei_ab306_cmd (s->fd, src, src_size, dst, dst_size); | ||||
|   else if (s->hw->flags & MUSTEK_FLAG_SCSI_PP) | ||||
|     status = mustek_scsi_pp_cmd (s->fd, src, src_size, dst, dst_size); | ||||
|   else | ||||
|     status = sanei_scsi_cmd (s->fd, src, src_size, dst, dst_size); | ||||
| 
 | ||||
|  | @ -598,6 +645,17 @@ dev_block_read_start (Mustek_Scanner * s, SANE_Int lines) | |||
|       readlines[4] = (lines >> 0) & 0xff; | ||||
|       return sanei_ab306_cmd (s->fd, readlines, sizeof (readlines), 0, 0); | ||||
|     } | ||||
|   else if (s->hw->flags & MUSTEK_FLAG_SCSI_PP) | ||||
|     { | ||||
|       SANE_Byte readlines[6]; | ||||
| 
 | ||||
|       memset (readlines, 0, sizeof (readlines)); | ||||
|       readlines[0] = MUSTEK_SCSI_READ_SCANNED_DATA; | ||||
|       readlines[2] = (lines >> 16) & 0xff; | ||||
|       readlines[3] = (lines >> 8) & 0xff; | ||||
|       readlines[4] = (lines >> 0) & 0xff; | ||||
|       return mustek_scsi_pp_cmd (s->fd, readlines, sizeof (readlines), 0, 0); | ||||
|     } | ||||
|   else if (s->hw->flags & MUSTEK_FLAG_PARAGON_2) | ||||
|     { | ||||
|       SANE_Byte buffer[6]; | ||||
|  | @ -652,6 +710,15 @@ dev_read_req_enter (Mustek_Scanner * s, SANE_Byte * buf, SANE_Int lines, | |||
| 
 | ||||
|       return sanei_ab306_rdata (s->fd, planes, buf, lines, bpl); | ||||
|     } | ||||
|   else if (s->hw->flags & MUSTEK_FLAG_SCSI_PP) | ||||
|     { | ||||
|       SANE_Int planes; | ||||
| 
 | ||||
|       *idp = 0; | ||||
|       planes = (s->mode & MUSTEK_MODE_COLOR) ? 3 : 1; | ||||
| 
 | ||||
|       return mustek_scsi_pp_rdata (s->fd, planes, buf, lines, bpl); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       if (s->hw->flags & MUSTEK_FLAG_SE) | ||||
|  | @ -693,6 +760,8 @@ dev_close (Mustek_Scanner * s) | |||
| { | ||||
|   if (s->hw->flags & MUSTEK_FLAG_N) | ||||
|     sanei_ab306_close (s->fd); | ||||
|   else if (s->hw->flags & MUSTEK_FLAG_SCSI_PP) | ||||
|     mustek_scsi_pp_close (s->fd); | ||||
|   else | ||||
|     sanei_scsi_close (s->fd); | ||||
| } | ||||
|  | @ -799,8 +868,8 @@ paragon_2_get_adf_status (Mustek_Scanner * s) | |||
|       DBG (1, "paragon_2_get_adf_status: %s\n", sane_strstatus (status)); | ||||
|       return status; | ||||
|     } | ||||
|   DBG (5, "paragon_2_get_adf_status: sense_buffer: %x %x %x %x\n", sense_buffer[0], | ||||
|        sense_buffer[1], sense_buffer[3], sense_buffer[3]); | ||||
|   DBG (5, "paragon_2_get_adf_status: sense_buffer: %x %x %x %x\n", | ||||
|        sense_buffer[0], sense_buffer[1], sense_buffer[3], sense_buffer[3]); | ||||
| 
 | ||||
|   if (sense_buffer[0] == 0x00 && sense_buffer[1] == 0x00) | ||||
|     return SANE_STATUS_GOOD; | ||||
|  | @ -1192,9 +1261,9 @@ attach (SANE_String_Const devname, Mustek_Device ** devp, SANE_Bool may_wait) | |||
|       dev->y_trans_range.max = SANE_FIX (255.0); | ||||
|       dev->dpi_range.max = SANE_FIX (600); | ||||
|       /* Looks like at least some versions of this scanner produce black images
 | ||||
| 	 in gray and color mode if MUSTEK_FORCE_GAMMA is not set. At least  | ||||
| 	 versions 2.01, 2.02 and 2.10 are reported as having this bug. 3.12 | ||||
| 	 doesn't need this workaround but it doesn't harm either. */ | ||||
|          in gray and color mode if MUSTEK_FORCE_GAMMA is not set. At least  | ||||
|          versions 2.01, 2.02 and 2.10 are reported as having this bug. 3.12 | ||||
|          doesn't need this workaround but it doesn't harm either. */ | ||||
|       dev->flags |= MUSTEK_FLAG_FORCE_GAMMA; | ||||
|       dev->flags |= MUSTEK_FLAG_PARAGON_1; | ||||
|       dev->sane.model = "MFS-6000SP"; | ||||
|  | @ -1317,6 +1386,14 @@ attach (SANE_String_Const devname, Mustek_Device ** devp, SANE_Bool may_wait) | |||
| 	  dev->max_block_buffer_size = 1024 * 1024 * 1024; | ||||
| 	  dev->sane.model = "600 II N"; | ||||
| 	} | ||||
|       else if (dev->flags & MUSTEK_FLAG_SCSI_PP) | ||||
| 	{ | ||||
| 	  /* FIXME; experiment with different line distance codes later */ | ||||
| 	  dev->dpi_range.min = SANE_FIX (75.0); | ||||
| 	  dev->flags |= MUSTEK_FLAG_LD_NONE; | ||||
| 	  dev->max_block_buffer_size = 2 * 1024 * 1024; | ||||
| 	  dev->sane.model = "600 II EP"; | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  dev->sane.model = "600S/600 II CD"; | ||||
|  | @ -1999,7 +2076,7 @@ set_window_pro (Mustek_Scanner * s) | |||
|   STORE16L (cp, SANE_UNFIX (s->val[OPT_BR_Y].w) * pixels_per_mm + 0.5); | ||||
| 
 | ||||
|   if (strcmp (s->hw->sane.model, "1200 SP PRO") != 0) | ||||
|     *cp++ = 0x3c; /* Only needed for A3 Pro, 60 minutes until lamp-off */ | ||||
|     *cp++ = 0x3c;		/* Only needed for A3 Pro, 60 minutes until lamp-off */ | ||||
|   DBG (5, "set_window_pro\n"); | ||||
| 
 | ||||
|   return dev_cmd (s, cmd, (cp - cmd), 0, 0); | ||||
|  | @ -2080,7 +2157,8 @@ send_calibration_lines_pro (Mustek_Scanner * s) | |||
|   if (!cmd1 || !cmd2) | ||||
|     { | ||||
|       DBG (1, "send_calibration_lines_pro: failed to malloc %ld bytes for " | ||||
| 	   "sending lines\n", (long int) (buf_size + sizeof (scsi_send_data))); | ||||
| 	   "sending lines\n", | ||||
| 	   (long int) (buf_size + sizeof (scsi_send_data))); | ||||
|       return SANE_STATUS_NO_MEM; | ||||
|     } | ||||
|   memset (cmd1, 0, sizeof (scsi_send_data)); | ||||
|  | @ -2242,7 +2320,8 @@ send_calibration_lines_se (Mustek_Scanner * s, SANE_Word color) | |||
|   if (!cmd) | ||||
|     { | ||||
|       DBG (1, "send_calibration_lines_se: failed to malloc %ld bytes for " | ||||
| 	   "sending lines\n", (long int) (buf_size + sizeof (scsi_send_data))); | ||||
| 	   "sending lines\n", | ||||
| 	   (long int) (buf_size + sizeof (scsi_send_data))); | ||||
|       return SANE_STATUS_NO_MEM; | ||||
|     } | ||||
|   memset (cmd, 0, sizeof (scsi_send_data)); | ||||
|  | @ -2717,7 +2796,7 @@ gamma_correction (Mustek_Scanner * s, SANE_Int color_code) | |||
| 		val = s->gamma_table[table][i * 256 / bytes_per_channel]; | ||||
| 	      else | ||||
| 		val = i * 256 / bytes_per_channel; | ||||
| 	      if ((s->mode & MUSTEK_MODE_COLOR)  | ||||
| 	      if ((s->mode & MUSTEK_MODE_COLOR) | ||||
| 		  && (s->val[OPT_CUSTOM_GAMMA].w == SANE_TRUE)) | ||||
| 		/* compose intensity gamma and color channel gamma: */ | ||||
| 		val = s->gamma_table[0][val]; | ||||
|  | @ -2869,14 +2948,15 @@ do_stop (Mustek_Scanner * s) | |||
|       pid = sanei_thread_waitpid (s->reader_pid, &exit_status); | ||||
|       if (pid < 0) | ||||
| 	{ | ||||
| 	  DBG (1, "do_stop: sanei_thread_waitpid failed, already terminated? (%s)\n", | ||||
| 	  DBG (1, | ||||
| 	       "do_stop: sanei_thread_waitpid failed, already terminated? (%s)\n", | ||||
| 	       strerror (errno)); | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  DBG (2, "do_stop: reader process terminated with status %s\n", | ||||
| 	       sane_strstatus (exit_status)); | ||||
| 	  if (status != SANE_STATUS_CANCELLED  | ||||
| 	  if (status != SANE_STATUS_CANCELLED | ||||
| 	      && exit_status != SANE_STATUS_GOOD) | ||||
| 	    status = exit_status; | ||||
| 	} | ||||
|  | @ -2886,8 +2966,8 @@ do_stop (Mustek_Scanner * s) | |||
| 
 | ||||
|   if (s->fd >= 0) | ||||
|     { | ||||
|       if (!sanei_thread_is_forked()) | ||||
| 	sanei_scsi_req_flush_all (); /* flush SCSI queue */ | ||||
|       if (!sanei_thread_is_forked ()) | ||||
| 	sanei_scsi_req_flush_all ();	/* flush SCSI queue */ | ||||
| 
 | ||||
|       if (s->hw->flags & MUSTEK_FLAG_PRO) | ||||
| 	{ | ||||
|  | @ -4691,17 +4771,20 @@ output_data (Mustek_Scanner * s, FILE * fp, | |||
| static RETSIGTYPE | ||||
| sigterm_handler (int signal) | ||||
| { | ||||
|   DBG (4, "sigterm_handler: started, signal is %d, starting sanei_scsi_req_flush_all()\n", signal); | ||||
|   sanei_scsi_req_flush_all (); /* flush SCSI queue */ | ||||
|   DBG (4, "sigterm_handler: sanei_scsi_req_flush_all() finisheshed, _exiting()\n"); | ||||
|   DBG (4, | ||||
|        "sigterm_handler: started, signal is %d, starting sanei_scsi_req_flush_all()\n", | ||||
|        signal); | ||||
|   sanei_scsi_req_flush_all ();	/* flush SCSI queue */ | ||||
|   DBG (4, | ||||
|        "sigterm_handler: sanei_scsi_req_flush_all() finisheshed, _exiting()\n"); | ||||
|   _exit (SANE_STATUS_GOOD); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static SANE_Int | ||||
| reader_process (void * data) | ||||
| reader_process (void *data) | ||||
| { | ||||
|   Mustek_Scanner * s = (Mustek_Scanner *) data; | ||||
|   Mustek_Scanner *s = (Mustek_Scanner *) data; | ||||
|   SANE_Int lines_per_buffer, bpl; | ||||
|   SANE_Byte *extra = 0, *ptr; | ||||
|   sigset_t sigterm_set; | ||||
|  | @ -4725,7 +4808,7 @@ reader_process (void * data) | |||
|   bstat[2]; | ||||
| 
 | ||||
|   DBG (3, "reader_process: started\n"); | ||||
|   if (sanei_thread_is_forked()) | ||||
|   if (sanei_thread_is_forked ()) | ||||
|     { | ||||
|       DBG (4, "reader_process: using fork ()\n"); | ||||
|       close (s->pipe); | ||||
|  | @ -4736,7 +4819,7 @@ reader_process (void * data) | |||
|       DBG (4, "reader_process: using threads\n"); | ||||
|     } | ||||
| 
 | ||||
|   if (sanei_thread_is_forked()) | ||||
|   if (sanei_thread_is_forked ()) | ||||
|     { | ||||
|       /* ignore SIGTERM while writing SCSI commands */ | ||||
|       sigemptyset (&sigterm_set); | ||||
|  | @ -5115,7 +5198,8 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) | |||
| 	  cp = sanei_config_get_string (cp, &word); | ||||
| 	  if (!word) | ||||
| 	    { | ||||
| 	      DBG (1, "sane_init: config file line %d: missing quotation mark?\n", | ||||
| 	      DBG (1, | ||||
| 		   "sane_init: config file line %d: missing quotation mark?\n", | ||||
| 		   linenumber); | ||||
| 	      continue; | ||||
| 	    } | ||||
|  | @ -5127,7 +5211,8 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) | |||
| 	      cp = sanei_config_get_string (cp, &word); | ||||
| 	      if (!word) | ||||
| 		{ | ||||
| 		  DBG (1, "sane_init: config file line %d: missing quotation mark?\n", | ||||
| 		  DBG (1, | ||||
| 		       "sane_init: config file line %d: missing quotation mark?\n", | ||||
| 		       linenumber); | ||||
| 		  continue; | ||||
| 		} | ||||
|  | @ -5280,7 +5365,8 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) | |||
| 	      cp = sanei_config_get_string (cp, &word); | ||||
| 	      if (!word) | ||||
| 		{ | ||||
| 		  DBG (1, "sane_init: config file line %d: missing quotation mark?\n", | ||||
| 		  DBG (1, | ||||
| 		       "sane_init: config file line %d: missing quotation mark?\n", | ||||
| 		       linenumber); | ||||
| 		  continue; | ||||
| 		} | ||||
|  | @ -5334,7 +5420,8 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) | |||
| 	      cp = sanei_config_get_string (cp, &word); | ||||
| 	      if (!word) | ||||
| 		{ | ||||
| 		  DBG (1, "sane_init: config file line %d: missing quotation mark?\n", | ||||
| 		  DBG (1, | ||||
| 		       "sane_init: config file line %d: missing quotation mark?\n", | ||||
| 		       linenumber); | ||||
| 		  continue; | ||||
| 		} | ||||
|  | @ -5425,6 +5512,7 @@ sane_exit (void) | |||
|   devlist = 0; | ||||
|   first_dev = 0; | ||||
|   sanei_ab306_exit ();		/* may have to do some cleanup */ | ||||
|   mustek_scsi_pp_exit (); | ||||
|   DBG (5, "sane_exit: finished\n"); | ||||
| } | ||||
| 
 | ||||
|  | @ -6194,12 +6282,16 @@ sane_start (SANE_Handle handle) | |||
|       goto stop_scanner_and_return; | ||||
|     } | ||||
| 
 | ||||
|   status = inquiry (s); | ||||
|   if (status != SANE_STATUS_GOOD) | ||||
|   if (!(s->hw->flags & MUSTEK_FLAG_SCSI_PP)) | ||||
|     { | ||||
|       DBG (1, "sane_start: inquiry command failed: %s\n", | ||||
| 	   sane_strstatus (status)); | ||||
|       goto stop_scanner_and_return; | ||||
|       /* SCSI-over-parallel port doesn't seem to like being inquired here */ | ||||
|       status = inquiry (s); | ||||
|       if (status != SANE_STATUS_GOOD) | ||||
| 	{ | ||||
| 	  DBG (1, "sane_start: inquiry command failed: %s\n", | ||||
| 	       sane_strstatus (status)); | ||||
| 	  goto stop_scanner_and_return; | ||||
| 	} | ||||
|     } | ||||
| 
 | ||||
|   if ((strcmp (s->val[OPT_SOURCE].s, "Automatic Document Feeder") == 0) && | ||||
|  | @ -6338,9 +6430,13 @@ sane_start (SANE_Handle handle) | |||
|       if (status != SANE_STATUS_GOOD) | ||||
| 	goto stop_scanner_and_return; | ||||
| 
 | ||||
|       status = send_gamma_table (s); | ||||
|       if (status != SANE_STATUS_GOOD) | ||||
| 	goto stop_scanner_and_return; | ||||
|       if (!(s->hw->flags & MUSTEK_FLAG_SCSI_PP)) | ||||
| 	{ | ||||
| 	  /* This second gamma table download upsets the SCSI-over-parallel models */ | ||||
| 	  status = send_gamma_table (s); | ||||
| 	  if (status != SANE_STATUS_GOOD) | ||||
| 	    goto stop_scanner_and_return; | ||||
| 	} | ||||
| 
 | ||||
|       s->ld.max_value = 0; | ||||
|       if (!(s->hw->flags & MUSTEK_FLAG_THREE_PASS)) | ||||
|  | @ -6381,9 +6477,9 @@ sane_start (SANE_Handle handle) | |||
|   /* don't call any SIGTERM or SIGCHLD handlers 
 | ||||
|      this is to stop xsane and other frontends from calling  | ||||
|      its quit handlers */ | ||||
|   memset      (&act, 0, sizeof (act)); | ||||
|   sigaction   (SIGTERM, &act, 0); | ||||
|   sigaction   (SIGCHLD, &act, 0); | ||||
|   memset (&act, 0, sizeof (act)); | ||||
|   sigaction (SIGTERM, &act, 0); | ||||
|   sigaction (SIGCHLD, &act, 0); | ||||
| 
 | ||||
|   if (pipe (fds) < 0) | ||||
|     return SANE_STATUS_IO_ERROR; | ||||
|  | @ -6395,7 +6491,8 @@ sane_start (SANE_Handle handle) | |||
| 
 | ||||
|   if (s->reader_pid < 0) | ||||
|     { | ||||
|       DBG (1, "sane_start: sanei_thread_begin failed (%s)\n", strerror(errno)); | ||||
|       DBG (1, "sane_start: sanei_thread_begin failed (%s)\n", | ||||
| 	   strerror (errno)); | ||||
|       return SANE_STATUS_NO_MEM; | ||||
|     } | ||||
| 
 | ||||
|  | @ -6599,3 +6696,5 @@ sane_get_select_fd (SANE_Handle handle, SANE_Int * fd) | |||
|   *fd = s->pipe; | ||||
|   return SANE_STATUS_GOOD; | ||||
| } | ||||
| 
 | ||||
| #include "mustek_scsi_pp.c" | ||||
|  |  | |||
|  | @ -34,3 +34,7 @@ scsi SCANNER | |||
|                                 # For the 600 II N try one of 0x26b, 0x2ab, | ||||
|                                 # 0x2eb, 0x22b, 0x32b, 0x36b,  0x3ab, 0x3eb. | ||||
| # option linedistance-fix       # only neccessary with firmware 2.x | ||||
| 
 | ||||
| #-------------------------- 600 II EP --------------------------------------- | ||||
| #0x378				 | ||||
| 				# 0x378=lpt1, 0x278=lpt2, 0x3bc=lpt3 | ||||
|  |  | |||
|  | @ -69,6 +69,7 @@ | |||
| #define MUSTEK_FLAG_SE_PLUS    	 (1 << 4)	/* ScanExpress Plus scanner */ | ||||
| #define MUSTEK_FLAG_PRO          (1 << 5)	/* Professional series scanner */ | ||||
| #define MUSTEK_FLAG_N		 (1 << 6)	/* N-type scanner (non SCSI) */ | ||||
| #define MUSTEK_FLAG_SCSI_PP      (1 << 22)	/* SCSI over parallel (e.g. 600 II EP) */ | ||||
| /* Additional equipment */ | ||||
| #define MUSTEK_FLAG_ADF		 (1 << 7)	/* automatic document feeder */ | ||||
| #define MUSTEK_FLAG_ADF_READY	 (1 << 8)	/* paper present */ | ||||
|  |  | |||
										
											
												Plik diff jest za duży
												Load Diff
											
										
									
								
							|  | @ -0,0 +1,123 @@ | |||
| /* sane - Scanner Access Now Easy.
 | ||||
|    Copyright (C) 2003 James Perry | ||||
|    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.   | ||||
| 
 | ||||
|    This file implements the SCSI-over-parallel port protocol used in, | ||||
|    for example, the Paragon 600 II EP | ||||
| */ | ||||
| 
 | ||||
| #ifndef mustek_scsi_pp_h | ||||
| #define mustek_scsi_pp_h | ||||
| 
 | ||||
| static int mustek_scsi_pp_get_time (void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Open the connection to a Mustek SCSI-over-pp device. | ||||
|  * | ||||
|  * @param dev Port address as text. | ||||
|  * @param fd  Information about port address and I/O method. fd is not a file | ||||
|  *            descriptor. The name and type are used for compatibility reasons. | ||||
|  * | ||||
|  * @return | ||||
|  * - SANE_STATUS_GOOD - on success | ||||
|  * - SANE_STATUS_INVAL - if the port address can't be interpreted | ||||
|  * - SANE_STATUS_IO_ERROR - if the device file for a port couldn't be accessed | ||||
|  */ | ||||
| static SANE_Status mustek_scsi_pp_open (const char *dev, int *fd); | ||||
| 
 | ||||
| /**
 | ||||
|  * Close the connection to a Mustek SCSI-over-PP device. | ||||
|  * | ||||
|  * @param fd  Information about port address and I/O method. | ||||
|  * | ||||
|  */ | ||||
| static void mustek_scsi_pp_close (int fd); | ||||
| 
 | ||||
| /**
 | ||||
|  * Exit Mustek SCSI-over-PP. | ||||
|  */ | ||||
| static void mustek_scsi_pp_exit (void); | ||||
| 
 | ||||
| /**
 | ||||
|  * Find out if the device is ready to accept new commands. | ||||
|  * | ||||
|  * @param fd  Information about port address and I/O method. | ||||
|  * | ||||
|  * @return | ||||
|  * - SANE_STATUS_GOOD - if the device is ready | ||||
|  * - SANE_STATUS_DEVICE_BUSY if the device is still busy (try again later) | ||||
|  */ | ||||
| static SANE_Status mustek_scsi_pp_test_ready (int fd); | ||||
| 
 | ||||
| /**
 | ||||
|  * Send a command to the Mustek SCSI-over-pp device. | ||||
|  * | ||||
|  * @param fd  Information about port address and I/O method. | ||||
|  * @param src Data to be sent to the device. | ||||
|  * @param src_size Size of data to be sent to the device. | ||||
|  * @param dst Data to be received from the device. | ||||
|  * @param dst_size Size of data to be received from the device | ||||
|  * | ||||
|  * @return | ||||
|  * - SANE_STATUS_GOOD - on success | ||||
|  * - SANE_STATUS_IO_ERROR - if an error occured during the dialog with the | ||||
|  *   device | ||||
|  */ | ||||
| static SANE_Status mustek_scsi_pp_cmd (int fd, const void *src, size_t src_size, | ||||
| 				       void *dst, size_t * dst_size); | ||||
| 
 | ||||
| /**
 | ||||
|  * Read scanned image data. | ||||
|  * | ||||
|  * @param fd  Information about port address and I/O method. | ||||
|  * @param planes Bytes per pixel (3 for color, 1 for all other modes) | ||||
|  * @param buf Buffer for image data. | ||||
|  * @param lines Number of lines | ||||
|  * @param bpl Bytes per line | ||||
|  * | ||||
|  * @return | ||||
|  * - SANE_STATUS_GOOD - on success | ||||
|  * - SANE_STATUS_IO_ERROR - if an error occured during the dialog with the  | ||||
|  *   device | ||||
|  */ | ||||
| static SANE_Status mustek_scsi_pp_rdata (int fd, int planes, | ||||
| 					 SANE_Byte * buf, int lines, int bpl); | ||||
| 
 | ||||
| 
 | ||||
| #endif /* mustek_scsi_pp_h */ | ||||
|  | @ -39,6 +39,16 @@ | |||
| :interface "SCSI" | ||||
| :status :complete | ||||
| 
 | ||||
| :model "Paragon 600 II ED" | ||||
| :interface "Parport" | ||||
| :status :untested | ||||
| :comment "Completely untested. If it's the same as the 600 II EP, it may work. Please contact me if you own such a device." | ||||
| 
 | ||||
| :model "Paragon 600 II EP" | ||||
| :interface "Parport" | ||||
| :status :untested | ||||
| :comment "Not tested yet but should work. Please contact me if you own such a device." | ||||
| 
 | ||||
| :model "ScanMagic 600 II SP" | ||||
| :interface "SCSI" | ||||
| :status :complete | ||||
|  |  | |||
|  | @ -1,14 +1,14 @@ | |||
| .TH sane-mustek 5 "5 Dec 2002" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy" | ||||
| .TH sane-mustek 5 "25 Dec 2002" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy" | ||||
| .IX sane-mustek | ||||
| .SH NAME | ||||
| sane-mustek \- SANE backend for Mustek SCSI flatbed scanners | ||||
| sane-mustek \- SANE backend for Mustek SCSI flatbed scanners (and some other devices) | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B sane-mustek | ||||
| library implements a SANE (Scanner Access Now Easy) backend that provides | ||||
| access to Mustek (and some relabeled Trust and Primax) SCSI flatbed scanners. | ||||
| At present, the following scanners are known to work more or less with this | ||||
| backend: | ||||
| library implements a SANE (Scanner Access Now Easy) backend that provides access | ||||
| to Mustek (and some relabeled Trust and Primax) SCSI and parport flatbed | ||||
| scanners.  At present, the following scanners are known to work more or less | ||||
| with this backend: | ||||
| .PP | ||||
| .RS | ||||
| Paragon MFS-6000CX | ||||
|  | @ -37,6 +37,8 @@ Paragon 1200 SP Pro | |||
| .br | ||||
| Paragon 1200 A3 Pro | ||||
| .br | ||||
| Paragon 600 II EP  | ||||
| .br | ||||
| Paragon 600 II N | ||||
| .br | ||||
| Trust Imagery 1200 | ||||
|  | @ -57,19 +59,21 @@ More details can be found on the Mustek SCSI backend homepage | |||
| Don't mix up MFS (Paragon), Pro and ScanExpress models! They're | ||||
| completely different. Check the exact model name! | ||||
| .PP | ||||
| Note that most of the above scanners come with a SCSI interface.  The | ||||
| only non-SCSI scanner that has some support at this point is the 600 | ||||
| II N scanner which comes with its own parallel port adapter (i.e., it | ||||
| does | ||||
| Note that most of the above scanners come with a SCSI interface.  The only | ||||
| non-SCSI scanners that have some support at this point is the 600 II N and 600 | ||||
| II EP scanners. The former one comes with its own parallel port adapter (i.e., | ||||
| it does | ||||
| .I not | ||||
| attach to the printer port). It uses the SCSI protocoll internally, too. More | ||||
| info on how to use the 600 II N can be found below in section | ||||
| .BR "PARAGON 600 II N" . | ||||
| attach to the printer port). Both scanners use the SCSI protocoll internally, | ||||
| too. More info on how to use these parallel port scanners can be found below in | ||||
| section | ||||
| .BR "PARALLEL PORT SCANNERS" . | ||||
| Other parallel port scanners are not supported by this backend but you may be | ||||
| successful using the Mustek parallel port backend mustek_pp, see | ||||
| .BR sane-mustek_pp (5). | ||||
| USB scanners are also not supported by this backend but the mustek_usb, | ||||
| USB scanners are also not supported by this backend but the ma1509, mustek_usb, | ||||
| gt68xx, and plustek backends include support for some of them, see | ||||
| .BR sane-ma1509 (5), | ||||
| .BR sane-mustek_usb (5), | ||||
| .BR sane-gt68xx "(5), and" | ||||
| .BR sane-plustek (5). | ||||
|  | @ -107,17 +111,17 @@ This backend expects device names of the form: | |||
| Where | ||||
| .I special | ||||
| is either the path-name for the special device that corresponds to a | ||||
| SCSI scanner or the port number at which the 600 II N can | ||||
| SCSI scanner or the port number at which the parallel port scanners can | ||||
| be found (see section  | ||||
| .B "PARAGON 600 II N" | ||||
| .B "PARALLEL PORT SCANNERS" | ||||
| below).  For SCSI scanners, the special device name must be a generic SCSI | ||||
| device or a symlink to such a device.  The program | ||||
| .I sane-find-scanner  | ||||
| helps to find out the correct device. Under Linux, such a device name | ||||
| could be | ||||
| .I /dev/sga | ||||
| .I /dev/sg0 | ||||
| or | ||||
| .IR /dev/sge , | ||||
| .IR /dev/sg3 , | ||||
| for example.  See  | ||||
| .BR sane-scsi (5) | ||||
| for details. | ||||
|  | @ -281,16 +285,19 @@ Details on how to get the Mustek SCSI adapters and other cards running can be | |||
| found at | ||||
| .IR http://www.meier-geinitz.de/sane/mustek-backend/#SCSI . | ||||
| 
 | ||||
| .SH "PARAGON 600 II N" | ||||
| This backend has support for the Paragon 600 II N parallel port | ||||
| scanner.  Note that this scanner comes with its own ISA card that | ||||
| implements a funky parallel port (in other words, the scanner does not | ||||
| connected to the printer parallel port). | ||||
| .SH "PARALLEL PORT SCANNERS" | ||||
| This backend has support for the Paragon 600 II EP and Paragon 600 II N parallel | ||||
| port scanners.  Note that the latter scanner comes with its own ISA card that | ||||
| implements a funky parallel port (in other words, the scanner does not connected | ||||
| to the printer parallel port). | ||||
| .PP | ||||
| This scanner can be configured by listing the port number | ||||
| of the adapter in the mustek.conf file.  Valid port numbers are | ||||
| These scanners can be configured by listing the port number | ||||
| of the adapter or the parallel port in the mustek.conf file.  Valid port numbers | ||||
| for the 600 II N are | ||||
| .IR 0x26b ", " 0x2ab ", " 0x2eb ", " 0x22b ", " 0x32b ", " 0x36b ", " | ||||
| .IR 0x3ab ", " 0x3eb . | ||||
| For the 600 II EP use one of these: | ||||
| .IR 0x378 ", " 0x278 ", " 0x3bc . | ||||
| Pick one that doesn't conflict with the other hardware in your computer. Put | ||||
| only one number on a single line. Example: | ||||
| .PP | ||||
|  | @ -298,7 +305,7 @@ only one number on a single line. Example: | |||
| .I 0x3eb | ||||
| .RE | ||||
| .PP | ||||
| Note that for this scanner root privileges are required to access the | ||||
| Note that for these scanners usually root privileges are required to access the | ||||
| I/O ports.  Thus, either make frontends such as  | ||||
| .BR scanimage (1) | ||||
| and  | ||||
|  | @ -306,18 +313,6 @@ and | |||
| setuid root (generally not recommended for safety reasons) or, alternatively, | ||||
| access this backend through the network daemon  | ||||
| .BR saned (1). | ||||
| On systems which support this feature, the scanner can be accessed through | ||||
| .IR /dev/port . | ||||
| Don't forget to adjust the permissions for  | ||||
| .IR /dev/port . | ||||
| At least with recent Linux kernels root privileges are necessary for  | ||||
| .I /dev/port | ||||
| access, even with full permissions set for all users.. | ||||
| .PP | ||||
| If your images have horizontal stripes in color mode, check option | ||||
| .B linedistance-fix | ||||
| (see above). Apply this option for a scanner with firmware version 2.x and | ||||
| disable it for version 1.x. | ||||
| .PP | ||||
| If the Mustek backend blocks while sending the inqiury command to the scanner, | ||||
| add the option | ||||
|  | @ -325,7 +320,7 @@ add the option | |||
| to | ||||
| .IR mustek.conf . | ||||
| .PP | ||||
| Also note that after a while of no activity, some scanners themself (not | ||||
| Also note that after a while of no activity, some scanners themselves (not | ||||
| the SANE backend) turns off their CCFL lamps. This shutdown is not always | ||||
| perfect with the result that the lamp sometimes continues to glow | ||||
| dimly at one end. This doesn't appear to be dangerous since as soon as | ||||
|  | @ -394,7 +389,7 @@ export SANE_DEBUG_MUSTEK=4 | |||
| 
 | ||||
| .SH AUTHOR | ||||
| David Mosberger, Andreas Czechanowski, Andreas Bolsch (SE extensions), | ||||
| Henning Meier-Geinitz | ||||
| Henning Meier-Geinitz, James Perry (600 II EP). | ||||
| 
 | ||||
| .SH BUGS | ||||
| Scanning with the SCSI adapters supplied by Mustek is very slow at | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| .TH sane 7 "3 Oct 2003" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy" | ||||
| .TH sane 7 "25 Dec 2003" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy" | ||||
| .IX sane | ||||
| 
 | ||||
| .SH NAME | ||||
|  | @ -300,9 +300,9 @@ SCSI-2 command set. See | |||
| for details. | ||||
| .TP | ||||
| .B mustek | ||||
| The SANE mustek backend supports most Mustek SCSI flatbed scanners including | ||||
| the Paragon and ScanExpress series and the 600 II N (non-SCSI). Some Trust | ||||
| scanners are also supported. See  | ||||
| The SANE mustek backend supports most Mustek SCSI flatbed scanners including the | ||||
| Paragon and ScanExpress series and the 600 II N and 600 II EP (non-SCSI). Some | ||||
| Trust scanners are also supported. See | ||||
| .BR sane\-mustek (5) | ||||
| for details. | ||||
| .TP | ||||
|  |  | |||
|  | @ -87,6 +87,22 @@ extern char ** sanei_pa4s2_devices(void); | |||
|  */ | ||||
| extern SANE_Status sanei_pa4s2_open (const char *dev, int *fd); | ||||
| 
 | ||||
| /** Open pa4s2 SCSI-over-parallel device 
 | ||||
|  * | ||||
|  * Opens *dev as pa4s2 SCSI-over-parallel device. | ||||
|  * | ||||
|  * @param dev IO port address ("0x378", "0x278", or "0x3BC") | ||||
|  * @param fd file descriptor | ||||
|  *  | ||||
|  * @return  | ||||
|  * - SANE_STATUS_GOOD - on success | ||||
|  * - SANE_STATUS_INVAL - if no scanner was found or the port number was wrong | ||||
|  * - SANE_STATUS_DEVICE_BUSY - if the device is already in use | ||||
|  * - SANE_STATUS_IO_ERROR - if the port couldn't be accessed | ||||
|  *  | ||||
|  */ | ||||
| extern SANE_Status sanei_pa4s2_scsi_pp_open (const char *dev, int *fd); | ||||
| 
 | ||||
| /** Close pa4s2 device 
 | ||||
|  * | ||||
|  * @param fd file descriptor | ||||
|  | @ -136,6 +152,27 @@ extern SANE_Status sanei_pa4s2_enable (int fd, int enable); | |||
|  */ | ||||
| extern SANE_Status sanei_pa4s2_readbegin (int fd, u_char reg); | ||||
| 
 | ||||
| /** Return port status information
 | ||||
|  * | ||||
|  * @param fd file descriptor | ||||
|  * @param status variable to receive status | ||||
|  * | ||||
|  * @return | ||||
|  * - SANE_STATUS_GOOD - on success | ||||
|  * - SANE_STATUS_INVAL - if fd is invalid or device not in use | ||||
|  */ | ||||
| extern SANE_Status sanei_pa4s2_scsi_pp_get_status (int fd, u_char *status); | ||||
| 
 | ||||
| /** Selects a register number on a SCSI-over-parallel scanner
 | ||||
|  * | ||||
|  * @param fd file descriptor | ||||
|  * @param reg register number | ||||
|  * | ||||
|  * @return | ||||
|  * - SANE_STATUS_GOOD - on success | ||||
|  * - SANE_STATUS_INVAL - if fd is invalid | ||||
|  */ | ||||
| extern SANE_Status sanei_pa4s2_scsi_pp_reg_select (int fd, int reg); | ||||
| 
 | ||||
| /** Read a register 
 | ||||
|  * | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| /* sane - Scanner Access Now Easy.
 | ||||
|    Copyright (C) 2000-2003 Jochen Eisinger <jochen.eisinger@gmx.net> | ||||
|    Copyright (C) 2003 James Perry (scsi_pp functions) | ||||
|    This file is part of the SANE package. | ||||
| 
 | ||||
|    This program is free software; you can redistribute it and/or | ||||
|  | @ -957,6 +958,204 @@ sanei_pa4s2_devices() | |||
|   return devices; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Needed for SCSI-over-parallel scanners (Paragon 600 II EP) | ||||
|  */ | ||||
| SANE_Status | ||||
| sanei_pa4s2_scsi_pp_get_status(int fd, u_char *status) | ||||
| { | ||||
|   u_char stat; | ||||
| 
 | ||||
|   TEST_DBG_INIT (); | ||||
| 
 | ||||
|   DBG (6, "sanei_pa4s2_scsi_pp_get_status: called for fd %d\n", | ||||
|        fd); | ||||
| 
 | ||||
| #if defined (HAVE_LIBIEEE1284) | ||||
|   DBG (3, "sanei_pa4s2_scsi_pp_get_status: not implemented yet for libieee1284\n"); | ||||
|   return SANE_STATUS_UNSUPPORTED; | ||||
| #else | ||||
| 
 | ||||
|   if ((fd < 0) || (fd >= NELEMS (port))) | ||||
|     { | ||||
| 
 | ||||
|       DBG (2, "sanei_pa4s2_scsi_pp_get_status: invalid fd %d\n", fd); | ||||
|       DBG (6, "sanei_pa4s2_scsi_pp_get_status: returning SANE_STATUS_INVAL\n"); | ||||
| 
 | ||||
|       return SANE_STATUS_INVAL; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|   if (port[fd].in_use == SANE_FALSE) | ||||
|     { | ||||
| 
 | ||||
|       DBG (2, "sanei_pa4s2_scsi_pp_get_status: port is not in use\n"); | ||||
|       DBG (6, "sanei_pa4s2_scsi_pp_get_status: port is 0x%03lx\n", | ||||
| 	   port[fd].base); | ||||
|       DBG (5, "sanei_pa4s2_scsi_pp_get_status: returning SANE_STATUS_INVAL\n"); | ||||
| 
 | ||||
|       return SANE_STATUS_INVAL; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|   if (port[fd].enabled == SANE_FALSE) | ||||
|     { | ||||
| 
 | ||||
|       DBG (2, "sanei_pa4s2_scsi_pp_get_status: port is not enabled\n"); | ||||
|       DBG (6, "sanei_pa4s2_scsi_pp_get_status: port is 0x%03lx\n", | ||||
| 	   port[fd].base); | ||||
|       DBG (5, "sanei_pa4s2_scsi_pp_get_status: returning SANE_STATUS_INVAL\n"); | ||||
| 
 | ||||
|       return SANE_STATUS_INVAL; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|   outb(0x4, port[fd].base+2); | ||||
|   stat=inb(port[fd].base+1)^0x80; | ||||
|   *status=(stat&0x2f)|((stat&0x10)<<2)|((stat&0x40)<<1)|((stat&0x80)>>3); | ||||
|   DBG (5, "sanei_pa4s2_scsi_pp_get_status: status=0x%02X\n", *status); | ||||
|   DBG (6, "sanei_pa4s2_scsi_pp_get_status: returning SANE_STATUS_GOOD\n"); | ||||
| #endif | ||||
| 
 | ||||
|   return SANE_STATUS_GOOD; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * SCSI-over-parallel scanners need this done when a register is | ||||
|  * selected | ||||
|  */  | ||||
| SANE_Status | ||||
| sanei_pa4s2_scsi_pp_reg_select (int fd, int reg) | ||||
| { | ||||
|   int base; | ||||
| 
 | ||||
|   TEST_DBG_INIT (); | ||||
| 
 | ||||
| #if defined (HAVE_LIBIEEE1284) | ||||
|   DBG (3, "sanei_pa4s2_scsi_pp_reg_select: not implemented yet for libieee1284\n"); | ||||
|   return SANE_STATUS_UNSUPPORTED; | ||||
| #else | ||||
|   if ((fd < 0) || (fd >= NELEMS (port))) | ||||
|     { | ||||
| 
 | ||||
|       DBG (2, "sanei_pa4s2_scsi_pp_reg_select: invalid fd %d\n", fd); | ||||
|       DBG (6, "sanei_pa4s2_scsi_pp_reg_select: returning SANE_STATUS_INVAL\n"); | ||||
| 
 | ||||
|       return SANE_STATUS_INVAL; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|   if (port[fd].in_use == SANE_FALSE) | ||||
|     { | ||||
| 
 | ||||
|       DBG (2, "sanei_pa4s2_scsi_pp_reg_select: port is not in use\n"); | ||||
|       DBG (6, "sanei_pa4s2_scsi_pp_reg_select: port is 0x%03lx\n", | ||||
| 	   port[fd].base); | ||||
|       DBG (5, "sanei_pa4s2_scsi_pp_reg_select: returning SANE_STATUS_INVAL\n"); | ||||
| 
 | ||||
|       return SANE_STATUS_INVAL; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|   if (port[fd].enabled == SANE_FALSE) | ||||
|     { | ||||
| 
 | ||||
|       DBG (2, "sanei_pa4s2_scsi_pp_reg_select: port is not enabled\n"); | ||||
|       DBG (6, "sanei_pa4s2_scsi_pp_reg_select: port is 0x%03lx\n", | ||||
| 	   port[fd].base); | ||||
|       DBG (5, "sanei_pa4s2_scsi_pp_reg_select: returning SANE_STATUS_INVAL\n"); | ||||
| 
 | ||||
|       return SANE_STATUS_INVAL; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|   base=port[fd].base; | ||||
| 
 | ||||
|   DBG (6, "sanei_pa4s2_scsi_pp_reg_select: selecting register %u at 0x%03x\n", | ||||
|        (int) reg, base); | ||||
| 
 | ||||
|   outb (reg | 0x58, base + 0); | ||||
|   outb (0x04, base + 2); | ||||
|   outb (0x06, base + 2); | ||||
|   outb (0x04, base + 2); | ||||
|   outb (0x04, base + 2); | ||||
| 
 | ||||
|   return SANE_STATUS_GOOD; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * The SCSI-over-parallel scanners need to be handled a bit differently | ||||
|  * when opened, as they don't return a valid ASIC ID, so this can't be | ||||
|  * used for detecting valid read modes | ||||
|  */ | ||||
| SANE_Status | ||||
| sanei_pa4s2_scsi_pp_open (const char *dev, int *fd) | ||||
| { | ||||
| 
 | ||||
|   u_char val; | ||||
|   SANE_Status status; | ||||
| 
 | ||||
|   TEST_DBG_INIT (); | ||||
| 
 | ||||
|   DBG(4, "sanei_pa4s2_scsi_pp_open: called for device '%s'\n", dev); | ||||
|   DBG(5, "sanei_pa4s2_scsi_pp_open: trying to connect to port\n"); | ||||
| 
 | ||||
| #if defined (HAVE_LIBIEEE1284) | ||||
|   DBG (3, "sanei_pa4s2_scsi_pp_open: not implemented yet for libieee1284\n"); | ||||
|   return SANE_STATUS_UNSUPPORTED; | ||||
| #else | ||||
|   if ((*fd = pa4s2_open (dev, &status)) == -1) | ||||
|     { | ||||
| 
 | ||||
|       DBG (5, "sanei_pa4s2_scsi_pp_open: connection failed\n"); | ||||
| 
 | ||||
|       return status; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|   DBG (6, "sanei_pa4s2_scsi_pp_open: connected to device using fd %u\n", *fd); | ||||
| 
 | ||||
|   DBG (5, "sanei_pa4s2_scsi_pp_open: checking for scanner\n"); | ||||
| 
 | ||||
|   if (sanei_pa4s2_enable (*fd, SANE_TRUE)!=SANE_STATUS_GOOD) | ||||
|     { | ||||
|       DBG (3, "sanei_pa4s2_scsi_pp_open: error enabling device\n"); | ||||
|       return SANE_STATUS_IO_ERROR; | ||||
|     } | ||||
| 
 | ||||
|   /*
 | ||||
|    * Instead of checking ASIC ID, check device status | ||||
|    */ | ||||
|   if (sanei_pa4s2_scsi_pp_get_status(*fd, &val)!=SANE_STATUS_GOOD) | ||||
|     { | ||||
|       DBG (3, "sanei_pa4s2_scsi_pp_open: error getting device status\n"); | ||||
|       sanei_pa4s2_enable (*fd, SANE_FALSE); | ||||
|       return SANE_STATUS_IO_ERROR; | ||||
|     } | ||||
|   val&=0xf0; | ||||
| 
 | ||||
|   if ((val==0xf0)||(val&0x40)||(!(val&0x20))) | ||||
|     { | ||||
|       DBG (3, "sanei_pa4s2_scsi_pp_open: device returned status 0x%02X\n", val); | ||||
|       sanei_pa4s2_enable (*fd, SANE_FALSE); | ||||
|       return SANE_STATUS_DEVICE_BUSY; | ||||
|     } | ||||
| 
 | ||||
|   if (sanei_pa4s2_enable (*fd, SANE_FALSE)!=SANE_STATUS_GOOD) | ||||
|     { | ||||
|       DBG (3, "sanei_pa4s2_scsi_pp_open: error disabling device\n"); | ||||
|       return SANE_STATUS_IO_ERROR; | ||||
|     } | ||||
| 
 | ||||
|   /* FIXME: it would be nice to try to use a better mode here, but how to
 | ||||
|    * know if it's going to work? */ | ||||
| 
 | ||||
|   DBG (4, "sanei_pa4s2_scsi_pp_open: returning SANE_STATUS_GOOD\n"); | ||||
| 
 | ||||
|   return SANE_STATUS_GOOD; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| SANE_Status | ||||
| sanei_pa4s2_open (const char *dev, int *fd) | ||||
|  | @ -1850,4 +2049,34 @@ sanei_pa4s2_devices() | |||
|   return calloc(1, sizeof(char *)); | ||||
| } | ||||
| 
 | ||||
| SANE_Status | ||||
| sanei_pa4s2_scsi_pp_get_status(int fd, u_char *status) | ||||
| { | ||||
|   TEST_DBG_INIT (); | ||||
|   DBG (4, "sanei_pa4s2_scsi_pp_get_status: fd=%d, status=%p\n", | ||||
|        fd, (void *) status); | ||||
|   DBG (3, "sanei_pa4s2_scsi_pp_get_status: A4S2 support not compiled\n"); | ||||
|   return SANE_STATUS_UNSUPPORTED; | ||||
| } | ||||
| 
 | ||||
| SANE_Status | ||||
| sanei_pa4s2_scsi_pp_reg_select (int fd, int reg) | ||||
| { | ||||
|   TEST_DBG_INIT (); | ||||
|   DBG (4, "sanei_pa4s2_scsi_pp_reg_select: fd=%d, reg=%d\n", | ||||
|        fd, reg); | ||||
|   DBG (3, "sanei_pa4s2_devices: A4S2 support not compiled\n"); | ||||
|   return SANE_STATUS_UNSUPPORTED; | ||||
| } | ||||
| 
 | ||||
| SANE_Status | ||||
| sanei_pa4s2_scsi_pp_open (const char *dev, int *fd) | ||||
| { | ||||
|   TEST_DBG_INIT (); | ||||
|   DBG (4, "sanei_pa4s2_scsi_pp_open: dev=%s, fd=%p\n", | ||||
|        dev, (void *) fd); | ||||
|   DBG (3, "sanei_pa4s2_scsi_pp_open: A4S2 support not compiled\n"); | ||||
|   return SANE_STATUS_UNSUPPORTED; | ||||
| } | ||||
| 
 | ||||
| #endif /* !HAVE_IOPERM */ | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Henning Geinitz
						Henning Geinitz