kopia lustrzana https://gitlab.com/sane-project/backends
Added sanei_pp_init() and sanei_pp_udelay().
rodzic
e81cfe2818
commit
edfe46590a
|
@ -58,6 +58,12 @@ enum sanei_pp_mode {
|
||||||
SANEI_PP_MODE_ECP = (1<<8)
|
SANEI_PP_MODE_ECP = (1<<8)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Initialize sanei_pp.
|
||||||
|
*
|
||||||
|
* This function must be called before any other sanei_pp function.
|
||||||
|
*/
|
||||||
|
extern SANE_Status sanei_pp_init( void );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function to open a parport device.
|
* Function to open a parport device.
|
||||||
*
|
*
|
||||||
|
@ -115,4 +121,13 @@ extern SANE_Byte sanei_pp_inb_stat( int fd );
|
||||||
extern SANE_Byte sanei_pp_inb_ctrl( int fd );
|
extern SANE_Byte sanei_pp_inb_ctrl( int fd );
|
||||||
extern SANE_Byte sanei_pp_inb_epp ( int fd );
|
extern SANE_Byte sanei_pp_inb_epp ( int fd );
|
||||||
|
|
||||||
|
/** function to delay execution for some micro-seconds.
|
||||||
|
* Please not, that the accuracy highly depends on your system architechture
|
||||||
|
* and the time to delay. It is internally implemented as system calls to
|
||||||
|
* gettimeofday().
|
||||||
|
*
|
||||||
|
* @param usec - number of micro-seconds to delay
|
||||||
|
*/
|
||||||
|
extern void sanei_pp_udelay( unsigned long usec );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
138
sanei/sanei_pp.c
138
sanei/sanei_pp.c
|
@ -59,6 +59,8 @@
|
||||||
|
|
||||||
#define BACKEND_NAME sanei_pp
|
#define BACKEND_NAME sanei_pp
|
||||||
|
|
||||||
|
#define _TEST_LOOPS 1000
|
||||||
|
|
||||||
#ifndef _VAR_NOT_USED
|
#ifndef _VAR_NOT_USED
|
||||||
# define _VAR_NOT_USED(x) ((x)=(x))
|
# define _VAR_NOT_USED(x) ((x)=(x))
|
||||||
#endif
|
#endif
|
||||||
|
@ -73,7 +75,16 @@
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
# include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_LIMITS_H
|
||||||
|
# include <limits.h>
|
||||||
|
#else
|
||||||
|
# ifndef ULONG_MAX
|
||||||
|
# define ULONG_MAX 4294967295UL
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
#if defined (ENABLE_PARPORT_DIRECTIO)
|
#if defined (ENABLE_PARPORT_DIRECTIO)
|
||||||
# undef HAVE_LIBIEEE1284
|
# undef HAVE_LIBIEEE1284
|
||||||
# if defined(HAVE_SYS_IO_H)
|
# if defined(HAVE_SYS_IO_H)
|
||||||
|
@ -135,6 +146,7 @@ inb( u_long port )
|
||||||
|
|
||||||
/** our global init flag... */
|
/** our global init flag... */
|
||||||
static int first_time = SANE_TRUE;
|
static int first_time = SANE_TRUE;
|
||||||
|
static unsigned long pp_thresh = 0;
|
||||||
|
|
||||||
#if (defined (HAVE_IOPERM) || defined (HAVE_LIBIEEE1284)) && !defined (IO_SUPPORT_MISSING)
|
#if (defined (HAVE_IOPERM) || defined (HAVE_LIBIEEE1284)) && !defined (IO_SUPPORT_MISSING)
|
||||||
|
|
||||||
|
@ -510,6 +522,77 @@ no_ecp:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static unsigned long
|
||||||
|
pp_time_diff( struct timeval *start, struct timeval *end )
|
||||||
|
{
|
||||||
|
double s, e, r;
|
||||||
|
|
||||||
|
s = (double)start->tv_sec * 1000000.0 + (double)start->tv_usec;
|
||||||
|
e = (double)end->tv_sec * 1000000.0 + (double)end->tv_usec;
|
||||||
|
r = (e - s);
|
||||||
|
|
||||||
|
if( r <= (double)ULONG_MAX )
|
||||||
|
return (unsigned long)r;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
static unsigned long
|
||||||
|
pp_calculate_thresh( void )
|
||||||
|
{
|
||||||
|
unsigned long i, r;
|
||||||
|
struct timeval start, end, deadline;
|
||||||
|
|
||||||
|
gettimeofday( &start, NULL);
|
||||||
|
|
||||||
|
for( i = _TEST_LOOPS; i; i-- ) {
|
||||||
|
|
||||||
|
gettimeofday( &deadline, NULL );
|
||||||
|
deadline.tv_usec += 10;
|
||||||
|
deadline.tv_sec += deadline.tv_usec / 1000000;
|
||||||
|
deadline.tv_usec %= 1000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
gettimeofday( &end, NULL);
|
||||||
|
|
||||||
|
r = pp_time_diff( &start, &end );
|
||||||
|
return (r/_TEST_LOOPS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
pp_calibrate_delay( void )
|
||||||
|
{
|
||||||
|
unsigned long r, i;
|
||||||
|
struct timeval start, end;
|
||||||
|
|
||||||
|
for( i = 0; i < 5; i++ ) {
|
||||||
|
|
||||||
|
pp_thresh = pp_calculate_thresh();
|
||||||
|
gettimeofday( &start, NULL);
|
||||||
|
|
||||||
|
for( i = _TEST_LOOPS; i; i-- ) {
|
||||||
|
sanei_pp_udelay( 1 );
|
||||||
|
}
|
||||||
|
gettimeofday( &end, NULL);
|
||||||
|
|
||||||
|
r = pp_time_diff( &start, &end );
|
||||||
|
|
||||||
|
DBG( 4, "pp_calibrate_delay: Delay expected: "
|
||||||
|
"%u, real %lu, pp_thresh=%lu\n", _TEST_LOOPS, r, pp_thresh );
|
||||||
|
|
||||||
|
if( r >= _TEST_LOOPS ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DBG( 4, "pp_calibrate_delay: pp_thresh set to 0\n" );
|
||||||
|
pp_thresh = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static SANE_Status
|
static SANE_Status
|
||||||
pp_init( void )
|
pp_init( void )
|
||||||
{
|
{
|
||||||
|
@ -573,21 +656,15 @@ pp_init( void )
|
||||||
static int
|
static int
|
||||||
pp_open( const char *dev, SANE_Status * status )
|
pp_open( const char *dev, SANE_Status * status )
|
||||||
{
|
{
|
||||||
int i, result;
|
int i;
|
||||||
#if !defined (HAVE_LIBIEEE1284)
|
#if !defined (HAVE_LIBIEEE1284)
|
||||||
u_long base;
|
u_long base;
|
||||||
|
#else
|
||||||
|
int result;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DBG( 4, "pp_open: trying to attach dev `%s`\n", dev );
|
DBG( 4, "pp_open: trying to attach dev `%s`\n", dev );
|
||||||
|
|
||||||
result = pp_init();
|
|
||||||
if( result != SANE_STATUS_GOOD ) {
|
|
||||||
|
|
||||||
DBG( 1, "pp_open: failed to initialize\n" );
|
|
||||||
*status = result;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !defined (HAVE_LIBIEEE1284)
|
#if !defined (HAVE_LIBIEEE1284)
|
||||||
{
|
{
|
||||||
char *end;
|
char *end;
|
||||||
|
@ -741,6 +818,22 @@ pp_close( int fd, SANE_Status *status )
|
||||||
|
|
||||||
/** exported functions **/
|
/** exported functions **/
|
||||||
|
|
||||||
|
SANE_Status
|
||||||
|
sanei_pp_init( void )
|
||||||
|
{
|
||||||
|
SANE_Status result;
|
||||||
|
|
||||||
|
DBG_INIT();
|
||||||
|
|
||||||
|
result = pp_init();
|
||||||
|
if( result != SANE_STATUS_GOOD ) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
pp_calibrate_delay();
|
||||||
|
return SANE_STATUS_GOOD;
|
||||||
|
}
|
||||||
|
|
||||||
SANE_Status
|
SANE_Status
|
||||||
sanei_pp_open( const char *dev, int *fd )
|
sanei_pp_open( const char *dev, int *fd )
|
||||||
{
|
{
|
||||||
|
@ -993,6 +1086,25 @@ sanei_pp_getmode( int fd, int *mode )
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sanei_pp_udelay( unsigned long usec )
|
||||||
|
{
|
||||||
|
struct timeval now, deadline;
|
||||||
|
|
||||||
|
if( usec <= pp_thresh )
|
||||||
|
return;
|
||||||
|
|
||||||
|
gettimeofday( &deadline, NULL );
|
||||||
|
deadline.tv_usec += usec;
|
||||||
|
deadline.tv_sec += deadline.tv_usec / 1000000;
|
||||||
|
deadline.tv_usec %= 1000000;
|
||||||
|
|
||||||
|
do {
|
||||||
|
gettimeofday( &now, NULL );
|
||||||
|
} while ((now.tv_sec < deadline.tv_sec) ||
|
||||||
|
(now.tv_sec == deadline.tv_sec && now.tv_usec < deadline.tv_usec));
|
||||||
|
}
|
||||||
|
|
||||||
#else /* !HAVE_IOPERM */
|
#else /* !HAVE_IOPERM */
|
||||||
|
|
||||||
SANE_Status
|
SANE_Status
|
||||||
|
@ -1105,4 +1217,10 @@ sanei_pp_getmode( int fd, int *mode )
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sanei_pp_udelay( unsigned long usec )
|
||||||
|
{
|
||||||
|
_VAR_NOT_USED( usesc );
|
||||||
|
DBG( 2, "sanei_pp_udelay: not supported\n" );
|
||||||
|
}
|
||||||
#endif /* !HAVE_IOPERM */
|
#endif /* !HAVE_IOPERM */
|
||||||
|
|
Ładowanie…
Reference in New Issue