kopia lustrzana https://gitlab.com/sane-project/backends
Minor fixes to improve usb-transfer stuff.
rodzic
7fbdae8348
commit
ddf779d8db
|
@ -1230,7 +1230,7 @@ static SetDef Settings[] =
|
||||||
* Have a look at the Hw0x0400_0x1000_0 or Hw0x07B3_0x0017_0 for further
|
* Have a look at the Hw0x0400_0x1000_0 or Hw0x07B3_0x0017_0 for further
|
||||||
* description
|
* description
|
||||||
*
|
*
|
||||||
* The fouth entry is simply the name of the device, which will be
|
* The fourth entry is simply the name of the device, which will be
|
||||||
* displayed by the frontend
|
* displayed by the frontend
|
||||||
*/
|
*/
|
||||||
{ NULL, NULL, NULL, NULL } /* last entry, never remove... */
|
{ NULL, NULL, NULL, NULL } /* last entry, never remove... */
|
||||||
|
|
|
@ -59,6 +59,8 @@
|
||||||
#define DEV_LampPositive 4
|
#define DEV_LampPositive 4
|
||||||
#define DEV_LampNegative 5
|
#define DEV_LampNegative 5
|
||||||
|
|
||||||
|
#define _MSECS(tv) ((tv.tv_sec*1000)+(tv.tv_usec/1000))
|
||||||
|
|
||||||
/* HEINER: check the tick counts 'cause 1 tick on NT is about 10ms */
|
/* HEINER: check the tick counts 'cause 1 tick on NT is about 10ms */
|
||||||
|
|
||||||
static u_long dwCrystalFrequency = 48000000UL;
|
static u_long dwCrystalFrequency = 48000000UL;
|
||||||
|
@ -87,37 +89,36 @@ static Bool usb_MotorOn( int handle, Bool fOn )
|
||||||
*/
|
*/
|
||||||
static Bool usb_IsScannerReady( pPlustek_Device dev )
|
static Bool usb_IsScannerReady( pPlustek_Device dev )
|
||||||
{
|
{
|
||||||
u_char value;
|
u_char value;
|
||||||
|
double len;
|
||||||
|
long timeout;
|
||||||
|
struct timeval t;
|
||||||
|
|
||||||
#if 1
|
/* time in ms = 1000*scanner length in inches/max step speed/in */
|
||||||
_UIO( usbio_ReadReg( dev->fd, 7, &value));
|
len = (dev->usbDev.Caps.Normal.Size.y/(double)_MEASURE_BASE) + 5;
|
||||||
|
len = (1000.0 * len)/dev->usbDev.HwSetting.dMaxMoveSpeed;
|
||||||
|
|
||||||
|
gettimeofday( &t, NULL);
|
||||||
|
timeout = _MSECS(t) + len;
|
||||||
|
|
||||||
if( value == 0 )
|
do {
|
||||||
_UIO( usbio_ResetLM983x( dev ));
|
|
||||||
|
|
||||||
if(value == 0 || value >= 0x20) {
|
|
||||||
|
|
||||||
if( usbio_WriteReg( dev->fd, 0x07, 0 )) {
|
|
||||||
return SANE_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
SANE_Word delay;
|
|
||||||
|
|
||||||
for( delay = 0; delay < 300; delay++ ) {
|
|
||||||
_UIO( usbio_ReadReg( dev->fd, 7, &value));
|
_UIO( usbio_ReadReg( dev->fd, 7, &value));
|
||||||
|
|
||||||
if( value == 0 )
|
if( value == 0 )
|
||||||
return SANE_TRUE;
|
return SANE_TRUE;
|
||||||
|
|
||||||
if (value >= 8)
|
if( value == 3 || value >= 0x20) {
|
||||||
_UIO( usbio_WriteReg( dev->fd, 0x07, 0 ));
|
|
||||||
|
|
||||||
usleep( 100000 );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
if( !usbio_WriteReg( dev->fd, 0x07, 0 )) {
|
||||||
|
DBG( _DBG_ERROR, "Scanner not ready!!!\n" );
|
||||||
|
return SANE_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gettimeofday( &t, NULL);
|
||||||
|
|
||||||
|
} while( _MSECS(t) < timeout );
|
||||||
|
|
||||||
DBG( _DBG_ERROR, "Scanner not ready!!!\n" );
|
DBG( _DBG_ERROR, "Scanner not ready!!!\n" );
|
||||||
return SANE_FALSE;
|
return SANE_FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,24 +68,45 @@
|
||||||
#define usbio_ReadReg(fd, reg, value) \
|
#define usbio_ReadReg(fd, reg, value) \
|
||||||
sanei_lm983x_read (fd, reg, value, 1, 0)
|
sanei_lm983x_read (fd, reg, value, 1, 0)
|
||||||
|
|
||||||
/*.............................................................................
|
/**
|
||||||
|
* function to read the contents of a LM983x register and regarding some
|
||||||
|
* extra stuff, like flushing register 2 when writing register 0x58, etc
|
||||||
*
|
*
|
||||||
|
* @param handle -
|
||||||
|
* @param reg -
|
||||||
|
* @param value -
|
||||||
|
* @return
|
||||||
*/
|
*/
|
||||||
static Bool usbio_WriteReg( SANE_Int handle, SANE_Byte reg, SANE_Byte value )
|
static Bool usbio_WriteReg( SANE_Int handle, SANE_Byte reg, SANE_Byte value )
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
SANE_Byte data;
|
SANE_Byte data;
|
||||||
|
|
||||||
_UIO( sanei_lm983x_write_byte( handle, reg, value));
|
/* retry loop... */
|
||||||
|
for( i = 0; i < 100; i++ ) {
|
||||||
|
|
||||||
/* Flush register 0x02 when register 0x58 is written */
|
_UIO( sanei_lm983x_write_byte( handle, reg, value ));
|
||||||
if( 0x58 == reg ) {
|
|
||||||
|
/* Flush register 0x02 when register 0x58 is written */
|
||||||
|
if( 0x58 == reg ) {
|
||||||
|
|
||||||
_UIO( usbio_ReadReg( handle, 2, &data ));
|
_UIO( usbio_ReadReg( handle, 2, &data ));
|
||||||
|
_UIO( usbio_ReadReg( handle, 2, &data ));
|
||||||
_UIO( usbio_ReadReg( handle, 2, &data ));
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if( reg != 7 )
|
||||||
|
return SANE_TRUE;
|
||||||
|
|
||||||
|
/* verify register 7 */
|
||||||
|
_UIO( usbio_ReadReg( handle, 7, &data ));
|
||||||
|
|
||||||
|
if( data == value ) {
|
||||||
|
return SANE_TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return SANE_TRUE;
|
return SANE_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*.............................................................................
|
/*.............................................................................
|
||||||
|
|
|
@ -1037,14 +1037,21 @@ static Bool usb_IsDataAvailableInDRAM( pPlustek_Device dev )
|
||||||
DBG( _DBG_INFO, "usb_IsDataAvailableInDRAM()\n" );
|
DBG( _DBG_INFO, "usb_IsDataAvailableInDRAM()\n" );
|
||||||
|
|
||||||
gettimeofday( &t, NULL);
|
gettimeofday( &t, NULL);
|
||||||
|
|
||||||
/* dwTicks = t.tv_sec * 1e6 + t.tv_usec + 30000UL; */
|
|
||||||
dwTicks = t.tv_sec + 30;
|
dwTicks = t.tv_sec + 30;
|
||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
|
|
||||||
_UIO( sanei_lm983x_read( dev->fd, 0x01, a_bBand, 3, SANE_FALSE ));
|
_UIO( sanei_lm983x_read( dev->fd, 0x01, a_bBand, 3, SANE_FALSE ));
|
||||||
|
|
||||||
|
gettimeofday( &t, NULL);
|
||||||
|
if( t.tv_sec > dwTicks )
|
||||||
|
break;
|
||||||
|
|
||||||
|
if( usb_IsEscPressed()) {
|
||||||
|
DBG(_DBG_INFO,"usb_IsDataAvailableInDRAM() - Cancel detected...\n");
|
||||||
|
return SANE_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* It is not stable for read */
|
/* It is not stable for read */
|
||||||
if((a_bBand[0] != a_bBand[1]) && (a_bBand[1] != a_bBand[2]))
|
if((a_bBand[0] != a_bBand[1]) && (a_bBand[1] != a_bBand[2]))
|
||||||
continue;
|
continue;
|
||||||
|
@ -1060,45 +1067,8 @@ static Bool usb_IsDataAvailableInDRAM( pPlustek_Device dev )
|
||||||
DBG( _DBG_INFO, "Data is available\n" );
|
DBG( _DBG_INFO, "Data is available\n" );
|
||||||
return SANE_TRUE;
|
return SANE_TRUE;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
continue;
|
|
||||||
|
|
||||||
gettimeofday( &t, NULL);
|
|
||||||
/* if((t.tv_sec * 1e6 + t.tv_usec) > dwTicks ) */
|
|
||||||
if( t.tv_sec > dwTicks )
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
DWORD dw, dwTimeout = GetTickCount ();
|
|
||||||
|
|
||||||
/* Polling register 0x01 to see if there is available data */
|
|
||||||
BYTE a_bBand [3];
|
|
||||||
|
|
||||||
while ((dw = (GetTickCount() - dwTimeout)) < 30000UL) {
|
|
||||||
|
|
||||||
if( DriverUSB.BulkIn (0x01, a_bBand, 3, FALSE)) {
|
|
||||||
|
|
||||||
/* It is not stable for read */
|
|
||||||
if ((a_bBand [0] != a_bBand [1]) && (a_bBand [1] != a_bBand [2]))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (a_bBand [0] > m_bOldScanData) {
|
|
||||||
|
|
||||||
if(m_pParam->bSource != SOURCE_Reflection)
|
|
||||||
Sleep (30 * a_bRegs[0x08] * Device.Caps.OpticDpi.x / 600);
|
|
||||||
else
|
|
||||||
Sleep (20 * a_bRegs[0x08] * Device.Caps.OpticDpi.x / 600);
|
|
||||||
|
|
||||||
return SANE_TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DBG( _DBG_INFO, "NO Data available\n" );
|
DBG( _DBG_INFO, "NO Data available\n" );
|
||||||
return SANE_FALSE;
|
return SANE_FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -628,7 +628,7 @@ static SANE_Status init_options( Plustek_Scanner *s )
|
||||||
s->val[OPT_NUM_OPTS].w = NUM_OPTIONS;
|
s->val[OPT_NUM_OPTS].w = NUM_OPTIONS;
|
||||||
|
|
||||||
/* "Scan Mode" group: */
|
/* "Scan Mode" group: */
|
||||||
s->opt[OPT_MODE_GROUP].name = "Scanmode-group";
|
s->opt[OPT_MODE_GROUP].name = "scanmode-group";
|
||||||
s->opt[OPT_MODE_GROUP].title = SANE_I18N("Scan Mode");
|
s->opt[OPT_MODE_GROUP].title = SANE_I18N("Scan Mode");
|
||||||
s->opt[OPT_MODE_GROUP].desc = "";
|
s->opt[OPT_MODE_GROUP].desc = "";
|
||||||
s->opt[OPT_MODE_GROUP].type = SANE_TYPE_GROUP;
|
s->opt[OPT_MODE_GROUP].type = SANE_TYPE_GROUP;
|
||||||
|
@ -708,8 +708,8 @@ static SANE_Status init_options( Plustek_Scanner *s )
|
||||||
s->val[OPT_RESOLUTION].w = s->hw->dpi_range.min;
|
s->val[OPT_RESOLUTION].w = s->hw->dpi_range.min;
|
||||||
|
|
||||||
/* "Geometry" group: */
|
/* "Geometry" group: */
|
||||||
|
s->opt[OPT_GEOMETRY_GROUP].name = "geometry-group";
|
||||||
s->opt[OPT_GEOMETRY_GROUP].title = SANE_I18N("Geometry");
|
s->opt[OPT_GEOMETRY_GROUP].title = SANE_I18N("Geometry");
|
||||||
s->opt[OPT_GEOMETRY_GROUP].name = "Geometry Group";
|
|
||||||
s->opt[OPT_GEOMETRY_GROUP].desc = "";
|
s->opt[OPT_GEOMETRY_GROUP].desc = "";
|
||||||
s->opt[OPT_GEOMETRY_GROUP].type = SANE_TYPE_GROUP;
|
s->opt[OPT_GEOMETRY_GROUP].type = SANE_TYPE_GROUP;
|
||||||
s->opt[OPT_GEOMETRY_GROUP].cap = SANE_CAP_ADVANCED;
|
s->opt[OPT_GEOMETRY_GROUP].cap = SANE_CAP_ADVANCED;
|
||||||
|
|
Ładowanie…
Reference in New Issue