2 * UPEK TouchStrip driver for libfprint
3 * Copyright (C) 2007 Daniel Drake <dsd@gentoo.org>
5 * Based in part on libthinkfinger:
6 * Copyright (C) 2006-2007 Timo Hoenig <thoenig@suse.de>
7 * Copyright (C) 2006 Pavel Machek <pavel@suse.cz>
9 * LGPL CRC code copied from GStreamer-0.10.10:
10 * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
11 * Copyright (C) 2004,2006 Thomas Vander Stichele <thomas at apestaart dot org>
13 * This library is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; version
18 * This library is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Lesser General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with this library; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 #define FP_COMPONENT "upekts"
36 #include <fp_internal.h>
38 #define EP_IN (1 | USB_ENDPOINT_IN)
39 #define EP_OUT (2 | USB_ENDPOINT_OUT)
46 static const uint16_t crc_table
[256] = {
47 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
48 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
49 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
50 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
51 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
52 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
53 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
54 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
55 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
56 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
57 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
58 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
59 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
60 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
61 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
62 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
63 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
64 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
65 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
66 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
67 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
68 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
69 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
70 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
71 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
72 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
73 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
74 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
75 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
76 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
77 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
78 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
81 static uint16_t udf_crc(unsigned char *buffer
, size_t size
)
85 crc
= (uint16_t) ((crc
<< 8) ^
86 crc_table
[((crc
>> 8) & 0x00ff) ^ *buffer
++]);
93 * Messages to and from the device have the same format.
96 * 'C' 'i' 'a' 'o' A B L <DATA> C1 C2
98 * Ciao prefixes all messages. The rightmost 4 bits of B become the uppermost
99 * 4 bits of L, and when combined with the lower 8 bits listed as 'L', L is
100 * the length of the data, <DATA> is L bytes long. C1 and C2 are the
101 * UDF-CRC16 for the whole message minus the Ciao prefix.
103 * When the device wants to command the driver to do something, it sends
104 * a message where B=0 and A!=0. The A value indicates the type of command.
105 * If the system is expected to respond to the command, it sends a message back
106 * with B=0 and A incremented.
108 * When the driver sends a command to the device, A=0 and B is used as a
109 * sequence counter. It starts at 0, increments by 0x10 on each command, and
111 * After each command is sent, the device responds with another message
112 * indicating completion of the command including any data that was requested.
113 * This message has the same A and B values.
115 * When the driver is sending commands as above, and when the device is
116 * responding, the <DATA> seems to follow this structure:
118 * 28 L1 L2 0 0 S <INNERDATA>
120 * Where the length of <INNERDATA> is L-3, and S is some kind of subcommand
121 * code. L1 is the least significant bits of L, L2 is the most significant. In
122 * the device's response to a command, the subcommand code will be unchanged.
124 * After deducing and documenting the above, I found a few places where the
125 * above doesn't hold true. Those are marked with FIXME's below.
128 #define CMD_SEQ_INCREMENT 0x10
130 static int send_cmd(struct fp_dev
*dev
, unsigned char seq_a
,
131 unsigned char seq_b
, unsigned char *data
, uint16_t len
)
136 /* 9 bytes extra for: 4 byte 'Ciao', 1 byte A, 1 byte B | lenHI,
137 * 1 byte lenLO, 2 byte CRC */
138 size_t urblen
= len
+ 9;
141 if (!data
&& len
> 0) {
142 fp_err("len>0 but no data?");
146 buf
= g_malloc(urblen
);
149 strncpy(buf
, "Ciao", 4);
150 len
= GUINT16_TO_LE(len
);
152 buf
[5] = seq_b
| ((len
& 0xf00) >> 8);
153 buf
[6] = len
& 0x00ff;
157 memcpy(buf
+ 7, data
, len
);
160 crc
= GUINT16_TO_BE(udf_crc(buf
+ 4, urblen
- 6));
161 buf
[urblen
- 2] = crc
>> 8;
162 buf
[urblen
- 1] = crc
& 0xff;
164 r
= usb_bulk_write(dev
->udev
, EP_OUT
, buf
, urblen
, TIMEOUT
);
167 fp_err("cmd write failed, code %d", r
);
169 } else if ((unsigned int) r
< urblen
) {
170 fp_err("cmd write too short (%d/%d)", r
, urblen
);
177 static int send_cmd28(struct fp_dev
*dev
, unsigned char subcmd
,
178 unsigned char *data
, uint16_t innerlen
)
180 uint16_t _innerlen
= innerlen
;
181 size_t len
= innerlen
+ 6;
182 unsigned char *buf
= g_malloc0(len
);
183 struct upekts_dev
*upekdev
= dev
->priv
;
184 uint8_t seq
= upekdev
->seq
+ CMD_SEQ_INCREMENT
;
187 fp_dbg("seq=%02x subcmd=%02x with %d bytes of data", seq
, subcmd
, innerlen
);
189 _innerlen
= GUINT16_TO_LE(innerlen
+ 3);
191 buf
[1] = _innerlen
& 0x00ff;
192 buf
[2] = (_innerlen
& 0xff00) >> 8;
194 memcpy(buf
+ 6, data
, innerlen
);
196 r
= send_cmd(dev
, 0, seq
, buf
, len
);
204 static int send_cmdresponse(struct fp_dev
*dev
, unsigned char seq
,
205 unsigned char *data
, uint8_t len
)
207 fp_dbg("seq=%02x len=%d", seq
, len
);
208 return send_cmd(dev
, seq
, 0, data
, len
);
211 static unsigned char *__read_msg(struct fp_dev
*dev
, size_t *data_len
)
213 #define MSG_READ_BUF_SIZE 0x40
214 #define MAX_DATA_IN_READ_BUF (MSG_READ_BUF_SIZE - 9)
215 unsigned char *buf
= g_malloc(MSG_READ_BUF_SIZE
);
216 size_t buf_size
= MSG_READ_BUF_SIZE
;
217 uint16_t computed_crc
, msg_crc
;
221 r
= usb_bulk_read(dev
->udev
, EP_IN
, buf
, buf_size
, TIMEOUT
);
223 fp_err("msg read failed, code %d", r
);
226 fp_err("msg read too short (%d/%d)", r
, buf_size
);
230 if (strncmp(buf
, "Ciao", 4) != 0) {
231 fp_err("no Ciao for you!!");
235 len
= GUINT16_FROM_LE(((buf
[5] & 0xf) << 8) | buf
[6]);
237 if (r
!= MSG_READ_BUF_SIZE
&& (len
+ 9) < r
) {
238 /* Check that the length claimed inside the message is in line with
239 * the amount of data that was transferred over USB. */
240 fp_err("msg didn't include enough data, expected=%d recv=%d",
245 /* We use a 64 byte buffer for reading messages. However, sometimes
246 * messages are longer, in which case we have to do another USB bulk read
247 * to read the remainder. This is handled below. */
248 if (len
> MAX_DATA_IN_READ_BUF
) {
249 int needed
= len
- MAX_DATA_IN_READ_BUF
;
250 fp_dbg("didn't fit in buffer, need to extend by %d bytes", needed
);
251 buf
= g_realloc((gpointer
) buf
, MSG_READ_BUF_SIZE
+ needed
);
252 r
= usb_bulk_read(dev
->udev
, EP_IN
, buf
+ MSG_READ_BUF_SIZE
, needed
,
255 fp_err("extended msg read failed, code %d", r
);
257 } else if (r
< needed
) {
258 fp_err("extended msg short read (%d/%d)", r
, needed
);
264 computed_crc
= udf_crc(buf
+ 4, len
+ 3);
265 msg_crc
= GUINT16_FROM_LE((buf
[len
+ 8] << 8) | buf
[len
+ 7]);
266 if (computed_crc
!= msg_crc
) {
267 fp_err("CRC failed, got %04x expected %04x", msg_crc
, computed_crc
);
271 *data_len
= buf_size
;
278 enum read_msg_status
{
281 READ_MSG_RESPONSE
= 2,
284 static enum read_msg_status
read_msg(struct fp_dev
*dev
, uint8_t *seq
,
285 unsigned char *subcmd
, unsigned char **data
, size_t *data_len
)
287 #define MSG_READ_BUF_SIZE 0x40
288 #define MAX_DATA_IN_READ_BUF (MSG_READ_BUF_SIZE - 9)
291 unsigned char code_a
;
292 unsigned char code_b
;
294 enum read_msg_status ret
= READ_MSG_ERROR
;
297 buf
= __read_msg(dev
, &buf_size
);
299 return READ_MSG_ERROR
;
302 code_b
= buf
[5] & 0xf0;
303 len
= GUINT16_FROM_LE(((buf
[5] & 0xf) << 8) | buf
[6]);
304 fp_dbg("A=%02x B=%02x len=%d", code_a
, code_b
, len
);
306 if (code_a
&& !code_b
) {
307 /* device sends command to driver */
308 fp_dbg("cmd %x from device to driver", code_a
);
310 if (code_a
== 0x08) {
311 fp_dbg("device busy, send busy-ack");
312 send_cmdresponse(dev
, 0x09, NULL
, 0);
321 unsigned char *tmp
= g_malloc(len
);
322 memcpy(tmp
, buf
+ 7, len
);
328 } else if (!code_a
) {
329 /* device sends response to a previously executed command */
330 unsigned char *innerbuf
= buf
+ 7;
331 unsigned char _subcmd
;
335 fp_err("cmd response too short (%d)", len
);
338 if (innerbuf
[0] != 0x28) {
339 fp_err("cmd response without 28 byte?");
342 if (innerbuf
[3] || innerbuf
[4]) {
343 fp_err("non-zero bytes in cmd response");
347 innerlen
= innerbuf
[1] | (innerbuf
[2] << 8);
348 innerlen
= GUINT16_FROM_LE(innerlen
) - 3;
349 _subcmd
= innerbuf
[5];
350 fp_dbg("device responds to subcmd %x with %d bytes", _subcmd
, innerlen
);
357 unsigned char *tmp
= g_malloc(innerlen
);
358 memcpy(tmp
, innerbuf
+ 6, innerlen
);
361 *data_len
= innerlen
;
363 ret
= READ_MSG_RESPONSE
;
365 fp_err("don't know how to handle this message");
373 static int read_msg28(struct fp_dev
*dev
, unsigned char subcmd
,
374 unsigned char **data
, size_t *data_len
)
376 struct upekts_dev
*upekdev
= dev
->priv
;
378 unsigned char _subcmd
;
379 enum read_msg_status msgstat
;
381 msgstat
= read_msg(dev
, &_seq
, &_subcmd
, data
, data_len
);
382 if (msgstat
!= READ_MSG_RESPONSE
) {
383 fp_err("expected response, got %d seq=%x", msgstat
, _seq
);
386 if (_subcmd
!= subcmd
) {
387 fp_warn("expected response to subcmd %02x, got response to %02x",
391 if (_seq
!= upekdev
->seq
) {
392 fp_err("expected response to cmd seq=%02x, got response to %02x",
400 static const unsigned char init_resp03
[] = {
401 0x01, 0x00, 0xe8, 0x03, 0x00, 0x00, 0xff, 0x07
403 static const unsigned char init28_08
[] = {
404 0x04, 0x83, 0x00, 0x2c, 0x22, 0x23, 0x97, 0xc9, 0xa7, 0x15, 0xa0, 0x8a,
405 0xab, 0x3c, 0xd0, 0xbf, 0xdb, 0xf3, 0x92, 0x6f, 0xae, 0x3b, 0x1e, 0x44,
408 static const unsigned char init28_0c
[] = {
409 0x04, 0x03, 0x00, 0x00, 0x00
411 static const unsigned char init28_0b
[] = {
412 0x04, 0x03, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
413 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
414 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
415 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0x64, 0x01, 0x00,
416 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
417 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
418 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0a,
419 0x00, 0x64, 0x00, 0xf4, 0x01, 0x32, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00
423 static int do_init(struct fp_dev
*dev
)
425 enum read_msg_status msgstat
;
426 unsigned char dummy
= 0x10;
430 r
= usb_control_msg(dev
->udev
, USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
431 0x0c, 0x100, 0x400, &dummy
, sizeof(dummy
), TIMEOUT
);
433 fp_dbg("control write failed\n");
437 msgstat
= read_msg(dev
, &seq
, NULL
, NULL
, NULL
);
438 if (msgstat
!= READ_MSG_CMD
) {
439 fp_err("expected command, got %d seq=%x", msgstat
, seq
);
443 fp_err("expected seq=3, got %x", seq
);
447 r
= send_cmdresponse(dev
, ++seq
, (unsigned char *) init_resp03
,
448 sizeof(init_resp03
));
452 msgstat
= read_msg(dev
, &seq
, NULL
, NULL
, NULL
);
453 if (msgstat
!= READ_MSG_CMD
) {
454 fp_err("expected command, got %d seq=%x", msgstat
, seq
);
458 fp_err("expected seq=5, got %x", seq
);
463 r
= send_cmd28(dev
, 0x06, &dummy
, 1);
466 if (read_msg28(dev
, 0x06, NULL
, NULL
) < 0)
470 r
= send_cmd28(dev
, 0x07, &dummy
, 1);
473 if (read_msg28(dev
, 0x07, NULL
, NULL
) < 0)
476 r
= send_cmd28(dev
, 0x08, (unsigned char *) init28_08
,
480 if (read_msg28(dev
, 0x08, NULL
, NULL
) < 0)
483 r
= send_cmd28(dev
, 0x0c, (unsigned char *) init28_0c
,
487 if (read_msg28(dev
, 0x0c, NULL
, NULL
) < 0)
490 r
= send_cmd28(dev
, 0x0b, (unsigned char *) init28_0b
,
494 if (read_msg28(dev
, 0x0b, NULL
, NULL
) < 0)
500 static int do_deinit(struct fp_dev
*dev
)
502 unsigned char dummy
= 0;
503 enum read_msg_status msgstat
;
507 /* FIXME: either i've misunderstood the message system or this is illegal
508 * here, since we arent responding to anything. */
509 r
= send_cmdresponse(dev
, 0x07, &dummy
, 1);
513 msgstat
= read_msg(dev
, &seq
, NULL
, NULL
, NULL
);
514 if (msgstat
!= READ_MSG_CMD
) {
515 fp_err("expected command, got %d seq=%x", msgstat
, seq
);
519 fp_err("expected seq=1, got %x", seq
);
526 static int dev_init(struct fp_dev
*dev
, unsigned long driver_data
)
528 struct upekts_dev
*upekdev
= NULL
;
531 r
= usb_claim_interface(dev
->udev
, 0);
535 upekdev
= g_malloc(sizeof(*upekdev
));
536 upekdev
->seq
= 0xf0; /* incremented to 0x00 before first cmd */
538 dev
->nr_enroll_stages
= 3;
543 static void dev_exit(struct fp_dev
*dev
)
545 usb_release_interface(dev
->udev
, 0);
549 static const unsigned char enroll_init
[] = {
550 0x02, 0xc0, 0xd4, 0x01, 0x00, 0x04, 0x00, 0x08
552 static const unsigned char scan_comp
[] = {
553 0x12, 0xff, 0xff, 0xff, 0xff /* scan completion, prefixes print data */
556 /* used for enrollment and verification */
557 static const unsigned char poll_data
[] = { 0x30, 0x01 };
559 static int enroll(struct fp_dev
*dev
, gboolean initial
,
560 int stage
, struct fp_print_data
**_data
, struct fp_img
**img
)
573 r
= send_cmd28(dev
, 0x02, (unsigned char *) enroll_init
,
574 sizeof(enroll_init
));
577 /* FIXME: protocol misunderstanding here. device receives response
578 * to subcmd 0 after submitting subcmd 2? */
579 /* actually this is probably a poll response? does the above cmd
580 * include a 30 01 poll somewhere? */
581 if (read_msg28(dev
, 0x00, NULL
, NULL
) < 0)
586 unsigned char status
;
588 r
= send_cmd28(dev
, 0x00, (unsigned char *) poll_data
,
592 if (read_msg28(dev
, 0x00, &data
, &data_len
) < 0)
595 if (data_len
!= 14) {
596 fp_err("received 3001 poll response of %d bytes?", data_len
);
602 fp_dbg("poll result = %02x", status
);
604 /* These codes indicate that we're waiting for a finger scan, so poll
610 /* no news, poll again */
612 result
= FP_ENROLL_PASS
;
614 case 0x1c: /* FIXME what does this one mean? */
615 case 0x0b: /* FIXME what does this one mean? */
616 case 0x23: /* FIXME what does this one mean? */
617 result
= FP_ENROLL_RETRY
;
619 case 0x0f: /* scan taking too long, remove finger and try again */
620 result
= FP_ENROLL_RETRY_REMOVE_FINGER
;
622 case 0x1e: /* swipe too short */
623 result
= FP_ENROLL_RETRY_TOO_SHORT
;
625 case 0x24: /* finger not centered */
626 result
= FP_ENROLL_RETRY_CENTER_FINGER
;
629 /* finger scanned successfully */
630 /* don't break out immediately, need to look at the next
631 * value to determine if enrollment is complete or not */
636 result
= FP_ENROLL_COMPLETE
;
639 fp_err("unrecognised scan status code %02x", status
);
646 /* FIXME: need to extend protocol research to handle the case when
647 * enrolment fails, e.g. you scan a different finger on each stage */
649 if (result
== FP_ENROLL_COMPLETE
) {
650 struct fp_print_data
*fdata
;
652 r
= send_cmd28(dev
, 0x00, (unsigned char *) poll_data
,
656 /* FIXME: protocol misunderstanding here. device receives response
657 * to subcmd 0 after submitting subcmd 2? */
658 if (read_msg28(dev
, 0x02, &data
, &data_len
) < 0)
661 if (data_len
< sizeof(scan_comp
)) {
662 fp_err("fingerprint data too short (%d bytes)", data_len
);
666 if (memcmp(data
, scan_comp
, sizeof(scan_comp
)) != 0) {
667 fp_err("unrecognised data prefix %x %x %x %x %x",
668 data
[0], data
[1], data
[2], data
[3], data
[4]);
673 fp_err("complete but no data storage!");
674 result
= FP_ENROLL_COMPLETE
;
678 fdata
= fpi_print_data_new(dev
, data_len
- sizeof(scan_comp
));
679 memcpy(fdata
->data
, data
+ sizeof(scan_comp
), data_len
- sizeof(scan_comp
));
689 static const unsigned char verify_hdr
[] = {
690 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
691 0x00, 0xc0, 0xd4, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
695 static int verify(struct fp_dev
*dev
, struct fp_print_data
*print
,
698 size_t data_len
= sizeof(verify_hdr
) + print
->length
;
701 unsigned char status
;
702 gboolean need_poll
= FALSE
;
703 gboolean done
= FALSE
;
709 data
= g_malloc(data_len
);
710 memcpy(data
, verify_hdr
, sizeof(verify_hdr
));
711 memcpy(data
+ sizeof(verify_hdr
), print
->data
, print
->length
);
713 r
= send_cmd28(dev
, 0x03, data
, data_len
);
720 r
= send_cmd28(dev
, 0x00, (unsigned char *) poll_data
,
727 if (read_msg28(dev
, 0x00, &data
, &data_len
) < 0)
730 if (data_len
!= 14) {
731 fp_err("received 3001 poll response of %d bytes?", data_len
);
737 fp_dbg("poll result = %02x", status
);
739 /* These codes indicate that we're waiting for a finger scan, so poll
742 case 0x0c: /* no news, poll again */
745 fp_dbg("processing scan for verification");
748 fp_dbg("good image");
751 case 0x1c: /* FIXME what does this one mean? */
752 case 0x0b: /* FIXME what does this one mean? */
753 case 0x23: /* FIXME what does this one mean? */
756 case 0x0f: /* scan taking too long, remove finger and try again */
757 r
= FP_VERIFY_RETRY_REMOVE_FINGER
;
759 case 0x1e: /* swipe too short */
760 r
= FP_VERIFY_RETRY_TOO_SHORT
;
762 case 0x24: /* finger not centered */
763 r
= FP_VERIFY_RETRY_CENTER_FINGER
;
766 fp_err("unrecognised verify status code %02x", status
);
773 if (status
== 0x00) {
774 /* poll again for verify result */
775 r
= send_cmd28(dev
, 0x00, (unsigned char *) poll_data
,
779 if (read_msg28(dev
, 0x03, &data
, &data_len
) < 0)
782 fp_err("verify result abnormally short!");
786 if (data
[0] != 0x12) {
787 fp_err("unexpected verify header byte %02x", data
[0]);
791 if (data
[1] == 0x00) {
792 r
= FP_VERIFY_NO_MATCH
;
793 } else if (data
[1] == 0x01) {
796 fp_err("unrecognised verify result %02x", data
[1]);
808 static const struct usb_id id_table
[] = {
809 { .vendor
= 0x0483, .product
= 0x2016 },
810 { 0, 0, 0, }, /* terminating entry */
813 struct fp_driver upekts_driver
= {
815 .name
= FP_COMPONENT
,
816 .full_name
= "UPEK TouchStrip",
817 .id_table
= id_table
,