[fprint] Adding new driver

MOGANESHWARAN RAJASEGARAN moganesh at fkegraduate.utm.my
Tue Jan 24 10:31:03 PST 2012


Thank you for the guide in creating the unified diff. I hope this is
correct.

Moganesh

diff --git a/configure.ac b/configure.ac
index f5c26f9..5ebaef5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,13 +23,14 @@ AC_SUBST(lt_major)
 AC_SUBST(lt_revision)
 AC_SUBST(lt_age)

-all_drivers="upeke2 upekts upektc upeksonly vcom5s uru4000 fdu2000 aes1610
aes2501 aes4000 vfs101"
+all_drivers="upeke2 upekts upektc upeket upeksonly vcom5s uru4000 fdu2000
aes1610 aes2501 aes4000 vfs101"

 require_imaging='no'
 require_aeslib='no'
 enable_upeke2='no'
 enable_upekts='no'
 enable_upektc='no'
+enable_upeket='no'
 enable_upeksonly='no'
 enable_vcom5s='no'
 enable_uru4000='no'
@@ -59,6 +60,11 @@ for driver in `echo ${drivers} | sed -e 's/,/ /g' -e
's/,$//g'`; do
  enable_upektc="no"
  # Driver not ported
  ;;
+ upeket)
+ AC_DEFINE([ENABLE_UPEKET], [], [Build UPEK TouchChip driver])
+ enable_upeket="no"
+ # Driver not ported
+ ;;
  upeksonly)
  AC_DEFINE([ENABLE_UPEKSONLY], [], [Build UPEK TouchStrip sensor-only
driver])
  enable_upeksonly="yes"
@@ -102,6 +108,7 @@ done
 AM_CONDITIONAL([ENABLE_UPEKTS], [test "$enable_upekts" = "yes"])
 AM_CONDITIONAL([ENABLE_UPEKE2], [test "$enable_upeke2" = "yes"])
 #AM_CONDITIONAL([ENABLE_UPEKTC], [test "$enable_upektc" = "yes"])
+#AM_CONDITIONAL([ENABLE_UPEKET], [test "$enable_upeket" = "yes"])
 AM_CONDITIONAL([ENABLE_UPEKSONLY], [test "$enable_upeksonly" = "yes"])
 AM_CONDITIONAL([ENABLE_VCOM5S], [test "$enable_vcom5s" = "yes"])
 AM_CONDITIONAL([ENABLE_URU4000], [test "$enable_uru4000" = "yes"])
@@ -237,6 +244,11 @@ if test x$enable_upektc != xno ; then
 else
  AC_MSG_NOTICE([   upektc driver disabled])
 fi
+if test x$enable_upeket != xno ; then
+ AC_MSG_NOTICE([** upeket driver enabled])
+else
+ AC_MSG_NOTICE([   upeket driver disabled])
+fi
 if test x$enable_upeksonly != xno ; then
  AC_MSG_NOTICE([** upeksonly driver enabled])
 else
diff --git a/libfprint/Makefile.am b/libfprint/Makefile.am
index 656a2f4..5ff2171 100644
--- a/libfprint/Makefile.am
+++ b/libfprint/Makefile.am
@@ -5,6 +5,7 @@ MOSTLYCLEANFILES = $(udev_rules_DATA)
 UPEKE2_SRC = drivers/upeke2.c
 UPEKTS_SRC = drivers/upekts.c
 UPEKTC_SRC = drivers/upektc.c
+UPEKET_SRC = drivers/upeket.c
 UPEKSONLY_SRC = drivers/upeksonly.c
 URU4000_SRC = drivers/uru4000.c
 AES1610_SRC = drivers/aes1610.c
@@ -18,6 +19,7 @@ EXTRA_DIST = \
  $(UPEKE2_SRC) \
  $(UPEKTS_SRC) \
  $(UPEKTC_SRC) \
+ $(UPEKET_SRC) \
  $(UPEKSONLY_SRC) \
  $(URU4000_SRC) \
  $(AES1610_SRC) \
@@ -100,6 +102,10 @@ endif
 #DRIVER_SRC += $(UPEKTC_SRC)
 #endif

+#if ENABLE_UPEKET
+#DRIVER_SRC += $(UPEKET_SRC)
+#endif
+
 if ENABLE_URU4000
 DRIVER_SRC += $(URU4000_SRC)
 endif
