diff --git a/backend/genesys.c b/backend/genesys.c index 0f7e0cb8e..fb45246a5 100644 --- a/backend/genesys.c +++ b/backend/genesys.c @@ -717,7 +717,7 @@ sanei_genesys_get_address (Genesys_Register_Set * regs, SANE_Byte addr) if (regs[i].address == addr) return ®s[i]; } - DBG (DBG_error, "sanei_genesys_get_address: failed to find address for register %d, crash expected !\n",addr); + DBG (DBG_error, "sanei_genesys_get_address: failed to find address for register 0x%02x, crash expected !\n",addr); return NULL; } diff --git a/backend/genesys_devices.c b/backend/genesys_devices.c index 56d44fbb6..5dbeabdaa 100644 --- a/backend/genesys_devices.c +++ b/backend/genesys_devices.c @@ -145,7 +145,7 @@ static Genesys_Frontend Wolfson[] = { , {0x32, 0x04, 0x00} , {0x00, 0x00, 0x00} } - , /* KVSS080 */ + , /* KV-SS080 */ {DAC_KVSS080, {0x00, 0x23, 0x24, 0x0f} , {0x00, 0x00, 0x00} @@ -489,36 +489,35 @@ static Genesys_Sensor Sensor[] = { 48, 85, 152, - 5416, + 5110, 210, 230, - {0x02, 0x00, 0x06, 0x04} , - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x08, 0x20, 0x2a, 0x00, 0x00, - 0x0c, 0x03} - , - {0x0f, 0x13, 0x17, 0x03, 0x07, 0x0b, 0x83, 0x00, 0xc1, 0x00, 0x00, 0x00, - 0x00} , + /* 08 09 0a 0b */ + {0x00, 0x00, 0x00, 0x6a} , + /* 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x1c, 0x01, 0x2a, 0x2c, 0x00, 0x20, 0x04} , /* 18=00 at 600 dpi */ + /* 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e */ + {0x0c, 0x0f, 0x00, 0x03, 0x06, 0x09, 0x6b, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x23} , 1.0, 1.0, 1.0, NULL, NULL, NULL} , {CCD_G4050, - 4800, + 1200, /* XXX STEF XXX 4800 */ 48, - 85, + 28, 152, - 5416, + 10220, 210, 230, - {0x02, 0x00, 0x06, 0x04} , - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x08, 0x20, 0x2a, 0x00, 0x00, - 0x0c, 0x03} - , - {0x0f, 0x13, 0x17, 0x03, 0x07, 0x0b, 0x83, 0x00, 0xc1, 0x00, 0x00, 0x00, - 0x00} , + /* 08 09 0a 0b */ + {0x00, 0x00, 0x18, 0x69} , + /* 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x0c, 0x01, 0x2a, 0x30, 0x00, 0x00, 0x08} , + /* 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e */ + {0x0e, 0x11, 0x02, 0x05, 0x08, 0x0b, 0x6b, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x6f} , 1.0, 1.0, 1.0, NULL, NULL, NULL} , - }; /** for General Purpose Output specific settings: @@ -626,14 +625,18 @@ static Genesys_Gpo Gpo[] = { } , {GPO_KVSS080, - {0x11, 0x00} , - {0x51, 0x20} , + {0xe5, 0x20} , + {0x7e, 0xa1} , } , {GPO_G4050, - {0x11, 0x00} , - {0x51, 0x20} , + {0x20, 0x00} , + {0xfc, 0x00} , } + /* + uint8_t value[2]; 6c/6d + uint8_t enable[2]; 6e/6f + */ , }; @@ -1074,8 +1077,8 @@ static Genesys_Model hpg4050_model = { GENESYS_GL843, NULL, - { 1200, 600, 300, 150, 75, 0}, /* possible x-resolutions */ - { 1200, 600, 300, 150, 75, 0}, /* possible y-resolutions */ + { 1200, 600, 300, 200, 150, 75, 0}, /* possible x-resolutions */ + { 1200, 600, 300, 200, 150, 75, 0}, /* possible y-resolutions */ {16, 8, 0}, /* possible depths in gray mode */ {16, 8, 0}, /* possible depths in color mode */ @@ -1099,7 +1102,7 @@ static Genesys_Model hpg4050_model = { SANE_FIX (0.0), /* Amount of feeding needed to eject document after finishing scanning in mm */ - 0, 0, 0, /* RGB CCD Line-distance correction in pixel */ + 0, 8, 16, /* RGB CCD Line-distance correction in pixel */ COLOR_ORDER_RGB, /* Order of the CCD/CIS colors */ diff --git a/backend/genesys_gl843.c b/backend/genesys_gl843.c index 1620db5a4..3549603a2 100644 --- a/backend/genesys_gl843.c +++ b/backend/genesys_gl843.c @@ -94,6 +94,78 @@ write_end_access (Genesys_Device * dev, uint8_t index, uint8_t val) return status; } +/* Write bulk data (e.g. gamma) */ +static SANE_Status +gl843_bulk_write_data (Genesys_Device * dev, uint8_t addr, + uint8_t * data, size_t len) +{ + SANE_Status status; + size_t size; + uint8_t outdata[8]; + + DBG (DBG_io, "gl843_bulk_write_data writing %lu bytes\n", + (u_long) len); + + status = + sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_REGISTER, + VALUE_SET_REGISTER, INDEX, 1, &addr); + if (status != SANE_STATUS_GOOD) + { + DBG (DBG_error, + "gl843_bulk_write_data failed while setting register: %s\n", + sane_strstatus (status)); + return status; + } + + while (len) + { + if (len > BULKOUT_MAXSIZE) + size = BULKOUT_MAXSIZE; + else + size = len; + + outdata[0] = BULK_OUT; + outdata[1] = BULK_RAM; + outdata[2] = 0x00; + outdata[3] = 0x00; + outdata[4] = (size & 0xff); + outdata[5] = ((size >> 8) & 0xff); + outdata[6] = ((size >> 16) & 0xff); + outdata[7] = ((size >> 24) & 0xff); + + status = + sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_BUFFER, + VALUE_BUFFER, INDEX, sizeof (outdata), + outdata); + if (status != SANE_STATUS_GOOD) + { + DBG (DBG_error, + "gl843_bulk_write_data failed while writing command: %s\n", + sane_strstatus (status)); + return status; + } + + status = sanei_usb_write_bulk (dev->dn, data, &size); + if (status != SANE_STATUS_GOOD) + { + DBG (DBG_error, + "gl843_bulk_write_data failed while writing bulk data: %s\n", + sane_strstatus (status)); + return status; + } + + DBG (DBG_io2, + "gl843_bulk_write_data: gamma wrote %lu bytes, %lu remaining\n", + (u_long) size, (u_long) (len - size)); + + len -= size; + data += size; + } + + DBGCOMPLETED; + return status; +} + /* Set address for writing data */ static SANE_Status gl843_set_buffer_address (Genesys_Device * dev, uint32_t addr) @@ -103,6 +175,15 @@ gl843_set_buffer_address (Genesys_Device * dev, uint32_t addr) DBG (DBG_io, "gl843_set_buffer_address: setting address to 0x%05x\n", addr & 0xffff); + status = sanei_genesys_write_register (dev, 0x5b, ((addr>>8) & 0xff)); + if (status != SANE_STATUS_GOOD) + { + DBG (DBG_error, + "gl843_set_buffer_address: failed while writing high byte: %s\n", + sane_strstatus (status)); + return status; + } + status = sanei_genesys_write_register (dev, 0x5c, (addr & 0xff)); if (status != SANE_STATUS_GOOD) { @@ -112,16 +193,6 @@ gl843_set_buffer_address (Genesys_Device * dev, uint32_t addr) return status; } - addr = addr >> 8; - status = sanei_genesys_write_register (dev, 0x5b, (addr & 0xff)); - if (status != SANE_STATUS_GOOD) - { - DBG (DBG_error, - "gl843_set_buffer_address: failed while writing high byte: %s\n", - sane_strstatus (status)); - return status; - } - DBG (DBG_io, "gl843_set_buffer_address: completed\n"); return status; @@ -137,7 +208,6 @@ gl843_set_buffer_address (Genesys_Device * dev, uint32_t addr) static SANE_Status write_data (Genesys_Device * dev, uint32_t addr, uint32_t size, uint8_t * data) { - size_t written; SANE_Status status = SANE_STATUS_GOOD; uint8_t val; @@ -160,8 +230,7 @@ write_data (Genesys_Device * dev, uint32_t addr, uint32_t size, uint8_t * data) } /* write actual data */ - written = size; - status = sanei_usb_write_bulk (dev->dn, data, &written); + status = gl843_bulk_write_data (dev, 0x3c, data, size); if (status != SANE_STATUS_GOOD) { DBG (DBG_error, "write_data: failed while writing bulk write data: %s\n", @@ -169,6 +238,7 @@ write_data (Genesys_Device * dev, uint32_t addr, uint32_t size, uint8_t * data) return status; } + /* set back address to 0 */ status = gl843_set_buffer_address (dev, 0); if (status != SANE_STATUS_GOOD) { @@ -532,6 +602,7 @@ gl843_init_registers (Genesys_Device * dev) SETREG (0x78, 0x00); SETREG (0x79, 0x00); SETREG (0x7a, 0x00); + SETREG (0x7a, 0x00); SETREG (0x7f, 0x00); SETREG (0x80, 0x00); SETREG (0x81, 0x00); @@ -550,6 +621,10 @@ gl843_init_registers (Genesys_Device * dev) /* G4050 values */ if(strcmp(dev->model->name,"hewlett-packard-scanjet-g4050")==0) { + SETREG (0x03, 0x1d); + SETREG (0x05, 0x08); + SETREG (0x0a, 0x18); + SETREG (0x0b, 0x69); } /* fine tune upon device description */ @@ -953,7 +1028,7 @@ HOME_FREE: 3 status = gl843_send_slope_table (dev, 0, fast_slope_table, 256); status = gl843_send_slope_table (dev, 1, fast_slope_table, 256); - /* XXX STEF XXX status = gl843_send_slope_table (dev, 2, fast_slope_table, 256); */ + status = gl843_send_slope_table (dev, 2, fast_slope_table, 256); status = gl843_send_slope_table (dev, 3, fast_slope_table, 256); status = gl843_send_slope_table (dev, 4, fast_slope_table, 256); @@ -1237,7 +1312,7 @@ gl843_init_motor_regs_scan (Genesys_Device * dev, if (status != SANE_STATUS_GOOD) return status; - /* XXX STEF XXX status = gl843_send_slope_table (dev, 2, slow_slope_table, 256); */ + status = gl843_send_slope_table (dev, 2, slow_slope_table, 256); if (status != SANE_STATUS_GOOD) return status; @@ -1555,6 +1630,8 @@ gl843_init_optical_regs_scan (Genesys_Device * dev, r->value &= ~REG05_GMMENB; else r->value |= REG05_GMMENB; + /* XXX STEF XXX */ + r->value &= ~REG05_GMMENB; /* sensor parameters */ gl843_setup_sensor (dev, dev->reg); @@ -2909,7 +2986,6 @@ gl843_begin_scan (Genesys_Device * dev, Genesys_Register_Set * reg, } DBGCOMPLETED; - return status; } @@ -3520,79 +3596,6 @@ gl843_init_regs_for_scan (Genesys_Device * dev) return SANE_STATUS_GOOD; } -/* Write bulk data (e.g. gamma) */ -static SANE_Status -gl843_bulk_write_data_gamma (Genesys_Device * dev, uint8_t addr, - uint8_t * data, size_t len) -{ - SANE_Status status; - size_t size; - uint8_t outdata[8]; - - DBG (DBG_io, "gl843_bulk_write_data_gamma writing %lu bytes\n", - (u_long) len); - - status = - sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_REGISTER, - VALUE_SET_REGISTER, INDEX, 1, &addr); - if (status != SANE_STATUS_GOOD) - { - DBG (DBG_error, - "gl843_bulk_write_data_gamma failed while setting register: %s\n", - sane_strstatus (status)); - return status; - } - - while (len) - { - if (len > BULKOUT_MAXSIZE) - size = BULKOUT_MAXSIZE; - else - size = len; - - outdata[0] = BULK_OUT; - outdata[1] = BULK_RAM; - outdata[2] = 0x00;/* 0x82 works, too */ - outdata[3] = 0x00; - outdata[4] = (size & 0xff); - outdata[5] = ((size >> 8) & 0xff); - outdata[6] = ((size >> 16) & 0xff); - outdata[7] = ((size >> 24) & 0xff); - - status = - sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_BUFFER, - VALUE_BUFFER, INDEX, sizeof (outdata), - outdata); - if (status != SANE_STATUS_GOOD) - { - DBG (DBG_error, - "gl843_bulk_write_data_gamma failed while writing command: %s\n", - sane_strstatus (status)); - return status; - } - - status = sanei_usb_write_bulk (dev->dn, data, &size); - if (status != SANE_STATUS_GOOD) - { - DBG (DBG_error, - "gl843_bulk_write_data_gamma failed while writing bulk data: %s\n", - sane_strstatus (status)); - return status; - } - - DBG (DBG_io2, - "gl843_bulk_write_data:gamma wrote %lu bytes, %lu remaining\n", - (u_long) size, (u_long) (len - size)); - - len -= size; - data += size; - } - - DBG (DBG_io, "gl843_bulk_write_data_gamma: completed\n"); - - return status; -} - /* * this function sends generic gamma table (ie linear ones) * or the Sensor specific one if provided @@ -3672,7 +3675,7 @@ gl843_send_gamma_table (Genesys_Device * dev, SANE_Bool generic) } /* send data */ - status = gl843_bulk_write_data_gamma (dev, 0x28, (uint8_t *) gamma, size * 2 * 3); + status = gl843_bulk_write_data (dev, 0x28, (uint8_t *) gamma, size * 2 * 3); if (status != SANE_STATUS_GOOD) { free (gamma); @@ -4118,9 +4121,8 @@ gl843_cold_boot (Genesys_Device * dev) DBGSTART; - /* XXX STEF XXX RIE (sanei_genesys_write_register (dev, 0x0e, 0x01)); - RIE (sanei_genesys_write_register (dev, 0x0e, 0x00)); */ + RIE (sanei_genesys_write_register (dev, 0x0e, 0x00)); /* test CHKVER */ RIE (sanei_genesys_read_register (dev, REG40, &val)); @@ -4157,12 +4159,27 @@ gl843_cold_boot (Genesys_Device * dev) RIE (write_end_access (dev, 0x10, 0xb4)); /* set up clock once for all */ - RIE (sanei_genesys_write_register (dev, 0x77, 0x00)); - RIE (sanei_genesys_write_register (dev, 0x78, 0x00)); - RIE (sanei_genesys_write_register (dev, 0x79, 0x9f)); + if(strcmp(dev->model->name,"hewlett-packard-scanjet-g4050")==0) + { + /* CK3MAP */ + RIE (sanei_genesys_write_register (dev, 0x77, 0x03)); + RIE (sanei_genesys_write_register (dev, 0x78, 0xff)); + RIE (sanei_genesys_write_register (dev, 0x79, 0xff)); + } + else + { + /* CK3MAP */ + RIE (sanei_genesys_write_register (dev, 0x77, 0x00)); + RIE (sanei_genesys_write_register (dev, 0x78, 0x07)); + RIE (sanei_genesys_write_register (dev, 0x79, 0xfe)); + } + /* CK4MAP */ + RIE (sanei_genesys_write_register (dev, 0x7a, 0x03)); + RIE (sanei_genesys_write_register (dev, 0x7b, 0xff)); + RIE (sanei_genesys_write_register (dev, 0x7c, 0xff)); /* CLKSET */ - val = (dev->reg[reg_0x0b].value & ~REG0B_CLKSET) | REG0B_30MHZ; + val = (dev->reg[reg_0x0b].value & ~REG0B_CLKSET) | REG0B_48MHZ; RIE (sanei_genesys_write_register (dev, REG0B, val)); dev->reg[reg_0x0b].value = val; @@ -4673,7 +4690,7 @@ static Genesys_Command_Set gl843_cmd_set = { gl843_slow_back_home, gl843_bulk_write_register, - NULL, + gl843_bulk_write_data, gl843_bulk_read_data, gl843_update_hardware_sensors,