diff --git a/backend/umax_pp.c b/backend/umax_pp.c index 0cc4c58cb..5523ce9ab 100644 --- a/backend/umax_pp.c +++ b/backend/umax_pp.c @@ -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"); diff --git a/backend/umax_pp.h b/backend/umax_pp.h index eb9b85075..5037b43ab 100644 --- a/backend/umax_pp.h +++ b/backend/umax_pp.h @@ -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; diff --git a/backend/umax_pp_low.c b/backend/umax_pp_low.c index 64c39608c..875beddb0 100644 --- a/backend/umax_pp_low.c +++ b/backend/umax_pp_low.c @@ -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; } diff --git a/backend/umax_pp_low.h b/backend/umax_pp_low.h index 52f330646..6da3fb7ca 100644 --- a/backend/umax_pp_low.h +++ b/backend/umax_pp_low.h @@ -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); diff --git a/backend/umax_pp_mid.c b/backend/umax_pp_mid.c index 26d10c880..f6650235f 100644 --- a/backend/umax_pp_mid.c +++ b/backend/umax_pp_mid.c @@ -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); diff --git a/backend/umax_pp_mid.h b/backend/umax_pp_mid.h index 0b6fac75b..f6b503a15 100644 --- a/backend/umax_pp_mid.h +++ b/backend/umax_pp_mid.h @@ -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);