diff options
Diffstat (limited to 'backend/rts8891_low.c')
| -rw-r--r-- | backend/rts8891_low.c | 74 | 
1 files changed, 66 insertions, 8 deletions
| diff --git a/backend/rts8891_low.c b/backend/rts8891_low.c index 1b95765..0eeab87 100644 --- a/backend/rts8891_low.c +++ b/backend/rts8891_low.c @@ -132,10 +132,16 @@ rts8891_write_all (SANE_Int devnum, SANE_Byte * regs, SANE_Int count)    buffer[1] = 0xb4;    buffer[2] = 0x00;    buffer[3] = size; -  for (i = 0; i < size; i++) -    buffer[i + 4] = regs[0xb4 + i]; +  j = 0; +  for (i = 0; i < size; i++) { +    buffer[i + 4 + j] = regs[0xb4 + i]; +    if (buffer[i + 4 + j] == 0xaa) { +      j++; +      buffer[i + 4 + j] = 0x00; +    } +  }    /* the USB block is size + 4 bytes of header long */ -  size += 4; +  size += 4 + j;    if (sanei_usb_write_bulk (devnum, buffer, &size) != SANE_STATUS_GOOD)      {        DBG (DBG_error, @@ -368,6 +374,28 @@ rts8891_data_format (SANE_Int dpi, int sensor)  	  break;  	}      } +  if (sensor == SENSOR_TYPE_UMAX) +    { +      switch (dpi) +	{ +	case 100: /* emulated */ +	case 200: +	  reg = 0x0b; +	  break; +	case 150: +	  reg = 0x17; +	  break; +	case 300: +	  reg = 0x17; +	  break; +	case 600: +	  reg = 0x03; +	  break; +	case 1200: +	  reg = 0x12; +	  break; +	} +    }    return reg;  } @@ -423,7 +451,12 @@ rts8891_move (struct Rts8891_Device *device, SANE_Byte * regs,    /* prepare scan */    rts8891_set_default_regs (regs); -  if (device->sensor != SENSOR_TYPE_4400 +  if (device->sensor == SENSOR_TYPE_UMAX) +    { +      regs10 = 0x20; +      regs11 = 0x3b; +    } +  else if (device->sensor != SENSOR_TYPE_4400        && device->sensor != SENSOR_TYPE_4400_BARE)      {        regs10 = 0x20; @@ -509,6 +542,29 @@ rts8891_move (struct Rts8891_Device *device, SANE_Byte * regs,        regs[0xe5] = 0xf3;	/* 0xf9 */        regs[0xe6] = 0x01;	/* 0x00 */      } +  if (device->sensor == SENSOR_TYPE_UMAX) +    { +      regs[0x14] = 0xf0; +      regs[0x16] = 0x0f; +      regs[0x23] = 0x00; +      regs[0x40] = 0xa0; +      /* regs[0x7a] = 0x02; */ +      regs[0x80] = 0x83; +      regs[0x81] = 0x01; +      regs[0x82] = 0x84; +      regs[0x83] = 0x01; +      regs[0x85] = 0x10; +      regs[0x86] = 0x14; +      regs[0x87] = 0x20; +      regs[0x88] = 0x22; +      regs[0x89] = 0x85; +      regs[0x8a] = 0x01; +      regs[0x8d] = 0x4f; +      regs[0xd9] = 0x2d; +      regs[0xda] = 0x00; +      regs[0xe5] = 0x1b; +      regs[0xe6] = 0x01; +    }    /* disable CCD */    regs[0] = 0xf5; @@ -661,11 +717,13 @@ read_data (struct Rts8891_Session *session, SANE_Byte * dest, SANE_Int length)  	  /* come yet */  	  if (session->non_blocking && count == 0)  	    { - -	      dev->regs[LAMP_REG] = 0x8d; -	      sanei_rts88xx_write_reg (dev->devnum, LAMP_REG, +	      if (dev->sensor != SENSOR_TYPE_UMAX) +		{ +		  dev->regs[LAMP_REG] = 0x8d; +		  sanei_rts88xx_write_reg (dev->devnum, LAMP_REG,  				       &(dev->regs[LAMP_REG])); -	      DBG (DBG_io, "read_data: no data available\n"); +		} +	      DBG (DBG_io, "read_data: no data vailable\n");  	      DBG (DBG_proc, "read_data: end\n");  	      return SANE_STATUS_DEVICE_BUSY;  	    } | 
