- support for UMAX Astra 610P in umax_pp backend

merge-requests/1/head
Stéphane Voltz 2004-05-03 05:14:20 +00:00
rodzic 3a8d80a390
commit d41fed97b2
8 zmienionych plików z 2303 dodań i 768 usunięć

Wyświetl plik

@ -1,3 +1,9 @@
2004-03-15 Stéphane Voltz <svoltz@wanadoo.fr>
* backend/umax_pp_low.c backend/umax_pp_low.h backend/umax_pp_mid.c
backend/umax_pp_mid.h backend/umax_pp.c backend/umax_pp.h
tools/umax_pp.c: added support for 610P
2004-05-01 Henning Meier-Geinitz <henning@meier-geinitz.de> 2004-05-01 Henning Meier-Geinitz <henning@meier-geinitz.de>
* configure configure.in: Warnings enabled again. Added -cvs to * configure configure.in: Warnings enabled again. Added -cvs to

Wyświetl plik

@ -43,7 +43,11 @@
/* CREDITS: /* CREDITS:
Started by being a mere copy of mustek_pp Started by being a mere copy of mustek_pp
by Jochen Eisinger <jochen.eisinger@gmx.net> by Jochen Eisinger <jochen.eisinger@gmx.net>
then evolved in its own thing */ then evolved in its own thing
support for the 610P has been made possible thank to an hardware donation
by William Stuart
*/
#include "../include/sane/config.h" #include "../include/sane/config.h"
@ -102,7 +106,7 @@
* see Changelog * see Changelog
*/ */
#define UMAX_PP_BUILD 14 #define UMAX_PP_BUILD 15
#define UMAX_PP_STATE "dev" #define UMAX_PP_STATE "dev"
static int num_devices = 0; static int num_devices = 0;
@ -299,12 +303,14 @@ attach (const char *devname)
if (mdl > 610) if (mdl > 610)
{ /* Astra 1220, 1600 and 2000 */ { /* Astra 1220, 1600 and 2000 */
dev->max_res = 1200; dev->max_res = 1200;
dev->ccd_res = 600;
dev->max_h_size = 5100; dev->max_h_size = 5100;
dev->max_v_size = 7000 - 8; /* -8: workaround 'y overflow bug at 600 dpi' */ dev->max_v_size = 7000 - 8; /* -8: workaround 'y overflow bug at 600 dpi' */
} }
else else
{ /* Astra 610 */ { /* Astra 610 */
dev->max_res = 600; dev->max_res = 600;
dev->ccd_res = 300;
dev->max_h_size = 2550; dev->max_h_size = 2550;
dev->max_v_size = 3500; dev->max_v_size = 3500;
} }
@ -379,18 +385,35 @@ static SANE_Int
umax_pp_get_sync (SANE_Int dpi) umax_pp_get_sync (SANE_Int dpi)
{ {
/* delta between color frames */ /* delta between color frames */
switch (dpi) if (sanei_umax_pp_getastra () > 610)
{ {
case 1200: switch (dpi)
return 8; {
case 600: case 1200:
return 4; return 8;
case 300: case 600:
return 2; return 4;
case 150: case 300:
return 1; return 2;
default: case 150:
return 0; return 1;
default:
return 0;
}
}
else
{
switch (dpi)
{
case 600:
return 8;
case 300:
return 8;
case 150:
return 4;
default:
return 2;
}
} }
} }
@ -1973,9 +1996,9 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
} }
else else
{ {
dev->red_contrast = 2; dev->red_contrast = 6;
dev->green_contrast = 2; dev->green_contrast = 6;
dev->blue_contrast = 2; dev->blue_contrast = 6;
} }
/* brightness control */ /* brightness control */
@ -2031,12 +2054,12 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
{ {
DBG (64, "sane_get_parameters: %d-%d -> remain is %d\n", DBG (64, "sane_get_parameters: %d-%d -> remain is %d\n",
dev->BottomX, dev->TopX, remain); dev->BottomX, dev->TopX, remain);
if (dev->BottomX + remain < 5100) if (dev->BottomX + remain < dev->desc->max_h_size)
dev->BottomX += remain; dev->BottomX += remain;
else else
{ {
remain -= (5100 - dev->BottomX); remain -= (dev->desc->max_h_size - dev->BottomX);
dev->BottomX = 5100; dev->BottomX = dev->desc->max_h_size;
dev->TopX -= remain; dev->TopX -= remain;
} }
} }
@ -2061,33 +2084,33 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
dev->dpi = 75; dev->dpi = 75;
dev->TopX = 0; dev->TopX = 0;
dev->TopY = 0; dev->TopY = 0;
dev->BottomX = 5100; dev->BottomX = dev->desc->max_h_size;
dev->BottomY = 7000; dev->BottomY = dev->desc->max_v_size;
} }
/* fill params */ /* fill params */
dev->params.last_frame = SANE_TRUE; dev->params.last_frame = SANE_TRUE;
dev->params.lines = ((dev->BottomY - dev->TopY) * dev->dpi) / 600; dev->params.lines =
if (dev->dpi == 1200) ((dev->BottomY - dev->TopY) * dev->dpi) / dev->desc->ccd_res;
dpi = 600; if (dev->dpi >= dev->desc->ccd_res)
dpi = dev->desc->ccd_res;
else else
dpi = dev->dpi; dpi = dev->dpi;
dev->params.pixels_per_line = ((dev->BottomX - dev->TopX) * dpi) / 600; dev->params.pixels_per_line =
dev->params.bytes_per_line = dev->params.pixels_per_line; ((dev->BottomX - dev->TopX) * dpi) / dev->desc->ccd_res;
if (dev->color == UMAX_PP_MODE_COLOR) if (dev->color == UMAX_PP_MODE_COLOR)
{ {
dev->params.bytes_per_line *= 3; dev->params.bytes_per_line = dev->params.pixels_per_line * 3;
dev->params.format = SANE_FRAME_RGB; dev->params.format = SANE_FRAME_RGB;
} }
else else
{ {
dev->params.bytes_per_line = dev->params.pixels_per_line;
dev->params.format = SANE_FRAME_GRAY; dev->params.format = SANE_FRAME_GRAY;
} }
dev->params.depth = 8; dev->params.depth = 8;
/* success */ /* success */
if (params != NULL) if (params != NULL)
memcpy (params, &(dev->params), sizeof (dev->params)); memcpy (params, &(dev->params), sizeof (dev->params));
@ -2100,12 +2123,12 @@ sane_start (SANE_Handle handle)
{ {
Umax_PP_Device *dev = handle; Umax_PP_Device *dev = handle;
int rc, autoset; int rc, autoset;
int delta = 0; int delta = 0, points;
/* sanity check */ /* sanity check */
if (dev->state == UMAX_PP_STATE_SCANNING) if (dev->state == UMAX_PP_STATE_SCANNING)
{ {
DBG (2, "start: device is already scanning\n"); DBG (2, "sane_start: device is already scanning\n");
DEBUG (); DEBUG ();
return SANE_STATUS_DEVICE_BUSY; return SANE_STATUS_DEVICE_BUSY;
@ -2114,14 +2137,14 @@ sane_start (SANE_Handle handle)
/* if cancelled, check if head is back home */ /* if cancelled, check if head is back home */
if (dev->state == UMAX_PP_STATE_CANCELLED) if (dev->state == UMAX_PP_STATE_CANCELLED)
{ {
DBG (2, "start: checking if scanner is parking head .... \n"); DBG (2, "sane_start: checking if scanner is parking head .... \n");
rc = sanei_umax_pp_status (); rc = sanei_umax_pp_status ();
/* check if scanner busy parking */ /* check if scanner busy parking */
if (rc == UMAX1220P_BUSY) if (rc == UMAX1220P_BUSY)
{ {
DBG (2, "start: scanner busy\n"); DBG (2, "sane_start: scanner busy\n");
return SANE_STATUS_DEVICE_BUSY; return SANE_STATUS_DEVICE_BUSY;
} }
dev->state = UMAX_PP_STATE_IDLE; dev->state = UMAX_PP_STATE_IDLE;
@ -2145,11 +2168,12 @@ sane_start (SANE_Handle handle)
if (dev->color == UMAX_PP_MODE_COLOR) if (dev->color == UMAX_PP_MODE_COLOR)
{ {
delta = umax_pp_get_sync (dev->dpi); delta = umax_pp_get_sync (dev->dpi);
DBG (64, "start:umax_pp_start(%d,%d,%d,%d,%d,1,%X,%X)\n", points = 2 * delta;
DBG (64, "sane_start:umax_pp_start(%d,%d,%d,%d,%d,1,%X,%X)\n",
dev->TopX, dev->TopX,
dev->TopY - 2 * delta, dev->TopY - points,
dev->BottomX - dev->TopX, dev->BottomX - dev->TopX,
dev->BottomY - dev->TopY, dev->BottomY - dev->TopY + points,
dev->dpi, dev->dpi,
(dev->red_brightness << 8) + (dev->green_brightness << 4) + (dev->red_brightness << 8) + (dev->green_brightness << 4) +
dev->blue_brightness, dev->blue_brightness,
@ -2157,9 +2181,9 @@ sane_start (SANE_Handle handle)
dev->blue_contrast); dev->blue_contrast);
rc = sanei_umax_pp_start (dev->TopX, rc = sanei_umax_pp_start (dev->TopX,
dev->TopY - 2 * delta, dev->TopY - points,
dev->BottomX - dev->TopX, dev->BottomX - dev->TopX,
dev->BottomY - dev->TopY, dev->BottomY - dev->TopY + points,
dev->dpi, dev->dpi,
2, 2,
autoset, autoset,
@ -2175,10 +2199,12 @@ sane_start (SANE_Handle handle)
/* substract it from real scanning */ /* substract it from real scanning */
/* zone */ /* zone */
dev->th -= 2 * delta; dev->th -= 2 * delta;
DBG (64, "sane_start: bpp=%d,tw=%d,th=%d\n", dev->bpp, dev->tw,
dev->th);
} }
else else
{ {
DBG (64, "start:umax_pp_start(%d,%d,%d,%d,%d,0,%X,%X)\n", DBG (64, "sane_start:umax_pp_start(%d,%d,%d,%d,%d,0,%X,%X)\n",
dev->TopX, dev->TopX,
dev->TopY, dev->TopY,
dev->BottomX - dev->TopX, dev->BottomX - dev->TopX,
@ -2189,16 +2215,18 @@ sane_start (SANE_Handle handle)
dev->BottomX - dev->TopX, dev->BottomX - dev->TopX,
dev->BottomY - dev->TopY, dev->BottomY - dev->TopY,
dev->dpi, dev->dpi,
(dev->color == 1,
UMAX_PP_MODE_GRAYSCALE) ? 1 : 0, autoset, autoset,
dev->gray_brightness << 4, dev->gray_brightness << 4,
dev->gray_contrast << 4, &(dev->bpp), dev->gray_contrast << 4, &(dev->bpp),
&(dev->tw), &(dev->th)); &(dev->tw), &(dev->th));
DBG (64, "sane_start: bpp=%d,tw=%d,th=%d\n", dev->bpp, dev->tw,
dev->th);
} }
if (rc != UMAX1220P_OK) if (rc != UMAX1220P_OK)
{ {
DBG (2, "start: failure\n"); DBG (2, "sane_start: failure\n");
DEBUG (); DEBUG ();
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
@ -2221,7 +2249,7 @@ sane_start (SANE_Handle handle)
2 * delta * dev->tw * dev->bpp); 2 * delta * dev->tw * dev->bpp);
if (rc != UMAX1220P_OK) if (rc != UMAX1220P_OK)
{ {
DBG (2, "start: preload buffer failed\n"); DBG (2, "sane_start: preload buffer failed\n");
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
} }
} }
@ -2253,7 +2281,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
/* sanity check */ /* sanity check */
if (dev->state == UMAX_PP_STATE_CANCELLED) if (dev->state == UMAX_PP_STATE_CANCELLED)
{ {
DBG (2, "read: scan cancelled\n"); DBG (2, "sane_read: scan cancelled\n");
DEBUG (); DEBUG ();
return SANE_STATUS_CANCELLED; return SANE_STATUS_CANCELLED;
@ -2262,7 +2290,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
/* eof test */ /* eof test */
if (dev->read >= dev->th * ll) if (dev->read >= dev->th * ll)
{ {
DBG (2, "read: end of scan reached\n"); DBG (2, "sane_read: end of scan reached\n");
return SANE_STATUS_EOF; return SANE_STATUS_EOF;
} }
@ -2285,12 +2313,14 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
length = (dev->bufsize / ll) * ll; length = (dev->bufsize / ll) * ll;
} }
delta = umax_pp_get_sync (dev->dpi);
if (dev->color == UMAX_PP_MODE_COLOR) if (dev->color == UMAX_PP_MODE_COLOR)
rc = {
sanei_umax_pp_read (length, dev->tw, dev->dpi, last, delta = umax_pp_get_sync (dev->dpi);
dev->buf + UMAX_PP_RESERVE); rc =
sanei_umax_pp_read (length, dev->tw, dev->dpi, last,
dev->buf + UMAX_PP_RESERVE);
}
else else
rc = sanei_umax_pp_read (length, dev->tw, dev->dpi, last, dev->buf); rc = sanei_umax_pp_read (length, dev->tw, dev->dpi, last, dev->buf);
if (rc != UMAX1220P_OK) if (rc != UMAX1220P_OK)
@ -2337,16 +2367,37 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
{ {
for (x = 0; x < dev->tw; x++) for (x = 0; x < dev->tw; x++)
{ {
/* red value: sync'ed */ switch (sanei_umax_pp_getastra ())
lbuf[x * dev->bpp + y * ll + UMAX_PP_RESERVE] = {
dev->buf[x + y * ll + 2 * dev->tw + UMAX_PP_RESERVE]; case 610:
/* green value, +delta line ahead of sync */ /* green value: sync'ed */
lbuf[x * dev->bpp + y * ll + 1 + UMAX_PP_RESERVE] = lbuf[x * dev->bpp + y * ll + 1 + UMAX_PP_RESERVE] =
dev->buf[x + (y - delta) * ll + dev->tw + dev->buf[x + y * ll + 2 * dev->tw + UMAX_PP_RESERVE];
UMAX_PP_RESERVE];
/* blue value, +2*delta line ahead of sync */ /* blue value, +delta line ahead of sync */
lbuf[x * dev->bpp + y * ll + 2 + UMAX_PP_RESERVE] = lbuf[x * dev->bpp + y * ll + 2 + UMAX_PP_RESERVE] =
dev->buf[x + (y - 2 * delta) * ll + UMAX_PP_RESERVE]; dev->buf[x + (y - delta) * ll + dev->tw +
UMAX_PP_RESERVE];
/* red value, +2*delta line ahead of sync */
lbuf[x * dev->bpp + y * ll + UMAX_PP_RESERVE] =
dev->buf[x + (y - 2 * delta) * ll + UMAX_PP_RESERVE];
break;
default:
/* red value: sync'ed */
lbuf[x * dev->bpp + y * ll + UMAX_PP_RESERVE] =
dev->buf[x + y * ll + 2 * dev->tw + UMAX_PP_RESERVE];
/* green value, +delta line ahead of sync */
lbuf[x * dev->bpp + y * ll + 1 + UMAX_PP_RESERVE] =
dev->buf[x + (y - delta) * ll + dev->tw +
UMAX_PP_RESERVE];
/* blue value, +2*delta line ahead of sync */
lbuf[x * dev->bpp + y * ll + 2 + UMAX_PP_RESERVE] =
dev->buf[x + (y - 2 * delta) * ll + UMAX_PP_RESERVE];
}
} }
} }
/* store last data lines for next reordering */ /* store last data lines for next reordering */
@ -2375,7 +2426,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
*len = length; *len = length;
dev->bufread += length; dev->bufread += length;
dev->read += length; dev->read += length;
DBG (64, "sane_read %ld bytes read\n", length); DBG (64, "sane_read: %ld bytes read\n", length);
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;

Wyświetl plik

@ -102,6 +102,7 @@ typedef struct Umax_PP_Descriptor
SANE_String ppdevice; SANE_String ppdevice;
SANE_Int max_res; SANE_Int max_res;
SANE_Int ccd_res;
SANE_Int max_h_size; SANE_Int max_h_size;
SANE_Int max_v_size; SANE_Int max_v_size;
long int buf_size; long int buf_size;

Plik diff jest za duży Load Diff

Wyświetl plik

@ -73,11 +73,11 @@ extern void sanei_umax_pp_setauto (int mode);
#ifndef PRECISION_ON #ifndef PRECISION_ON
#define PRECISION_ON 1 #define PRECISION_ON 1
#define PRECISION_OFF 0 #define PRECISION_OFF 0
#define LAMP_STATE 0x20
#define MOTOR_BIT 0x40 #define LAMP_STATE 0x20
#define MOTOR_BIT 0x40
#define UMAX_PP_PARPORT_PS2 0x01 #define UMAX_PP_PARPORT_PS2 0x01
#define UMAX_PP_PARPORT_BYTE 0x02 #define UMAX_PP_PARPORT_BYTE 0x02
@ -108,6 +108,10 @@ extern void sanei_umax_pp_setparport (int fd);
extern int sanei_umax_pp_getparport (void); extern int sanei_umax_pp_getparport (void);
extern void sanei_umax_pp_setastra (int mod); extern void sanei_umax_pp_setastra (int mod);
extern int sanei_umax_pp_getastra (void); extern int sanei_umax_pp_getastra (void);
extern void sanei_umax_pp_setLeft (int mod);
extern int sanei_umax_pp_getLeft (void);
extern void sanei_umax_pp_setfull (int mod);
extern int sanei_umax_pp_getfull (void);
extern int sanei_umax_pp_scannerStatus (void); extern int sanei_umax_pp_scannerStatus (void);
extern int sanei_umax_pp_probeScanner (int recover); extern int sanei_umax_pp_probeScanner (int recover);

Wyświetl plik

@ -79,7 +79,7 @@ lock_parport (void)
{ {
if (ioctl (sanei_umax_pp_getparport (), PPCLAIM)) if (ioctl (sanei_umax_pp_getparport (), PPCLAIM))
{ {
return (UMAX1220P_BUSY); return UMAX1220P_BUSY;
} }
#ifdef PPGETMODE #ifdef PPGETMODE
if (ioctl (fd, PPGETMODE, &exmode)) if (ioctl (fd, PPGETMODE, &exmode))
@ -95,7 +95,7 @@ lock_parport (void)
#else #else
locked = 1; locked = 1;
#endif #endif
return (UMAX1220P_OK); return UMAX1220P_OK;
} }
@ -121,7 +121,7 @@ unlock_parport (void)
#endif #endif
DBG (3, "unlock_parport\n"); DBG (3, "unlock_parport\n");
locked = 0; locked = 0;
return (UMAX1220P_OK); return UMAX1220P_OK;
} }
@ -143,7 +143,7 @@ sanei_umax_pp_model (int port, int *model)
DBG (3, "sanei_umax_pp_model\n"); DBG (3, "sanei_umax_pp_model\n");
sanei_umax_pp_setport (port); sanei_umax_pp_setport (port);
if (lock_parport () == UMAX1220P_BUSY) if (lock_parport () == UMAX1220P_BUSY)
return (UMAX1220P_BUSY); return UMAX1220P_BUSY;
/* init transport layer */ /* init transport layer */
/* 0: failed /* 0: failed
@ -160,14 +160,14 @@ sanei_umax_pp_model (int port, int *model)
if (rc == 3) if (rc == 3)
{ {
unlock_parport (); unlock_parport ();
return (UMAX1220P_BUSY); return UMAX1220P_BUSY;
} }
if (rc != 1) if (rc != 1)
{ {
DBG (0, "sanei_umax_pp_initTransport() failed (%s:%d)\n", __FILE__, DBG (0, "sanei_umax_pp_initTransport() failed (%s:%d)\n", __FILE__,
__LINE__); __LINE__);
unlock_parport (); unlock_parport ();
return (UMAX1220P_TRANSPORT_FAILED); return UMAX1220P_TRANSPORT_FAILED;
} }
/* check model only, and if only none given in conf file */ /* check model only, and if only none given in conf file */
@ -181,17 +181,17 @@ sanei_umax_pp_model (int port, int *model)
} }
sanei_umax_pp_endSession (); sanei_umax_pp_endSession ();
unlock_parport (); unlock_parport ();
if (rc < 610) if (rc < 600)
{ {
DBG (0, "sanei_umax_pp_CheckModel() failed (%s:%d)\n", __FILE__, DBG (0, "sanei_umax_pp_CheckModel() failed (%s:%d)\n", __FILE__,
__LINE__); __LINE__);
return (UMAX1220P_PROBE_FAILED); return UMAX1220P_PROBE_FAILED;
} }
*model = rc; *model = rc;
/* OK */ /* OK */
return (UMAX1220P_OK); return UMAX1220P_OK;
} }
int int
@ -211,7 +211,7 @@ sanei_umax_pp_attach (int port, char *name)
sanei_umax_pp_setport (port); sanei_umax_pp_setport (port);
if (sanei_umax_pp_initPort (port, name) != 1) if (sanei_umax_pp_initPort (port, name) != 1)
return (UMAX1220P_PROBE_FAILED); return UMAX1220P_PROBE_FAILED;
/* init port locks the port, so we flag that */ /* init port locks the port, so we flag that */
locked = 1; locked = 1;
@ -226,13 +226,13 @@ sanei_umax_pp_attach (int port, char *name)
{ {
DBG (0, "Recover failed ....\n"); DBG (0, "Recover failed ....\n");
unlock_parport (); unlock_parport ();
return (UMAX1220P_PROBE_FAILED); return UMAX1220P_PROBE_FAILED;
} }
} }
else else
{ {
unlock_parport (); unlock_parport ();
return (UMAX1220P_PROBE_FAILED); return UMAX1220P_PROBE_FAILED;
} }
} }
sanei_umax_pp_endSession (); sanei_umax_pp_endSession ();
@ -240,7 +240,7 @@ sanei_umax_pp_attach (int port, char *name)
/* OK */ /* OK */
return (UMAX1220P_OK); return UMAX1220P_OK;
} }
@ -257,7 +257,7 @@ sanei_umax_pp_open (int port, char *name)
sanei_umax_pp_setport (port); sanei_umax_pp_setport (port);
if (lock_parport () == UMAX1220P_BUSY) if (lock_parport () == UMAX1220P_BUSY)
return (UMAX1220P_BUSY); return UMAX1220P_BUSY;
/* init transport layer */ /* init transport layer */
/* 0: failed /* 0: failed
@ -274,7 +274,7 @@ sanei_umax_pp_open (int port, char *name)
if (rc == 3) if (rc == 3)
{ {
unlock_parport (); unlock_parport ();
return (UMAX1220P_BUSY); return UMAX1220P_BUSY;
} }
if (rc != 1) if (rc != 1)
@ -283,7 +283,7 @@ sanei_umax_pp_open (int port, char *name)
DBG (0, "sanei_umax_pp_initTransport() failed (%s:%d)\n", __FILE__, DBG (0, "sanei_umax_pp_initTransport() failed (%s:%d)\n", __FILE__,
__LINE__); __LINE__);
unlock_parport (); unlock_parport ();
return (UMAX1220P_TRANSPORT_FAILED); return UMAX1220P_TRANSPORT_FAILED;
} }
/* init scanner */ /* init scanner */
if (sanei_umax_pp_initScanner (recover) == 0) if (sanei_umax_pp_initScanner (recover) == 0)
@ -292,12 +292,12 @@ sanei_umax_pp_open (int port, char *name)
__LINE__); __LINE__);
sanei_umax_pp_endSession (); sanei_umax_pp_endSession ();
unlock_parport (); unlock_parport ();
return (UMAX1220P_SCANNER_FAILED); return UMAX1220P_SCANNER_FAILED;
} }
/* OK */ /* OK */
unlock_parport (); unlock_parport ();
return (UMAX1220P_OK); return UMAX1220P_OK;
} }
@ -306,7 +306,7 @@ sanei_umax_pp_cancel (void)
{ {
DBG (3, "sanei_umax_pp_cancel\n"); DBG (3, "sanei_umax_pp_cancel\n");
if (lock_parport () == UMAX1220P_BUSY) if (lock_parport () == UMAX1220P_BUSY)
return (UMAX1220P_BUSY); return UMAX1220P_BUSY;
/* maybe EPAT reset here if exists */ /* maybe EPAT reset here if exists */
sanei_umax_pp_cmdSync (0xC2); sanei_umax_pp_cmdSync (0xC2);
@ -314,14 +314,14 @@ sanei_umax_pp_cancel (void)
sanei_umax_pp_cmdSync (0x00); sanei_umax_pp_cmdSync (0x00);
if (sanei_umax_pp_park () == 0) if (sanei_umax_pp_park () == 0)
{ {
DBG (0, "Park failed !!! (%s:%d)\n", __FILE__, __LINE__); DBG (0, "sanei_umax_pp_park failed !!! (%s:%d)\n", __FILE__, __LINE__);
unlock_parport (); unlock_parport ();
return (UMAX1220P_PARK_FAILED); return UMAX1220P_PARK_FAILED;
} }
/* endSession() cancels any pending command */ /* endSession() cancels any pending command */
/* such as parking ...., so we only return */ /* such as parking ...., so we only return */
unlock_parport (); unlock_parport ();
return (UMAX1220P_OK); return UMAX1220P_OK;
} }
@ -336,7 +336,7 @@ sanei_umax_pp_start (int x, int y, int width, int height, int dpi, int color,
DBG (3, "sanei_umax_pp_start\n"); DBG (3, "sanei_umax_pp_start\n");
if (lock_parport () == UMAX1220P_BUSY) if (lock_parport () == UMAX1220P_BUSY)
return (UMAX1220P_BUSY); return UMAX1220P_BUSY;
/* end session isn't done by cancel any more */ /* end session isn't done by cancel any more */
sanei_umax_pp_endSession (); sanei_umax_pp_endSession ();
@ -359,31 +359,45 @@ sanei_umax_pp_start (int x, int y, int width, int height, int dpi, int color,
} }
if (sanei_umax_pp_startScan if (sanei_umax_pp_startScan
(x + 144, y, width, height, dpi, col, brightness, contrast, rbpp, rtw, (x + sanei_umax_pp_getLeft (), y, width, height, dpi, col, brightness,
rth) != 1) contrast, rbpp, rtw, rth) != 1)
{ {
sanei_umax_pp_endSession (); sanei_umax_pp_endSession ();
unlock_parport (); unlock_parport ();
return (UMAX1220P_START_FAILED); return UMAX1220P_START_FAILED;
} }
unlock_parport (); unlock_parport ();
return (UMAX1220P_OK); return UMAX1220P_OK;
} }
int int
sanei_umax_pp_read (long len, int window, int dpi, int last, sanei_umax_pp_read (long len, int window, int dpi, int last,
unsigned char *buffer) unsigned char *buffer)
{ {
int read = 0;
int bytes;
DBG (3, "sanei_umax_pp_read\n"); DBG (3, "sanei_umax_pp_read\n");
if (lock_parport () == UMAX1220P_BUSY) if (lock_parport () == UMAX1220P_BUSY)
return (UMAX1220P_BUSY); return UMAX1220P_BUSY;
if (sanei_umax_pp_readBlock (len, window, dpi, last, buffer) == 0)
/* since 610P may override len and last to meet its */
/* hardware requirements, we have to loop until we */
/* have all the data */
while (read < len)
{ {
sanei_umax_pp_endSession (); bytes =
return (UMAX1220P_READ_FAILED); sanei_umax_pp_readBlock (len - read, window, dpi, last,
buffer + read);
if (bytes == 0)
{
sanei_umax_pp_endSession ();
return UMAX1220P_READ_FAILED;
}
read += bytes;
} }
unlock_parport (); unlock_parport ();
return (UMAX1220P_OK); return UMAX1220P_OK;
} }
@ -393,8 +407,13 @@ sanei_umax_pp_lamp (int on)
{ {
/* init transport layer */ /* init transport layer */
DBG (3, "sanei_umax_pp_lamp\n"); DBG (3, "sanei_umax_pp_lamp\n");
/* no lamp support for 610P ... */
if (sanei_umax_pp_getastra () < 1210)
return UMAX1220P_OK;
if (lock_parport () == UMAX1220P_BUSY) if (lock_parport () == UMAX1220P_BUSY)
return (UMAX1220P_BUSY); return UMAX1220P_BUSY;
if (sanei_umax_pp_setLamp (on) == 0) if (sanei_umax_pp_setLamp (on) == 0)
{ {
@ -402,7 +421,7 @@ sanei_umax_pp_lamp (int on)
} }
unlock_parport (); unlock_parport ();
return (UMAX1220P_OK); return UMAX1220P_OK;
} }
@ -415,18 +434,16 @@ sanei_umax_pp_status (void)
DBG (3, "sanei_umax_pp_status\n"); DBG (3, "sanei_umax_pp_status\n");
if (lock_parport () == UMAX1220P_BUSY) if (lock_parport () == UMAX1220P_BUSY)
return (UMAX1220P_BUSY); return UMAX1220P_BUSY;
/* check if head is at home */ /* check if head is at home */
sanei_umax_pp_cmdSync (0x40); sanei_umax_pp_cmdSync (0x40);
status = sanei_umax_pp_scannerStatus (); status = sanei_umax_pp_scannerStatus ();
if ((status & MOTOR_BIT) == 0x00)
{
unlock_parport ();
return (UMAX1220P_BUSY);
}
unlock_parport (); unlock_parport ();
DBG (8, "sanei_umax_pp_status=0x%02X\n", status);
if ((status & MOTOR_BIT) == 0x00)
return UMAX1220P_BUSY;
return (UMAX1220P_OK); return UMAX1220P_OK;
} }
int int
@ -450,5 +467,5 @@ sanei_umax_pp_close ()
sanei_umax_pp_setparport (0); sanei_umax_pp_setparport (0);
} }
#endif #endif
return (UMAX1220P_OK); return UMAX1220P_OK;
} }

