--- backend/lexmark.c | 13 +- backend/lexmark.conf.in | 2 + backend/lexmark.h | 21 +- backend/lexmark_low.c | 3802 ++++++++++++++++++++++++++++----------------- backend/lexmark_models.c | 35 +- backend/lexmark_sensors.c | 19 +- 6 files changed, 2440 insertions(+), 1452 deletions(-)
diff --git a/backend/lexmark.c b/backend/lexmark.c index a4b5bba..23aab45 100644 --- a/backend/lexmark.c +++ b/backend/lexmark.c @@ -78,6 +78,10 @@ static SANE_Int x1200_dpi_list[] = { 4, 75, 150, 300, 600 }; +static SANE_Int x74_dpi_list[] = { + 75, 150, 300, 600 +}; + static SANE_Range threshold_range = { SANE_FIX (0.0), /* minimum */ SANE_FIX (100.0), /* maximum */ @@ -103,6 +107,7 @@ static SANE_Range x_range = { static SANE_Range y_range = { 0, /* minimum */ 6848, /* maximum */ + /* 7032, for X74 */ 8 /* quantization */ }; @@ -170,6 +175,9 @@ init_options (Lexmark_Device * dev) case X1200_USB2_SENSOR: od->constraint.word_list = x1200_dpi_list; break; + case X74_SENSOR: + od->constraint.word_list = x74_dpi_list; + break; } dev->val[OPT_RESOLUTION].w = 75; @@ -1111,19 +1119,20 @@ sane_start (SANE_Handle handle) /* Scan backwards until we find home */ sanei_lexmark_low_search_home_bwd (lexmark_device); } - /* do calibration before offset detection , use sensor max dpi, not motor's one */ resolution = lexmark_device->val[OPT_RESOLUTION].w; if(resolution > 600) { resolution = 600; } + + sanei_lexmark_low_set_scan_regs (lexmark_device, resolution, 0, SANE_FALSE); status = sanei_lexmark_low_calibration (lexmark_device); if (status != SANE_STATUS_GOOD) { DBG (1, "sane_start: calibration failed : %s ! \n", - sane_strstatus (status)); + sane_strstatus (status)); return status; } diff --git a/backend/lexmark.conf.in b/backend/lexmark.conf.in index 61049e4..c0bf868 100644 --- a/backend/lexmark.conf.in +++ b/backend/lexmark.conf.in @@ -4,3 +4,5 @@ usb 0x043d 0x007c usb 0x043d 0x007d # Dell A920 usb 0x413c 0x5105 +# X74 +usb 0x43d 0x0060 diff --git a/backend/lexmark.h b/backend/lexmark.h index 9354e26..6e1fe5e 100644 --- a/backend/lexmark.h +++ b/backend/lexmark.h @@ -1,8 +1,8 @@ -/************************************************************************** +/************************************************************************ lexmark.h - SANE library for Lexmark scanners. Copyright (C) 2003-2004 Lexmark International, Inc. (original source) Copyright (C) 2005 Fred Odendaal - Copyright (C) 2006-2009 St?phane Voltz <stef.dev at free.fr> + Copyright (C) 2006-2009 St??phane Voltz <stef.dev at free.fr> This file is part of the SANE package. @@ -45,7 +45,7 @@ #ifndef LEXMARK_H #define LEXMARK_H -#undef DEEP_DEBUG +#define DEEP_DEBUG #include "../include/sane/config.h" @@ -109,6 +109,8 @@ typedef struct Lexmark_Model SANE_String_Const model; SANE_Int motor_type; SANE_Int sensor_type; + SANE_Int HomeEdgePoint1; + SANE_Int HomeEdgePoint2; } Lexmark_Model; /* @@ -233,12 +235,14 @@ Lexmark_Device; /* motors and sensors type defines */ #define X1100_MOTOR 1 #define A920_MOTOR 2 +#define X74_MOTOR 3 -#define X1100_B2_SENSOR 3 -#define A920_SENSOR 4 -#define X1100_2C_SENSOR 5 -#define X1200_SENSOR 6 /* X1200 on USB 1.0 */ -#define X1200_USB2_SENSOR 7 /* X1200 on USB 2.0 */ +#define X1100_B2_SENSOR 4 +#define A920_SENSOR 5 +#define X1100_2C_SENSOR 6 +#define X1200_SENSOR 7 /* X1200 on USB 1.0 */ +#define X1200_USB2_SENSOR 8 /* X1200 on USB 2.0 */ +#define X74_SENSOR 9 /* Non-static Function Proto-types (called by lexmark.c) */ SANE_Status sanei_lexmark_low_init (Lexmark_Device * dev); @@ -248,6 +252,7 @@ void sanei_lexmark_low_close_device (Lexmark_Device * dev); SANE_Bool sanei_lexmark_low_search_home_fwd (Lexmark_Device * dev); void sanei_lexmark_low_move_fwd (SANE_Int distance, Lexmark_Device * dev, SANE_Byte * regs); +SANE_Bool sanei_lexmark_low_X74_search_home (Lexmark_Device * dev, SANE_Byte * regs); SANE_Bool sanei_lexmark_low_search_home_bwd (Lexmark_Device * dev); SANE_Int sanei_lexmark_low_find_start_line (Lexmark_Device * dev); SANE_Status sanei_lexmark_low_set_scan_regs (Lexmark_Device * dev, diff --git a/backend/lexmark_low.c b/backend/lexmark_low.c index 7de3557..bb6de6c 100644 --- a/backend/lexmark_low.c +++ b/backend/lexmark_low.c @@ -1,7 +1,7 @@ /* lexmark-low.c: scanner-interface file for low Lexmark scanners. (C) 2005 Fred Odendaal - (C) 2006-2009 St?phane Voltz <stef.dev at free.fr> + (C) 2006-2009 St??phane Voltz <stef.dev at free.fr> This file is part of the SANE package. @@ -61,14 +61,9 @@ typedef enum } region_type; -/* - * all these defines may be move in device specific constant in per model - * struct if we need it - */ -#define HomeEdgePoint1 1235 -#define HomeEdgePoint2 1258 #define HomeTolerance 30 + #define LOBYTE(x) ((uint8_t)((x) & 0xFF)) #define HIBYTE(x) ((uint8_t)((x) >> 8)) @@ -78,7 +73,7 @@ static SANE_Status low_usb_bulk_write (SANE_Int devnum, static SANE_Status low_usb_bulk_read (SANE_Int devnum, SANE_Byte * buf, size_t * size); static SANE_Status low_write_all_regs (SANE_Int devnum, SANE_Byte * regs); -static SANE_Bool low_is_home_line (unsigned char *buffer); +static SANE_Bool low_is_home_line (Lexmark_Device * dev, unsigned char *buffer); static SANE_Status low_get_start_loc (SANE_Int resolution, SANE_Int * vert_start, SANE_Int * hor_start, @@ -483,6 +478,61 @@ sanei_lexmark_low_init (Lexmark_Device * dev) switch (dev->model.sensor_type) { + case X74_SENSOR: + dev->shadow_regs[0x00] = 0x04; + dev->shadow_regs[0x01] = 0x43; + dev->shadow_regs[0x0b] = 0x70; + dev->shadow_regs[0x12] = 0x0f; + dev->shadow_regs[0x16] = 0x07; + dev->shadow_regs[0x1d] = 0x20; + dev->shadow_regs[0x28] = 0xe0; + dev->shadow_regs[0x29] = 0xe3; + dev->shadow_regs[0x2a] = 0xeb; + dev->shadow_regs[0x2b] = 0x0d; + dev->shadow_regs[0x2e] = 0x40; + dev->shadow_regs[0x2e] = 0x86; + dev->shadow_regs[0x2f] = 0x01; + dev->shadow_regs[0x30] = 0x48; + dev->shadow_regs[0x31] = 0x06; + dev->shadow_regs[0x33] = 0x01; + dev->shadow_regs[0x34] = 0x50; + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x36] = 0x50; + dev->shadow_regs[0x37] = 0x01; + dev->shadow_regs[0x38] = 0x50; + dev->shadow_regs[0x3a] = 0x20; + dev->shadow_regs[0x3c] = 0x88; + dev->shadow_regs[0x3d] = 0x08; + dev->shadow_regs[0x65] = 0x80; + dev->shadow_regs[0x66] = 0x64; + dev->shadow_regs[0x6c] = 0xc8; + dev->shadow_regs[0x72] = 0x1a; + dev->shadow_regs[0x74] = 0x23; + dev->shadow_regs[0x75] = 0x03; + dev->shadow_regs[0x79] = 0x40; + dev->shadow_regs[0x7A] = 0x01; + dev->shadow_regs[0x8d] = 0x01; + dev->shadow_regs[0x8e] = 0x60; + dev->shadow_regs[0x8f] = 0x80; + dev->shadow_regs[0x93] = 0x02; + dev->shadow_regs[0x94] = 0x0e; + dev->shadow_regs[0xa3] = 0xcc; + dev->shadow_regs[0xa4] = 0x27; + dev->shadow_regs[0xa5] = 0x24; + dev->shadow_regs[0xc2] = 0x80; + dev->shadow_regs[0xc3] = 0x01; + dev->shadow_regs[0xc4] = 0x20; + dev->shadow_regs[0xc5] = 0x0a; + dev->shadow_regs[0xc8] = 0x04; + dev->shadow_regs[0xc9] = 0x39; + dev->shadow_regs[0xca] = 0x0a; + dev->shadow_regs[0xe2] = 0x70; + dev->shadow_regs[0xe3] = 0x17; + dev->shadow_regs[0xf3] = 0xe0; + dev->shadow_regs[0xf4] = 0xff; + dev->shadow_regs[0xf5] = 0x01; + status = SANE_STATUS_GOOD; + break; case X1100_B2_SENSOR: dev->shadow_regs[0x01] = 0x43; dev->shadow_regs[0x0b] = 0x70; @@ -998,7 +1048,7 @@ low_simple_scan (Lexmark_Device * dev, SANE_Byte * regs, int xoffset, regs[0x60] = LOBYTE (yoffset); regs[0x61] = HIBYTE (yoffset); yend = yoffset + lines; - if (dev->model.motor_type == A920_MOTOR && rts88xx_is_color (regs) + if ((dev->model.motor_type == A920_MOTOR || dev->model.motor_type == X74_MOTOR) && rts88xx_is_color (regs) && dev->val[OPT_RESOLUTION].w == 600) yend *= 2; regs[0x62] = LOBYTE (yend); @@ -1050,9 +1100,9 @@ low_simple_scan (Lexmark_Device * dev, SANE_Byte * regs, int xoffset, { /* this block would deserve to be a function */ status = - rts88xx_read_data (dev->devnum, needed - read, (*data) + read, &size); + rts88xx_read_data (dev->devnum, needed - read, (*data) + read, &size); if (status != SANE_STATUS_GOOD) - return status; + return status; read += size; } while (read < needed); @@ -1062,15 +1112,15 @@ low_simple_scan (Lexmark_Device * dev, SANE_Byte * regs, int xoffset, { i = 0; do - { - if (rts88xx_read_reg (dev->devnum, 0xb3, ®) != SANE_STATUS_GOOD) - { - DBG (5, "low_simple_scan: register read failed ...\n"); - return SANE_STATUS_IO_ERROR; - } - usleep (100000); - i++; - } + { + if (rts88xx_read_reg (dev->devnum, 0xb3, ®) != SANE_STATUS_GOOD) + { + DBG (5, "low_simple_scan: register read failed ...\n"); + return SANE_STATUS_IO_ERROR; + } + usleep (100000); + i++; + } while ((reg & 0x08) && (i < 100)); if (reg & 0x08) { @@ -1137,7 +1187,8 @@ sanei_lexmark_low_open_device (Lexmark_Device * dev) DBG (2, "sanei_lexmark_low_open_device: initial registers values\n"); for (i = 0; i < 255; i++) { - sprintf (msg+i*5, "0x%02x ", shadow_regs[i]); + if ((i+1) % 16 == 0) sprintf (msg+i*5, "0x%02x\n", shadow_regs[i]); + else sprintf (msg+i*5, "0x%02x ", shadow_regs[i]); } DBG (3, "%s\n",msg); } @@ -1233,7 +1284,9 @@ low_write_all_regs (SANE_Int devnum, SANE_Byte * regs) fprintf (stderr, "write_all(0x00,255)="); for (i = 0; i < 255; i++) { - fprintf (stderr, "0x%02x ", regs[i]); + if ((i+4)%16 == 0) + fprintf (stderr, "\n"); + fprintf (stderr, "%02x ", regs[i]); } fprintf (stderr, "\n"); #endif @@ -1250,7 +1303,7 @@ low_write_all_regs (SANE_Int devnum, SANE_Byte * regs) SANE_Bool -low_is_home_line (unsigned char *buffer) +low_is_home_line (Lexmark_Device * dev, unsigned char *buffer) { /* This function assumes the buffer has a size of 2500 bytes.It is @@ -1286,7 +1339,8 @@ low_is_home_line (unsigned char *buffer) unsigned char min_byte = 0xFF; unsigned char average; int i; - + int home_point1; + int home_point2; region_type region; int transition_counter; int index1 = 0; @@ -1376,10 +1430,14 @@ low_is_home_line (unsigned char *buffer) DBG (15, "low_is_home_line: transitions!=2 (%d)\n", transition_counter); return SANE_FALSE; } + + + /* Check that the 1st index is in range */ - low_range = HomeEdgePoint1 - HomeTolerance; - high_range = HomeEdgePoint1 + HomeTolerance; + home_point1 = dev->model.HomeEdgePoint1; + low_range = home_point1 - HomeTolerance; + high_range = home_point1 + HomeTolerance; if ((index1 < low_range) || (index1 > high_range)) { @@ -1387,13 +1445,15 @@ low_is_home_line (unsigned char *buffer) return SANE_FALSE; } + /* Check that the 2nd index is in range */ - low_range = HomeEdgePoint2 - HomeTolerance; - high_range = HomeEdgePoint2 + HomeTolerance; + home_point2 = dev->model.HomeEdgePoint2; + low_range = home_point2 - HomeTolerance; + high_range = home_point2 + HomeTolerance; if ((index2 < low_range) || (index2 > high_range)) { - DBG (15, "low_is_home_line: index2=%d out of range\n", index2); + DBG (15, "low_is_home_line: index2=%d out of range.\n", index2); return SANE_FALSE; } @@ -1434,6 +1494,10 @@ sanei_lexmark_low_move_fwd (SANE_Int distance, Lexmark_Device * dev, regs[0x65] = 0x80; switch (dev->model.sensor_type) { + case X74_SENSOR: + rts88xx_set_scan_frequency (regs, 0); + regs[0x93] = 0x06; + break; case X1100_B2_SENSOR: regs[0x8b] = 0x00; regs[0x8c] = 0x00; @@ -1488,31 +1552,59 @@ sanei_lexmark_low_move_fwd (SANE_Int distance, Lexmark_Device * dev, regs[0xb2] = 0x04; /* Motor enable & Coordinate space denominator */ regs[0xc3] = 0x81; + /* Movement direction & step size */ + regs[0xc6] = 0x09; /* ? */ regs[0x80] = 0x00; regs[0x81] = 0x00; regs[0x82] = 0x00; regs[0xc5] = 0x0a; - /* Movement direction & step size */ - regs[0xc6] = 0x09; - /* step size range2 */ - regs[0xc9] = 0x3b; - /* ? */ - regs[0xca] = 0x0a; - /* motor curve stuff */ - regs[0xe0] = 0x00; - regs[0xe1] = 0x00; - regs[0xe4] = 0x00; - regs[0xe5] = 0x00; - regs[0xe7] = 0x00; - regs[0xe8] = 0x00; - - regs[0xe2] = 0x09; - regs[0xe3] = 0x1a; - regs[0xe6] = 0xdc; - regs[0xe9] = 0x1b; - regs[0xec] = 0x07; - regs[0xef] = 0x03; + + + switch (dev->model.motor_type) + { + case X1100_MOTOR: + case A920_MOTOR: + /* step size range2 */ + regs[0xc9] = 0x3b; + /* ? */ + regs[0xca] = 0x0a; + /* motor curve stuff */ + regs[0xe0] = 0x00; + regs[0xe1] = 0x00; + regs[0xe4] = 0x00; + regs[0xe5] = 0x00; + regs[0xe7] = 0x00; + regs[0xe8] = 0x00; + regs[0xe2] = 0x09; + regs[0xe3] = 0x1a; + regs[0xe6] = 0xdc; + regs[0xe9] = 0x1b; + regs[0xec] = 0x07; + regs[0xef] = 0x03; + break; + case X74_MOTOR: + regs[0xc5] = 0x41; + /* step size range2 */ + regs[0xc9] = 0x39; + /* ? */ + regs[0xca] = 0x40; + /* motor curve stuff */ + regs[0xe0] = 0x00; + regs[0xe1] = 0x00; + regs[0xe2] = 0x09; + regs[0xe3] = 0x1a; + regs[0xe4] = 0x00; + regs[0xe5] = 0x00; + regs[0xe6] = 0x64; + regs[0xe7] = 0x00; + regs[0xe8] = 0x00; + regs[0xe9] = 0x32; + regs[0xec] = 0x0c; + regs[0xef] = 0x08; + break; + } + /* prepare for register write */ low_clr_c6 (devnum); @@ -1546,6 +1638,11 @@ sanei_lexmark_low_move_fwd (SANE_Int distance, Lexmark_Device * dev, } #endif } + + /* this is needed to find the start line properly */ + if (dev->model.sensor_type == X74_SENSOR) + low_stop_mvmt (devnum); + DBG (2, "sanei_lexmark_low_move_fwd: end.\n"); } @@ -1575,6 +1672,22 @@ sanei_lexmark_low_search_home_fwd (Lexmark_Device * dev) /* set up registers according to the sensor type */ switch (dev->model.sensor_type) { + case X74_SENSOR: + dev->shadow_regs[0x2c] = 0x03; + dev->shadow_regs[0x2d] = 0x45; + dev->shadow_regs[0x2f] = 0x21; + dev->shadow_regs[0x30] = 0x48; + dev->shadow_regs[0x31] = 0x06; + dev->shadow_regs[0x34] = 0x05; + dev->shadow_regs[0x35] = 0x05; + dev->shadow_regs[0x36] = 0x09; + dev->shadow_regs[0x37] = 0x09; + dev->shadow_regs[0x38] = 0x0d; + dev->shadow_regs[0x40] = 0x80; + dev->shadow_regs[0x75] = 0x00; + dev->shadow_regs[0x8b] = 0xff; + dev->shadow_regs[0x93] = 0x06; + break; case X1100_B2_SENSOR: dev->shadow_regs[0x2c] = 0x0f; dev->shadow_regs[0x2d] = 0x51; @@ -1585,7 +1698,6 @@ sanei_lexmark_low_search_home_fwd (Lexmark_Device * dev) dev->shadow_regs[0x37] = 0x08; dev->shadow_regs[0x38] = 0x0b; dev->shadow_regs[0x93] = 0x06; - break; case X1100_2C_SENSOR: dev->shadow_regs[0x2c] = 0x0d; @@ -1655,7 +1767,6 @@ sanei_lexmark_low_search_home_fwd (Lexmark_Device * dev) dev->shadow_regs[0x0b] = 0x70; dev->shadow_regs[0x0c] = 0x28; dev->shadow_regs[0x0d] = 0xa4; - dev->shadow_regs[0x2c] = 0x0d; dev->shadow_regs[0x2d] = 0x4f; dev->shadow_regs[0x2f] = 0x21; @@ -1676,25 +1787,20 @@ sanei_lexmark_low_search_home_fwd (Lexmark_Device * dev) dev->shadow_regs[0x4c] = 0x05; dev->shadow_regs[0x4d] = 0x3f; dev->shadow_regs[0x75] = 0x00; - dev->shadow_regs[0x85] = 0x03; dev->shadow_regs[0x86] = 0x33; dev->shadow_regs[0x87] = 0x8f; dev->shadow_regs[0x88] = 0x34; - dev->shadow_regs[0x8b] = 0xff; dev->shadow_regs[0x8e] = 0x60; dev->shadow_regs[0x8f] = 0x80; - dev->shadow_regs[0x91] = 0x59; dev->shadow_regs[0x92] = 0x10; dev->shadow_regs[0x93] = 0x06; - dev->shadow_regs[0xa3] = 0x0d; dev->shadow_regs[0xa4] = 0x5e; dev->shadow_regs[0xa5] = 0x23; dev->shadow_regs[0xb1] = 0x07; - dev->shadow_regs[0xc2] = 0x80; dev->shadow_regs[0xc5] = 0x00; dev->shadow_regs[0xca] = 0x00; @@ -1735,19 +1841,45 @@ sanei_lexmark_low_search_home_fwd (Lexmark_Device * dev) /* set horizontal resolution */ dev->shadow_regs[0x79] = 0x40; dev->shadow_regs[0x7a] = 0x02; - /* Movement direction & step size */ - dev->shadow_regs[0xc6] = 0x01; - /* step size range2 */ - dev->shadow_regs[0xc9] = 0x3b; - /* step size range0 */ - dev->shadow_regs[0xe2] = 0x01; - /* ? */ - dev->shadow_regs[0xe3] = 0x03; - /* Motor disable & Coordinate space denominator */ dev->shadow_regs[0xc3] = 0x01; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x01; - + switch (dev->model.motor_type) + { + case A920_MOTOR: + case X1100_MOTOR: + /* step size range2 */ + dev->shadow_regs[0xc9] = 0x3b; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x01; + /* ? */ + dev->shadow_regs[0xe3] = 0x03; + break; + case X74_MOTOR: + dev->shadow_regs[0xc4] = 0x20; + dev->shadow_regs[0xc5] = 0x00; + dev->shadow_regs[0xc8] = 0x04; + /* step size range2 */ + dev->shadow_regs[0xc9] = 0x39; + dev->shadow_regs[0xca] = 0x00; + /* motor curve stuff */ + dev->shadow_regs[0xe0] = 0x29; + dev->shadow_regs[0xe1] = 0x17; + dev->shadow_regs[0xe2] = 0x8f; + dev->shadow_regs[0xe3] = 0x06; + dev->shadow_regs[0xe4] = 0x61; + dev->shadow_regs[0xe5] = 0x16; + dev->shadow_regs[0xe6] = 0x64; + dev->shadow_regs[0xe7] = 0xb5; + dev->shadow_regs[0xe8] = 0x08; + dev->shadow_regs[0xe9] = 0x32; + dev->shadow_regs[0xec] = 0x0c; + dev->shadow_regs[0xef] = 0x08; + break; + } + /* Stop the scanner */ low_stop_mvmt (devnum); @@ -1800,7 +1932,7 @@ sanei_lexmark_low_search_home_fwd (Lexmark_Device * dev) } /* check for home position */ - ret_val = low_is_home_line (buffer); + ret_val = low_is_home_line (dev, buffer); if (ret_val) DBG (2, "sanei_lexmark_low_search_home_fwd: !!!HOME POSITION!!!\n"); @@ -1812,8 +1944,6 @@ sanei_lexmark_low_search_home_fwd (Lexmark_Device * dev) return ret_val; } - - SANE_Bool sanei_lexmark_low_search_home_bwd (Lexmark_Device * dev) { @@ -1855,6 +1985,7 @@ sanei_lexmark_low_search_home_bwd (Lexmark_Device * dev) SANE_Int size_returned; SANE_Int no_of_buffers; SANE_Int buffer_limit = 0xF3C; + SANE_Int high_byte, mid_byte, low_byte; SANE_Int home_line_count; SANE_Bool in_home_region; @@ -1876,6 +2007,21 @@ sanei_lexmark_low_search_home_bwd (Lexmark_Device * dev) /* set up registers */ switch (dev->model.sensor_type) { + case X74_SENSOR: + dev->shadow_regs[0x2c] = 0x03; + dev->shadow_regs[0x2d] = 0x45; + dev->shadow_regs[0x34] = 0x09; + dev->shadow_regs[0x35] = 0x09; + dev->shadow_regs[0x36] = 0x11; + dev->shadow_regs[0x37] = 0x11; + dev->shadow_regs[0x38] = 0x19; + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x93] = 0x06; + dev->shadow_regs[0x40] = 0x80; + /* important for detection of b/w transitions*/ + dev->shadow_regs[0x75] = 0x00; + dev->shadow_regs[0x8b] = 0xff; + break; case X1100_B2_SENSOR: dev->shadow_regs[0x2c] = 0x0f; dev->shadow_regs[0x2d] = 0x51; @@ -1918,6 +2064,7 @@ sanei_lexmark_low_search_home_bwd (Lexmark_Device * dev) dev->shadow_regs[0x37] = 0x0f; dev->shadow_regs[0x38] = 0x15; break; + case X1200_USB2_SENSOR: dev->shadow_regs[0x2c] = 0x0d; dev->shadow_regs[0x2d] = 0x4f; @@ -1960,29 +2107,58 @@ sanei_lexmark_low_search_home_bwd (Lexmark_Device * dev) /* set horizontal resolution */ dev->shadow_regs[0x79] = 0x40; dev->shadow_regs[0x7a] = 0x02; - /* Motor enable & Coordinate space denominator */ - dev->shadow_regs[0xc3] = 0x81; - /* ? */ - dev->shadow_regs[0xc5] = 0x19; + /* Movement direction & step size */ dev->shadow_regs[0xc6] = 0x01; - /* step size range2 */ - dev->shadow_regs[0xc9] = 0x3a; - /* ? */ - dev->shadow_regs[0xca] = 0x08; - /* motor curve stuff */ - dev->shadow_regs[0xe0] = 0xe3; - dev->shadow_regs[0xe1] = 0x18; - dev->shadow_regs[0xe2] = 0x03; - dev->shadow_regs[0xe3] = 0x06; - dev->shadow_regs[0xe4] = 0x2b; - dev->shadow_regs[0xe5] = 0x17; - dev->shadow_regs[0xe6] = 0xdc; - dev->shadow_regs[0xe7] = 0xb3; - dev->shadow_regs[0xe8] = 0x07; - dev->shadow_regs[0xe9] = 0x1b; - dev->shadow_regs[0xec] = 0x07; - dev->shadow_regs[0xef] = 0x03; + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0xc3] = 0x81; + + switch (dev->model.motor_type) + { + case X74_MOTOR: + dev->shadow_regs[0xc4] = 0x20; + dev->shadow_regs[0xc5] = 0x00; + dev->shadow_regs[0xc8] = 0x04; + /* step size range2 */ + dev->shadow_regs[0xc9] = 0x39; + dev->shadow_regs[0xca] = 0x00; + /* motor curve stuff */ + dev->shadow_regs[0xe0] = 0x29; + dev->shadow_regs[0xe1] = 0x17; + dev->shadow_regs[0xe2] = 0x8f; + dev->shadow_regs[0xe3] = 0x06; + dev->shadow_regs[0xe4] = 0x61; + dev->shadow_regs[0xe5] = 0x16; + dev->shadow_regs[0xe6] = 0x64; + dev->shadow_regs[0xe7] = 0xb5; + dev->shadow_regs[0xe8] = 0x08; + dev->shadow_regs[0xe9] = 0x32; + dev->shadow_regs[0xec] = 0x0c; + dev->shadow_regs[0xef] = 0x08; + break; + case A920_MOTOR: + case X1100_MOTOR: + /* ? */ + dev->shadow_regs[0xc5] = 0x19; + /* step size range2 */ + dev->shadow_regs[0xc9] = 0x3a; + /* ? */ + dev->shadow_regs[0xca] = 0x08; + /* motor curve stuff */ + dev->shadow_regs[0xe0] = 0xe3; + dev->shadow_regs[0xe1] = 0x18; + dev->shadow_regs[0xe2] = 0x03; + dev->shadow_regs[0xe3] = 0x06; + dev->shadow_regs[0xe4] = 0x2b; + dev->shadow_regs[0xe5] = 0x17; + dev->shadow_regs[0xe6] = 0xdc; + dev->shadow_regs[0xe7] = 0xb3; + dev->shadow_regs[0xe8] = 0x07; + dev->shadow_regs[0xe9] = 0x1b; + dev->shadow_regs[0xec] = 0x07; + dev->shadow_regs[0xef] = 0x03; + break; + } /* Stop the scanner */ low_stop_mvmt (devnum); @@ -2055,10 +2231,11 @@ sanei_lexmark_low_search_home_bwd (Lexmark_Device * dev) no_of_buffers = 1; if (no_of_buffers < 1) - no_of_buffers = 1; + no_of_buffers = 1; else if (no_of_buffers > 10) - no_of_buffers = 10; + no_of_buffers = 10; buffer_count = buffer_count + no_of_buffers; + size_requested = no_of_buffers * 2500; /* Tell the scanner to send the data */ @@ -2070,51 +2247,51 @@ sanei_lexmark_low_search_home_bwd (Lexmark_Device * dev) cmd_size = 4; status = low_usb_bulk_write (devnum, command5_block, &cmd_size); if (status != SANE_STATUS_GOOD) - return SANE_FALSE; + return SANE_FALSE; /* Read it */ cmd_size = size_requested; status = low_usb_bulk_read (devnum, buffer, &cmd_size); if (status != SANE_STATUS_GOOD) - return SANE_FALSE; + return SANE_FALSE; for (i = 0; i < no_of_buffers; i++) - { - buffer_start = buffer + (i * 2500); - /* Reverse order of bytes in words of buffer */ - for (j = 0; j < 2500; j = j + 2) - { - temp_byte = *(buffer_start + j); - *(buffer_start + j) = *(buffer_start + j + 1); - *(buffer_start + j + 1) = temp_byte; - } + { + buffer_start = buffer + (i * 2500); + /* Reverse order of bytes in words of buffer */ + for (j = 0; j < 2500; j = j + 2) + { + temp_byte = *(buffer_start + j); + *(buffer_start + j) = *(buffer_start + j + 1); + *(buffer_start + j + 1) = temp_byte; + } #ifdef DEEP_DEBUG - fwrite (buffer + (i * 2500), 2500, 1, img); + fwrite (buffer + (i * 2500), 2500, 1, img); #endif - if (low_is_home_line (buffer_start)) - { - home_line_count++; - if (home_line_count > 7) - in_home_region = SANE_TRUE; - } - if (in_home_region) - { - /* slow down scanning : on purpose backtracking */ - if (home_line_count) - sleep (1); - free (buffer); -#ifdef DEEP_DEBUG - fflush (img); - i = ftell (img) / 2500; - rewind (img); - DBG (2, "sanei_lexmark_low_search_home_bwd: offset=%d\n", i); - fprintf (img, "P5\n2500 %03d\n", i); - fclose (img); -#endif - low_stop_mvmt (devnum); - DBG (2, - "sanei_lexmark_low_search_home_bwd: in home region, end.\n"); - return SANE_TRUE; - } - } + if (low_is_home_line (dev, buffer_start)) + { + home_line_count++; + if (home_line_count > 7) + in_home_region = SANE_TRUE; + } + if (in_home_region) + { + /* slow down scanning : on purpose backtracking */ + if (home_line_count) + sleep (1); + free (buffer); + #ifdef DEEP_DEBUG + fflush (img); + i = ftell (img) / 2500; + rewind (img); + DBG (2, "sanei_lexmark_low_search_home_bwd: offset=%d\n", i); + fprintf (img, "P5\n2500 %03d\n", i); + fclose (img); + #endif + low_stop_mvmt (devnum); + DBG (2, + "sanei_lexmark_low_search_home_bwd: in home region, end.\n"); + return SANE_TRUE; + } + } } /* end while (buffer_count > buffer_limit); */ free (buffer); #ifdef DEEP_DEBUG @@ -2138,40 +2315,70 @@ low_get_start_loc (SANE_Int resolution, SANE_Int * vert_start, { SANE_Int start_600; + switch (dev->model.sensor_type) + { + case X1100_2C_SENSOR: + case X1200_USB2_SENSOR: + case A920_SENSOR: + case X1200_SENSOR: + start_600 = 195 - offset; + *hor_start = 0x68; + break; + case X1100_B2_SENSOR: + start_600 = 195 - offset; + switch (resolution) + { + case 75: *hor_start = 0x68; + break; + case 150: *hor_start = 0x68; + break; + case 300: *hor_start = 0x6a; + break; + case 600: *hor_start = 0x6b; + break; + case 1200: *hor_start = 0x6b; + break; + default: + /* If we're here we have an invalid resolution */ + return SANE_STATUS_INVAL; + } + break; + case X74_SENSOR: + start_600 = 268 - offset; + switch (resolution) + { + case 75: *hor_start = 0x48; + break; + case 150: *hor_start = 0x48; + break; + case 300: *hor_start = 0x4a; + break; + case 600: *hor_start = 0x4b; + break; + default: + /* If we're here we have an invalid resolution */ + return SANE_STATUS_INVAL; + } + break; + } /* Calculate vertical start distance at 600dpi */ - start_600 = 195 - offset; - switch (resolution) { - case 75: - *vert_start = start_600 / 8; - *hor_start = 0x68; + case 75: *vert_start = start_600 / 8; break; - case 150: - *vert_start = start_600 / 4; - *hor_start = 0x68; + case 150: *vert_start = start_600 / 4; break; - case 300: - *vert_start = start_600 / 2; - *hor_start = 0x6a; + case 300: *vert_start = start_600 / 2; break; - case 600: - *vert_start = start_600; - *hor_start = 0x6b; + case 600: *vert_start = start_600; break; - case 1200: - *vert_start = start_600 * 2; - *hor_start = 0x6b; + case 1200: *vert_start = start_600 * 2; break; default: /* If we're here we have an invalid resolution */ return SANE_STATUS_INVAL; } - /* maybe left margin could be autodetected */ - if (dev->model.sensor_type != X1100_B2_SENSOR) - *hor_start = 0x68; - return SANE_STATUS_GOOD; } @@ -2191,7 +2398,7 @@ low_set_scan_area (SANE_Int res, SANE_Int hor_start = 0; SANE_Int vert_end; SANE_Int hor_end; - + status = low_get_start_loc (res, &vert_start, &hor_start, offset, dev); /* convert pixel height to vertical location coordinates */ @@ -2214,10 +2421,10 @@ low_set_scan_area (SANE_Int res, regs[0x63] = HIBYTE (vert_end); /* convert pixel width to horizontal location coordinates */ - hor_end = hor_start + brx; - /* set horizontal start position registers */ + hor_end = hor_start + brx; hor_start += tlx; + regs[0x66] = LOBYTE (hor_start); regs[0x67] = HIBYTE (hor_start); /* set horizontal end position registers */ @@ -2300,9 +2507,21 @@ sanei_lexmark_low_find_start_line (Lexmark_Device * dev) DBG (2, "sanei_lexmark_low_find_start_line:\n"); + /* set up registers */ switch (dev->model.sensor_type) { + case X74_SENSOR: + dev->shadow_regs[0x2c] = 0x04; + dev->shadow_regs[0x2d] = 0x46; + dev->shadow_regs[0x34] = 0x05; + dev->shadow_regs[0x35] = 0x05; + dev->shadow_regs[0x36] = 0x0b; + dev->shadow_regs[0x37] = 0x0b; + dev->shadow_regs[0x38] = 0x11; + dev->shadow_regs[0x40] = 0x40; + rts88xx_set_gain (dev->shadow_regs, 6, 6, 6); + break; case X1100_B2_SENSOR: dev->shadow_regs[0x2c] = 0x0f; dev->shadow_regs[0x2d] = 0x51; @@ -2416,29 +2635,80 @@ sanei_lexmark_low_find_start_line (Lexmark_Device * dev) /* set for ? */ /* Motor enable & Coordinate space denominator */ dev->shadow_regs[0xc3] = 0x81; - /* set for ? */ - dev->shadow_regs[0xc5] = 0x22; - /* Movement direction & step size */ - dev->shadow_regs[0xc6] = 0x09; - /* step size range2 */ - dev->shadow_regs[0xc9] = 0x3b; - /* set for ? */ - dev->shadow_regs[0xca] = 0x1f; - dev->shadow_regs[0xe0] = 0xf7; - dev->shadow_regs[0xe1] = 0x16; - /* step size range0 */ - dev->shadow_regs[0xe2] = 0x87; - /* ? */ - dev->shadow_regs[0xe3] = 0x13; - dev->shadow_regs[0xe4] = 0x1b; - dev->shadow_regs[0xe5] = 0x16; - dev->shadow_regs[0xe6] = 0xdc; - dev->shadow_regs[0xe7] = 0x00; - dev->shadow_regs[0xe8] = 0x00; - dev->shadow_regs[0xe9] = 0x1b; - dev->shadow_regs[0xec] = 0x07; - dev->shadow_regs[0xef] = 0x03; + + + + + switch (dev->model.motor_type) + { + case X1100_MOTOR: + case A920_MOTOR: + /* set for ? */ + dev->shadow_regs[0xc5] = 0x22; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x09; + /* step size range2 */ + dev->shadow_regs[0xc9] = 0x3b; + /* set for ? */ + dev->shadow_regs[0xca] = 0x1f; + dev->shadow_regs[0xe0] = 0xf7; + dev->shadow_regs[0xe1] = 0x16; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x87; + /* ? */ + dev->shadow_regs[0xe3] = 0x13; + dev->shadow_regs[0xe4] = 0x1b; + dev->shadow_regs[0xe5] = 0x16; + dev->shadow_regs[0xe6] = 0xdc; + dev->shadow_regs[0xe7] = 0x00; + dev->shadow_regs[0xe8] = 0x00; + dev->shadow_regs[0xe9] = 0x1b; + dev->shadow_regs[0xec] = 0x07; + dev->shadow_regs[0xef] = 0x03; + break; + case X74_MOTOR: + dev->shadow_regs[0xc4] = 0x20; + dev->shadow_regs[0xc5] = 0x22; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x0b; + + dev->shadow_regs[0xc8] = 0x04; + dev->shadow_regs[0xc9] = 0x39; + dev->shadow_regs[0xca] = 0x1f; + + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x2f; + dev->shadow_regs[0xe1] = 0x11; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x9f; + /* ? */ + dev->shadow_regs[0xe3] = 0x0f; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0xcb; + + dev->shadow_regs[0xe5] = 0x10; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x64; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0x00; + dev->shadow_regs[0xe8] = 0x00; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x32; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x0c; + /* bounds of movement range4 -only for 75dpi grayscale */ + dev->shadow_regs[0xed] = 0x00; + dev->shadow_regs[0xee] = 0x00; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x08; + break; + } + + /* Stop the scanner */ low_stop_mvmt (dev->devnum); @@ -2528,34 +2798,49 @@ sanei_lexmark_low_find_start_line (Lexmark_Device * dev) *(buffer + i) = 0x00; } +#ifdef DEEP_DEBUG + fdbg = fopen ("find_start_after.pnm", "wb"); + if (fdbg != NULL) + { + fprintf (fdbg, "P5\n%d %d\n255\n", 88, 59); + fwrite (buffer, 5192, 1, fdbg); + fclose (fdbg); + } +#endif + /* Go through 59 lines */ for (j = 0; j < 59; j++) { blackByteCounter = 0; /* Go through 88 bytes per line */ for (i = 0; i < 88; i++) - { - /* Is byte black? */ - if (*(buffer + (j * 88) + i) == 0) - { - blackByteCounter++; - } - } /* end for line */ + { + /* Is byte black? */ + if (*(buffer + (j * 88) + i) == 0) + { + blackByteCounter++; + } + } /* end for line */ if (blackByteCounter > 0) - { - /* This was a black line */ - blackLineCount++; - whiteLineCount = 0; - } + { + /* This was a black line */ + blackLineCount++; + whiteLineCount = 0; + } else - { - /* This is a white line */ - whiteLineCount++; - blackLineCount = 0; - } + { + /* This is a white line */ + whiteLineCount++; + blackLineCount = 0; + } } /* end for buffer */ free (buffer); + /* Stop the scanner. + This is needed to get the right distance to the scanning area */ + if (dev->model.sensor_type == X74_SENSOR) + low_stop_mvmt (dev->devnum); + DBG (2, "sanei_lexmark_low_find_start_line: end.\n"); return whiteLineCount; } @@ -2580,6 +2865,10 @@ sanei_lexmark_low_set_scan_regs (Lexmark_Device * dev, SANE_Int resolution, /* set up registers */ switch (dev->model.sensor_type) { + case X74_SENSOR: + dev->shadow_regs[0x2c] = 0x03; + dev->shadow_regs[0x2d] = 0x45; + break; case X1100_B2_SENSOR: dev->shadow_regs[0x2c] = 0x0f; dev->shadow_regs[0x2d] = 0x51; @@ -2608,8 +2897,10 @@ sanei_lexmark_low_set_scan_regs (Lexmark_Device * dev, SANE_Int resolution, dev->val[OPT_BR_X].w, dev->val[OPT_BR_Y].w, offset, - dev->model.motor_type == A920_MOTOR && isColourScan - && (resolution == 600), dev->shadow_regs, dev); + (dev->model.motor_type == A920_MOTOR || dev->model.motor_type == X74_MOTOR) + && isColourScan + && (resolution == 600), + dev->shadow_regs, dev); /* may be we could use a sensor descriptor that would held the max horiz dpi */ if (dev->val[OPT_RESOLUTION].w < 600) @@ -2623,272 +2914,418 @@ sanei_lexmark_low_set_scan_regs (Lexmark_Device * dev, SANE_Int resolution, DBG (5, "sanei_lexmark_low_set_scan_regs(): 75 DPI resolution\n"); if (isColourScan) - { - /* set colour scan */ - dev->shadow_regs[0x2f] = 0x11; - - switch (dev->model.sensor_type) - { - case X1100_B2_SENSOR: - dev->shadow_regs[0x34] = 0x05; - dev->shadow_regs[0x36] = 0x05; - dev->shadow_regs[0x38] = 0x05; - - dev->shadow_regs[0x80] = 0x0c; - dev->shadow_regs[0x81] = 0x0c; - dev->shadow_regs[0x82] = 0x09; - - dev->shadow_regs[0x85] = 0x00; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x8c; - dev->shadow_regs[0x92] = 0x40; - dev->shadow_regs[0x93] = 0x06; - break; - - case X1100_2C_SENSOR: - dev->shadow_regs[0x34] = 0x03; - dev->shadow_regs[0x36] = 0x04; - dev->shadow_regs[0x38] = 0x03; - - dev->shadow_regs[0x80] = 0x00; - dev->shadow_regs[0x81] = 0x02; - dev->shadow_regs[0x82] = 0x03; - - dev->shadow_regs[0x85] = 0x20; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - break; - - case A920_SENSOR: - dev->shadow_regs[0x34] = 0x02; - dev->shadow_regs[0x36] = 0x04; - dev->shadow_regs[0x38] = 0x03; - - dev->shadow_regs[0x80] = 0x07; - dev->shadow_regs[0x81] = 0x0f; - dev->shadow_regs[0x82] = 0x03; - - dev->shadow_regs[0x85] = 0x05; - dev->shadow_regs[0x86] = 0x14; - dev->shadow_regs[0x87] = 0x06; - dev->shadow_regs[0x88] = 0x44; - - dev->shadow_regs[0x91] = 0x60; - dev->shadow_regs[0x92] = 0x85; - dev->shadow_regs[0x93] = 0x0e; - break; - - case X1200_SENSOR: - dev->shadow_regs[0x34] = 0x02; - dev->shadow_regs[0x36] = 0x03; - dev->shadow_regs[0x38] = 0x01; - - dev->shadow_regs[0x79] = 0x20; - - dev->shadow_regs[0x80] = 0x08; - dev->shadow_regs[0x81] = 0x02; - dev->shadow_regs[0x82] = 0x0d; - - dev->shadow_regs[0x85] = 0x20; - dev->shadow_regs[0x86] = 0x1e; - dev->shadow_regs[0x87] = 0x39; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - /* dev->shadow_regs[0x92] = 0x92; */ - dev->shadow_regs[0x93] = 0x06; - break; - - case X1200_USB2_SENSOR: - dev->shadow_regs[0x34] = 0x04; - dev->shadow_regs[0x36] = 0x05; - dev->shadow_regs[0x38] = 0x04; - - dev->shadow_regs[0x80] = 0x01; - dev->shadow_regs[0x81] = 0x0a; - dev->shadow_regs[0x82] = 0x0b; - break; - } - - dev->shadow_regs[0x35] = 0x01; - dev->shadow_regs[0x37] = 0x01; - - /* Motor enable & Coordinate space denominator */ - dev->shadow_regs[0xc3] = 0x83; - /* ? */ - dev->shadow_regs[0xc5] = 0x0a; - /* bounds of movement range0 */ - dev->shadow_regs[0xe0] = 0x2b; - dev->shadow_regs[0xe1] = 0x0a; - /* step size range0 */ - dev->shadow_regs[0xe2] = 0x7f; - /* ? */ - dev->shadow_regs[0xe3] = 0x01; - /* bounds of movement range1 */ - dev->shadow_regs[0xe4] = 0xbb; - dev->shadow_regs[0xe5] = 0x09; - /* step size range1 */ - dev->shadow_regs[0xe6] = 0x0e; - /* bounds of movement range2 */ - dev->shadow_regs[0xe7] = 0x2b; - dev->shadow_regs[0xe8] = 0x03; - /* step size range2 */ - dev->shadow_regs[0xe9] = 0x05; - /* bounds of movement range3 */ - dev->shadow_regs[0xea] = 0xa0; - dev->shadow_regs[0xeb] = 0x01; - /* step size range3 */ - dev->shadow_regs[0xec] = 0x01; - /* step size range4 */ - dev->shadow_regs[0xef] = 0x01; - } - else - { - /* set grayscale scan */ - dev->shadow_regs[0x2f] = 0x21; - switch (dev->model.sensor_type) - { - case X1100_B2_SENSOR: - dev->shadow_regs[0x34] = 0x02; - dev->shadow_regs[0x35] = 0x02; - dev->shadow_regs[0x36] = 0x04; - dev->shadow_regs[0x37] = 0x04; - dev->shadow_regs[0x38] = 0x06; - - dev->shadow_regs[0x85] = 0x20; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - break; - case X1100_2C_SENSOR: - dev->shadow_regs[0x34] = 0x01; - dev->shadow_regs[0x35] = 0x01; - dev->shadow_regs[0x36] = 0x02; - dev->shadow_regs[0x37] = 0x02; - dev->shadow_regs[0x38] = 0x03; /* these are half of B2 sensor */ - - dev->shadow_regs[0x85] = 0x20; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - break; - case A920_SENSOR: - dev->shadow_regs[0x34] = 0x01; - dev->shadow_regs[0x35] = 0x01; - dev->shadow_regs[0x36] = 0x02; - dev->shadow_regs[0x37] = 0x02; - dev->shadow_regs[0x38] = 0x03; - - dev->shadow_regs[0x85] = 0x0d; - dev->shadow_regs[0x86] = 0x14; - dev->shadow_regs[0x87] = 0x06; - dev->shadow_regs[0x88] = 0x45; - - dev->shadow_regs[0x91] = 0x60; - dev->shadow_regs[0x92] = 0x8d; - dev->shadow_regs[0x93] = 0x0e; - break; - case X1200_SENSOR: - dev->shadow_regs[0x34] = 0x01; - dev->shadow_regs[0x35] = 0x01; - dev->shadow_regs[0x36] = 0x02; - dev->shadow_regs[0x37] = 0x02; - dev->shadow_regs[0x38] = 0x02; - - dev->shadow_regs[0x79] = 0x20; - - dev->shadow_regs[0x85] = 0x00; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0xff; - dev->shadow_regs[0x88] = 0x02; - - dev->shadow_regs[0x92] = 0x00; - break; - case X1200_USB2_SENSOR: - dev->shadow_regs[0x34] = 0x01; - dev->shadow_regs[0x35] = 0x01; - dev->shadow_regs[0x36] = 0x02; - dev->shadow_regs[0x37] = 0x02; - dev->shadow_regs[0x38] = 0x02; - - dev->shadow_regs[0x79] = 0x20; - - dev->shadow_regs[0x85] = 0x00; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0xff; - dev->shadow_regs[0x88] = 0x02; - - dev->shadow_regs[0x92] = 0x00; - break; - } - - /* set ? only for colour? */ - dev->shadow_regs[0x80] = 0x00; - dev->shadow_regs[0x81] = 0x00; - dev->shadow_regs[0x82] = 0x00; - /* Motor enable & Coordinate space denominator */ - dev->shadow_regs[0xc3] = 0x81; - /* ? */ - dev->shadow_regs[0xc5] = 0x10; - /* bounds of movement range0 */ - dev->shadow_regs[0xe0] = 0x4d; - dev->shadow_regs[0xe1] = 0x1c; - /* step size range0 */ - dev->shadow_regs[0xe2] = 0x71; - /* ? */ - dev->shadow_regs[0xe3] = 0x02; - /* bounds of movement range1 */ - dev->shadow_regs[0xe4] = 0x6d; - dev->shadow_regs[0xe5] = 0x15; - /* step size range1 */ - dev->shadow_regs[0xe6] = 0xdc; - /* bounds of movement range2 */ - dev->shadow_regs[0xe7] = 0xad; - dev->shadow_regs[0xe8] = 0x07; - /* step size range2 */ - dev->shadow_regs[0xe9] = 0x1b; - /* bounds of movement range3 */ - dev->shadow_regs[0xea] = 0xe1; - dev->shadow_regs[0xeb] = 0x03; - /* step size range3 */ - dev->shadow_regs[0xec] = 0x07; - /* bounds of movement range4 -only for 75dpi grayscale */ - dev->shadow_regs[0xed] = 0xc2; - dev->shadow_regs[0xee] = 0x02; - /* step size range4 */ - dev->shadow_regs[0xef] = 0x03; - } + { + switch (dev->model.sensor_type) + { + case X74_SENSOR: + + dev->shadow_regs[0x34] = 0x04; + dev->shadow_regs[0x36] = 0x03; + dev->shadow_regs[0x38] = 0x03; + + dev->shadow_regs[0x79] = 0x08; + + dev->shadow_regs[0x80] = 0x0d; + dev->shadow_regs[0x81] = 0x0e; + dev->shadow_regs[0x82] = 0x02; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06;; + + break; + + case X1100_B2_SENSOR: + dev->shadow_regs[0x34] = 0x05; + dev->shadow_regs[0x36] = 0x05; + dev->shadow_regs[0x38] = 0x05; + + dev->shadow_regs[0x80] = 0x0c; + dev->shadow_regs[0x81] = 0x0c; + dev->shadow_regs[0x82] = 0x09; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x8c; + dev->shadow_regs[0x92] = 0x40; + dev->shadow_regs[0x93] = 0x06; + break; + + case X1100_2C_SENSOR: + dev->shadow_regs[0x34] = 0x03; + dev->shadow_regs[0x36] = 0x04; + dev->shadow_regs[0x38] = 0x03; + + dev->shadow_regs[0x80] = 0x00; + dev->shadow_regs[0x81] = 0x02; + dev->shadow_regs[0x82] = 0x03; + + dev->shadow_regs[0x85] = 0x20; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + + case A920_SENSOR: + dev->shadow_regs[0x34] = 0x02; + dev->shadow_regs[0x36] = 0x04; + dev->shadow_regs[0x38] = 0x03; + + dev->shadow_regs[0x80] = 0x07; + dev->shadow_regs[0x81] = 0x0f; + dev->shadow_regs[0x82] = 0x03; + + dev->shadow_regs[0x85] = 0x05; + dev->shadow_regs[0x86] = 0x14; + dev->shadow_regs[0x87] = 0x06; + dev->shadow_regs[0x88] = 0x44; + + dev->shadow_regs[0x91] = 0x60; + dev->shadow_regs[0x92] = 0x85; + dev->shadow_regs[0x93] = 0x0e; + break; + + case X1200_SENSOR: + dev->shadow_regs[0x34] = 0x02; + dev->shadow_regs[0x36] = 0x03; + dev->shadow_regs[0x38] = 0x01; + + dev->shadow_regs[0x79] = 0x20; + + dev->shadow_regs[0x80] = 0x08; + dev->shadow_regs[0x81] = 0x02; + dev->shadow_regs[0x82] = 0x0d; + + dev->shadow_regs[0x85] = 0x20; + dev->shadow_regs[0x86] = 0x1e; + dev->shadow_regs[0x87] = 0x39; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + /* dev->shadow_regs[0x92] = 0x92; */ + dev->shadow_regs[0x93] = 0x06; + break; + + case X1200_USB2_SENSOR: + dev->shadow_regs[0x34] = 0x04; + dev->shadow_regs[0x36] = 0x05; + dev->shadow_regs[0x38] = 0x04; + + dev->shadow_regs[0x80] = 0x01; + dev->shadow_regs[0x81] = 0x0a; + dev->shadow_regs[0x82] = 0x0b; + break; + } + + switch (dev->model.motor_type) + { + case X74_MOTOR: + dev->shadow_regs[0xc2] = 0x80; + /* ? */ + dev->shadow_regs[0xc4] = 0x20; + dev->shadow_regs[0xc5] = 0x0c; + dev->shadow_regs[0xc6] = 0x0b; + + dev->shadow_regs[0xc8] = 0x04; + dev->shadow_regs[0xc9] = 0x39; + dev->shadow_regs[0xca] = 0x01; + + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x1b; + dev->shadow_regs[0xe1] = 0x0a; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x4f; + /* ? */ + dev->shadow_regs[0xe3] = 0x01; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0xb3; + + dev->shadow_regs[0xe5] = 0x09; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x0d; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0xe5; + dev->shadow_regs[0xe8] = 0x02; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x05; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0xa0; + dev->shadow_regs[0xeb] = 0x01; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x01; + /* bounds of movement range4 */ + dev->shadow_regs[0xed] = 0x00; + dev->shadow_regs[0xee] = 0x00; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x01; + break; + case A920_MOTOR: + case X1100_MOTOR: + /* ? */ + dev->shadow_regs[0xc5] = 0x0a; + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x2b; + dev->shadow_regs[0xe1] = 0x0a; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x7f; + /* ? */ + dev->shadow_regs[0xe3] = 0x01; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0xbb; + dev->shadow_regs[0xe5] = 0x09; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x0e; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0x2b; + dev->shadow_regs[0xe8] = 0x03; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x05; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0xa0; + dev->shadow_regs[0xeb] = 0x01; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x01; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x01; + break; + } + + /* set colour scan */ + dev->shadow_regs[0x2f] = 0x11; + + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x37] = 0x01; + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0xc3] = 0x83; + } + else /* 75 dpi gray */ + { + switch (dev->model.sensor_type) + { + case X74_SENSOR: + + dev->shadow_regs[0x34] = 0x01; + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x36] = 0x02; + dev->shadow_regs[0x37] = 0x02; + dev->shadow_regs[0x38] = 0x03; + dev->shadow_regs[0x39] = 0x0f; + + dev->shadow_regs[0x40] = 0x80; + + dev->shadow_regs[0x79] = 0x08; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x8c] = 0x02; + dev->shadow_regs[0x8d] = 0x01; + dev->shadow_regs[0x8e] = 0x60; + dev->shadow_regs[0x8f] = 0x80; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + + break; + + case X1100_B2_SENSOR: + dev->shadow_regs[0x34] = 0x02; + dev->shadow_regs[0x35] = 0x02; + dev->shadow_regs[0x36] = 0x04; + dev->shadow_regs[0x37] = 0x04; + dev->shadow_regs[0x38] = 0x06; + + dev->shadow_regs[0x85] = 0x20; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case X1100_2C_SENSOR: + dev->shadow_regs[0x34] = 0x01; + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x36] = 0x02; + dev->shadow_regs[0x37] = 0x02; + dev->shadow_regs[0x38] = 0x03; /* these are half of B2 sensor */ + + dev->shadow_regs[0x85] = 0x20; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case A920_SENSOR: + dev->shadow_regs[0x34] = 0x01; + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x36] = 0x02; + dev->shadow_regs[0x37] = 0x02; + dev->shadow_regs[0x38] = 0x03; + + dev->shadow_regs[0x85] = 0x0d; + dev->shadow_regs[0x86] = 0x14; + dev->shadow_regs[0x87] = 0x06; + dev->shadow_regs[0x88] = 0x45; + + dev->shadow_regs[0x91] = 0x60; + dev->shadow_regs[0x92] = 0x8d; + dev->shadow_regs[0x93] = 0x0e; + break; + case X1200_SENSOR: + dev->shadow_regs[0x34] = 0x01; + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x36] = 0x02; + dev->shadow_regs[0x37] = 0x02; + dev->shadow_regs[0x38] = 0x02; + + dev->shadow_regs[0x79] = 0x20; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0xff; + dev->shadow_regs[0x88] = 0x02; + + dev->shadow_regs[0x92] = 0x00; + break; + case X1200_USB2_SENSOR: + dev->shadow_regs[0x34] = 0x01; + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x36] = 0x02; + dev->shadow_regs[0x37] = 0x02; + dev->shadow_regs[0x38] = 0x02; + + dev->shadow_regs[0x79] = 0x20; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0xff; + dev->shadow_regs[0x88] = 0x02; + + dev->shadow_regs[0x92] = 0x00; + break; + } + switch (dev->model.motor_type) + { + case X74_MOTOR: + /* ? */ + dev->shadow_regs[0xc4] = 0x20; + dev->shadow_regs[0xc5] = 0x0a; + dev->shadow_regs[0xc6] = 0x0b; + + dev->shadow_regs[0xc8] = 0x04; + dev->shadow_regs[0xc9] = 0x39; + dev->shadow_regs[0xca] = 0x01; + + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x07; + dev->shadow_regs[0xe1] = 0x18; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0xe7; + /* ? */ + dev->shadow_regs[0xe3] = 0x03; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0xe7; + dev->shadow_regs[0xe5] = 0x14; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x64; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0xcb; + dev->shadow_regs[0xe8] = 0x08; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x32; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0xe3; + dev->shadow_regs[0xeb] = 0x04; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x0c; + /* bounds of movement range4 */ + dev->shadow_regs[0xed] = 0x00; + dev->shadow_regs[0xee] = 0x00; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x08; + break; + case A920_MOTOR: + case X1100_MOTOR: + /* ? */ + dev->shadow_regs[0xc5] = 0x10; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x09; + + dev->shadow_regs[0xc9] = 0x3b; + dev->shadow_regs[0xca] = 0x01; + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x4d; + dev->shadow_regs[0xe1] = 0x1c; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x71; + /* ? */ + dev->shadow_regs[0xe3] = 0x02; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x6d; + dev->shadow_regs[0xe5] = 0x15; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0xdc; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0xad; + dev->shadow_regs[0xe8] = 0x07; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x1b; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0xe1; + dev->shadow_regs[0xeb] = 0x03; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x07; + /* bounds of movement range4 -only for 75dpi grayscale */ + dev->shadow_regs[0xed] = 0xc2; + dev->shadow_regs[0xee] = 0x02; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x03; + break; + } + + /* set grayscale scan */ + dev->shadow_regs[0x2f] = 0x21; + + /* set ? only for colour? */ + dev->shadow_regs[0x80] = 0x00; + dev->shadow_regs[0x81] = 0x00; + dev->shadow_regs[0x82] = 0x00; + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0xc3] = 0x81; + + } /* set motor resolution divisor */ dev->shadow_regs[0x39] = 0x0f; - /* Movement direction & step size */ - dev->shadow_regs[0xc6] = 0x09; - - dev->shadow_regs[0xc9] = 0x3b; - dev->shadow_regs[0xca] = 0x01; /* set # of head moves per CIS read */ rts88xx_set_scan_frequency (dev->shadow_regs, 1); + /* set horizontal resolution */ if (dev->model.sensor_type != X1200_SENSOR) - dev->shadow_regs[0x79] = 0x08; + dev->shadow_regs[0x79] = 0x08; + } /* 150dpi x 150dpi */ @@ -2897,293 +3334,438 @@ sanei_lexmark_low_set_scan_regs (Lexmark_Device * dev, SANE_Int resolution, DBG (5, "sanei_lexmark_low_set_scan_regs(): 150 DPI resolution\n"); if (isColourScan) - { - /* set colour scan */ - dev->shadow_regs[0x2f] = 0x11; - switch (dev->model.sensor_type) - { - case X1100_B2_SENSOR: - dev->shadow_regs[0x34] = 0x0b; - dev->shadow_regs[0x36] = 0x0b; - dev->shadow_regs[0x38] = 0x0a; - - dev->shadow_regs[0x80] = 0x05; - dev->shadow_regs[0x81] = 0x05; - dev->shadow_regs[0x82] = 0x0a; - - dev->shadow_regs[0x85] = 0x83; - dev->shadow_regs[0x86] = 0x7e; - dev->shadow_regs[0x87] = 0xad; - dev->shadow_regs[0x88] = 0x35; - - dev->shadow_regs[0x91] = 0xfe; - dev->shadow_regs[0x92] = 0xdf; - dev->shadow_regs[0x93] = 0x0e; - break; - case X1100_2C_SENSOR: - dev->shadow_regs[0x34] = 0x05; - dev->shadow_regs[0x36] = 0x07; - dev->shadow_regs[0x38] = 0x05; - - dev->shadow_regs[0x80] = 0x00; - dev->shadow_regs[0x81] = 0x02; - dev->shadow_regs[0x82] = 0x06; - - dev->shadow_regs[0x85] = 0x20; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - break; - case A920_SENSOR: - dev->shadow_regs[0x34] = 0x03; - dev->shadow_regs[0x36] = 0x08; - dev->shadow_regs[0x38] = 0x05; - - dev->shadow_regs[0x80] = 0x0e; - dev->shadow_regs[0x81] = 0x07; - dev->shadow_regs[0x82] = 0x02; - - dev->shadow_regs[0x85] = 0x05; - dev->shadow_regs[0x86] = 0x14; - dev->shadow_regs[0x87] = 0x06; - dev->shadow_regs[0x88] = 0x04; - - dev->shadow_regs[0x91] = 0xe0; - dev->shadow_regs[0x92] = 0x85; - dev->shadow_regs[0x93] = 0x0e; - break; - case X1200_SENSOR: - dev->shadow_regs[0x34] = 0x04; - dev->shadow_regs[0x36] = 0x05; - dev->shadow_regs[0x38] = 0x02; - /* data compression - dev->shadow_regs[0x40] = 0x90; - dev->shadow_regs[0x50] = 0x20; */ - /* no data compression */ - dev->shadow_regs[0x40] = 0x80; - dev->shadow_regs[0x50] = 0x00; - - dev->shadow_regs[0x79] = 0x20; - - dev->shadow_regs[0x80] = 0x00; - dev->shadow_regs[0x81] = 0x07; - dev->shadow_regs[0x82] = 0x0b; - - dev->shadow_regs[0x85] = 0x20; - dev->shadow_regs[0x86] = 0x1e; - dev->shadow_regs[0x87] = 0x39; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x92] = 0x92; - - break; - case X1200_USB2_SENSOR: - dev->shadow_regs[0x34] = 0x04; - dev->shadow_regs[0x36] = 0x05; - dev->shadow_regs[0x38] = 0x02; - - dev->shadow_regs[0x40] = 0x80; - dev->shadow_regs[0x50] = 0x00; - - dev->shadow_regs[0x79] = 0x20; - - dev->shadow_regs[0x80] = 0x00; - dev->shadow_regs[0x81] = 0x07; - dev->shadow_regs[0x82] = 0x0b; - - dev->shadow_regs[0x85] = 0x20; - dev->shadow_regs[0x86] = 0x1e; - dev->shadow_regs[0x87] = 0x39; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x92] = 0x92; - break; - } - /* set ? */ - dev->shadow_regs[0x35] = 0x01; - dev->shadow_regs[0x37] = 0x01; - /* Motor enable & Coordinate space denominator */ - dev->shadow_regs[0xc3] = 0x83; - /* ? */ - dev->shadow_regs[0xc5] = 0x0e; - /* ? */ - dev->shadow_regs[0xc9] = 0x3a; - dev->shadow_regs[0xca] = 0x03; - /* bounds of movement range0 */ - dev->shadow_regs[0xe0] = 0x61; - dev->shadow_regs[0xe1] = 0x0a; - /* step size range0 */ - dev->shadow_regs[0xe2] = 0xed; - /* ? */ - dev->shadow_regs[0xe3] = 0x02; - /* bounds of movement range1 */ - dev->shadow_regs[0xe4] = 0x29; - dev->shadow_regs[0xe5] = 0x0a; - /* step size range1 */ - dev->shadow_regs[0xe6] = 0x0e; - /* bounds of movement range2 */ - dev->shadow_regs[0xe7] = 0x29; - dev->shadow_regs[0xe8] = 0x03; - /* step size range2 */ - dev->shadow_regs[0xe9] = 0x05; - /* bounds of movement range3 */ - dev->shadow_regs[0xea] = 0x00; - dev->shadow_regs[0xeb] = 0x00; - /* step size range3 */ - dev->shadow_regs[0xec] = 0x01; - /* step size range4 */ - dev->shadow_regs[0xef] = 0x01; - - } + { + + switch (dev->model.sensor_type) + { + case X74_SENSOR: + dev->shadow_regs[0x34] = 0x08; + dev->shadow_regs[0x36] = 0x06; + dev->shadow_regs[0x38] = 0x05; + dev->shadow_regs[0x39] = 0x07; + + /* resolution divisor */ + dev->shadow_regs[0x79] = 0x08; + + dev->shadow_regs[0x80] = 0x0a; + dev->shadow_regs[0x81] = 0x0c; + dev->shadow_regs[0x82] = 0x04; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case X1100_B2_SENSOR: + dev->shadow_regs[0x34] = 0x0b; + dev->shadow_regs[0x36] = 0x0b; + dev->shadow_regs[0x38] = 0x0a; + + dev->shadow_regs[0x80] = 0x05; + dev->shadow_regs[0x81] = 0x05; + dev->shadow_regs[0x82] = 0x0a; + + dev->shadow_regs[0x85] = 0x83; + dev->shadow_regs[0x86] = 0x7e; + dev->shadow_regs[0x87] = 0xad; + dev->shadow_regs[0x88] = 0x35; + + dev->shadow_regs[0x91] = 0xfe; + dev->shadow_regs[0x92] = 0xdf; + dev->shadow_regs[0x93] = 0x0e; + break; + case X1100_2C_SENSOR: + dev->shadow_regs[0x34] = 0x05; + dev->shadow_regs[0x36] = 0x07; + dev->shadow_regs[0x38] = 0x05; + + dev->shadow_regs[0x80] = 0x00; + dev->shadow_regs[0x81] = 0x02; + dev->shadow_regs[0x82] = 0x06; + + dev->shadow_regs[0x85] = 0x20; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case A920_SENSOR: + dev->shadow_regs[0x34] = 0x03; + dev->shadow_regs[0x36] = 0x08; + dev->shadow_regs[0x38] = 0x05; + + dev->shadow_regs[0x80] = 0x0e; + dev->shadow_regs[0x81] = 0x07; + dev->shadow_regs[0x82] = 0x02; + + dev->shadow_regs[0x85] = 0x05; + dev->shadow_regs[0x86] = 0x14; + dev->shadow_regs[0x87] = 0x06; + dev->shadow_regs[0x88] = 0x04; + + dev->shadow_regs[0x91] = 0xe0; + dev->shadow_regs[0x92] = 0x85; + dev->shadow_regs[0x93] = 0x0e; + break; + case X1200_SENSOR: + dev->shadow_regs[0x34] = 0x04; + dev->shadow_regs[0x36] = 0x05; + dev->shadow_regs[0x38] = 0x02; + /* data compression + dev->shadow_regs[0x40] = 0x90; + dev->shadow_regs[0x50] = 0x20; */ + /* no data compression */ + dev->shadow_regs[0x40] = 0x80; + dev->shadow_regs[0x50] = 0x00; + + dev->shadow_regs[0x79] = 0x20; + + dev->shadow_regs[0x80] = 0x00; + dev->shadow_regs[0x81] = 0x07; + dev->shadow_regs[0x82] = 0x0b; + + dev->shadow_regs[0x85] = 0x20; + dev->shadow_regs[0x86] = 0x1e; + dev->shadow_regs[0x87] = 0x39; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x92] = 0x92; + + break; + case X1200_USB2_SENSOR: + dev->shadow_regs[0x34] = 0x04; + dev->shadow_regs[0x36] = 0x05; + dev->shadow_regs[0x38] = 0x02; + + dev->shadow_regs[0x40] = 0x80; + dev->shadow_regs[0x50] = 0x00; + + dev->shadow_regs[0x79] = 0x20; + + dev->shadow_regs[0x80] = 0x00; + dev->shadow_regs[0x81] = 0x07; + dev->shadow_regs[0x82] = 0x0b; + + dev->shadow_regs[0x85] = 0x20; + dev->shadow_regs[0x86] = 0x1e; + dev->shadow_regs[0x87] = 0x39; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x92] = 0x92; + break; + } /* switch */ + switch (dev->model.motor_type) + { + case X74_MOTOR: + dev->shadow_regs[0xc2] = 0x80; + /* ? */ + dev->shadow_regs[0xc4] = 0x20; + + dev->shadow_regs[0xc5] = 0x0e; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x0b; + dev->shadow_regs[0xc7] = 0x00; + dev->shadow_regs[0xc8] = 0x04; + dev->shadow_regs[0xc9] = 0x39; + dev->shadow_regs[0xca] = 0x03; + + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x41; + dev->shadow_regs[0xe1] = 0x09; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x89; + /* ? */ + dev->shadow_regs[0xe3] = 0x02; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x0d; + + dev->shadow_regs[0xe5] = 0x09; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x0d; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0xe8; + dev->shadow_regs[0xe8] = 0x02; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x05; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x01; + /* bounds of movement range4 */ + dev->shadow_regs[0xed] = 0x00; + dev->shadow_regs[0xee] = 0x00; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x01; + break; + case X1100_MOTOR: + case A920_MOTOR: + /* ? */ + dev->shadow_regs[0xc5] = 0x0e; + /* ? */ + dev->shadow_regs[0xc9] = 0x3a; + dev->shadow_regs[0xca] = 0x03; + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x61; + dev->shadow_regs[0xe1] = 0x0a; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0xed; + /* ? */ + dev->shadow_regs[0xe3] = 0x02; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x29; + dev->shadow_regs[0xe5] = 0x0a; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x0e; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0x29; + dev->shadow_regs[0xe8] = 0x03; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x05; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x01; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x01; + break; + } + /* set colour scan */ + dev->shadow_regs[0x2f] = 0x11; + + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x37] = 0x01; + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0xc3] = 0x83; + + } /* if (isColourScan) */ else - { - /* set grayscale scan */ - dev->shadow_regs[0x2f] = 0x21; - switch (dev->model.sensor_type) - { - case X1100_B2_SENSOR: - dev->shadow_regs[0x34] = 0x04; - dev->shadow_regs[0x35] = 0x04; - dev->shadow_regs[0x36] = 0x07; - dev->shadow_regs[0x37] = 0x07; - dev->shadow_regs[0x38] = 0x0a; - - dev->shadow_regs[0x85] = 0x00; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - break; - case X1100_2C_SENSOR: - dev->shadow_regs[0x34] = 0x02; - dev->shadow_regs[0x35] = 0x02; - dev->shadow_regs[0x36] = 0x04; - dev->shadow_regs[0x37] = 0x04; - dev->shadow_regs[0x38] = 0x05; - - dev->shadow_regs[0x85] = 0x20; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - break; - case A920_SENSOR: - dev->shadow_regs[0x34] = 0x02; - dev->shadow_regs[0x35] = 0x02; - dev->shadow_regs[0x36] = 0x04; - dev->shadow_regs[0x37] = 0x04; - dev->shadow_regs[0x38] = 0x05; - - dev->shadow_regs[0x85] = 0x0d; - dev->shadow_regs[0x86] = 0x14; - dev->shadow_regs[0x87] = 0x06; - dev->shadow_regs[0x88] = 0x45; - - dev->shadow_regs[0x91] = 0x60; - dev->shadow_regs[0x92] = 0x8d; - dev->shadow_regs[0x93] = 0x0e; - break; - case X1200_SENSOR: - dev->shadow_regs[0x34] = 0x01; - dev->shadow_regs[0x35] = 0x01; - dev->shadow_regs[0x36] = 0x02; - dev->shadow_regs[0x37] = 0x02; - dev->shadow_regs[0x38] = 0x03; - - /* dev->shadow_regs[0x40] = 0x90; - dev->shadow_regs[0x50] = 0x20; */ - /* no data compression */ - dev->shadow_regs[0x40] = 0x80; - dev->shadow_regs[0x50] = 0x00; - - dev->shadow_regs[0x79] = 0x20; - - dev->shadow_regs[0x85] = 0x00; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0xff; - dev->shadow_regs[0x88] = 0x02; - - dev->shadow_regs[0x92] = 0x92; - break; - case X1200_USB2_SENSOR: - dev->shadow_regs[0x34] = 0x01; - dev->shadow_regs[0x35] = 0x01; - dev->shadow_regs[0x36] = 0x02; - dev->shadow_regs[0x37] = 0x02; - dev->shadow_regs[0x38] = 0x03; - - dev->shadow_regs[0x40] = 0x80; - dev->shadow_regs[0x50] = 0x00; - - dev->shadow_regs[0x79] = 0x20; - - dev->shadow_regs[0x85] = 0x00; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0xff; - dev->shadow_regs[0x88] = 0x02; - - dev->shadow_regs[0x92] = 0x92; - break; - } - - /* set ? only for colour? */ - dev->shadow_regs[0x80] = 0x00; - dev->shadow_regs[0x81] = 0x00; - dev->shadow_regs[0x82] = 0x00; - /* Motor enable & Coordinate space denominator */ - dev->shadow_regs[0xc3] = 0x81; - /* ? */ - dev->shadow_regs[0xc5] = 0x16; - /* ? */ - dev->shadow_regs[0xc9] = 0x3b; - dev->shadow_regs[0xca] = 0x01; - /* bounds of movement range0 */ - dev->shadow_regs[0xe0] = 0xdd; - dev->shadow_regs[0xe1] = 0x18; - /* step size range0 */ - dev->shadow_regs[0xe2] = 0x01; - /* ? */ - dev->shadow_regs[0xe3] = 0x03; - /* bounds of movement range1 */ - dev->shadow_regs[0xe4] = 0x6d; - dev->shadow_regs[0xe5] = 0x15; - /* step size range1 */ - dev->shadow_regs[0xe6] = 0xdc; - /* bounds of movement range2 */ - dev->shadow_regs[0xe7] = 0xad; - dev->shadow_regs[0xe8] = 0x07; - /* step size range2 */ - dev->shadow_regs[0xe9] = 0x1b; - /* bounds of movement range3 */ - dev->shadow_regs[0xea] = 0xe1; - dev->shadow_regs[0xeb] = 0x03; - /* step size range3 */ - dev->shadow_regs[0xec] = 0x07; - /* step size range4 */ - dev->shadow_regs[0xef] = 0x03; - } - - /* set motor resolution divisor */ - dev->shadow_regs[0x39] = 0x07; - /* Movement direction & step size */ - dev->shadow_regs[0xc6] = 0x09; - - /* set # of head moves per CIS read */ + { + switch (dev->model.sensor_type) + { + case X74_SENSOR: + + dev->shadow_regs[0x34] = 0x02; + dev->shadow_regs[0x35] = 0x02; + dev->shadow_regs[0x36] = 0x04; + dev->shadow_regs[0x37] = 0x04; + dev->shadow_regs[0x38] = 0x06; + dev->shadow_regs[0x39] = 0x07; + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0x40] = 0x40; + + /* resolution divisor */ + dev->shadow_regs[0x79] = 0x08; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case X1100_B2_SENSOR: + dev->shadow_regs[0x34] = 0x04; + dev->shadow_regs[0x35] = 0x04; + dev->shadow_regs[0x36] = 0x07; + dev->shadow_regs[0x37] = 0x07; + dev->shadow_regs[0x38] = 0x0a; + + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case X1100_2C_SENSOR: + dev->shadow_regs[0x34] = 0x02; + dev->shadow_regs[0x35] = 0x02; + dev->shadow_regs[0x36] = 0x04; + dev->shadow_regs[0x37] = 0x04; + dev->shadow_regs[0x38] = 0x05; + + dev->shadow_regs[0x85] = 0x20; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case A920_SENSOR: + dev->shadow_regs[0x34] = 0x02; + dev->shadow_regs[0x35] = 0x02; + dev->shadow_regs[0x36] = 0x04; + dev->shadow_regs[0x37] = 0x04; + dev->shadow_regs[0x38] = 0x05; + + dev->shadow_regs[0x85] = 0x0d; + dev->shadow_regs[0x86] = 0x14; + dev->shadow_regs[0x87] = 0x06; + dev->shadow_regs[0x88] = 0x45; + + dev->shadow_regs[0x91] = 0x60; + dev->shadow_regs[0x92] = 0x8d; + dev->shadow_regs[0x93] = 0x0e; + break; + case X1200_SENSOR: + dev->shadow_regs[0x34] = 0x01; + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x36] = 0x02; + dev->shadow_regs[0x37] = 0x02; + dev->shadow_regs[0x38] = 0x03; + + /* dev->shadow_regs[0x40] = 0x90; + dev->shadow_regs[0x50] = 0x20; */ + /* no data compression */ + dev->shadow_regs[0x40] = 0x80; + dev->shadow_regs[0x50] = 0x00; + + dev->shadow_regs[0x79] = 0x20; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0xff; + dev->shadow_regs[0x88] = 0x02; + + dev->shadow_regs[0x92] = 0x92; + break; + case X1200_USB2_SENSOR: + dev->shadow_regs[0x34] = 0x01; + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x36] = 0x02; + dev->shadow_regs[0x37] = 0x02; + dev->shadow_regs[0x38] = 0x03; + + dev->shadow_regs[0x40] = 0x80; + dev->shadow_regs[0x50] = 0x00; + + dev->shadow_regs[0x79] = 0x20; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0xff; + dev->shadow_regs[0x88] = 0x02; + + dev->shadow_regs[0x92] = 0x92; + break; + } /* switch */ + switch (dev->model.motor_type) + { + case X74_MOTOR: + /* ? */ + dev->shadow_regs[0xc4] = 0x20; + dev->shadow_regs[0xc5] = 0x14; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x0b; + + dev->shadow_regs[0xc8] = 0x04; + dev->shadow_regs[0xc9] = 0x39; + dev->shadow_regs[0xca] = 0x01; + + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x09; + dev->shadow_regs[0xe1] = 0x18; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0xe9; + /* ? */ + dev->shadow_regs[0xe3] = 0x03; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x79; + + dev->shadow_regs[0xe5] = 0x16; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x64; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0xcd; + dev->shadow_regs[0xe8] = 0x08; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x32; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0xe5; + dev->shadow_regs[0xeb] = 0x04; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x0c; + /* bounds of movement range4 */ + dev->shadow_regs[0xed] = 0x00; + dev->shadow_regs[0xee] = 0x00; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x08; + break; + case X1100_MOTOR: + case A920_MOTOR: + /* ? */ + dev->shadow_regs[0xc5] = 0x16; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x09; + /* ? */ + dev->shadow_regs[0xc9] = 0x3b; + dev->shadow_regs[0xca] = 0x01; + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0xdd; + dev->shadow_regs[0xe1] = 0x18; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x01; + /* ? */ + dev->shadow_regs[0xe3] = 0x03; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x6d; + dev->shadow_regs[0xe5] = 0x15; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0xdc; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0xad; + dev->shadow_regs[0xe8] = 0x07; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x1b; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0xe1; + dev->shadow_regs[0xeb] = 0x03; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x07; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x03; + break; + } + + /* set grayscale scan */ + dev->shadow_regs[0x2f] = 0x21; + /* set motor resolution divisor */ + dev->shadow_regs[0x39] = 0x07; + /* set ? only for colour? */ + dev->shadow_regs[0x80] = 0x00; + dev->shadow_regs[0x81] = 0x00; + dev->shadow_regs[0x82] = 0x00; + + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0xc3] = 0x81; + }/* else (greyscale) */ + + + + + /* set # of head moves per CIS read */ rts88xx_set_scan_frequency (dev->shadow_regs, 1); /* hum, horizontal resolution different for X1200 ? */ - if (dev->model.sensor_type != X1200_SENSOR) - dev->shadow_regs[0x79] = 0x20; + /* if (dev->model.sensor_type != X1200_SENSOR) + dev->shadow_regs[0x79] = 0x20;*/ + } /*300dpi x 300dpi */ @@ -3192,693 +3774,1004 @@ sanei_lexmark_low_set_scan_regs (Lexmark_Device * dev, SANE_Int resolution, DBG (5, "sanei_lexmark_low_set_scan_regs(): 300 DPI resolution\n"); if (isColourScan) - { - /* set colour scan */ - dev->shadow_regs[0x2f] = 0x11; - - switch (dev->model.sensor_type) - { - case X1100_B2_SENSOR: - dev->shadow_regs[0x34] = 0x15; - dev->shadow_regs[0x36] = 0x15; - dev->shadow_regs[0x38] = 0x14; - - dev->shadow_regs[0x80] = 0x0a; - dev->shadow_regs[0x81] = 0x0a; - dev->shadow_regs[0x82] = 0x06; - - dev->shadow_regs[0x85] = 0x83; - dev->shadow_regs[0x86] = 0x7e; - dev->shadow_regs[0x87] = 0xad; - dev->shadow_regs[0x88] = 0x35; - - dev->shadow_regs[0x91] = 0xfe; - dev->shadow_regs[0x92] = 0xdf; - dev->shadow_regs[0x93] = 0x0e; - break; - case X1100_2C_SENSOR: - dev->shadow_regs[0x34] = 0x08; - dev->shadow_regs[0x36] = 0x0d; - dev->shadow_regs[0x38] = 0x09; - - dev->shadow_regs[0x80] = 0x0e; - dev->shadow_regs[0x81] = 0x04; - dev->shadow_regs[0x82] = 0x0a; - - dev->shadow_regs[0x85] = 0x20; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - break; - case A920_SENSOR: - dev->shadow_regs[0x34] = 0x06; - dev->shadow_regs[0x36] = 0x10; - dev->shadow_regs[0x38] = 0x09; - - dev->shadow_regs[0x80] = 0x0c; - dev->shadow_regs[0x81] = 0x02; - dev->shadow_regs[0x82] = 0x04; - - dev->shadow_regs[0x85] = 0x05; - dev->shadow_regs[0x86] = 0x14; - dev->shadow_regs[0x87] = 0x06; - dev->shadow_regs[0x88] = 0x04; - - dev->shadow_regs[0x91] = 0xe0; - dev->shadow_regs[0x92] = 0x85; - dev->shadow_regs[0x93] = 0x0e; - break; - case X1200_SENSOR: - dev->shadow_regs[0x34] = 0x07; - dev->shadow_regs[0x36] = 0x09; - dev->shadow_regs[0x38] = 0x04; - - /* data compression - dev->shadow_regs[0x40] = 0x90; - dev->shadow_regs[0x50] = 0x20; */ - /* no data compression */ - dev->shadow_regs[0x40] = 0x80; - dev->shadow_regs[0x50] = 0x00; - - dev->shadow_regs[0x80] = 0x00; - dev->shadow_regs[0x81] = 0x0e; - dev->shadow_regs[0x82] = 0x06; - break; - case X1200_USB2_SENSOR: - dev->shadow_regs[0x34] = 0x07; - dev->shadow_regs[0x36] = 0x09; - dev->shadow_regs[0x38] = 0x04; - - dev->shadow_regs[0x40] = 0x80; - dev->shadow_regs[0x50] = 0x00; - - dev->shadow_regs[0x80] = 0x00; - dev->shadow_regs[0x81] = 0x0e; - dev->shadow_regs[0x82] = 0x06; - break; - } - - /* set ? */ - dev->shadow_regs[0x35] = 0x01; - dev->shadow_regs[0x37] = 0x01; - /* set motor resolution divisor */ - dev->shadow_regs[0x39] = 0x03; - /* set ? */ - /* Motor enable & Coordinate space denominator */ - dev->shadow_regs[0xc3] = 0x83; - /* ? */ - dev->shadow_regs[0xc5] = 0x17; - /* Movement direction & step size */ - dev->shadow_regs[0xc6] = 0x09; - /* ? */ - dev->shadow_regs[0xc9] = 0x3a; - dev->shadow_regs[0xca] = 0x0a; - /* bounds of movement range0 */ - dev->shadow_regs[0xe0] = 0x75; - dev->shadow_regs[0xe1] = 0x0a; - /* step size range0 */ - dev->shadow_regs[0xe2] = 0xdd; - /* ? */ - dev->shadow_regs[0xe3] = 0x05; - /* bounds of movement range1 */ - dev->shadow_regs[0xe4] = 0x59; - dev->shadow_regs[0xe5] = 0x0a; - /* step size range1 */ - dev->shadow_regs[0xe6] = 0x0e; - /* bounds of movement range2 */ - dev->shadow_regs[0xe7] = 0x00; - dev->shadow_regs[0xe8] = 0x00; - /* step size range2 */ - dev->shadow_regs[0xe9] = 0x05; - /* bounds of movement range3 */ - dev->shadow_regs[0xea] = 0x00; - dev->shadow_regs[0xeb] = 0x00; - /* step size range3 */ - dev->shadow_regs[0xec] = 0x01; - /* step size range4 */ - dev->shadow_regs[0xef] = 0x01; - } - else - { - /* set grayscale scan */ - dev->shadow_regs[0x2f] = 0x21; - /* set ? */ - switch (dev->model.sensor_type) - { - case X1100_B2_SENSOR: - dev->shadow_regs[0x34] = 0x08; - dev->shadow_regs[0x35] = 0x08; - dev->shadow_regs[0x36] = 0x0f; - dev->shadow_regs[0x37] = 0x0f; - dev->shadow_regs[0x38] = 0x16; - - dev->shadow_regs[0x85] = 0x00; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - break; - case X1100_2C_SENSOR: - dev->shadow_regs[0x34] = 0x04; - dev->shadow_regs[0x35] = 0x04; - dev->shadow_regs[0x36] = 0x07; - dev->shadow_regs[0x37] = 0x07; - dev->shadow_regs[0x38] = 0x0a; - - dev->shadow_regs[0x85] = 0x20; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - break; - case A920_SENSOR: - dev->shadow_regs[0x34] = 0x03; - dev->shadow_regs[0x35] = 0x03; - dev->shadow_regs[0x36] = 0x06; - dev->shadow_regs[0x37] = 0x06; - dev->shadow_regs[0x38] = 0x09; - - dev->shadow_regs[0x85] = 0x05; - dev->shadow_regs[0x86] = 0x14; - dev->shadow_regs[0x87] = 0x06; - dev->shadow_regs[0x88] = 0x04; - - dev->shadow_regs[0x91] = 0xe0; - dev->shadow_regs[0x92] = 0x85; - dev->shadow_regs[0x93] = 0x0e; - break; - case X1200_SENSOR: - dev->shadow_regs[0x34] = 0x02; - dev->shadow_regs[0x35] = 0x02; - dev->shadow_regs[0x36] = 0x04; - dev->shadow_regs[0x37] = 0x04; - dev->shadow_regs[0x38] = 0x06; - break; - case X1200_USB2_SENSOR: - dev->shadow_regs[0x34] = 0x02; - dev->shadow_regs[0x35] = 0x02; - dev->shadow_regs[0x36] = 0x04; - dev->shadow_regs[0x37] = 0x04; - dev->shadow_regs[0x38] = 0x06; - break; - } - - /* set motor resolution divisor */ - dev->shadow_regs[0x39] = 0x03; - /* set ? only for colour? */ - dev->shadow_regs[0x80] = 0x00; - dev->shadow_regs[0x81] = 0x00; - dev->shadow_regs[0x82] = 0x00; - /* Motor enable & Coordinate space denominator */ - dev->shadow_regs[0xc3] = 0x81; - /* ? */ - dev->shadow_regs[0xc5] = 0x19; - /* Movement direction & step size */ - dev->shadow_regs[0xc6] = 0x09; - /* ? */ - dev->shadow_regs[0xc9] = 0x3a; - dev->shadow_regs[0xca] = 0x08; - /* bounds of movement range0 */ - dev->shadow_regs[0xe0] = 0xe3; - dev->shadow_regs[0xe1] = 0x18; - /* step size range0 */ - dev->shadow_regs[0xe2] = 0x03; - /* ? */ - dev->shadow_regs[0xe3] = 0x06; - /* bounds of movement range1 */ - dev->shadow_regs[0xe4] = 0x2b; - dev->shadow_regs[0xe5] = 0x17; - /* step size range1 */ - dev->shadow_regs[0xe6] = 0xdc; - /* bounds of movement range2 */ - dev->shadow_regs[0xe7] = 0xb3; - dev->shadow_regs[0xe8] = 0x07; - /* step size range2 */ - dev->shadow_regs[0xe9] = 0x1b; - /* bounds of movement range3 */ - dev->shadow_regs[0xea] = 0x00; - dev->shadow_regs[0xeb] = 0x00; - /* step size range3 */ - dev->shadow_regs[0xec] = 0x07; - /* step size range4 */ - dev->shadow_regs[0xef] = 0x03; - } + { + + switch (dev->model.sensor_type) + { + case X74_SENSOR: + dev->shadow_regs[0x34] = 0x08; + dev->shadow_regs[0x36] = 0x06; + dev->shadow_regs[0x38] = 0x05; + dev->shadow_regs[0x39] = 0x07; + + dev->shadow_regs[0x80] = 0x08; + dev->shadow_regs[0x81] = 0x0a; + dev->shadow_regs[0x82] = 0x03; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case X1100_B2_SENSOR: + dev->shadow_regs[0x34] = 0x15; + dev->shadow_regs[0x36] = 0x15; + dev->shadow_regs[0x38] = 0x14; + /* set motor resolution divisor */ + dev->shadow_regs[0x39] = 0x03; + + dev->shadow_regs[0x80] = 0x0a; + dev->shadow_regs[0x81] = 0x0a; + dev->shadow_regs[0x82] = 0x06; + + dev->shadow_regs[0x85] = 0x83; + dev->shadow_regs[0x86] = 0x7e; + dev->shadow_regs[0x87] = 0xad; + dev->shadow_regs[0x88] = 0x35; + + dev->shadow_regs[0x91] = 0xfe; + dev->shadow_regs[0x92] = 0xdf; + dev->shadow_regs[0x93] = 0x0e; + break; + case X1100_2C_SENSOR: + dev->shadow_regs[0x34] = 0x08; + dev->shadow_regs[0x36] = 0x0d; + dev->shadow_regs[0x38] = 0x09; + /* set motor resolution divisor */ + dev->shadow_regs[0x39] = 0x03; + + dev->shadow_regs[0x80] = 0x0e; + dev->shadow_regs[0x81] = 0x04; + dev->shadow_regs[0x82] = 0x0a; + + dev->shadow_regs[0x85] = 0x20; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case A920_SENSOR: + dev->shadow_regs[0x34] = 0x06; + dev->shadow_regs[0x36] = 0x10; + dev->shadow_regs[0x38] = 0x09; + /* set motor resolution divisor */ + dev->shadow_regs[0x39] = 0x03; + + dev->shadow_regs[0x80] = 0x0c; + dev->shadow_regs[0x81] = 0x02; + dev->shadow_regs[0x82] = 0x04; + + dev->shadow_regs[0x85] = 0x05; + dev->shadow_regs[0x86] = 0x14; + dev->shadow_regs[0x87] = 0x06; + dev->shadow_regs[0x88] = 0x04; + + dev->shadow_regs[0x91] = 0xe0; + dev->shadow_regs[0x92] = 0x85; + dev->shadow_regs[0x93] = 0x0e; + break; + case X1200_SENSOR: + dev->shadow_regs[0x34] = 0x07; + dev->shadow_regs[0x36] = 0x09; + dev->shadow_regs[0x38] = 0x04; + /* set motor resolution divisor */ + dev->shadow_regs[0x39] = 0x03; + + /* data compression + dev->shadow_regs[0x40] = 0x90; + dev->shadow_regs[0x50] = 0x20; */ + /* no data compression */ + dev->shadow_regs[0x40] = 0x80; + dev->shadow_regs[0x50] = 0x00; + + dev->shadow_regs[0x80] = 0x00; + dev->shadow_regs[0x81] = 0x0e; + dev->shadow_regs[0x82] = 0x06; + break; + case X1200_USB2_SENSOR: + dev->shadow_regs[0x34] = 0x07; + dev->shadow_regs[0x36] = 0x09; + dev->shadow_regs[0x38] = 0x04; + /* set motor resolution divisor */ + dev->shadow_regs[0x39] = 0x03; + + dev->shadow_regs[0x40] = 0x80; + dev->shadow_regs[0x50] = 0x00; + + dev->shadow_regs[0x80] = 0x00; + dev->shadow_regs[0x81] = 0x0e; + dev->shadow_regs[0x82] = 0x06; + break; + } + switch (dev->model.motor_type) + { + case X74_MOTOR: + /* ? */ + dev->shadow_regs[0xc4] = 0x20; + dev->shadow_regs[0xc5] = 0x12; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x09; + + dev->shadow_regs[0xc8] = 0x04; + dev->shadow_regs[0xc9] = 0x39; + dev->shadow_regs[0xca] = 0x0f; + + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x5d; + dev->shadow_regs[0xe1] = 0x05; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0xed; + /* ? */ + dev->shadow_regs[0xe3] = 0x02; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x29; + dev->shadow_regs[0xe5] = 0x05; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x0d; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0x00; + dev->shadow_regs[0xe8] = 0x00; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x05; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x01; + /* bounds of movement range4 -only for 75dpi grayscale */ + dev->shadow_regs[0xed] = 0x00; + dev->shadow_regs[0xee] = 0x00; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x01; + break; + case A920_MOTOR: + case X1100_MOTOR: + /* ? */ + dev->shadow_regs[0xc5] = 0x17; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x09; + /* ? */ + dev->shadow_regs[0xc9] = 0x3a; + dev->shadow_regs[0xca] = 0x0a; + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x75; + dev->shadow_regs[0xe1] = 0x0a; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0xdd; + /* ? */ + dev->shadow_regs[0xe3] = 0x05; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x59; + dev->shadow_regs[0xe5] = 0x0a; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x0e; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0x00; + dev->shadow_regs[0xe8] = 0x00; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x05; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x01; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x01; + break; + } + + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x37] = 0x01; + + /* set colour scan */ + dev->shadow_regs[0x2f] = 0x11; + + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0xc3] = 0x83; + + } + else /* greyscale */ + { + + switch (dev->model.sensor_type) + { + case X74_SENSOR: + dev->shadow_regs[0x34] = 0x04; + dev->shadow_regs[0x35] = 0x04; + dev->shadow_regs[0x36] = 0x08; + dev->shadow_regs[0x37] = 0x08; + dev->shadow_regs[0x38] = 0x0c; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case X1100_B2_SENSOR: + dev->shadow_regs[0x34] = 0x08; + dev->shadow_regs[0x35] = 0x08; + dev->shadow_regs[0x36] = 0x0f; + dev->shadow_regs[0x37] = 0x0f; + dev->shadow_regs[0x38] = 0x16; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case X1100_2C_SENSOR: + dev->shadow_regs[0x34] = 0x04; + dev->shadow_regs[0x35] = 0x04; + dev->shadow_regs[0x36] = 0x07; + dev->shadow_regs[0x37] = 0x07; + dev->shadow_regs[0x38] = 0x0a; + + dev->shadow_regs[0x85] = 0x20; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case A920_SENSOR: + dev->shadow_regs[0x34] = 0x03; + dev->shadow_regs[0x35] = 0x03; + dev->shadow_regs[0x36] = 0x06; + dev->shadow_regs[0x37] = 0x06; + dev->shadow_regs[0x38] = 0x09; + + dev->shadow_regs[0x85] = 0x05; + dev->shadow_regs[0x86] = 0x14; + dev->shadow_regs[0x87] = 0x06; + dev->shadow_regs[0x88] = 0x04; + + dev->shadow_regs[0x91] = 0xe0; + dev->shadow_regs[0x92] = 0x85; + dev->shadow_regs[0x93] = 0x0e; + break; + case X1200_SENSOR: + dev->shadow_regs[0x34] = 0x02; + dev->shadow_regs[0x35] = 0x02; + dev->shadow_regs[0x36] = 0x04; + dev->shadow_regs[0x37] = 0x04; + dev->shadow_regs[0x38] = 0x06; + break; + case X1200_USB2_SENSOR: + dev->shadow_regs[0x34] = 0x02; + dev->shadow_regs[0x35] = 0x02; + dev->shadow_regs[0x36] = 0x04; + dev->shadow_regs[0x37] = 0x04; + dev->shadow_regs[0x38] = 0x06; + break; + } + switch (dev->model.motor_type) + { + case X74_MOTOR: + /* ? */ + dev->shadow_regs[0xc4] = 0x20; + dev->shadow_regs[0xc5] = 0x1c; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x0b; + + dev->shadow_regs[0xc8] = 0x04; + dev->shadow_regs[0xc9] = 0x39; + dev->shadow_regs[0xca] = 0x05; + + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x29; + dev->shadow_regs[0xe1] = 0x17; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x8f; + /* ? */ + dev->shadow_regs[0xe3] = 0x06; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x61; + + dev->shadow_regs[0xe5] = 0x16; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x64; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0xb5; + dev->shadow_regs[0xe8] = 0x08; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x32; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x0c; + /* bounds of movement range4 -only for 75dpi grayscale */ + dev->shadow_regs[0xed] = 0x00; + dev->shadow_regs[0xee] = 0x00; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x08; + break; + case A920_MOTOR: + case X1100_MOTOR: + /* ? */ + dev->shadow_regs[0xc5] = 0x19; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x09; + /* ? */ + dev->shadow_regs[0xc9] = 0x3a; + dev->shadow_regs[0xca] = 0x08; + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0xe3; + dev->shadow_regs[0xe1] = 0x18; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x03; + /* ? */ + dev->shadow_regs[0xe3] = 0x06; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x2b; + dev->shadow_regs[0xe5] = 0x17; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0xdc; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0xb3; + dev->shadow_regs[0xe8] = 0x07; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x1b; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x07; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x03; + break; + } /* switch motortype */ + /* set grayscale scan */ + dev->shadow_regs[0x2f] = 0x21; + /* set motor resolution divisor */ + dev->shadow_regs[0x39] = 0x03; + + /* set ? only for colour? */ + dev->shadow_regs[0x80] = 0x00; + dev->shadow_regs[0x81] = 0x00; + dev->shadow_regs[0x82] = 0x00; + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0xc3] = 0x81; + + + } /* else (gray)*/ /* set # of head moves per CIS read */ rts88xx_set_scan_frequency (dev->shadow_regs, 1); /* set horizontal resolution */ dev->shadow_regs[0x79] = 0x20; - } + } /* 600dpi x 600dpi */ if (resolution == 600) { DBG (5, "sanei_lexmark_low_set_scan_regs(): 600 DPI resolution\n"); + + if (isColourScan) - { - /* set colour scan */ - dev->shadow_regs[0x2f] = 0x11; - /* set ? */ - switch (dev->model.sensor_type) - { - case X1100_B2_SENSOR: - dev->shadow_regs[0x34] = 0x15; - dev->shadow_regs[0x36] = 0x15; - dev->shadow_regs[0x38] = 0x14; - - dev->shadow_regs[0x80] = 0x02; - dev->shadow_regs[0x81] = 0x02; - dev->shadow_regs[0x82] = 0x08; - - dev->shadow_regs[0x85] = 0x83; - dev->shadow_regs[0x86] = 0x7e; - dev->shadow_regs[0x87] = 0xad; - dev->shadow_regs[0x88] = 0x35; - - dev->shadow_regs[0x91] = 0xfe; - dev->shadow_regs[0x92] = 0xdf; - dev->shadow_regs[0x93] = 0x0e; - break; - case X1100_2C_SENSOR: - dev->shadow_regs[0x34] = 0x08; - dev->shadow_regs[0x36] = 0x0d; - dev->shadow_regs[0x38] = 0x09; - - dev->shadow_regs[0x80] = 0x0e; - dev->shadow_regs[0x81] = 0x02; - dev->shadow_regs[0x82] = 0x0a; - - dev->shadow_regs[0x85] = 0x20; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - break; - case A920_SENSOR: - dev->shadow_regs[0x34] = 0x06; - dev->shadow_regs[0x36] = 0x0f; - dev->shadow_regs[0x38] = 0x09; - - dev->shadow_regs[0x79] = 0x40; - - dev->shadow_regs[0x80] = 0x0e; - dev->shadow_regs[0x81] = 0x0e; - dev->shadow_regs[0x82] = 0x00; - - dev->shadow_regs[0x85] = 0x05; - dev->shadow_regs[0x86] = 0x14; - dev->shadow_regs[0x87] = 0x06; - dev->shadow_regs[0x88] = 0x04; - - dev->shadow_regs[0x91] = 0x60; - dev->shadow_regs[0x92] = 0x85; - dev->shadow_regs[0x93] = 0x0e; - break; - case X1200_SENSOR: - dev->shadow_regs[0x34] = 0x07; - dev->shadow_regs[0x36] = 0x0a; - dev->shadow_regs[0x38] = 0x04; - - /* data compression - dev->shadow_regs[0x40] = 0x90; - dev->shadow_regs[0x50] = 0x20; */ - - /* no data compression */ - dev->shadow_regs[0x40] = 0x80; - dev->shadow_regs[0x50] = 0x00; - - dev->shadow_regs[0x80] = 0x02; - dev->shadow_regs[0x81] = 0x00; - dev->shadow_regs[0x82] = 0x06; - break; - case X1200_USB2_SENSOR: - dev->shadow_regs[0x34] = 0x0d; - dev->shadow_regs[0x36] = 0x13; - dev->shadow_regs[0x38] = 0x10; - - dev->shadow_regs[0x80] = 0x04; - dev->shadow_regs[0x81] = 0x0e; - dev->shadow_regs[0x82] = 0x08; - - dev->shadow_regs[0x85] = 0x02; - dev->shadow_regs[0x86] = 0x3b; - dev->shadow_regs[0x87] = 0x0f; - dev->shadow_regs[0x88] = 0x24; - - dev->shadow_regs[0x91] = 0x19; - dev->shadow_regs[0x92] = 0x30; - dev->shadow_regs[0x93] = 0x0e; - dev->shadow_regs[0xc5] = 0x17; - dev->shadow_regs[0xc6] = 0x09; - dev->shadow_regs[0xca] = 0x0a; - break; - } - dev->shadow_regs[0x35] = 0x01; - dev->shadow_regs[0x37] = 0x01; - - /* set motor resolution divisor */ - dev->shadow_regs[0x39] = 0x03; - /* set # of head moves per CIS read */ - rts88xx_set_scan_frequency (dev->shadow_regs, 2); - /* Motor enable & Coordinate space denominator */ - dev->shadow_regs[0xc3] = 0x86; - /* ? */ - dev->shadow_regs[0xc5] = 0x27; - /* Movement direction & step size */ - dev->shadow_regs[0xc6] = 0x0c; - /* ? */ - dev->shadow_regs[0xc9] = 0x3a; - dev->shadow_regs[0xca] = 0x1a; - /* bounds of movement range0 */ - dev->shadow_regs[0xe0] = 0x57; - dev->shadow_regs[0xe1] = 0x0a; - /* step size range0 */ - dev->shadow_regs[0xe2] = 0xbf; - /* ? */ - dev->shadow_regs[0xe3] = 0x05; - /* bounds of movement range1 */ - dev->shadow_regs[0xe4] = 0x3b; - dev->shadow_regs[0xe5] = 0x0a; - /* step size range1 */ - dev->shadow_regs[0xe6] = 0x0e; - /* bounds of movement range2 */ - dev->shadow_regs[0xe7] = 0x00; - dev->shadow_regs[0xe8] = 0x00; - /* step size range2 */ - dev->shadow_regs[0xe9] = 0x05; - /* bounds of movement range3 */ - dev->shadow_regs[0xea] = 0x00; - dev->shadow_regs[0xeb] = 0x00; - /* step size range3 */ - dev->shadow_regs[0xec] = 0x01; - /* step size range4 */ - dev->shadow_regs[0xef] = 0x01; - } + { + /* 600 dpi color doesn't work for X74 yet */ + if (dev->model.sensor_type == X74_SENSOR) + return SANE_STATUS_INVAL; + + switch (dev->model.sensor_type) + { + case X74_SENSOR: + dev->shadow_regs[0x34] = 0x10; + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x36] = 0x0c; + dev->shadow_regs[0x37] = 0x01; + dev->shadow_regs[0x38] = 0x09; + + dev->shadow_regs[0x80] = 0x02; + dev->shadow_regs[0x81] = 0x08; + dev->shadow_regs[0x82] = 0x08; + + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + + /*dev->shadow_regs[0x34] = 0x08; + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x36] = 0x06; + dev->shadow_regs[0x37] = 0x01; + dev->shadow_regs[0x38] = 0x05; + + + dev->shadow_regs[0x80] = 0x09; + dev->shadow_regs[0x81] = 0x0c; + dev->shadow_regs[0x82] = 0x04; + + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break;*/ + + + + case X1100_B2_SENSOR: + dev->shadow_regs[0x34] = 0x15; + dev->shadow_regs[0x36] = 0x15; + dev->shadow_regs[0x38] = 0x14; + + dev->shadow_regs[0x80] = 0x02; + dev->shadow_regs[0x81] = 0x02; + dev->shadow_regs[0x82] = 0x08; + + dev->shadow_regs[0x85] = 0x83; + dev->shadow_regs[0x86] = 0x7e; + dev->shadow_regs[0x87] = 0xad; + dev->shadow_regs[0x88] = 0x35; + + dev->shadow_regs[0x91] = 0xfe; + dev->shadow_regs[0x92] = 0xdf; + dev->shadow_regs[0x93] = 0x0e; + break; + case X1100_2C_SENSOR: + dev->shadow_regs[0x34] = 0x08; + dev->shadow_regs[0x36] = 0x0d; + dev->shadow_regs[0x38] = 0x09; + + dev->shadow_regs[0x80] = 0x0e; + dev->shadow_regs[0x81] = 0x02; + dev->shadow_regs[0x82] = 0x0a; + + dev->shadow_regs[0x85] = 0x20; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case A920_SENSOR: + dev->shadow_regs[0x34] = 0x06; + dev->shadow_regs[0x36] = 0x0f; + dev->shadow_regs[0x38] = 0x09; + + dev->shadow_regs[0x79] = 0x40; + + dev->shadow_regs[0x80] = 0x0e; + dev->shadow_regs[0x81] = 0x0e; + dev->shadow_regs[0x82] = 0x00; + + dev->shadow_regs[0x85] = 0x05; + dev->shadow_regs[0x86] = 0x14; + dev->shadow_regs[0x87] = 0x06; + dev->shadow_regs[0x88] = 0x04; + + dev->shadow_regs[0x91] = 0x60; + dev->shadow_regs[0x92] = 0x85; + dev->shadow_regs[0x93] = 0x0e; + break; + case X1200_SENSOR: + dev->shadow_regs[0x34] = 0x07; + dev->shadow_regs[0x36] = 0x0a; + dev->shadow_regs[0x38] = 0x04; + + /* data compression + dev->shadow_regs[0x40] = 0x90; + dev->shadow_regs[0x50] = 0x20; */ + + /* no data compression */ + dev->shadow_regs[0x40] = 0x80; + dev->shadow_regs[0x50] = 0x00; + + dev->shadow_regs[0x80] = 0x02; + dev->shadow_regs[0x81] = 0x00; + dev->shadow_regs[0x82] = 0x06; + break; + case X1200_USB2_SENSOR: + dev->shadow_regs[0x34] = 0x0d; + dev->shadow_regs[0x36] = 0x13; + dev->shadow_regs[0x38] = 0x10; + + dev->shadow_regs[0x80] = 0x04; + dev->shadow_regs[0x81] = 0x0e; + dev->shadow_regs[0x82] = 0x08; + + dev->shadow_regs[0x85] = 0x02; + dev->shadow_regs[0x86] = 0x3b; + dev->shadow_regs[0x87] = 0x0f; + dev->shadow_regs[0x88] = 0x24; + + dev->shadow_regs[0x91] = 0x19; + dev->shadow_regs[0x92] = 0x30; + dev->shadow_regs[0x93] = 0x0e; + dev->shadow_regs[0xc5] = 0x17; + dev->shadow_regs[0xc6] = 0x09; + dev->shadow_regs[0xca] = 0x0a; + break; + } + switch (dev->model.motor_type) + { + case X74_MOTOR: + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0xc3] = 0x81; + /* ? */ + dev->shadow_regs[0xc4] = 0x20; + dev->shadow_regs[0xc5] = 0x21; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x09; + dev->shadow_regs[0xc8] = 0x04; + dev->shadow_regs[0xc9] = 0x39; + dev->shadow_regs[0xca] = 0x20; + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x00; + dev->shadow_regs[0xe1] = 0x00; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0xbf; + /* ? */ + dev->shadow_regs[0xe3] = 0x05; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x00; + dev->shadow_regs[0xe5] = 0x00; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x0d; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0x00; + dev->shadow_regs[0xe8] = 0x00; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x05; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x01; + /* bounds of movement range4 -only for 75dpi grayscale */ + dev->shadow_regs[0xed] = 0x00; + dev->shadow_regs[0xee] = 0x00; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x01; + break; + case A920_MOTOR: + case X1100_MOTOR: + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0xc3] = 0x86; + /* ? */ + dev->shadow_regs[0xc5] = 0x27; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x0c; + /* ? */ + dev->shadow_regs[0xc9] = 0x3a; + dev->shadow_regs[0xca] = 0x1a; + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x57; + dev->shadow_regs[0xe1] = 0x0a; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0xbf; + /* ? */ + dev->shadow_regs[0xe3] = 0x05; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x3b; + dev->shadow_regs[0xe5] = 0x0a; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x0e; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0x00; + dev->shadow_regs[0xe8] = 0x00; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x05; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x01; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x01; + break; + } + /* set colour scan */ + dev->shadow_regs[0x2f] = 0x11; + + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x37] = 0x01; + + /* set motor resolution divisor */ + dev->shadow_regs[0x39] = 0x03; + /* set # of head moves per CIS read */ + rts88xx_set_scan_frequency (dev->shadow_regs, 2); + + + } else - { - /* set grayscale scan */ - dev->shadow_regs[0x2f] = 0x21; - switch (dev->model.sensor_type) - { - case X1100_B2_SENSOR: - dev->shadow_regs[0x34] = 0x11; - dev->shadow_regs[0x35] = 0x11; - dev->shadow_regs[0x36] = 0x21; - dev->shadow_regs[0x37] = 0x21; - dev->shadow_regs[0x38] = 0x31; - - dev->shadow_regs[0x85] = 0x00; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - break; - case X1100_2C_SENSOR: - dev->shadow_regs[0x34] = 0x07; - dev->shadow_regs[0x35] = 0x07; - dev->shadow_regs[0x36] = 0x0d; - dev->shadow_regs[0x37] = 0x0d; - dev->shadow_regs[0x38] = 0x13; - - dev->shadow_regs[0x85] = 0x20; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - break; - case A920_SENSOR: - dev->shadow_regs[0x34] = 0x05; - dev->shadow_regs[0x35] = 0x05; - dev->shadow_regs[0x36] = 0x0b; - dev->shadow_regs[0x37] = 0x0b; - dev->shadow_regs[0x38] = 0x11; - - dev->shadow_regs[0x85] = 0x05; - dev->shadow_regs[0x86] = 0x14; - dev->shadow_regs[0x87] = 0x06; - dev->shadow_regs[0x88] = 0x04; - - dev->shadow_regs[0x91] = 0xe0; - dev->shadow_regs[0x92] = 0x85; - dev->shadow_regs[0x93] = 0x0e; - break; - case X1200_SENSOR: - dev->shadow_regs[0x34] = 0x03; - dev->shadow_regs[0x35] = 0x03; - dev->shadow_regs[0x36] = 0x07; - dev->shadow_regs[0x37] = 0x07; - dev->shadow_regs[0x38] = 0x0b; - - /* data compression - dev->shadow_regs[0x40] = 0x90; - dev->shadow_regs[0x50] = 0x20; */ - /* no data compression */ - dev->shadow_regs[0x40] = 0x80; - dev->shadow_regs[0x50] = 0x00; - - dev->shadow_regs[0x85] = 0x00; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0xff; - dev->shadow_regs[0x88] = 0x02; - - dev->shadow_regs[0x92] = 0x00; - - break; - case X1200_USB2_SENSOR: - dev->shadow_regs[0x34] = 0x03; - dev->shadow_regs[0x35] = 0x03; - dev->shadow_regs[0x36] = 0x07; - dev->shadow_regs[0x37] = 0x07; - dev->shadow_regs[0x38] = 0x0b; - - dev->shadow_regs[0x40] = 0x80; - dev->shadow_regs[0x50] = 0x00; - - dev->shadow_regs[0x85] = 0x00; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0xff; - dev->shadow_regs[0x88] = 0x02; - - dev->shadow_regs[0x92] = 0x00; - break; - } - /* set motor resolution divisor */ - dev->shadow_regs[0x39] = 0x01; - /* set # of head moves per CIS read */ - rts88xx_set_scan_frequency (dev->shadow_regs, 1); - - /* set ? only for colour? */ - dev->shadow_regs[0x80] = 0x00; - dev->shadow_regs[0x81] = 0x00; - dev->shadow_regs[0x82] = 0x00; - /* Motor enable & Coordinate space denominator */ - dev->shadow_regs[0xc3] = 0x81; - /* ? */ - dev->shadow_regs[0xc5] = 0x22; - /* Movement direction & step size */ - dev->shadow_regs[0xc6] = 0x09; - /* ? */ - dev->shadow_regs[0xc9] = 0x3b; - dev->shadow_regs[0xca] = 0x1f; - /* bounds of movement range0 */ - dev->shadow_regs[0xe0] = 0xf7; - dev->shadow_regs[0xe1] = 0x16; - /* step size range0 */ - dev->shadow_regs[0xe2] = 0x87; - /* ? */ - dev->shadow_regs[0xe3] = 0x13; - /* bounds of movement range1 */ - dev->shadow_regs[0xe4] = 0x1b; - dev->shadow_regs[0xe5] = 0x16; - /* step size range1 */ - dev->shadow_regs[0xe6] = 0xdc; - /* bounds of movement range2 */ - dev->shadow_regs[0xe7] = 0x00; - dev->shadow_regs[0xe8] = 0x00; - /* step size range2 */ - dev->shadow_regs[0xe9] = 0x1b; - /* bounds of movement range3 */ - dev->shadow_regs[0xea] = 0x00; - dev->shadow_regs[0xeb] = 0x00; - /* step size range3 */ - dev->shadow_regs[0xec] = 0x07; - /* step size range4 */ - dev->shadow_regs[0xef] = 0x03; - } + { + switch (dev->model.sensor_type) + { + case X74_SENSOR: + dev->shadow_regs[0x2c] = 0x04; + dev->shadow_regs[0x2d] = 0x46; + dev->shadow_regs[0x34] = 0x05; + dev->shadow_regs[0x35] = 0x05; + dev->shadow_regs[0x36] = 0x0b; + dev->shadow_regs[0x37] = 0x0b; + dev->shadow_regs[0x38] = 0x11; + dev->shadow_regs[0x40] = 0x40; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case X1100_B2_SENSOR: + dev->shadow_regs[0x34] = 0x11; + dev->shadow_regs[0x35] = 0x11; + dev->shadow_regs[0x36] = 0x21; + dev->shadow_regs[0x37] = 0x21; + dev->shadow_regs[0x38] = 0x31; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case X1100_2C_SENSOR: + dev->shadow_regs[0x34] = 0x07; + dev->shadow_regs[0x35] = 0x07; + dev->shadow_regs[0x36] = 0x0d; + dev->shadow_regs[0x37] = 0x0d; + dev->shadow_regs[0x38] = 0x13; + + dev->shadow_regs[0x85] = 0x20; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + break; + case A920_SENSOR: + dev->shadow_regs[0x34] = 0x05; + dev->shadow_regs[0x35] = 0x05; + dev->shadow_regs[0x36] = 0x0b; + dev->shadow_regs[0x37] = 0x0b; + dev->shadow_regs[0x38] = 0x11; + + dev->shadow_regs[0x85] = 0x05; + dev->shadow_regs[0x86] = 0x14; + dev->shadow_regs[0x87] = 0x06; + dev->shadow_regs[0x88] = 0x04; + + dev->shadow_regs[0x91] = 0xe0; + dev->shadow_regs[0x92] = 0x85; + dev->shadow_regs[0x93] = 0x0e; + break; + case X1200_SENSOR: + dev->shadow_regs[0x34] = 0x03; + dev->shadow_regs[0x35] = 0x03; + dev->shadow_regs[0x36] = 0x07; + dev->shadow_regs[0x37] = 0x07; + dev->shadow_regs[0x38] = 0x0b; + + /* data compression + dev->shadow_regs[0x40] = 0x90; + dev->shadow_regs[0x50] = 0x20; */ + /* no data compression */ + dev->shadow_regs[0x40] = 0x80; + dev->shadow_regs[0x50] = 0x00; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0xff; + dev->shadow_regs[0x88] = 0x02; + + dev->shadow_regs[0x92] = 0x00; + + break; + case X1200_USB2_SENSOR: + dev->shadow_regs[0x34] = 0x03; + dev->shadow_regs[0x35] = 0x03; + dev->shadow_regs[0x36] = 0x07; + dev->shadow_regs[0x37] = 0x07; + dev->shadow_regs[0x38] = 0x0b; + + dev->shadow_regs[0x40] = 0x80; + dev->shadow_regs[0x50] = 0x00; + + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0xff; + dev->shadow_regs[0x88] = 0x02; + + dev->shadow_regs[0x92] = 0x00; + break; + } + switch (dev->model.motor_type) + { + case X74_MOTOR: + /* set # of head moves per CIS read */ + rts88xx_set_scan_frequency (dev->shadow_regs, 1); + /* ? */ + dev->shadow_regs[0xc4] = 0x20; + dev->shadow_regs[0xc5] = 0x22; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x0b; + + dev->shadow_regs[0xc8] = 0x04; + dev->shadow_regs[0xc9] = 0x39; + dev->shadow_regs[0xca] = 0x1f; + + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x2f; + dev->shadow_regs[0xe1] = 0x11; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x9f; + /* ? */ + dev->shadow_regs[0xe3] = 0x0f; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0xcb; + + dev->shadow_regs[0xe5] = 0x10; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x64; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0x00; + dev->shadow_regs[0xe8] = 0x00; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x32; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x0c; + /* bounds of movement range4 -only for 75dpi grayscale */ + dev->shadow_regs[0xed] = 0x00; + dev->shadow_regs[0xee] = 0x00; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x08; + break; + case X1100_MOTOR: + case A920_MOTOR: + /* set ? only for colour? */ + dev->shadow_regs[0x80] = 0x00; + dev->shadow_regs[0x81] = 0x00; + dev->shadow_regs[0x82] = 0x00; + /* ? */ + dev->shadow_regs[0xc5] = 0x22; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x09; + /* ? */ + dev->shadow_regs[0xc9] = 0x3b; + dev->shadow_regs[0xca] = 0x1f; + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0xf7; + dev->shadow_regs[0xe1] = 0x16; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x87; + /* ? */ + dev->shadow_regs[0xe3] = 0x13; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x1b; + dev->shadow_regs[0xe5] = 0x16; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0xdc; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0x00; + dev->shadow_regs[0xe8] = 0x00; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x1b; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x07; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x03; + break; + } + + /* set grayscale scan */ + dev->shadow_regs[0x2f] = 0x21; + + /* set motor resolution divisor */ + dev->shadow_regs[0x39] = 0x01; + + /* set # of head moves per CIS read */ + rts88xx_set_scan_frequency (dev->shadow_regs, 1); + + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0xc3] = 0x81; + } /* else (grayscale) */ /* set horizontal resolution */ dev->shadow_regs[0x79] = 0x40; + } /*600dpi x 1200dpi */ if (resolution == 1200) { DBG (5, "sanei_lexmark_low_set_scan_regs(): 1200 DPI resolution\n"); - if (isColourScan) - { - /* set colour scan */ - dev->shadow_regs[0x2f] = 0x11; - /* set motor resolution divisor */ - dev->shadow_regs[0x39] = 0x01; - /* set # of head moves per CIS read */ - rts88xx_set_scan_frequency (dev->shadow_regs, 2); - - if (dev->model.sensor_type == X1100_B2_SENSOR) - { - /* set ? */ - dev->shadow_regs[0x34] = 0x29; - dev->shadow_regs[0x36] = 0x29; - dev->shadow_regs[0x38] = 0x28; - /* set ? */ - dev->shadow_regs[0x80] = 0x04; - dev->shadow_regs[0x81] = 0x04; - dev->shadow_regs[0x82] = 0x08; - dev->shadow_regs[0x85] = 0x83; - dev->shadow_regs[0x86] = 0x7e; - dev->shadow_regs[0x87] = 0xad; - dev->shadow_regs[0x88] = 0x35; - dev->shadow_regs[0x91] = 0xfe; - dev->shadow_regs[0x92] = 0xdf; - } - else - { /* A920 case */ - dev->shadow_regs[0x34] = 0x0c; - dev->shadow_regs[0x36] = 0x1e; - dev->shadow_regs[0x38] = 0x10; - - dev->shadow_regs[0x80] = 0x0c; - dev->shadow_regs[0x81] = 0x08; - dev->shadow_regs[0x82] = 0x0c; - - dev->shadow_regs[0x85] = 0x05; - dev->shadow_regs[0x86] = 0x14; - dev->shadow_regs[0x87] = 0x06; - dev->shadow_regs[0x88] = 0x04; - - dev->shadow_regs[0x91] = 0x60; - dev->shadow_regs[0x92] = 0x85; - } + /* 1200 dpi doesn't work for X74 yet */ + if (dev->model.sensor_type == X74_SENSOR) + return SANE_STATUS_INVAL; - dev->shadow_regs[0x35] = 0x01; - dev->shadow_regs[0x37] = 0x01; - /* set motor resolution divisor */ - dev->shadow_regs[0x39] = 0x01; - dev->shadow_regs[0x93] = 0x0e; - - /* Motor enable & Coordinate space denominator */ - dev->shadow_regs[0xc3] = 0x86; - /* ? */ - dev->shadow_regs[0xc5] = 0x41; - /* Movement direction & step size */ - dev->shadow_regs[0xc6] = 0x0c; - /* ? */ - dev->shadow_regs[0xc9] = 0x3a; - dev->shadow_regs[0xca] = 0x40; - /* bounds of movement range0 */ - dev->shadow_regs[0xe0] = 0x00; - dev->shadow_regs[0xe1] = 0x00; - /* step size range0 */ - dev->shadow_regs[0xe2] = 0x85; - /* ? */ - dev->shadow_regs[0xe3] = 0x0b; - /* bounds of movement range1 */ - dev->shadow_regs[0xe4] = 0x00; - dev->shadow_regs[0xe5] = 0x00; - /* step size range1 */ - dev->shadow_regs[0xe6] = 0x0e; - /* bounds of movement range2 */ - dev->shadow_regs[0xe7] = 0x00; - dev->shadow_regs[0xe8] = 0x00; - /* step size range2 */ - dev->shadow_regs[0xe9] = 0x05; - /* bounds of movement range3 */ - dev->shadow_regs[0xea] = 0x00; - dev->shadow_regs[0xeb] = 0x00; - /* step size range3 */ - dev->shadow_regs[0xec] = 0x01; - /* step size range4 */ - dev->shadow_regs[0xef] = 0x01; - } + if (isColourScan) + { + /* set colour scan */ + dev->shadow_regs[0x2f] = 0x11; + /* set motor resolution divisor */ + dev->shadow_regs[0x39] = 0x01; + /* set # of head moves per CIS read */ + rts88xx_set_scan_frequency (dev->shadow_regs, 2); + + if (dev->model.sensor_type == X1100_B2_SENSOR) + { + /* set ? */ + dev->shadow_regs[0x34] = 0x29; + dev->shadow_regs[0x36] = 0x29; + dev->shadow_regs[0x38] = 0x28; + /* set ? */ + dev->shadow_regs[0x80] = 0x04; + dev->shadow_regs[0x81] = 0x04; + dev->shadow_regs[0x82] = 0x08; + dev->shadow_regs[0x85] = 0x83; + dev->shadow_regs[0x86] = 0x7e; + dev->shadow_regs[0x87] = 0xad; + dev->shadow_regs[0x88] = 0x35; + dev->shadow_regs[0x91] = 0xfe; + dev->shadow_regs[0x92] = 0xdf; + } + else + { /* A920 case */ + dev->shadow_regs[0x34] = 0x0c; + dev->shadow_regs[0x36] = 0x1e; + dev->shadow_regs[0x38] = 0x10; + + dev->shadow_regs[0x80] = 0x0c; + dev->shadow_regs[0x81] = 0x08; + dev->shadow_regs[0x82] = 0x0c; + + dev->shadow_regs[0x85] = 0x05; + dev->shadow_regs[0x86] = 0x14; + dev->shadow_regs[0x87] = 0x06; + dev->shadow_regs[0x88] = 0x04; + + dev->shadow_regs[0x91] = 0x60; + dev->shadow_regs[0x92] = 0x85; + } + + dev->shadow_regs[0x35] = 0x01; + dev->shadow_regs[0x37] = 0x01; + /* set motor resolution divisor */ + dev->shadow_regs[0x39] = 0x01; + dev->shadow_regs[0x93] = 0x0e; + + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0xc3] = 0x86; + /* ? */ + dev->shadow_regs[0xc5] = 0x41; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x0c; + /* ? */ + dev->shadow_regs[0xc9] = 0x3a; + dev->shadow_regs[0xca] = 0x40; + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x00; + dev->shadow_regs[0xe1] = 0x00; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0x85; + /* ? */ + dev->shadow_regs[0xe3] = 0x0b; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x00; + dev->shadow_regs[0xe5] = 0x00; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0x0e; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0x00; + dev->shadow_regs[0xe8] = 0x00; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x05; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x01; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x01; + } else - { - /* set grayscale scan */ - dev->shadow_regs[0x2f] = 0x21; - /* set ? */ - dev->shadow_regs[0x34] = 0x22; - dev->shadow_regs[0x35] = 0x22; - dev->shadow_regs[0x36] = 0x42; - dev->shadow_regs[0x37] = 0x42; - dev->shadow_regs[0x38] = 0x62; - /* set motor resolution divisor */ - dev->shadow_regs[0x39] = 0x01; - /* set # of head moves per CIS read */ - rts88xx_set_scan_frequency (dev->shadow_regs, 0); - - /* set ? only for colour? */ - dev->shadow_regs[0x80] = 0x00; - dev->shadow_regs[0x81] = 0x00; - dev->shadow_regs[0x82] = 0x00; - dev->shadow_regs[0x85] = 0x00; - dev->shadow_regs[0x86] = 0x00; - dev->shadow_regs[0x87] = 0x00; - dev->shadow_regs[0x88] = 0x00; - dev->shadow_regs[0x91] = 0x00; - dev->shadow_regs[0x92] = 0x00; - dev->shadow_regs[0x93] = 0x06; - /* Motor enable & Coordinate space denominator */ - dev->shadow_regs[0xc3] = 0x81; - /* ? */ - dev->shadow_regs[0xc5] = 0x41; - /* Movement direction & step size */ - dev->shadow_regs[0xc6] = 0x09; - /* ? */ - dev->shadow_regs[0xc9] = 0x3a; - dev->shadow_regs[0xca] = 0x40; - /* bounds of movement range0 */ - dev->shadow_regs[0xe0] = 0x00; - dev->shadow_regs[0xe1] = 0x00; - /* step size range0 */ - dev->shadow_regs[0xe2] = 0xc7; - /* ? */ - dev->shadow_regs[0xe3] = 0x29; - /* bounds of movement range1 */ - dev->shadow_regs[0xe4] = 0x00; - dev->shadow_regs[0xe5] = 0x00; - /* step size range1 */ - dev->shadow_regs[0xe6] = 0xdc; - /* bounds of movement range2 */ - dev->shadow_regs[0xe7] = 0x00; - dev->shadow_regs[0xe8] = 0x00; - /* step size range2 */ - dev->shadow_regs[0xe9] = 0x1b; - /* bounds of movement range3 */ - dev->shadow_regs[0xea] = 0x00; - dev->shadow_regs[0xeb] = 0x00; - /* step size range3 */ - dev->shadow_regs[0xec] = 0x07; - /* step size range4 */ - dev->shadow_regs[0xef] = 0x03; - } + { + /* set grayscale scan */ + dev->shadow_regs[0x2f] = 0x21; + /* set ? */ + dev->shadow_regs[0x34] = 0x22; + dev->shadow_regs[0x35] = 0x22; + dev->shadow_regs[0x36] = 0x42; + dev->shadow_regs[0x37] = 0x42; + dev->shadow_regs[0x38] = 0x62; + /* set motor resolution divisor */ + dev->shadow_regs[0x39] = 0x01; + /* set # of head moves per CIS read */ + rts88xx_set_scan_frequency (dev->shadow_regs, 0); + + /* set ? only for colour? */ + dev->shadow_regs[0x80] = 0x00; + dev->shadow_regs[0x81] = 0x00; + dev->shadow_regs[0x82] = 0x00; + dev->shadow_regs[0x85] = 0x00; + dev->shadow_regs[0x86] = 0x00; + dev->shadow_regs[0x87] = 0x00; + dev->shadow_regs[0x88] = 0x00; + dev->shadow_regs[0x91] = 0x00; + dev->shadow_regs[0x92] = 0x00; + dev->shadow_regs[0x93] = 0x06; + /* Motor enable & Coordinate space denominator */ + dev->shadow_regs[0xc3] = 0x81; + /* ? */ + dev->shadow_regs[0xc5] = 0x41; + /* Movement direction & step size */ + dev->shadow_regs[0xc6] = 0x09; + /* ? */ + dev->shadow_regs[0xc9] = 0x3a; + dev->shadow_regs[0xca] = 0x40; + /* bounds of movement range0 */ + dev->shadow_regs[0xe0] = 0x00; + dev->shadow_regs[0xe1] = 0x00; + /* step size range0 */ + dev->shadow_regs[0xe2] = 0xc7; + /* ? */ + dev->shadow_regs[0xe3] = 0x29; + /* bounds of movement range1 */ + dev->shadow_regs[0xe4] = 0x00; + dev->shadow_regs[0xe5] = 0x00; + /* step size range1 */ + dev->shadow_regs[0xe6] = 0xdc; + /* bounds of movement range2 */ + dev->shadow_regs[0xe7] = 0x00; + dev->shadow_regs[0xe8] = 0x00; + /* step size range2 */ + dev->shadow_regs[0xe9] = 0x1b; + /* bounds of movement range3 */ + dev->shadow_regs[0xea] = 0x00; + dev->shadow_regs[0xeb] = 0x00; + /* step size range3 */ + dev->shadow_regs[0xec] = 0x07; + /* step size range4 */ + dev->shadow_regs[0xef] = 0x03; + } /* set horizontal resolution */ dev->shadow_regs[0x79] = 0x40; @@ -4213,6 +5106,10 @@ low_rewind (Lexmark_Device * dev, SANE_Byte * regs) else new_location += 420; + if (dev->model.sensor_type == X74_SENSOR) + new_location += 150; + + location = new_location - 1; DBG (2, "low_rewind: %d=>new_location=%d\n", dev->val[OPT_BR_Y].w, new_location); @@ -4234,24 +5131,50 @@ low_rewind (Lexmark_Device * dev, SANE_Byte * regs) regs[0x62] = LOBYTE (new_location); regs[0x63] = HIBYTE (new_location); -/* set regs for rewind */ - regs[0x79] = 0x40; - regs[0xb2] = 0x04; - regs[0xc3] = 0x81; - regs[0xc6] = 0x01; - regs[0xc9] = 0x3b; - regs[0xe0] = 0x2b; - regs[0xe1] = 0x17; - regs[0xe2] = 0xe7; - regs[0xe3] = 0x03; - regs[0xe6] = 0xdc; - regs[0xe7] = 0xb3; - regs[0xe8] = 0x07; - regs[0xe9] = 0x1b; - regs[0xea] = 0x00; - regs[0xeb] = 0x00; - regs[0xec] = 0x07; - regs[0xef] = 0x03; + switch (dev->model.motor_type) + { + case X74_MOTOR: + regs[0xc3] = 0x81; + regs[0xc6] = 0x03; + regs[0xc9] = 0x39; + regs[0xe0] = 0x81; + regs[0xe1] = 0x16; + regs[0xe2] = 0xe1; + regs[0xe3] = 0x04; + regs[0xe4] = 0xe7; + regs[0xe5] = 0x14; + regs[0xe6] = 0x64; + regs[0xe7] = 0xd5; + regs[0xe8] = 0x08; + regs[0xe9] = 0x32; + regs[0xea] = 0xed; + regs[0xeb] = 0x04; + regs[0xec] = 0x0c; + regs[0xef] = 0x08; + break; + case X1100_MOTOR: + case A920_MOTOR: + /* set regs for rewind */ + regs[0x79] = 0x40; + regs[0xb2] = 0x04; + regs[0xc3] = 0x81; + regs[0xc6] = 0x01; + regs[0xc9] = 0x3b; + regs[0xe0] = 0x2b; + regs[0xe1] = 0x17; + regs[0xe2] = 0xe7; + regs[0xe3] = 0x03; + regs[0xe6] = 0xdc; + regs[0xe7] = 0xb3; + regs[0xe8] = 0x07; + regs[0xe9] = 0x1b; + regs[0xea] = 0x00; + regs[0xeb] = 0x00; + regs[0xec] = 0x07; + regs[0xef] = 0x03; + break; + } + /* starts scan */ low_start_scan (dev->devnum, regs); @@ -4751,6 +5674,7 @@ sanei_lexmark_low_gain_calibration (Lexmark_Device * dev) ex = regs[0x6d] * 256 + regs[0x6c]; pixels = (ex - sx) / regs[0x7a]; + /* set up inital gains */ red = 6; green = 6; @@ -4777,13 +5701,12 @@ sanei_lexmark_low_gain_calibration (Lexmark_Device * dev) { status = low_simple_scan (dev, regs, sx, pixels, yoffset, lines, &data); if (status != SANE_STATUS_GOOD) - { - DBG (1, - "sanei_lexmark_low_gain_calibration: low_simple_scan failed!\n"); - if (data != NULL) - free (data); - return status; - } + { + DBG (1, "sanei_lexmark_low_gain_calibration: low_simple_scan failed!\n"); + if (data != NULL) + free (data); + return status; + } #ifdef DEEP_DEBUG sprintf (title, "gain%02d.pnm", i); write_pnm_file (title, pixels, lines, rts88xx_is_color (regs), data); @@ -4791,12 +5714,12 @@ sanei_lexmark_low_gain_calibration (Lexmark_Device * dev) average = average_area (regs, data, pixels, lines, &ra, &ga, &ba); free (data); if (ra < dev->sensor->red_gain_target) - red++; + red++; if (ga < dev->sensor->green_gain_target || (dev->sensor->gray_gain_target && !rts88xx_is_color (regs))) - green++; + green++; if (ba < dev->sensor->blue_gain_target) - blue++; + blue++; rts88xx_set_gain (regs, red, green, blue); i++; } @@ -4804,8 +5727,7 @@ sanei_lexmark_low_gain_calibration (Lexmark_Device * dev) dev->gain.green = green; dev->gain.blue = blue; dev->gain.gray = green; - DBG (7, - "sanei_lexmark_low_gain_calibration: gain=(0x%02x,0x%02x,0x%02x).\n", + DBG (7, "sanei_lexmark_low_gain_calibration: gain=(0x%02x,0x%02x,0x%02x).\n", dev->gain.red, dev->gain.green, dev->gain.blue); DBG (2, "sanei_lexmark_low_gain_calibration: end.\n"); return status; @@ -4830,7 +5752,9 @@ sanei_lexmark_low_shading_calibration (Lexmark_Device * dev) /* enough 75 dpi lines to "go off" home position dot, and include shading area */ int lines = 4 + 4; - int yoffset = 1; + int lineoffset = 1; + int linetotal = lines + lineoffset; + int yoffset; int x, y; float rtarget, btarget, gtarget; @@ -4842,8 +5766,11 @@ sanei_lexmark_low_shading_calibration (Lexmark_Device * dev) /* allocate memory for scan */ sx = regs[0x67] * 256 + regs[0x66]; ex = regs[0x6d] * 256 + regs[0x6c]; + + DBG (7, "startx=%d, endx=%d, coef=%d, r2f=0x%02x\n", sx, ex, regs[0x7a], regs[0x2f]); + pixels = (ex - sx) / regs[0x7a]; if (rts88xx_is_color (regs)) bpl = 3 * pixels; @@ -4852,6 +5779,8 @@ sanei_lexmark_low_shading_calibration (Lexmark_Device * dev) /* adjust the target area to the scanning resolution */ lines = (8 * lines) / regs[0x7a]; + lineoffset = (8 * lineoffset) / regs[0x7a]; + linetotal = (8 * linetotal) / regs[0x7a]; data = (SANE_Byte *) malloc (bpl * lines); DBG (7, "pixels=%d, lines=%d, size=%d\n", pixels, lines, bpl * lines); @@ -4878,13 +5807,12 @@ sanei_lexmark_low_shading_calibration (Lexmark_Device * dev) regs[0xc3] = regs[0xc3] | 0x80; /* execute scan */ - status = low_simple_scan (dev, regs, sx, pixels, yoffset, lines, &data); + status = low_simple_scan (dev, regs, sx, pixels, lineoffset, lines, &data); if (status != SANE_STATUS_GOOD) { - DBG (1, - "sanei_lexmark_low_shading_calibration: low_simple_scan failed!\n"); + DBG (1,"sanei_lexmark_low_shading_calibration: low_simple_scan failed!\n"); if (data != NULL) - free (data); + free (data); return status; } @@ -4986,6 +5914,9 @@ sanei_lexmark_low_shading_calibration (Lexmark_Device * dev) /* do the scan backward to go back to start position */ regs[0xc6] &= 0xF7; lines = (8 * 8) / regs[0x7a]; + /* it shoud use linetotal to account for the lineoffset */ + if (dev->model.sensor_type == X74_SENSOR) + lines = linetotal; /* execute scan */ status = low_simple_scan (dev, regs, sx, pixels, 1, lines, &data); @@ -5010,6 +5941,8 @@ sanei_lexmark_low_shading_calibration (Lexmark_Device * dev) SANE_Status sanei_lexmark_low_calibration (Lexmark_Device * dev) { + DBG (2, "sanei_lexmark_low_calibration: start.\n"); + SANE_Status status; status = sanei_lexmark_low_offset_calibration (dev); @@ -5063,6 +5996,7 @@ sanei_lexmark_low_calibration (Lexmark_Device * dev) } status = sanei_lexmark_low_shading_calibration (dev); + if (status != SANE_STATUS_GOOD) return status; diff --git a/backend/lexmark_models.c b/backend/lexmark_models.c index fec3776..b078107 100644 --- a/backend/lexmark_models.c +++ b/backend/lexmark_models.c @@ -49,8 +49,10 @@ static Lexmark_Model model_list[] = { "Lexmark X1100", /* name */ "Lexmark", /* vendor */ "X1100/rev. B2", /* model */ - X1100_MOTOR, /* X1100 series has 2 sensors */ - X1100_B2_SENSOR}, + /* X1100 series has 2 sensors */ + X1100_B2_SENSOR, + 1235, /* first x-coordinate of Home Point */ + 1258}, /* second x-coordinate of Home Point */ { 0x043d, /* vendor id */ 0x007c, /* product id */ @@ -60,7 +62,9 @@ static Lexmark_Model model_list[] = { "X1100/rev. 2C", /* model */ A920_MOTOR, /* X1100 series has 2 sensors, 2C or B2. It is detected at sane_open() */ - X1100_2C_SENSOR}, + X1100_2C_SENSOR, + 1235, /* first x-coordinate of Home Point */ + 1258}, /* second x-coordinate of Home Point */ { 0x413c, /* vendor id */ 0x5105, /* product id */ @@ -69,7 +73,9 @@ static Lexmark_Model model_list[] = { "Dell", /* vendor */ "A920", /* model */ A920_MOTOR, - A920_SENSOR}, + A920_SENSOR, + 1235, /* first x-coordinate of Home Point */ + 1258}, /* second x-coordinate of Home Point */ { 0x043d, /* vendor id */ 0x007d, /* product id */ @@ -78,7 +84,9 @@ static Lexmark_Model model_list[] = { "Lexmark", /* vendor */ "X1200/USB1.1", /* model */ A920_MOTOR, - X1200_SENSOR}, + X1200_SENSOR, + 1235, /* first x-coordinate of Home Point */ + 1258}, /* second x-coordinate of Home Point */ { 0x043d, /* vendor id */ 0x007d, /* product id */ @@ -87,7 +95,20 @@ static Lexmark_Model model_list[] = { "Lexmark", /* vendor */ "X1200/USB2.0", /* model */ A920_MOTOR, - X1200_USB2_SENSOR}, + X1200_USB2_SENSOR, + 1235, /* first x-coordinate of Home Point */ + 1258}, /* second x-coordinate of Home Point */ + { + 0x043d, /* vendor id */ + 0x0060, /* product id */ + 0x00, /* submodel id */ + "Lexmark X74", /* name */ + "Lexmark", /* vendor */ + "X74", /* model */ + X74_MOTOR, + X74_SENSOR, + 1222, /* first x-coordinate of Home Point */ + 1322}, /* second x-coordinate of Home Point */ { /* termination model, must be last */ - 0, 0, 0, NULL, NULL, NULL, 0, 0} + 0, 0, 0, NULL, NULL, NULL, 0, 0, 0, 0} }; /* end models description */ diff --git a/backend/lexmark_sensors.c b/backend/lexmark_sensors.c index c661dd0..b2f6805 100644 --- a/backend/lexmark_sensors.c +++ b/backend/lexmark_sensors.c @@ -1,6 +1,6 @@ /* sane - Scanner Access Now Easy. - Copyright (C) 2006-2007 St?phane Voltz <stef.dev at free.fr> + Copyright (C) 2006-2007 St??phane Voltz <stef.dev at free.fr> This file is part of the SANE package. @@ -117,6 +117,23 @@ static Lexmark_Sensor sensor_list[] = { /* offset and gain fallback */ 0x70, 13 }, + { + X74_SENSOR, + /* start x TDONE, end x and target average for offset calibration */ + /*36,68,12,*/ + 20,52,12, + /* usable pixel sensor startx */ + /*104,*/ + 104, + /* default gain */ + 10, + /* gain calibration target */ + 130, 145, 150, 145, + /* gain calibration target */ + 260, 260, 260, 260, + /* offset and gain fallback */ + 0x70, 13 + }, /* termination list sensor, must be last */ {0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; -- 1.7.1