diff --git a/libfprint/drivers/upeket.c b/libfprint/drivers/upeket.c
new file mode 100644
index 0000000..e5c12d2
--- /dev/null
+++ b/libfprint/drivers/upeket.c
@@ -0,0 +1,720 @@
+/*
+ * Copyright (C) 2012 Moganeshwaran Rajasegaran <moganeshwaran at gmail.com>
+ * UPEK EikonTouch300 driver for libfprint
+
+ * Heavily based on UPEK TouchChip driver for libfprint
+ * Copyright (C) 2007 Jan-Michael Brummer <buzz2 at gmx.de>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
+ */
+
+#define FP_COMPONENT "upeket"
+
+#include <errno.h>
+#include <string.h>
+
+#include <glib.h>
+#include <usb.h>
+
+#include <fp_internal.h>
+
+#define SENSOR_FULL_IMAGE 59904
+#define WAIT_COUNT 5
+
+typedef char sint8;
+typedef unsigned char uint8;
+typedef int sint32;
+typedef unsigned int uint32;
+
+/** scan command */
+static const unsigned char anScanCommand[ 0x40 ] = {
+ 0x0e, 0x00, 0x03, 0xa8, 0x00, 0xb6, 0xbb, 0xbb,
+ 0xb8, 0xb7, 0xb8, 0xb5, 0xb8, 0xb9, 0xb8, 0xb9,
+ 0xbb, 0xbb, 0xbe, 0xbb, 0x4e, 0x16, 0xf4, 0x77,
+ 0xa8, 0x07, 0x32, 0x00, 0x6a, 0x16, 0xf4, 0x77,
+ 0x78, 0x24, 0x61, 0x00, 0xc8, 0x00, 0xec, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x3c, 0xf3, 0x2f, 0x01,
+ 0x05, 0x90, 0xf6, 0x77, 0x84, 0xf5, 0x2f, 0x01,
+ 0x05, 0x90, 0xf6, 0x00, 0xc8, 0x00, 0xec, 0x00
+};
+
+
+/**
+ * \brief Common interaktion routine for the sensor device
+ * \param dev fingerprint image device pointer
+ * \param pnRawString raw data string
+ * \param nLen length we want to read, if 0 do not read at all
+ * \param pnBuffer buffer pointer we want to store the read buffer
+ * \return error code
+ */
+static sint32 askScanner( struct fp_img_dev *dev, const unsigned char
*pnRawString, sint32 nLen, sint8 *pnBuffer ) {
+    sint8 anBuf[ 65535 ];
+ sint32 nRet;
+ int transferred;
+ struct libusb_bulk_transfer msg1 = {
+ .endpoint = 2,
+ .data = pnRawString,
+ .length = 0x40,
+ };
+ struct libusb_bulk_transfer msg2 = {
+ .endpoint = 0x81,
+ .data = anBuf,
+ .length = nLen,
+ };
+
+ nRet = libusb_bulk_transfer(dev->udev, &msg1, &transferred, 1003);
+ if (transferred != 0x40) {
+ return -1;
+ }
+
+ if ( !nLen ) {
+ return 0;
+ }
+
+ nRet = libusb_bulk_transfer(dev->udev, &msg2, &transferred, 1003);
+ if ( ( transferred == nLen ) && ( pnBuffer != NULL ) ) {
+ memcpy( pnBuffer, anBuf, nLen );
+ return transferred;
+ }
+
+ return nRet;
+}
+
+/**
+ * \brief Quick test if finger is on sensor
+ * \param pnImage image pointer
+ * \return 1 on yes, 0 on no
+ */
+static sint32 ValidScan( sint8 *pnImage ) {
+ sint32 nIndex, nSum;
+
+ nSum = 0;
+
+ for ( nIndex = 0; nIndex < SENSOR_FULL_IMAGE; nIndex++ ) {
+ if ( ( uint8 ) pnImage[ nIndex ] < 160 ) {
+ nSum++;
+ }
+ }
+
+ return nSum < 500 ? 0 : 1;
+}
+
+/**
+ * \brief Setup Sensor device
+ * \param dev fingerprint image device pointer
+ * \return error code
+ */
+static sint32 SetupSensor( struct fp_img_dev *dev ) {
+
+ /* setup sensor */
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xF3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -1;
+ }
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x98\xf1\x12\x00\x03\xd4\xa9\x00\x64\x00\x00\x00\x14\x20\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x84\xf1\x12\x00\x0c\x00\x00\x00\x90\xf1\x12\x00\xac\x0d\x00\x00\x08\x00\x00\x00",
0x00, NULL ) < 0 ) {
+ return -2;
+ }
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xf7\x00\x00\x00\x00\x00\x00\x90\xf1\x12\x00\x92\xc5\xa9\x00\x48\xf1\x12\x00\x40\x00\x00\x00\xa2\xc5\xa9\x00\x03\x00\x00\x00\x02\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x98\xf1\x12\x00\x03\xd4\xa9\x00\x64\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -3;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\xf7\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
0x00, NULL ) < 0 ) {
+ return -4;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xf8\xa9\x00\x28\xf1\x12\x00\x40\x00\x00\x00\xbb\xc4\xa9\x00\x02\xfa\x3f\x05\x05\x02\x05\x23\x27\xe5\x13\x10\x08\xff\x04\x6c\xc1\x41\x1c\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x60\xf1\x12\x00\x89\xae\xa9\x00\x03\x00\x00\x00\x00\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -5;
+ };
+
+
+ if ( askScanner( dev,
"\x8b\x00\x00\x00\x3a\x8c\xf1\x12\x00\x64\xa8\xa7\x00\x84\xf1\x12\x00\x2f\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xc0\xf1\x12\x00\x51\xa6\xa7\x00\xf8\x00\x00\x00\x7e\xa6\xa7\x00\x24\x5a\xac\x00\x01\xf1\x12\x00\x00\x00\x00\x00\x2f\x00\x00\x00\x08\x00\x00",
0x40, NULL ) < 0 ) {
+ return -6;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3a\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1f\x20\x21\x22\x23\x24\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3d\x3f\xff\x7c",
0x40, NULL ) < 0 ) {
+ return -7;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3a\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1f\x20\x21\x22\x23\x24\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3d\x3f\xff\x00",
0x40, NULL ) < 0 ) {
+ return -8;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\x0d\xff\x00\x34\xf1\x12\x00\x40\x00\x00\x00\xe8\x03\x00\x00\x00\x00\x00\x00\x00\xf1\x12\x00\x57\xcc\xa9\x00\x34\xf1\x12\x00\x40\x00\x00\x00\xbd\xcc\xa9\x00\x3a\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x34\xf1\x12\x00\x3a\x00\x00\x00",
0x00, NULL ) < 0 ) {
+ return -9;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x0a\x37\x6a\x3d\x73\x3d\x71\x0e\x01\x0e\x81\x00\x40\x00\x00\x00\xe8\x03\x00\x00\x00\x00\x00\x00\x00\xf1\x12\x00\x57\xcc\xa9\x00\x34\xf1\x12\x00\x40\x00\x00\x00\xbd\xcc\xa9\x00\x3a\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x34\xf1\x12\x00",
0x00, NULL ) < 0 ) {
+ return -10;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3a\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1f\x20\x21\x22\x23\x24\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3d\x3f\xff\x00",
0x40, NULL ) < 0 ) {
+ return -11;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\x3d\x51\x0e\x01\x0e\x81\x00\x40\x00\x00\x00\xe8\x03\x00\x00\x00\x00\x00\x00\x00\xf1\x12\x00\x57\xcc\xa9\x00\x34\xf1\x12\x00\x40\x00\x00\x00\xbd\xcc\xa9\x00\x3a\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x34\xf1\x12\x00\x3a\x00\x00\x00",
0x00, NULL ) < 0 ) {
+ return -12;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3a\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1f\x20\x21\x22\x23\x24\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3d\x3f\xff\x00",
0x40, NULL ) < 0 ) {
+ return -13;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x04\x78\x3A\x34\x00\x00\xC0\x00\x00\x00\x00\x24\x1A\x80\x7C\x04\xF1\x12\x00\x18\x00\x00\x00\x48\x00\x00\x00\xCC\xEF\x12\x00\x42\x00\x00\x00\x00\x00\x00\x00\xB0\xEF\x12\x00\x0C\x00\x0C\x00\x84\x21\x15\x00\x48\x00\x00\x00\x0C\x00\x00\x00\x02\x00\x00",
0x40, NULL ) < 0 ) {
+ return -14;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x04\xB2\x3A\x0B\x88\x01\xB4\x01\x20\x91\x04\x07\x02\x24\x20\xE2\x15\x0D\x10\x0F\x10\x11\x11\x11\x11\x11\x12\x13\x13\x13\x14\x14\x14\x15\x15\x15\x15\x16\x16\x16\x17\x17\x17\x17\x18\x18\x18\x18\x19\x19\x19\x19\x1A\x1A\x1A\x1A\x1A\x1A\x1B\x1B\x1B\x00",
0x40, NULL ) < 0 ) {
+ return -15;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x04\xEC\x3A\x0B\x1C\x1C\x1C\x1C\x1C\x1C\x1C\x1D\x1D\x1D\x1E\x1D\x1E\x1E\x1E\x1E\x1E\x1E\x1F\x1F\x1F\x1F\x1E\x1F\x1F\x20\x20\x1F\x20\x20\x20\x21\x20\x21\x20\x21\x20\x20\x20\x21\x20\x21\x20\x21\x21\x21\x21\x21\x22\x21\x21\x22\x21\x22\x21\x22\x22\x00",
0x40, NULL ) < 0 ) {
+ return -16;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x05\x26\x3A\x0B\x22\x22\x22\x21\x22\x22\x22\x21\x22\x22\x22\x21\x22\x21\x22\x21\x21\x21\x22\x21\x21\x21\x21\x22\x22\x21\x22\x22\x21\x21\x21\x21\x21\x21\x21\x21\x21\x20\x20\x21\x20\x20\x20\x20\x20\x20\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x00",
0x40, NULL ) < 0 ) {
+ return -17;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x05\x60\x3A\x0B\x1F\x1F\x1F\x1F\x1F\x1F\x1E\x1E\x1E\x1E\x1F\x1F\x1F\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1F\x1E\x1E\x1E\x1E\x1D\x1D\x1D\x1D\x1D\x1D\x1D\x1D\x1D\x1C\x1D\x1D\x1D\x1C\x1C\x1C\x1C\x1C\x1C\x1C\x1B\x1B\x1C\x1C\x1B\x1B\x1B\x00",
0x40, NULL ) < 0 ) {
+ return -18;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x05\x9A\x3A\x0B\x1B\x1B\x1B\x1A\x1B\x1B\x1A\x1A\x1A\x1B\x1B\x1B\x1B\x1A\x19\x1A\x1A\x1A\x1A\x19\x1A\x1A\x1A\x19\x19\x19\x19\x19\x19\x18\x19\x18\x18\x19\x18\x17\x18\x17\x17\x17\x17\x17\x17\x17\x17\x16\x17\x16\x16\x15\x15\x16\x15\x16\x15\x15\x14\x00",
0x40, NULL ) < 0 ) {
+ return -19;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x05\xD4\x2C\x0B\x14\x15\x14\x14\x14\x13\x13\x13\x12\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6E\x12\x00\x2B\xC5\xA9\x00\x64\x00\x00\x00\x7C\xEF\x12\x00",
0x40, NULL ) < 0 ) {
+ return -20;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x01\x68\x0A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xD0\xFD\x7F\xDC\x6D\x12\x00\x2A\x26\x80\x7C\x98\x6D\x12\x00\x00\x26\x80\x7C\xB8\x00\x00\x00\x0C\x80\x01\x10\x90\x3E\x94\x00",
0x40, NULL ) < 0 ) {
+ return -21;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x03\xB4\x3A\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1E\x1E\x1E\x1E\x1F\x1F\x1F\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1F\x1E\x1E\x1E\x1E\x1D\x1D\x1D\x1D\x1D\x1D\x1D\x1D\x1D\x1C\x1D\x1D\x1D\x1C\x1C\x1C\x1C\x1C\x00",
0x40, NULL ) < 0 ) {
+ return -22;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x03\xEE\x06\x0B\x00\x00\x00\x00\x00\x00\x85\xB7\xA9\x00\xB8\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xB8\x00\x00\x00\x18\x70\x12\x00\x2B\xC5\xA9\x00\x64\x00\x00\x00\xD4\xF0\x12\x00",
0x40, NULL ) < 0 ) {
+ return -23;
+ };
+
+
+ if ( askScanner( dev,
"\x07\x00\x20\x00\x3a\x32\x2b\x07\x2e\x29\x07\x2b\x27\x07\x27\x25\x07\x23\x23\x07\x20\x21\x07\x1c\x1d\x07\x19\x1a\x07\x15\x17\x07\x12\x15\x07\x0e\x14\x07\x12\x17\x07\x15\x19\x07\x19\x1c\x07\x1c\x1f\x07\x20\x23\x07\x23\x25\x07\x27\x27\x07\x2b\x29\x07\x2e\x00",
0x00, NULL ) < 0 ) {
+ return -24;
+ };
+
+
+ if ( askScanner( dev,
"\x07\x00\x20\x3a\x26\x2b\x07\x32\x2d\x07\x32\x2f\x07\x2e\x2d\x07\x2b\x2b\x07\x27\x29\x07\x23\x27\x07\x20\x25\x07\x1c\x22\x07\x19\x1e\x07\x15\x1b\x07\x12\x19\x07\x0e\x16\x07\x07\x19\x1c\x07\x1c\x1f\x07\x20\x23\x07\x23\x25\x07\x27\x27\x07\x2b\x29\x07\x2e\x00",
0x00, NULL ) < 0 ) {
+ return -25;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x06\x0e\x81\x0e\x81\x09\x4d\x00\x00\x00\x00\x00\x26\x00\x00\x00\x07\x00\x20\x3a\x26\x2b\x07\x32\x2d\x07\x32\x2f\x07\x2e\x2d\x07\x2b\x2b\x07\x27\x29\x07\x23\x27\x07\x20\x25\x07\x1c\x22\x07\x19\x1e\x07\x15\x1b\x07\x12\x19\x07\x0e\x16\x07\x07",
0x00, NULL ) < 0 ) {
+ return -26;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3a\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1f\x20\x21\x22\x23\x24\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3d\x3f\xff\x00",
0x40, NULL ) < 0 ) {
+ return -27;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\x0e\x85\x00\x00\x00\x00\x00\x26\x00\x00\x00\x07\x00\x20\x3a\x26\x2b\x07\x32\x2d\x07\x32\x2f\x07\x2e\x2d\x07\x2b\x2b\x07\x29\x07\x23\x27\x07\x20\x25\x07\x1c\x22\x07\x19\x1e\x07\x15\x1b\x07\x12\x19\x07\x1f\x0e\x16\x07\x07\x19\x1c\x07\x1c",
0x00, NULL ) < 0 ) {
+ return -28;
+ };
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\x0d\x62\x62\x51\x6c\x00\x00\x00\x00\x00\x40\x3a\x41\x0e\x2b\x00\x00\x00\x00\x78\xf1\x12\x00\x1a\xaa\xa7\x1f\x00\x3a\x09\x00\x00\x00\x12\x41\x0e\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xf1\x12\x00\x89\xae\xa9\x00\x00\x00\x00\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -29;
+ };
+
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\x20\x6C\x00\x00\x00\x00\x00\x26\x00\x00\x00\x07\x00\x20\x3A\x26\x2B\x07\x32\x2D\x07\x32\x2F\x07\x2E\x2D\x07\x2B\x2B\x07\x27\x29\x07\x23\x27\x07\x20\x25\x07\x1C\x22\x07\x19\x1E\x07\x15\x1B\x07\x12\x19\x07\x0E\x16\x07\x07\x19\x1C\x07\x1C",
0x00, NULL ) < 0 ) {
+ return -30;
+ };
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xF9\x6C\x6C\x6C\x6C\x40\x40\x2E\x6D\x64\xED\x00\x00\x00\x00\x00\x00\x00\x00\x4C\xF1\x12\x00\x89\xAE\xA9\x00\x03\x00\x00\x00\x00\x00\x00\x00\xE8\x3D\xAC\x00\x02\x00\x00\x00\x00\x00\x00\x00\x68\xF1\x12\x00\x14\xAB\xA7\x00\x03\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -31;
+ };
+
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\xF9\x00\x00\x26\x00\x00\x00\x07\x00\x20\x3A\x26\x2B\x07\x32\x2D\x07\x32\x2F\x07\x2E\x2D\x07\x2B\x2B\x07\x27\x29\x07\x23\x27\x07\x20\x25\x07\x1C\x22\x07\x19\x1E\x07\x15\x1B\x07\x12\x19\x07\x0E\x16\x07\x07\x19\x1C\x07\x1C\xBA\xEC\x64\xED",
0x00, NULL ) < 0 ) {
+ return -32;
+ };
+
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x16\x1C\x13\x1B\x0B\x1A\x0A\x30\x08\x09\x6D\x08\xA7\x00\x9E\x00\x1E\x0C\x08\x1D\x04\x23\x42\x2F\x07\x2E\x2D\x07\x2B\x2B\x07\x27\x29\x07\x23\x27\x07\x20\x25\x07\x1C\x22\x07\x19\x1E\x07\x15\x1B\x07\x12\x19\x07\x0E\x16\x07\x07\x19\x1C\x07\x1C",
0x00, NULL ) < 0 ) {
+ return -33;
+ };
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3A\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1F\x20\x21\x22\x23\x24\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3D\x3F\xFF\x00",
0x40, NULL ) < 0 ) {
+ return -34;
+ };
+
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\x0D\xFF\x30\x08\x09\x6D\x08\xA7\x00\x9E\x00\x1E\x0C\x08\x1D\x04\x23\x42\x2F\x07\x2E\x2D\x07\x2B\x2B\x07\x27\x29\x07\x23\x27\x07\x20\x25\x07\x1C\x22\x07\x19\x1E\x07\x15\x1B\x07\x12\x19\x07\x0E\x16\x07\x07\x19\x1C\x07\x1C\xBA\xEC\x64\xED",
0x00, NULL ) < 0 ) {
+ return -35;
+ };
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xF7\x64\xED\x00\x00\x00\x00\x7C\xF1\x12\x00\x1A\xAA\xA7\x00\x3A\x00\x00\x00\x2A\x6D\x64\xED\x00\x00\x00\x00\x00\x00\x00\x00\x50\xF1\x12\x00\x89\xAE\xA9\x00\x03\x00\x00\x00\x00\x00\x00\x00\xE8\x3D\xAC\x00\x02\x00\x00\x00\x00\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -36;
+ };
+
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xF7\xA9\x00\x02\xFA\x3F\x05\x05\xC2\x85\xA6\xA7\x6D\x10\x10\x08\xFF\x85\x6C\x00\x00\xCF\x00\x01\x00\x00\x1F\x01\x01\x0A\x0B\x13\x04\x6C\x6C\x6C\x6C\x42\x42\x42\x42\x42\x42\x42\x42\x42\x42\x6C\x08\x00\x00\x00\x00\x40\x42\x42\x42\x42\x42",
0x40, NULL ) < 0 ) {
+ return -37;
+ };
+
+
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\xF7\xF3\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\x0D\xFF\x30\x08\x09\x6D\x08\xA7\x00\x9E\x00\x1E\x0C\x08\x1D\x04\x23\x42\x2F\x07\x2E\x2D\x07\x2B\x2B\x07\x27\x29\x07\x23\x27\x07\x20\x25\x07\x1C\x22\x07\x19\x1E\x07\x15\x1B",
0x00, NULL ) < 0 ) {
+ return -38;
+ };
+
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xF0\x00\x00\x00\x00\x00\x00\xE8\x3D\xAC\x00\x02\x00\x00\x00\x00\x00\x00\x00\x5C\xF1\x12\x00\x14\xAB\xA7\x00\x03\x00\x00\x00\x5C\xF1\x12\x00\x20\xAB\xA7\x00\x58\xF1\x12\x00\x08\x00\x00\x00\x99\xA9\xA7\x00\xE8\x3D\xAC\x00\x00\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -39;
+ };
+
+
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\xF0\x8F\x2F\x07\x2E\x2D\x07\x2B\x2B\x07\x27\x29\x07\x23\x27\x07\x20\x25\x07\x1C\x22\x07\x19\x1E\x07\x15\x1B\x07\x12\x19\x07\x82\xEC\x64\xED\x24\xF1\x12\x00\xFA\xCB\xA9\x00\x03\x00\x00\x00\x00\x00\x00\x00\xEA\x3D\xAC\x00\xBD\xCC\xA9\x00",
0x00, NULL ) < 0 ) {
+ return -40;
+ };
+
+
+ if ( askScanner( dev,
"\x08\x00\x00\x00\x0A\x00\x00\xCF\x00\x01\x00\x00\x1F\x01\x01\x00\x0C\xCF\xA9\x00\x74\x70\x12\x00\x40\x00\x00\x00\x1C\xCF\xA9\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\xF0\x8F\x2F\x07\x2E\x2D\x07\x2B\x2B\x07\x27\x29\x07\x23\x27\x07\x20\x25\x07",
0x00, NULL ) < 0 ) {
+ return -41;
+ };
+
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x06\x0E\x85\x09\xED\x09\x6D\x2F\x07\x2E\x2D\x07\x2B\x2B\x07\x27\x29\x07\x23\x27\x07\x20\x25\x07\x1C\x22\x07\x19\x8A\xEC\x64\xED\x1C\xF1\x12\x00\xFA\xCB\xA9\x00\x08\x00\x00\x00\x00\x00\x00\x00\x72\xF1\x12\x00\xBD\xCC\xA9\x00\x0A\x00\x00\x00",
0x00, NULL ) < 0 ) {
+ return -42;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3A\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1F\x20\x21\x22\x23\x24\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3D\x3F\xFF\x00",
0x40, NULL ) < 0 ) {
+ return -43;
+ };
+
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\x09\xED\x2F\x07\x2E\x2D\x07\x2B\x2B\x07\x27\x29\x07\x23\x27\x07\x20\x25\x07\x1C\x22\x07\x19\x8A\xEC\x64\xED\x1C\xF1\x12\x00\xFA\xCB\xA9\x00\x08\x00\x00\x00\x00\x00\x00\x00\x72\xF1\x12\x00\xBD\xCC\xA9\x00\x0A\x00\x00\x00\xBD\xCC\xA9\x00",
0x00, NULL ) < 0 ) {
+ return -44;
+ };
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xF3\x00\x00\x8C\xF1\x12\x00\x1A\xAA\xA7\x00\x3A\x00\x00\x00\x5A\x6D\x64\xED\x00\x00\x00\x00\x00\x00\x00\x00\x60\xF1\x12\x00\x89\xAE\xA9\x00\x03\x00\x00\x00\x00\x00\x00\x00\xE8\x3D\xAC\x00\x02\x00\x00\x00\x00\x00\x00\x00\x7C\xF1\x12\x00",
0x40, NULL ) < 0 ) {
+ return -45;
+ };
+
+
+
+ if ( askScanner( dev,
"\x84\x00\x00\x00\x32\x02\xE0\xAD\x00\xFC\xDF\xAD\x00\xDB\xDF\xAD\x00\xBA\xDF\xAD\x00\x99\xDF\x6F\x44\xC2\xE8\x20\x65\x73\x83\xAC\xD7\x88\x6D\x59\x61\xE0\x3B\x3D\xB7\xF4\xDE\xAD\x00\xD3\xDE\xAD\x00\xB2\xDE\xAD\x00\x91\xDE\x00\xA6\xEC\x64\xED\xA2\xEC\x64\xED",
0x40, NULL ) < 0 ) {
+ return -46;
+ };
+
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x06\x1A\x0A\x1B\x0B\x1C\x13\x00\x00\x00\x00\x00\x92\xD5\x90\x7C\xBB\x9B\x80\x7C\xB8\x00\x00\x00\xAC\x70\x12\x00\x85\xB7\xA9\x00\xB8\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
0x00, NULL ) < 0 ) {
+ return -47;
+ };
+
+
+ if ( askScanner( dev,
"\x08\x00\x00\x00\x0A\x00\x00\xCF\x00\x01\x00\x00\x1F\x01\x01\x00\x00\x00\x00\x00\xB8\x00\x00\x00\x4C\x70\x12\x00\xEB\xC4\xA9\x00\x64\x00\x00\x00\x68\x70\x12\x00\x40\x00\x00\x00\xE8\x03\x00\x00\x00\x00\x00\x00\xB0\x70\x12\x00\x0C\xCF\xA9\x00\x68\x70\x12\x00",
0x00, NULL ) < 0 ) {
+ return -48;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\x0D\x00\x00\xCF\x00\x00\x00\x00\x00\x00\x00\x1F\x01\x00\x00\x20\x01\x00\x00\xD0\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\xA6\xB5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x28\x6F\x44\xC2",
0x40, NULL ) < 0 ) {
+ return -49;
+ };
+
+
+
+ if ( askScanner( dev,
"\x8B\x00\x04\x78\x3A\x00\x00\x00\x00\x00\xD0\xFD\x7F\x94\xF0\x12\x00\x2A\x26\x80\x7C\x50\xF0\x12\x00\x00\x26\x80\x7C\x08\x00\x00\x00\x0C\x80\x01\x10\x90\x3E\x94\x00\x14\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x80\x69\x00",
0x40, NULL ) < 0 ) {
+ return -50;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x04\xB2\x3A\x0B\x88\x01\xB4\x01\x20\x91\x04\x07\x02\x24\x20\xE2\x15\x0D\x10\x0F\x10\x11\x11\x11\x11\x11\x12\x13\x13\x13\x14\x14\x14\x15\x15\x15\x15\x16\x16\x16\x17\x17\x17\x17\x18\x18\x18\x18\x19\x19\x19\x19\x1A\x1A\x1A\x1A\x1A\x1A\x1B\x1B\x1B\x00",
0x40, NULL ) < 0 ) {
+ return -51;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x04\xEC\x3A\x0B\x1C\x1C\x1C\x1C\x1C\x1C\x1C\x1D\x1D\x1D\x1E\x1D\x1E\x1E\x1E\x1E\x1E\x1E\x1F\x1F\x1F\x1F\x1E\x1F\x1F\x20\x20\x1F\x20\x20\x20\x21\x20\x21\x20\x21\x20\x20\x20\x21\x20\x21\x20\x21\x21\x21\x21\x21\x22\x21\x21\x22\x21\x22\x21\x22\x22\x00",
0x40, NULL ) < 0 ) {
+ return -52;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x05\x26\x3A\x0B\x22\x22\x22\x21\x22\x22\x22\x21\x22\x22\x22\x21\x22\x21\x22\x21\x21\x21\x22\x21\x21\x21\x21\x22\x22\x21\x22\x22\x21\x21\x21\x21\x21\x21\x21\x21\x21\x20\x20\x21\x20\x20\x20\x20\x20\x20\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x1F\x00",
0x40, NULL ) < 0 ) {
+ return -53;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x05\x60\x3A\x0B\x1F\x1F\x1F\x1F\x1F\x1F\x1E\x1E\x1E\x1E\x1F\x1F\x1F\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1E\x1F\x1E\x1E\x1E\x1E\x1D\x1D\x1D\x1D\x1D\x1D\x1D\x1D\x1D\x1C\x1D\x1D\x1D\x1C\x1C\x1C\x1C\x1C\x1C\x1C\x1B\x1B\x1C\x1C\x1B\x1B\x1B\x00",
0x40, NULL ) < 0 ) {
+ return -54;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x05\x9A\x3A\x0B\x1B\x1B\x1B\x1A\x1B\x1B\x1A\x1A\x1A\x1B\x1B\x1B\x1B\x1A\x19\x1A\x1A\x1A\x1A\x19\x1A\x1A\x1A\x19\x19\x19\x19\x19\x19\x18\x19\x18\x18\x19\x18\x17\x18\x17\x17\x17\x17\x17\x17\x17\x17\x16\x17\x16\x16\x15\x15\x16\x15\x16\x15\x15\x14\x00",
0x40, NULL ) < 0 ) {
+ return -55;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x05\xD4\x2C\x0B\x14\x15\x14\x14\x14\x13\x13\x13\x12\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6F\x12\x00\x2B\xC5\xA9\x00\x64\x00\x00\x00\x2C\xF0\x12\x00",
0x40, NULL ) < 0 ) {
+ return -56;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xF7\x1C\x1C\x1B\x1B\x1C\x1C\x1B\x1B\x1B\x1B\x1B\x1B\x1B\x1A\x1B\x1B\x1A\x1A\x1A\x1B\x1B\x1B\x1B\x1A\x19\x1A\x1A\x1A\x1A\x19\x1A\x1A\x1A\x19\x19\x19\x19\x19\x19\x18\x19\x18\x18\x19\x18\x17\x18\x17\x17\x17\x17\x17\x17\x17\x17\x16\x17\x16",
0x40, NULL ) < 0 ) {
+ return -57;
+ };
+
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\xF7\xF3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
0x00, NULL ) < 0 ) {
+ return -58;
+ };
+
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x04\x3D\x40\x0A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xED\x64\xED\xD4\xF1\x12\x00\xFA\xCB\xA9\x00",
0x00, NULL ) < 0 ) {
+ return -59;
+ };
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3A\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1F\x20\x21\x22\x23\x24\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3D\x3F\xFF\x00",
0x40, NULL ) < 0 ) {
+ return -60;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\x0A\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xED\x64\xED\xD4\xF1\x12\x00\xFA\xCB\xA9\x00\x03\x00\x00\x00",
0x00, NULL ) < 0 ) {
+ return -61;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x00\xA8\x3A\x00\x00\x00\x00\xDC\x00\xEA\x00\x20\xED\x12\x00\x0C\x00\x0E\x00\x00\xDC\xFD\x7F\x20\xED\x12\x00\x05\x00\x00\x00\xA0\x20\x15\x00\xC8\x00\x00\x01\x43\x00\x3A\x00\x5C\x00\x44\x00\x6F\x00\x63\x00\x75\x00\x6D\x00\x65\x00\x6E\x00\x74\x00\x00",
0x40, NULL ) < 0 ) {
+ return -62;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x00\xE2\x3A\x0B\x07\xA5\x03\x2F\x63\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -63;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x01\x1C\x3A\x0B\x00\x00\x00\x00\x00\x00\x12\x75\xB3\x05\xE2\xBC\x74\x68\xAD\xAC\x7B\xB1\xF8\x52\xD5\x8F\xF7\x03\x00\x00\x06\xA5\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -64;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x01\x56\x3A\x0B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -65;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x01\x90\x3A\x0B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xA5\x00\x22\x8E\xA3\x00\x00\x0E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4C\xA5\xC8\xC8\x41\x50\x52\x39\x07\x01\x00\x5F\x00\x00\xFF\x00",
0x40, NULL ) < 0 ) {
+ return -66;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x01\xCA\x3A\x0B\x01\x48\x34\x33\x00\x00\x00\x00\x76\x3E\x84\x10\x2E\x48\x54\x0D\x98\x4C\x14\x12\x72\x7A\x88\x0F\x9F\x84\x98\x03\x52\xA6\xA4\x0A\x6E\xA8\x54\x0C\x13\xB6\xE8\x0A\x77\xC0\x94\x04\x73\xC6\x14\x07\x80\xCA\xA8\x08\x31\xD2\x44\x09\x1E\x00",
0x40, NULL ) < 0 ) {
+ return -67;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x02\x04\x3A\x0B\x74\x09\x7A\xE4\x78\x17\xA5\xE4\x24\x09\x45\xE8\x68\x07\xBA\xEC\xE8\x05\xC2\xF0\x58\x16\x78\xF6\x98\x15\x7C\xFC\xB8\x19\xAD\xFC\x74\x09\x8C\x02\x39\x0D\x36\x06\x99\x06\x9B\x08\x09\x0B\xA1\x0C\x25\x19\x57\x10\x29\x05\x1A\x1C\x45\x00",
0x40, NULL ) < 0 ) {
+ return -68;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x02\x3E\x3A\x0B\x55\x1E\x69\x16\xA4\x24\xB9\x09\x1C\x44\x55\x08\x9C\x44\xC9\x0B\x9F\x4A\xF9\x19\x4C\x4C\xF9\x13\x5E\x50\x09\x13\xB7\x6A\x09\x0A\x7C\x7A\x75\x0F\x0E\x7E\x95\x00\x81\xA6\x99\x0E\xC0\xAE\xE5\x19\xA0\xCC\x35\x0D\x63\xE2\x85\x1F\x8E\x00",
0x40, NULL ) < 0 ) {
+ return -69;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x02\x78\x3A\x0B\x35\x1D\xC1\xE8\xA9\x0C\x7A\x06\xCA\x0E\xAD\x12\xD6\x1C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
", 0x40, NULL ) < 0 ) {
+ return -70;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x02\xB2\x2A\x0B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x6C\x12\x00\x2B\xC5\xA9\x00\x64\x00\x00\x00\xFC\xEC\x12\x00",
0x40, NULL ) < 0 ) {
+ return -71;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xF1\x42\x42\x40\x6C\x00\x00\x00\x00\x00\x40\xCE\x6D\x64\xED\x00\x00\x00\x00\x30\xF2\x12\x00\x1A\xAA\xA7\x00\x3A\x00\x00\x00\xF6\x6D\x64\xED\x00\x00\x00\x00\x00\x00\x00\x00\x04\xF2\x12\x00\x89\xAE\xA9\x00\x03\x00\x00\x00\x00\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -72;
+ };
+
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\xF1\x01\x00\x1C\xCF\xA9\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\x0A\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
0x00, NULL ) < 0 ) {
+ return -73;
+ };
+
+
+
+ if ( askScanner( dev,
"\x8B\x00\x00\xFC\x3A\x1E\xDC\x74\x09\x7A\xE4\x78\x17\xA5\xE4\x24\x09\x45\xE8\x68\x07\xBA\xEC\xE8\x05\xC2\xF0\x58\x16\x78\xF6\x98\x15\x7C\xFC\xB8\x19\xAD\xFC\x74\x09\x8C\x02\x39\x0D\x36\x06\x99\x06\x9B\x08\x09\x0B\xA1\x0C\x25\x19\x57\x10\x29\x05\x1A\x1C\x00",
0x40, NULL ) < 0 ) {
+ return -74;
+ };
+
+
+ if ( askScanner( dev,
"\x8B\x00\x01\x36\x2E\x0B\x06\xA5\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2B\xC5\xA9\x00\x64\x00\x00\x00\xD8\xEE\x12\x00",
0x40, NULL ) < 0 ) {
+ return -75;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xF0\xAC\x00\xF0\xF1\x12\x00\x6A\xB1\xA7\x00\x00\x00\x00\x00\x06\xA5\x00\x01\x00\x00\x12\x00\x14\xAB\xA7\x00\x03\x00\x00\x00\x0C\xF2\x12\x00\x20\xAB\xA7\x00\x08\xF2\x12\x00\x08\x00\x00\x00\x99\xA9\xA7\x00\xE8\x3D\xAC\x00\x00\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -76;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\xF0\x8F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xED\x64\xED\xD4\xF1\x12\x00\xFA\xCB\xA9\x00\x03\x00\x00\x00\x00\x00\x00\x00\xEA\x3D\xAC\x00\xBD\xCC\xA9\x00",
0x00, NULL ) < 0 ) {
+ return -77;
+ };
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xF7\x12\x00\x88\xC4\xA9\x00\xD8\xF1\x12\x00\x40\x00\x00\x00\xBB\xC4\xA9\x00\x02\x00\x3F\x05\x0B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xEA\x6D\x64\xED\x00\x00\x00\x00\x00\x00\x00\x00\x10\xF2\x12\x00\x89\xAE\xA9\x00\x03\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -78;
+ };
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xF7\xA9\x00\x02\xFA\x3F\x05\x0B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
0x40, NULL ) < 0 ) {
+ return -79;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\xF7\xF3\x00\x0C\xCF\xA9\x00\x24\x71\x12\x00\x40\x00\x00\x00\x1C\xCF\xA9\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\xF0\x8F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
0x00, NULL ) < 0 ) {
+ return -80;
+ };
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x01\xFB\x00\x00\x00\x00\x00\x00\xF0\xF1\x12\x00\x89\xAE\xA9\x00\x03\x00\x00\x00\x00\x00\x00\x00\xE8\x3D\xAC\x00\x02\x00\x00\x00\x00\x00\x00\x00\x0C\xF2\x12\x00\x14\xAB\xA7\x00\x03\x00\x00\x00\x0C\xF2\x12\x00\x20\xAB\xA7\x00\x08\xF2\x12\x00",
0x40, NULL ) < 0 ) {
+ return -81;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\xFB\x0F\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\xF0\x8F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xED\x64\xED\xD4\xF1\x12\x00\xFA\xCB\xA9\x00",
0x00, NULL ) < 0 ) {
+ return -82;
+ };
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3A\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1F\x20\x21\x22\x23\x24\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3D\x3F\xFF\x00",
0x40, NULL ) < 0 ) {
+ return -83;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\x07\xA4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xED\x64\xED\xD4\xF1\x12\x00\xFA\xCB\xA9\x00\x03\x00\x00\x00\x42\xED\x64\xED\xE4\xF1\x12\x00\xFA\xCB\xA9\x00",
0x00, NULL ) < 0 ) {
+ return -84;
+ };
+
+
+ if ( askScanner( dev,
"\x08\x00\x00\x00\x0A\x00\x00\xCF\x00\x01\x00\x00\x1F\x01\x01\x00\xEB\xC4\xA9\x00\x64\x00\x00\x00\x24\x71\x12\x00\x40\x00\x00\x00\xE8\x03\x00\x00\x00\x00\x00\x00\x6C\x71\x12\x00\x0C\xCF\xA9\x00\x24\x71\x12\x00\x40\x00\x00\x00\x1C\xCF\xA9\x00\x00\x00\x00\x00",
0x00, NULL ) < 0 ) {
+ return -85;
+ };
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3A\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1F\x20\x21\x22\x23\x24\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3D\x3F\xFF\x00",
0x40, NULL ) < 0 ) {
+ return -86;
+ };
+
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3A\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1F\x20\x21\x22\x23\x24\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3D\x3F\xFF\x00",
0x40, NULL ) < 0 ) {
+ return -87;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\x00\x21\x00\x02\x00\x00\x00\x36\xED\x64\xED\xB0\xF1\x12\x00\xFA\xCB\xA9\x00\x08\x00\x00\x00\x00\x00\x00\x00\x06\xF2\x12\x00\xBD\xCC\xA9\x00\x0A\x00\x00\x00\x00\x00\x00\x00\x52\xED\x64\xED\xFC\xF1\x12\x00\x0A\x00\x00\x00\x06\xF2\x12\x00",
0x00, NULL ) < 0 ) {
+ return -88;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3A\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1F\x20\x21\x22\x23\x24\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3D\x3F\xFF\x00",
0x40, NULL ) < 0 ) {
+ return -89;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3A\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1F\x20\x21\x22\x23\x24\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3D\x3F\xFF\x00",
0x40, NULL ) < 0 ) {
+ return -90;
+ };
+
+
+ if ( askScanner( dev,
"\x03\x00\x00\x00\x02\x00\x20\x00\x02\x00\x00\x00\x36\xED\x64\xED\xB0\xF1\x12\x00\xFA\xCB\xA9\x00\x08\x00\x00\x00\x00\x00\x00\x00\x06\xF2\x12\x00\xBD\xCC\xA9\x00\x0A\x00\x00\x00\x00\x00\x00\x00\x52\xED\x64\xED\xFC\xF1\x12\x00\x0A\x00\x00\x00\x06\xF2\x12\x00",
0x00, NULL ) < 0 ) {
+ return -91;
+ };
+
+
+ if ( askScanner( dev,
"\x82\x00\x00\x00\x3A\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1F\x20\x21\x22\x23\x24\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3D\x3F\xFF\x00",
0x40, NULL ) < 0 ) {
+ return -92;
+ };
+
+
+ return 0;
+}
+
+static int DetectFinger( struct fp_img_dev *dev ) {
+ sint32 nRet = 0;
+ uint8 *pnData = NULL;
+
+ pnData = g_malloc( SENSOR_FULL_IMAGE );
+
+ nRet = askScanner( dev, anScanCommand, SENSOR_FULL_IMAGE, pnData );
+
+ if ( nRet != SENSOR_FULL_IMAGE ) {
+ nRet = 0;
+ goto end;
+ }
+
+ nRet = ValidScan( pnData );
+
+end:
+ g_free( pnData );
+
+ return nRet;
+}
+
+static int awaitFingerOn( struct fp_img_dev *dev ) {
+ int nRet = 0;
+ int nCount = WAIT_COUNT;
+
+ /* wait until a finger is present */
+ do {
+ nRet = DetectFinger( dev );
+ } while ( nRet == 0 );
+
+ /* give user time to scan his full finger */
+ while ( nCount-- ) {
+ nRet = DetectFinger( dev );
+ }
+
+ return nRet != 1 ? nRet : 0;
+}
+
+static int capture( struct fp_img_dev *dev, gboolean unconditional, struct
fp_img **ppsRet ) {
+ struct fp_img *psImg = NULL;
+ uint8 *pnData = NULL;
+ sint32 nRet = 0;
+
+ psImg = fpi_img_new_for_imgdev( dev );
+ pnData = g_malloc( SENSOR_FULL_IMAGE );
+
+ nRet = askScanner( dev, anScanCommand, SENSOR_FULL_IMAGE, pnData );
+ if ( nRet == SENSOR_FULL_IMAGE ) {
+ memcpy( psImg -> data, pnData, SENSOR_FULL_IMAGE );
+ *ppsRet = psImg;
+ nRet = 0;
+ } else {
+ nRet = -1;
+ }
+
+ g_free( pnData );
+
+ return nRet;
+}
+
+static int dev_init( struct fp_img_dev *dev, unsigned long driver_data ) {
+ int nResult;
+
+ nResult = libusb_claim_interface( dev -> udev, 0 );
+ if ( nResult < 0 ) {
+ fp_err( "could not claim interface 0" );
+ return nResult;
+ }
+
+ nResult = SetupSensor( dev );
+
+ return nResult;
+}
+
+static void dev_exit( struct fp_img_dev *dev ) {
+ libusb_release_interface( dev -> udev, 0 );
+}
+
+static const struct usb_id id_table[] = {
+ { .vendor = 0x147e, .product = 0x3001 },
+ { 0, 0, 0, },
+};
+
+struct fp_img_driver upeket_driver = {
+ .driver = {
+ .id = 5,
+ .name = FP_COMPONENT,
+ .full_name = "UPEK EikonTouch 300",
+ .id_table = id_table,
+ scan_type = FP_SCAN_TYPE_PRESS,
+ },
+ .flags = FP_IMGDRV_SUPPORTS_UNCONDITIONAL_CAPTURE,
+ .img_height = 288,
+ .img_width = 208,
+
+ .bz3_threshold = 30,
+ .init = dev_init,
+ .exit = dev_exit,
+ .await_finger_on = awaitFingerOn,
+ .capture = capture,
+};
diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h
index e6134d4..080a048 100644
--- a/libfprint/fp_internal.h
+++ b/libfprint/fp_internal.h
@@ -244,6 +244,9 @@ extern struct fp_driver upeke2_driver;
 #ifdef ENABLE_UPEKTC
 extern struct fp_img_driver upektc_driver;
 #endif
+#ifdef ENABLE_UPEKET
+extern struct fp_img_driver upeket_driver;
+#endif
 #ifdef ENABLE_UPEKSONLY
 extern struct fp_img_driver upeksonly_driver;
 #endif


On Wed, Jan 25, 2012 at 12:08 AM, Patrick Marlier <patrick.marlier at gmail.com
> wrote:

> On 01/24/2012 10:55 AM, MOGANESHWARAN RAJASEGARAN wrote:
>
>> Hi,
>> I am having trouble creating the diff file for the newly written source
>> file for eikontouch 300. I named it upeket.c. The source code is based
>> on upektc.c. So how to create the diff file if there is no other source
>> file to diff it? Or should I use upektc.c to create the diff file. And
>> how about other source file such as core.c fp_internal.h configure.ac
>> <http://configure.ac> and makefile.in <http://makefile.in>. Should I
>>
>> create the diff for the latter two also?
>>
>
> First, do you use the git of libfprint? if not, I advice you to do it.
> When done, copy your files into your git directory, use 'git add
> libprint/drivers/upeket.c libfprint/core.c libfprint/fp_internal.h
> configure.ac Makefile.in', and then you can use 'git diff' to get your
> unified diff.
>
> Hope it helps you.
>
> Patrick.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/fprint/attachments/20120125/3486401b/attachment-0001.html>


More information about the fprint mailing list