Wyświetl plik

@ -186,5 +186,6 @@ extern void sanei_umax_pp_setastra (int val);
/* set gamma tables */ /* set gamma tables */
extern void sanei_umax_pp_gamma (int *red, int *green, int *blue); extern void sanei_umax_pp_gamma (int *red, int *green, int *blue);
/* sets coordinate of first usable left pixel */
extern int sanei_umax_pp_getLeft (void);
#endif #endif

Wyświetl plik

@ -33,17 +33,18 @@ main (int argc, char **argv)
char *name = NULL; char *name = NULL;
int scan = 0; int scan = 0;
int lamp = -1; int lamp = -1;
int i,fd; int i, fd;
int found; int found;
int recover = 0; int recover = 0;
int trace = 0; int trace = 0;
int maxw,maxh;
/* scanning parameters : defaults to preview (75 dpi color, full scan area) */ /* scanning parameters : defaults to preview (75 dpi color, full scan area) */
int brightness = 0x0; int brightness = 0x0;
int contrast = 0x2C0; int contrast = 0x646;
int dpi = 75; int dpi = 75;
int x = 0, y = 0; int x = 0, y = 0;
int width = 5100, height = 7000; int width = -1, height = -1;
int color = RGB_MODE; int color = RGB_MODE;
@ -120,11 +121,6 @@ main (int argc, char **argv)
return 0; return 0;
} }
x = atoi (argv[i + 1]); x = atoi (argv[i + 1]);
if (x < 0 || x > 5100)
{
fprintf (stderr, "x must be between 0 and 5099\n");
return 0;
}
i++; i++;
found = 1; found = 1;
} }
@ -138,11 +134,6 @@ main (int argc, char **argv)
return 0; return 0;
} }
y = atoi (argv[i + 1]); y = atoi (argv[i + 1]);
if (y < 0 || y > 7000)
{
fprintf (stderr, "y must be between 0 and 7000\n");
return 0;
}
i++; i++;
found = 1; found = 1;
} }
@ -156,17 +147,6 @@ main (int argc, char **argv)
return 0; return 0;
} }
width = atoi (argv[i + 1]); width = atoi (argv[i + 1]);
if ((width < 1) || (width > 5100))
{
fprintf (stderr, "width must be between 1 and 5100\n");
return 0;
}
if (x + width > 5100)
{
fprintf (stderr,
"Right side of scan area exceed physical limits (x+witdh>5100)\n");
return 0;
}
i++; i++;
found = 1; found = 1;
} }
@ -181,17 +161,6 @@ main (int argc, char **argv)
return 0; return 0;
} }
height = atoi (argv[i + 1]); height = atoi (argv[i + 1]);
if ((height < 1) || (height > 7000))
{
fprintf (stderr, "height must be between 1 and 7000\n");
return 0;
}
if (y + height > 7100)
{
fprintf (stderr,
"Bottom side of scan area exceed physical limits (y+height>7100)\n");
return 0;
}
i++; i++;
found = 1; found = 1;
} }
@ -220,6 +189,8 @@ main (int argc, char **argv)
if ((strcmp (argv[i], "-s") == 0) || (strcmp (argv[i], "--scan") == 0)) if ((strcmp (argv[i], "-s") == 0) || (strcmp (argv[i], "--scan") == 0))
{ {
scan = 1; scan = 1;
/* we have to probe again if we scan */
probe = 1;
found = 1; found = 1;
} }
@ -356,9 +327,6 @@ main (int argc, char **argv)
} }
/* set x origin left to right */
x = 144 + (5100 - x) - width;
/* enable I/O */ /* enable I/O */
/* parport_claim */ /* parport_claim */
if (sanei_umax_pp_initPort (port, name) != 1) if (sanei_umax_pp_initPort (port, name) != 1)
@ -368,7 +336,7 @@ main (int argc, char **argv)
} }
if (trace) if (trace)
{ {
printf ("UMAX 1220P scanning program version 5.1 starting ...\n"); printf ("UMAX 610P/1220P/2000P scanning program version 6.0 starting ...\n");
#ifdef HAVE_LINUX_PPDEV_H #ifdef HAVE_LINUX_PPDEV_H
printf ("ppdev character device built-in.\n"); printf ("ppdev character device built-in.\n");
#endif #endif
@ -426,6 +394,7 @@ main (int argc, char **argv)
/* free scanner if a scan is planned */ /* free scanner if a scan is planned */
if (scan) if (scan)
sanei_umax_pp_endSession (); sanei_umax_pp_endSession ();
printf ("Done ....\n");
} }
/* lamp on/off: must come after probing (610p handling) */ /* lamp on/off: must come after probing (610p handling) */
@ -459,6 +428,60 @@ main (int argc, char **argv)
/* scan */ /* scan */
if (scan) if (scan)
{ {
printf ("Scanning ....\n");
if (sanei_umax_pp_getastra () < 1210)
{
maxw = 2550;
maxh = 3500;
}
else
{
maxw = 5100;
maxh = 7000;
}
if (width < 0)
width = maxw;
if (height < 0)
height = maxh;
if ((width < 1) || (width > maxw))
{
fprintf (stderr, "width must be between 1 and %d\n", maxw);
return 0;
}
if (x + width > maxw)
{
fprintf (stderr,
"Right side of scan area exceed physical limits (x+witdh>%d)\n",
maxw);
return 0;
}
if (y < 0 || y > maxh)
{
fprintf (stderr, "y must be between 0 and %d\n", maxh - 1);
return 0;
}
if (x < 0 || x > maxw)
{
fprintf (stderr, "x must be between 0 and %d\n", maxw - 1);
return 0;
}
if ((height < 1) || (height > maxh))
{
fprintf (stderr, "height must be between 1 and %d\n", maxh);
return 0;
}
if (y + height > maxh)
{
fprintf (stderr,
"Bottom side of scan area exceed physical limits (y+height>%d)\n",
maxh);
return 0;
}
/* set x origin left to right */
x = sanei_umax_pp_getLeft() + (maxw - x) - width;
/* init transport layer */ /* init transport layer */
/* 0: failed /* 0: failed
1: success 1: success
@ -474,15 +497,6 @@ main (int argc, char **argv)
printf ("initTransport() failed (%s:%d)\n", __FILE__, __LINE__); printf ("initTransport() failed (%s:%d)\n", __FILE__, __LINE__);
return 0; return 0;
} }
/*i = sanei_umax_pp_checkModel ();
if (i < 610)
{
sanei_umax_pp_endSession ();
printf ("checkModel() failed (%s:%d)\n", __FILE__, __LINE__);
return 0;
}
if (trace)
printf ("UMAX Astra %dP detected \n", i); */
/* init scanner */ /* init scanner */
if (sanei_umax_pp_initScanner (recover) == 0) if (sanei_umax_pp_initScanner (recover) == 0)
{ {
@ -499,6 +513,7 @@ main (int argc, char **argv)
/* wait for head parking */ /* wait for head parking */
sanei_umax_pp_parkWait (); sanei_umax_pp_parkWait ();
printf ("Done ....\n");
} }
sanei_umax_pp_endSession (); sanei_umax_pp_endSession ();
#ifdef HAVE_LINUX_PPDEV_H #ifdef HAVE_LINUX_PPDEV_H