kopia lustrzana https://gitlab.com/sane-project/backends
* DBG() macro clean-up
* fixed color transfer for 1600P models * fixed potential crash if dump file couldn't be opened for writing * added ppdev device name handling * added model overrideDEVEL_2_0_BRANCH-1
rodzic
f02205558f
commit
61b8100c90
|
@ -69,6 +69,7 @@
|
|||
#include "../include/sane/sane.h"
|
||||
#include "../include/sane/sanei.h"
|
||||
#include "../include/sane/saneopts.h"
|
||||
#include "../include/sane/sanei_config.h"
|
||||
|
||||
#include "umax_pp_mid.h"
|
||||
#include "umax_pp.h"
|
||||
|
@ -113,8 +114,8 @@ static const SANE_Device **devarray = NULL;
|
|||
static Umax_PP_Device *first_dev = NULL;
|
||||
|
||||
|
||||
/* 1 Meg scan buffer */
|
||||
static long int buf_size = 2024 * 1024;
|
||||
/* 2 Meg scan buffer */
|
||||
static long int buf_size = 2048 * 1024;
|
||||
|
||||
|
||||
static int red_gain = 0;
|
||||
|
@ -166,7 +167,10 @@ static const SANE_Range u8_range = {
|
|||
|
||||
#define UMAX_PP_DEFAULT_PORT 0x378
|
||||
|
||||
|
||||
/*
|
||||
* devname may be either an hardware address for direct I/O (0x378 for instance)
|
||||
* or the device name used by ppdev on linux systems (/dev/parport0 )
|
||||
*/
|
||||
|
||||
|
||||
static SANE_Status
|
||||
|
@ -175,24 +179,44 @@ attach (const char *devname)
|
|||
Umax_PP_Descriptor *dev;
|
||||
int i;
|
||||
SANE_Status status = SANE_STATUS_GOOD;
|
||||
int ret, prt, mdl;
|
||||
int ret, prt = 0, mdl;
|
||||
char model[32];
|
||||
char name[64];
|
||||
|
||||
memset (name, 0, 64);
|
||||
|
||||
if ((strlen (devname) < 3) || (strlen (devname) > 8))
|
||||
if ((strlen (devname) < 3))
|
||||
return SANE_STATUS_INVAL;
|
||||
|
||||
if ((devname[0] == '0') && ((devname[1] == 'x') || (devname[1] == 'X')))
|
||||
prt = strtol (devname + 2, NULL, 16);
|
||||
/* if the name begins with a slash, it's a device, else it's an addr */
|
||||
if ((devname[0] == '/'))
|
||||
{
|
||||
strncpy (name, devname, 64);
|
||||
}
|
||||
else
|
||||
prt = atoi (devname);
|
||||
{
|
||||
if ((devname[0] == '0') && ((devname[1] == 'x') || (devname[1] == 'X')))
|
||||
prt = strtol (devname + 2, NULL, 16);
|
||||
else
|
||||
prt = atoi (devname);
|
||||
}
|
||||
|
||||
|
||||
for (i = 0; i < num_devices; i++)
|
||||
if (strcmp (devlist[i].port, devname) == 0)
|
||||
return SANE_STATUS_GOOD;
|
||||
{
|
||||
if (devname[0] == '/')
|
||||
{
|
||||
if (strcmp (devlist[i].ppdevice, devname) == 0)
|
||||
return SANE_STATUS_GOOD;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strcmp (devlist[i].port, devname) == 0)
|
||||
return SANE_STATUS_GOOD;
|
||||
}
|
||||
}
|
||||
|
||||
ret = sanei_umax_pp_attach (prt);
|
||||
ret = sanei_umax_pp_attach (prt, name);
|
||||
switch (ret)
|
||||
{
|
||||
case UMAX1220P_OK:
|
||||
|
@ -202,11 +226,11 @@ attach (const char *devname)
|
|||
status = SANE_STATUS_DEVICE_BUSY;
|
||||
break;
|
||||
case UMAX1220P_TRANSPORT_FAILED:
|
||||
DBG (1, "attach: failed to init transport layer on port %s\n", devname);
|
||||
DBG (1, "attach: failed to init transport layer on %s\n", devname);
|
||||
status = SANE_STATUS_IO_ERROR;
|
||||
break;
|
||||
case UMAX1220P_PROBE_FAILED:
|
||||
DBG (1, "attach: failed to probe scanner on port %s\n", devname);
|
||||
DBG (1, "attach: failed to probe scanner on %s\n", devname);
|
||||
status = SANE_STATUS_IO_ERROR;
|
||||
break;
|
||||
}
|
||||
|
@ -226,14 +250,14 @@ attach (const char *devname)
|
|||
ret = sanei_umax_pp_model (prt, &mdl);
|
||||
if (ret != UMAX1220P_OK)
|
||||
{
|
||||
DBG (1, "attach: waiting for busy scanner on port %s\n", devname);
|
||||
DBG (1, "attach: waiting for busy scanner on %s\n", devname);
|
||||
}
|
||||
}
|
||||
while (ret == UMAX1220P_BUSY);
|
||||
|
||||
if (ret != UMAX1220P_OK)
|
||||
{
|
||||
DBG (1, "attach: failed to recognize scanner model on port %s\n",
|
||||
DBG (1, "attach: failed to recognize scanner model on %s\n",
|
||||
devname);
|
||||
return SANE_STATUS_IO_ERROR;
|
||||
}
|
||||
|
@ -264,7 +288,10 @@ attach (const char *devname)
|
|||
dev->sane.vendor = strdup ("UMAX");
|
||||
dev->sane.type = "flatbed scanner";
|
||||
|
||||
dev->port = strdup (devname);
|
||||
if (devname[0] == '/')
|
||||
dev->ppdevice = strdup (devname);
|
||||
else
|
||||
dev->port = strdup (devname);
|
||||
dev->buf_size = buf_size;
|
||||
|
||||
if (mdl > 610)
|
||||
|
@ -601,8 +628,7 @@ init_options (Umax_PP_Device * dev)
|
|||
|
||||
|
||||
|
||||
SANE_Status
|
||||
sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)
|
||||
SANE_Status sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)
|
||||
{
|
||||
char dev_name[512];
|
||||
const char *cp;
|
||||
|
@ -650,6 +676,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)
|
|||
if (strncmp (cp, "option", 6) == 0 && isspace (cp[6]))
|
||||
{
|
||||
|
||||
DBG (3, "init: evaluating option <%s>\n", cp);
|
||||
cp += 7;
|
||||
cp = sanei_config_skip_whitespace (cp);
|
||||
|
||||
|
@ -684,12 +711,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)
|
|||
devlist[0].buf_size = val;
|
||||
}
|
||||
}
|
||||
else if (strncmp (cp, "astra", 6) == 0)
|
||||
else if (strncmp (cp, "astra", 5) == 0)
|
||||
{
|
||||
char *end;
|
||||
long int val;
|
||||
|
||||
cp += 7;
|
||||
cp += 6;
|
||||
|
||||
errno = 0;
|
||||
val = strtol (cp, &end, 0);
|
||||
|
@ -978,13 +1005,13 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
|
|||
return SANE_STATUS_GOOD;
|
||||
}
|
||||
|
||||
SANE_Status
|
||||
sane_open (SANE_String_Const devicename, SANE_Handle * handle)
|
||||
SANE_Status sane_open (SANE_String_Const devicename, SANE_Handle * handle)
|
||||
{
|
||||
Umax_PP_Device *dev;
|
||||
Umax_PP_Descriptor *desc;
|
||||
int i, j;
|
||||
int rc, prt;
|
||||
int rc, prt = 0;
|
||||
char *name = NULL;
|
||||
|
||||
DBG (3, "open: device `%s'\n", devicename);
|
||||
|
||||
|
@ -1008,14 +1035,21 @@ sane_open (SANE_String_Const devicename, SANE_Handle * handle)
|
|||
|
||||
desc = &devlist[i];
|
||||
|
||||
if ((devlist[i].port[0] == '0')
|
||||
&& ((devlist[i].port[1] == 'x') || (devlist[i].port[1] == 'X')))
|
||||
prt = strtol (devlist[i].port + 2, NULL, 16);
|
||||
if (devlist[i].ppdevice[0] == '/')
|
||||
{
|
||||
name = devlist[i].ppdevice;
|
||||
}
|
||||
else
|
||||
prt = atoi (devlist[i].port);
|
||||
DBG (64, "open: devlist[i].port='%s' -> port=0x%X\n", devlist[i].port,
|
||||
prt);
|
||||
rc = sanei_umax_pp_open (prt);
|
||||
{
|
||||
if ((devlist[i].port[0] == '0')
|
||||
&& ((devlist[i].port[1] == 'x') || (devlist[i].port[1] == 'X')))
|
||||
prt = strtol (devlist[i].port + 2, NULL, 16);
|
||||
else
|
||||
prt = atoi (devlist[i].port);
|
||||
DBG (64, "open: devlist[i].port='%s' -> port=0x%X\n",
|
||||
devlist[i].port, prt);
|
||||
}
|
||||
rc = sanei_umax_pp_open (prt, name);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1029,22 +1063,44 @@ sane_open (SANE_String_Const devicename, SANE_Handle * handle)
|
|||
DBG (3, "open: trying default device %s, port=%s\n",
|
||||
devlist[0].sane.name, devlist[0].port);
|
||||
|
||||
rc = sanei_umax_pp_open (atoi (devlist[0].port));
|
||||
rc = sanei_umax_pp_open (atoi (devlist[0].port), NULL);
|
||||
|
||||
desc = &devlist[0];
|
||||
}
|
||||
switch (rc)
|
||||
{
|
||||
case UMAX1220P_TRANSPORT_FAILED:
|
||||
DBG (1, "failed to init transport layer on port 0x%03X\n",
|
||||
atoi (desc->port));
|
||||
if (name == NULL)
|
||||
{
|
||||
DBG (1, "failed to init transport layer on port 0x%03X\n",
|
||||
atoi (desc->port));
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG (1, "failed to init transport layer on device %s\n", name);
|
||||
}
|
||||
return SANE_STATUS_IO_ERROR;
|
||||
|
||||
case UMAX1220P_SCANNER_FAILED:
|
||||
DBG (1, "failed to initialize scanner on port 0x%03X\n",
|
||||
atoi (desc->port));
|
||||
if (name == NULL)
|
||||
{
|
||||
DBG (1, "failed to initialize scanner on port 0x%03X\n",
|
||||
atoi (desc->port));
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG (1, "failed to initialize scanner on device %s\n", name);
|
||||
}
|
||||
return SANE_STATUS_IO_ERROR;
|
||||
case UMAX1220P_BUSY:
|
||||
DBG (1, "busy scanner on port 0x%03X\n", atoi (desc->port));
|
||||
if (name == NULL)
|
||||
{
|
||||
DBG (1, "busy scanner on port 0x%03X\n", atoi (desc->port));
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG (1, "busy scanner on device %s\n", name);
|
||||
}
|
||||
return SANE_STATUS_DEVICE_BUSY;
|
||||
}
|
||||
|
||||
|
@ -1238,7 +1294,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
|||
return SANE_STATUS_INVAL;
|
||||
}
|
||||
|
||||
DBG (6, "control_option: option <%s>, action ... ", dev->opt[option].name,
|
||||
DBG (6, "control_option: option <%s>, action ... %d", dev->opt[option].name,
|
||||
action);
|
||||
|
||||
if (action == SANE_ACTION_GET_VALUE)
|
||||
|
@ -1665,8 +1721,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
|||
}
|
||||
|
||||
|
||||
SANE_Status
|
||||
sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
|
||||
SANE_Status sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
|
||||
{
|
||||
Umax_PP_Device *dev = handle;
|
||||
int dpi, remain;
|
||||
|
@ -1821,8 +1876,7 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
|
|||
}
|
||||
|
||||
|
||||
SANE_Status
|
||||
sane_start (SANE_Handle handle)
|
||||
SANE_Status sane_start (SANE_Handle handle)
|
||||
{
|
||||
Umax_PP_Device *dev = handle;
|
||||
int rc, autoset;
|
||||
|
@ -1898,8 +1952,8 @@ sane_start (SANE_Handle handle)
|
|||
dev->TopX,
|
||||
dev->TopY,
|
||||
dev->BottomX - dev->TopX,
|
||||
dev->BottomY - dev->TopY, dev->dpi, dev->green_gain << 4,
|
||||
dev->BottomY - dev->TopY, dev->dpi, dev->green_highlight << 4);
|
||||
dev->BottomY - dev->TopY, dev->dpi, dev->gray_gain << 4,
|
||||
dev->gray_highlight << 4);
|
||||
rc = sanei_umax_pp_start (dev->TopX,
|
||||
dev->TopY,
|
||||
dev->BottomX - dev->TopX,
|
||||
|
@ -1997,7 +2051,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
|
|||
/* re order data into RGB */
|
||||
if (dev->color == UMAX_PP_MODE_COLOR)
|
||||
{
|
||||
DBG (64, "sane_read: reordering %d bytes of data (lines=%d)\n",
|
||||
DBG (64, "sane_read: reordering %ld bytes of data (lines=%d)\n",
|
||||
length, nl);
|
||||
lbuf = (SANE_Byte *) malloc (dev->bufsize);
|
||||
if (lbuf == NULL)
|
||||
|
@ -2007,16 +2061,34 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
|
|||
return SANE_STATUS_NO_MEM;
|
||||
}
|
||||
/* this loop will be optimized when everything else will be working */
|
||||
for (y = 0; y < nl; y++)
|
||||
if (sanei_umax_pp_getastra () == 1600)
|
||||
{
|
||||
for (x = 0; x < dev->tw; x++)
|
||||
for (y = 0; y < nl; y++)
|
||||
{
|
||||
lbuf[x * dev->bpp + y * ll] =
|
||||
dev->buf[dev->bufread + x + y * ll + 2 * dev->tw];
|
||||
lbuf[x * dev->bpp + y * ll + 1] =
|
||||
dev->buf[dev->bufread + x + y * ll + dev->tw];
|
||||
lbuf[x * dev->bpp + y * ll + 2] =
|
||||
dev->buf[dev->bufread + x + y * ll];
|
||||
for (x = 0; x < dev->tw; x++)
|
||||
{
|
||||
lbuf[x * dev->bpp + y * ll] =
|
||||
dev->buf[dev->bufread + x + y * ll + 2 * dev->tw];
|
||||
lbuf[x * dev->bpp + y * ll + 1] =
|
||||
dev->buf[dev->bufread + x + y * ll];
|
||||
lbuf[x * dev->bpp + y * ll + 2] =
|
||||
dev->buf[dev->bufread + x + y * ll + dev->tw];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (y = 0; y < nl; y++)
|
||||
{
|
||||
for (x = 0; x < dev->tw; x++)
|
||||
{
|
||||
lbuf[x * dev->bpp + y * ll] =
|
||||
dev->buf[dev->bufread + x + y * ll + 2 * dev->tw];
|
||||
lbuf[x * dev->bpp + y * ll + 1] =
|
||||
dev->buf[dev->bufread + x + y * ll + dev->tw];
|
||||
lbuf[x * dev->bpp + y * ll + 2] =
|
||||
dev->buf[dev->bufread + x + y * ll];
|
||||
}
|
||||
}
|
||||
}
|
||||
/* avoids memcopy */
|
||||
|
@ -2037,7 +2109,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
|
|||
*len = length;
|
||||
dev->bufread += length;
|
||||
dev->read += length;
|
||||
DBG (64, "sane_read %d bytes read\n", length);
|
||||
DBG (64, "sane_read %ld bytes read\n", length);
|
||||
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
|
@ -2081,8 +2153,7 @@ sane_cancel (SANE_Handle handle)
|
|||
}
|
||||
}
|
||||
|
||||
SANE_Status
|
||||
sane_set_io_mode (SANE_Handle handle, SANE_Bool non_blocking)
|
||||
SANE_Status sane_set_io_mode (SANE_Handle handle, SANE_Bool non_blocking)
|
||||
{
|
||||
DBG (129, "unused arg: handle = %p, non_blocking = %d\n",
|
||||
handle, (int) non_blocking);
|
||||
|
@ -2092,11 +2163,10 @@ sane_set_io_mode (SANE_Handle handle, SANE_Bool non_blocking)
|
|||
return SANE_STATUS_UNSUPPORTED;
|
||||
}
|
||||
|
||||
SANE_Status
|
||||
sane_get_select_fd (SANE_Handle handle, SANE_Int * fd)
|
||||
SANE_Status sane_get_select_fd (SANE_Handle handle, SANE_Int * fd)
|
||||
{
|
||||
|
||||
DBG (129, "unused arg: handle = %p, fd = %p\n", handle, fd);
|
||||
DBG (129, "unused arg: handle = %p, fd = %p\n", handle, (void *)fd);
|
||||
|
||||
DBG (2, "get_select_fd: not supported\n");
|
||||
|
||||
|
|
|
@ -106,6 +106,7 @@ typedef struct Umax_PP_Descriptor
|
|||
SANE_Device sane;
|
||||
|
||||
SANE_String port;
|
||||
SANE_String ppdevice;
|
||||
|
||||
SANE_Int max_res;
|
||||
SANE_Int max_h_size;
|
||||
|
|
|
@ -399,7 +399,7 @@ sanei_parport_info (int number, int *addr)
|
|||
|
||||
|
||||
int
|
||||
sanei_umax_pp_InitPort (int port)
|
||||
sanei_umax_pp_InitPort (int port, char *name)
|
||||
{
|
||||
int fd;
|
||||
int found = 0;
|
||||
|
@ -408,9 +408,6 @@ sanei_umax_pp_InitPort (int port)
|
|||
#endif
|
||||
#ifdef HAVE_LINUX_PPDEV_H
|
||||
char strmodes[160];
|
||||
char parport_name[16];
|
||||
int i;
|
||||
int addr;
|
||||
#endif
|
||||
|
||||
/* since this function must be called before */
|
||||
|
@ -427,151 +424,146 @@ sanei_umax_pp_InitPort (int port)
|
|||
|
||||
|
||||
#ifdef HAVE_LINUX_PPDEV_H
|
||||
/* ppdev opening and configuration */
|
||||
/* we start with /dev/parport0 and go through all /dev/parportx */
|
||||
/* until we find the right one */
|
||||
i = 0;
|
||||
found = 0;
|
||||
sprintf (parport_name, "/dev/parport%d", i);
|
||||
fd = open (parport_name, O_RDWR | O_NOCTTY);
|
||||
while ((fd != -1) && (!found))
|
||||
if (name != NULL)
|
||||
{
|
||||
/* claim port */
|
||||
if (ioctl (fd, PPCLAIM))
|
||||
if (strlen (name) > 3)
|
||||
{
|
||||
DBG (1, "umax_pp: cannot claim port '%s'\n", parport_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* we check if parport does EPP or ECP */
|
||||
#ifdef PPGETMODES
|
||||
if (ioctl (fd, PPGETMODES, &mode))
|
||||
/* ppdev opening and configuration */
|
||||
found = 0;
|
||||
fd = open (name, O_RDWR | O_NOCTTY);
|
||||
if (fd < 0)
|
||||
{
|
||||
DBG (16, "umax_pp: ppdev couldn't gave modes for port '%s'\n",
|
||||
parport_name);
|
||||
switch (errno)
|
||||
{
|
||||
case ENOENT:
|
||||
DBG (1, "umax_pp: '%s' does not exist \n", name);
|
||||
break;
|
||||
case EACCES:
|
||||
DBG (1,
|
||||
"umax_pp: current user has not R/W permissions on '%s' \n",
|
||||
name);
|
||||
break;
|
||||
}
|
||||
return (0);
|
||||
|
||||
}
|
||||
/* claim port */
|
||||
if (ioctl (fd, PPCLAIM))
|
||||
{
|
||||
DBG (1, "umax_pp: cannot claim port '%s'\n", name);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf (strmodes, "\n");
|
||||
if (mode & PARPORT_MODE_PCSPP)
|
||||
sprintf (strmodes, "%s\t\tPARPORT_MODE_PCSPP\n", strmodes);
|
||||
if (mode & PARPORT_MODE_TRISTATE)
|
||||
sprintf (strmodes, "%s\t\tPARPORT_MODE_TRISTATE\n", strmodes);
|
||||
if (mode & PARPORT_MODE_EPP)
|
||||
sprintf (strmodes, "%s\t\tPARPORT_MODE_EPP\n", strmodes);
|
||||
if (mode & PARPORT_MODE_ECP)
|
||||
sprintf (strmodes, "%s\t\tPARPORT_MODE_ECP\n", strmodes);
|
||||
if (mode & PARPORT_MODE_COMPAT)
|
||||
sprintf (strmodes, "%s\t\tPARPORT_MODE_COMPAT\n", strmodes);
|
||||
if (mode & PARPORT_MODE_DMA)
|
||||
sprintf (strmodes, "%s\t\tPARPORT_MODE_DMA\n", strmodes);
|
||||
DBG (32, "parport modes: %X\n", mode);
|
||||
DBG (32, "parport modes: %s\n", strmodes);
|
||||
if (!(mode & PARPORT_MODE_EPP) && !(mode & PARPORT_MODE_ECP))
|
||||
/* we check if parport does EPP or ECP */
|
||||
#ifdef PPGETMODES
|
||||
if (ioctl (fd, PPGETMODES, &mode))
|
||||
{
|
||||
DBG (1,
|
||||
"port 0x%X does not have EPP or ECP, giving up ...\n",
|
||||
port);
|
||||
mode = IEEE1284_MODE_COMPAT;
|
||||
ioctl (fd, PPSETMODE, &mode);
|
||||
ioctl (fd, PPRELEASE);
|
||||
close (fd);
|
||||
return (0);
|
||||
DBG (16,
|
||||
"umax_pp: ppdev couldn't gave modes for port '%s'\n",
|
||||
name);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf (strmodes, "\n");
|
||||
if (mode & PARPORT_MODE_PCSPP)
|
||||
sprintf (strmodes, "%s\t\tPARPORT_MODE_PCSPP\n",
|
||||
strmodes);
|
||||
if (mode & PARPORT_MODE_TRISTATE)
|
||||
sprintf (strmodes, "%s\t\tPARPORT_MODE_TRISTATE\n",
|
||||
strmodes);
|
||||
if (mode & PARPORT_MODE_EPP)
|
||||
sprintf (strmodes, "%s\t\tPARPORT_MODE_EPP\n", strmodes);
|
||||
if (mode & PARPORT_MODE_ECP)
|
||||
sprintf (strmodes, "%s\t\tPARPORT_MODE_ECP\n", strmodes);
|
||||
if (mode & PARPORT_MODE_COMPAT)
|
||||
sprintf (strmodes, "%s\t\tPARPORT_MODE_COMPAT\n",
|
||||
strmodes);
|
||||
if (mode & PARPORT_MODE_DMA)
|
||||
sprintf (strmodes, "%s\t\tPARPORT_MODE_DMA\n", strmodes);
|
||||
DBG (32, "parport modes: %X\n", mode);
|
||||
DBG (32, "parport modes: %s\n", strmodes);
|
||||
if (!(mode & PARPORT_MODE_EPP)
|
||||
&& !(mode & PARPORT_MODE_ECP))
|
||||
{
|
||||
DBG (1,
|
||||
"port 0x%X does not have EPP or ECP, giving up ...\n",
|
||||
port);
|
||||
mode = IEEE1284_MODE_COMPAT;
|
||||
ioctl (fd, PPSETMODE, &mode);
|
||||
ioctl (fd, PPRELEASE);
|
||||
close (fd);
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
DBG (16,
|
||||
"umax_pp: ppdev used to build SANE doesn't have PPGETMODES.\n");
|
||||
DBG (16,
|
||||
"umax_pp: ppdev used to build SANE doesn't have PPGETMODES.\n");
|
||||
#endif
|
||||
/* prefered mode is EPP */
|
||||
mode = IEEE1284_MODE_EPP;
|
||||
mode = ioctl (fd, PPNEGOT, &mode);
|
||||
if (mode)
|
||||
{
|
||||
DBG (16,
|
||||
"umax_pp: ppdev couldn't negociate mode IEEE1284_MODE_EPP for '%s'\n",
|
||||
parport_name);
|
||||
}
|
||||
if (ioctl (fd, PPSETMODE, &mode))
|
||||
{
|
||||
DBG (16,
|
||||
"umax_pp: ppdev couldn't set mode to IEEE1284_MODE_EPP for '%s'\n",
|
||||
parport_name);
|
||||
|
||||
mode = IEEE1284_MODE_ECP;
|
||||
/* prefered mode is EPP */
|
||||
mode = IEEE1284_MODE_EPP;
|
||||
mode = ioctl (fd, PPNEGOT, &mode);
|
||||
if (mode)
|
||||
{
|
||||
DBG (16,
|
||||
"umax_pp: ppdev couldn't negociate mode IEEE1284_MODE_EPP for '%s'\n",
|
||||
name);
|
||||
}
|
||||
if (ioctl (fd, PPSETMODE, &mode))
|
||||
{
|
||||
DBG (16,
|
||||
"umax_pp: ppdev couldn't set mode to IEEE1284_MODE_ECP for '%s'\n",
|
||||
parport_name);
|
||||
DBG (1,
|
||||
"port 0x%X can't be set to EPP or ECP, giving up ...\n",
|
||||
port);
|
||||
"umax_pp: ppdev couldn't set mode to IEEE1284_MODE_EPP for '%s'\n",
|
||||
name);
|
||||
|
||||
mode = IEEE1284_MODE_COMPAT;
|
||||
ioctl (fd, PPSETMODE, &mode);
|
||||
ioctl (fd, PPRELEASE);
|
||||
close (fd);
|
||||
return (0);
|
||||
mode = IEEE1284_MODE_ECP;
|
||||
if (ioctl (fd, PPSETMODE, &mode))
|
||||
{
|
||||
DBG (16,
|
||||
"umax_pp: ppdev couldn't set mode to IEEE1284_MODE_ECP for '%s'\n",
|
||||
name);
|
||||
DBG (1,
|
||||
"port 0x%X can't be set to EPP or ECP, giving up ...\n",
|
||||
port);
|
||||
|
||||
mode = IEEE1284_MODE_COMPAT;
|
||||
ioctl (fd, PPSETMODE, &mode);
|
||||
ioctl (fd, PPRELEASE);
|
||||
close (fd);
|
||||
return (0);
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG (16,
|
||||
"umax_pp: mode set to PARPORT_MODE_ECP for '%s'\n",
|
||||
name);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG (16,
|
||||
"umax_pp: mode set to PARPORT_MODE_ECP for '%s'\n",
|
||||
parport_name);
|
||||
"umax_pp: mode set to PARPORT_MODE_EPP for '%s'\n",
|
||||
name);
|
||||
}
|
||||
|
||||
|
||||
/* allways start in compat mode (for probe) */
|
||||
mode = IEEE1284_MODE_COMPAT;
|
||||
ioctl (fd, PPSETMODE, &mode);
|
||||
found = 1;
|
||||
|
||||
}
|
||||
|
||||
if (!found)
|
||||
{
|
||||
DBG (1, "device %s does not fit ...\n",name);
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG (16,
|
||||
"umax_pp: mode set to PARPORT_MODE_EPP for '%s'\n",
|
||||
parport_name);
|
||||
}
|
||||
|
||||
|
||||
/* find the base addr of ppdev */
|
||||
if (sanei_parport_info (i, &addr))
|
||||
{
|
||||
if (gPort == addr)
|
||||
{
|
||||
found = 1;
|
||||
DBG (1, "Using /proc info\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* allways start in compat mode (for probe) */
|
||||
mode = IEEE1284_MODE_COMPAT;
|
||||
ioctl (fd, PPSETMODE, &mode);
|
||||
|
||||
/* release port */
|
||||
if (!found)
|
||||
{
|
||||
ioctl (fd, PPRELEASE);
|
||||
DBG (1, "Using %s ...\n", name);
|
||||
sanei_umax_pp_setparport (fd);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* next parport */
|
||||
if (!found)
|
||||
{
|
||||
close (fd);
|
||||
i++;
|
||||
sprintf (parport_name, "/dev/parport%d", i);
|
||||
fd = open (parport_name, O_RDONLY | O_NOCTTY);
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
{
|
||||
DBG (1, "no relevant /dev/parportx found...\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG (1, "Using /dev/parport%d ...\n", i);
|
||||
sanei_umax_pp_setparport (fd);
|
||||
return (1);
|
||||
}
|
||||
#endif /* HAVE_LINUX_PPDEV_H */
|
||||
|
||||
|
@ -836,7 +828,7 @@ Outsw (int port, unsigned char *source, int size)
|
|||
static int scannerStatus = 0;
|
||||
static int epp32 = 1;
|
||||
static int model = 0x15;
|
||||
static int astra = 1220;
|
||||
static int astra = 0;
|
||||
|
||||
int
|
||||
sanei_umax_pp_ScannerStatus (void)
|
||||
|
@ -2533,6 +2525,8 @@ SendWord (int *cmd)
|
|||
/******************************************************************************/
|
||||
/* RingScanner: returns 1 if scanner present, else 0 */
|
||||
/******************************************************************************/
|
||||
#define UMAX_PP_PAUSE 100
|
||||
|
||||
static int
|
||||
RingScanner (void)
|
||||
{
|
||||
|
@ -2557,29 +2551,29 @@ RingScanner (void)
|
|||
|
||||
/* send ring string */
|
||||
Outb (DATA, 0x22);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0x22);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0xAA);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0xAA);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0x55);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0x55);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0x00);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0x00);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0xFF);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0xFF);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
|
||||
/* OK ? */
|
||||
status = Inb (STATUS);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
if ((status & 0xB8) != 0xB8)
|
||||
{
|
||||
DBG (1, "status %d doesn't match! %s:%d\n", status, __FILE__, __LINE__);
|
||||
|
@ -2590,11 +2584,11 @@ RingScanner (void)
|
|||
if (ret)
|
||||
{
|
||||
Outb (DATA, 0x87);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0x87);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
status = Inb (STATUS);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
if ((status & 0xB8) != 0x18)
|
||||
{
|
||||
DBG (1, "status %d doesn't match! %s:%d\n", status, __FILE__,
|
||||
|
@ -2607,9 +2601,9 @@ RingScanner (void)
|
|||
if (ret)
|
||||
{
|
||||
Outb (DATA, 0x78);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0x78);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
status = Inb (STATUS);
|
||||
if ((status & 0x30) != 0x30)
|
||||
{
|
||||
|
@ -2623,13 +2617,13 @@ RingScanner (void)
|
|||
if (ret)
|
||||
{
|
||||
Outb (DATA, 0x08);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0x08);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0xFF);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
Outb (DATA, 0xFF);
|
||||
usleep (1000);
|
||||
usleep (UMAX_PP_PAUSE);
|
||||
}
|
||||
|
||||
/* restore state */
|
||||
|
@ -4164,7 +4158,8 @@ Probe610P (int recover)
|
|||
recover = 0; /* quit compiler quiet .. */
|
||||
|
||||
/* make sure we won't try 1220/200P later */
|
||||
sanei_umax_pp_setastra (610);
|
||||
if(!sanei_umax_pp_getastra())
|
||||
sanei_umax_pp_setastra (610);
|
||||
if (!Test610P (0x87))
|
||||
{
|
||||
DBG (1, "Ring610P(0x87) failed (%s:%d)\n", __FILE__, __LINE__);
|
||||
|
@ -4997,7 +4992,7 @@ sanei_umax_pp_ProbeScanner (int recover)
|
|||
__FILE__, __LINE__);
|
||||
if (CmdSetDataBuffer (voidbuf) != 1)
|
||||
{
|
||||
DBG (0, "Loop %d: CmdSetDataBuffer(voidbuf) failed ! (%s:%d) \n",
|
||||
DBG (0, "Loop %d: CmdSetDataBuffer(voidbuf) failed ! (%s:%d) \n",i,
|
||||
__FILE__, __LINE__);
|
||||
return (0);
|
||||
}
|
||||
|
@ -6159,12 +6154,12 @@ DumpRVB (int width, int height, unsigned char *data, char *name)
|
|||
sprintf (titre, "%s", name);
|
||||
}
|
||||
fic = fopen (titre, "wb");
|
||||
fprintf (fic, "P6\n%d %d\n255\n", width, height);
|
||||
if (fic == NULL)
|
||||
{
|
||||
DBG (0, "could not open %s for writing\n", titre);
|
||||
return;
|
||||
}
|
||||
fprintf (fic, "P6\n%d %d\n255\n", width, height);
|
||||
for (y = 0; y < height; y++)
|
||||
{
|
||||
for (x = 0; x < width; x++)
|
||||
|
@ -6218,7 +6213,7 @@ EvalGain (int sum, int count)
|
|||
{
|
||||
int gn;
|
||||
|
||||
/* 19000 is a little to bright */
|
||||
/* 19000 is a little too bright */
|
||||
gn = (int) ((double) (18500 * count) / sum - 100 + 0.5);
|
||||
if (gn < 0)
|
||||
gn = 0;
|
||||
|
@ -6606,6 +6601,7 @@ MoveToOrigin (void)
|
|||
if ((edge <= 30) && (sanei_umax_pp_getastra () != 1600))
|
||||
{
|
||||
DBG (2, "MoveToOrigin() detected a 1600P");
|
||||
if(!sanei_umax_pp_getastra())
|
||||
sanei_umax_pp_setastra (1600);
|
||||
}
|
||||
edge = EdgePosition (300, 180, buffer);
|
||||
|
@ -7285,8 +7281,8 @@ sanei_umax_pp_Scan (int x, int y, int width, int height, int dpi, int color,
|
|||
/* write data to file operation */
|
||||
/*blocksize=(2096100/bpl)*bpl; */
|
||||
bpl = bpp * tw;
|
||||
hp = 16776960 / bpl; /* 16 Mo buffer (!!) */
|
||||
hp = 2096100 / bpl;
|
||||
hp = 16776960 / bpl;
|
||||
blocksize = hp * bpl;
|
||||
nb = 0;
|
||||
read = 0;
|
||||
|
@ -7345,7 +7341,6 @@ sanei_umax_pp_Scan (int x, int y, int width, int height, int dpi, int color,
|
|||
DBG (8, "Read %ld bytes out of %ld ...\n", read, somme);
|
||||
DBG (8, "Read %d blocks ... \n", nb);
|
||||
|
||||
|
||||
/* write partial buffer to file */
|
||||
if (len)
|
||||
{
|
||||
|
@ -7386,6 +7381,11 @@ sanei_umax_pp_Scan (int x, int y, int width, int height, int dpi, int color,
|
|||
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
gettimeofday (&tf, NULL);
|
||||
|
||||
/* scan time are high enough to forget about usec */
|
||||
elapsed = tf.tv_sec - td.tv_sec;
|
||||
DBG (8, "%ld bytes transfered in %f seconds ( %.2f Kb/s)\n", somme,
|
||||
elapsed, (somme / elapsed) / 1024.0);
|
||||
#endif
|
||||
|
||||
/* release ressources */
|
||||
|
@ -7394,13 +7394,6 @@ sanei_umax_pp_Scan (int x, int y, int width, int height, int dpi, int color,
|
|||
free (dest);
|
||||
free (buffer);
|
||||
|
||||
/* scan time are high enough to forget about usec */
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
elapsed = tf.tv_sec - td.tv_sec;
|
||||
DBG (8, "%ld bytes transfered in %f seconds ( %.2f Kb/s)\n", somme,
|
||||
elapsed, (somme / elapsed) / 1024.0);
|
||||
#endif
|
||||
|
||||
|
||||
/* park head */
|
||||
distance = distance + y + height;
|
||||
|
@ -8039,6 +8032,7 @@ sanei_umax_pp_CheckModel (void)
|
|||
/* if data has turned into 0, we have a 2000P */
|
||||
if (dest[1] == 0x00)
|
||||
{
|
||||
if(!sanei_umax_pp_getastra())
|
||||
sanei_umax_pp_setastra (2000);
|
||||
err = 2000;
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
/*****************************************************************************/
|
||||
/* set port to 'idle state' and get iopl */
|
||||
/*****************************************************************************/
|
||||
extern int sanei_umax_pp_InitPort (int port);
|
||||
extern int sanei_umax_pp_InitPort (int port, char *name);
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -169,7 +169,16 @@ sanei_umax_pp_model (int port, int *model)
|
|||
unlock_parport ();
|
||||
return (UMAX1220P_TRANSPORT_FAILED);
|
||||
}
|
||||
rc = sanei_umax_pp_CheckModel ();
|
||||
|
||||
/* check model only, and if only none given in conf file */
|
||||
if (!sanei_umax_pp_getastra ())
|
||||
{
|
||||
rc = sanei_umax_pp_CheckModel ();
|
||||
}
|
||||
else
|
||||
{
|
||||
rc = sanei_umax_pp_getastra ();
|
||||
}
|
||||
sanei_umax_pp_EndSession ();
|
||||
unlock_parport ();
|
||||
if (rc < 610)
|
||||
|
@ -186,14 +195,22 @@ sanei_umax_pp_model (int port, int *model)
|
|||
}
|
||||
|
||||
int
|
||||
sanei_umax_pp_attach (int port)
|
||||
sanei_umax_pp_attach (int port, char *name)
|
||||
{
|
||||
int recover = 0;
|
||||
|
||||
/* set up port */
|
||||
DBG (3, "sanei_umax_pp_attach\n");
|
||||
if (name == NULL)
|
||||
{
|
||||
DBG (3, "sanei_umax_pp_attach(%d,NULL)\n", port);
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG (3, "sanei_umax_pp_attach(%d,%s)\n", port, name);
|
||||
}
|
||||
|
||||
sanei_umax_pp_setport (port);
|
||||
if (sanei_umax_pp_InitPort (port) != 1)
|
||||
if (sanei_umax_pp_InitPort (port, name) != 1)
|
||||
return (UMAX1220P_PROBE_FAILED);
|
||||
|
||||
/* init port locks the port, so we flag that */
|
||||
|
@ -228,14 +245,17 @@ sanei_umax_pp_attach (int port)
|
|||
|
||||
|
||||
int
|
||||
sanei_umax_pp_open (int port)
|
||||
sanei_umax_pp_open (int port, char *name)
|
||||
{
|
||||
int rc;
|
||||
int recover = 0;
|
||||
|
||||
/* set up port */
|
||||
DBG (3, "sanei_umax_pp_open\n");
|
||||
sanei_umax_pp_setport (port);
|
||||
|
||||
if (name == NULL)
|
||||
sanei_umax_pp_setport (port);
|
||||
|
||||
if (lock_parport () == UMAX1220P_BUSY)
|
||||
return (UMAX1220P_BUSY);
|
||||
|
||||
|
|
|
@ -66,12 +66,15 @@
|
|||
initialize transport layer
|
||||
probe scanner
|
||||
|
||||
if name is null, direct I/O is attempted to address given in port
|
||||
else ppdev is tried using the given name as device
|
||||
|
||||
on success returns UMAX1220P_OK,
|
||||
else one of the error above.
|
||||
|
||||
*/
|
||||
|
||||
extern int sanei_umax_pp_attach (int port);
|
||||
extern int sanei_umax_pp_attach (int port, char *name);
|
||||
|
||||
/*
|
||||
recognizes 1220P from 2000P
|
||||
|
@ -104,9 +107,12 @@ extern int sanei_umax_pp_lamp (int on);
|
|||
on succes returns UMAX1220P_OK,
|
||||
else one of the error above.
|
||||
|
||||
port: addr when doing direc I/O
|
||||
name: ppdev character device name
|
||||
|
||||
*/
|
||||
|
||||
extern int sanei_umax_pp_open (int port);
|
||||
extern int sanei_umax_pp_open (int port,char *name);
|
||||
|
||||
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue