2 * Digital Persona U.are.U 4000/4000B driver for libfprint
3 * Copyright (C) 2007-2008 Daniel Drake <dsd@gentoo.org>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 #define FP_COMPONENT "uru4000"
26 #include <openssl/aes.h>
29 #include <fp_internal.h>
31 #define EP_INTR (1 | LIBUSB_ENDPOINT_IN)
32 #define EP_DATA (2 | LIBUSB_ENDPOINT_IN)
34 #define CTRL_IN (LIBUSB_TYPE_VENDOR | LIBUSB_ENDPOINT_IN)
35 #define CTRL_OUT (LIBUSB_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT)
36 #define CTRL_TIMEOUT 5000
37 #define BULK_TIMEOUT 5000
38 #define DATABLK_RQLEN 0x1b340
39 #define DATABLK_EXPECT 0x1b1c0
40 #define CAPTURE_HDRLEN 64
45 IRQDATA_SCANPWR_ON
= 0x56aa,
46 IRQDATA_FINGER_ON
= 0x0101,
47 IRQDATA_FINGER_OFF
= 0x0200,
48 IRQDATA_DEATH
= 0x0800,
54 /* firmware starts at 0x100 */
55 REG_RESPONSE
= 0x2000,
56 REG_CHALLENGE
= 0x2010,
61 MODE_AWAIT_FINGER_ON
= 0x10,
62 MODE_AWAIT_FINGER_OFF
= 0x12,
77 static const struct uru4k_dev_profile
{
80 } uru4k_dev_info
[] = {
82 .name
= "Microsoft Keyboard with Fingerprint Reader",
86 .name
= "Microsoft Wireless IntelliMouse with Fingerprint Reader",
90 .name
= "Microsoft Fingerprint Reader",
93 [MS_STANDALONE_V2
] = {
94 .name
= "Microsoft Fingerprint Reader v2",
98 .name
= "Digital Persona U.are.U 4000",
102 .name
= "Digital Persona U.are.U 4000B",
107 /* As we don't know the encryption scheme, we have to disable encryption
108 * by powering the device down and modifying the firmware. The location of
109 * the encryption control byte changes based on device revision.
111 * We use a search approach to find it: we look at the 3 bytes of data starting
112 * from these addresses, looking for a pattern "ff X7 41" (where X is dontcare)
113 * When we find a pattern we know that the encryption byte ius the X7 byte.
115 static const uint16_t fwenc_offsets
[] = {
116 0x510, 0x62d, 0x792, 0x7f4,
119 typedef void (*irq_cb_fn
)(struct fp_img_dev
*dev
, int status
, uint16_t type
,
121 typedef void (*irqs_stopped_cb_fn
)(struct fp_img_dev
*dev
);
124 const struct uru4k_dev_profile
*profile
;
126 enum fp_imgdev_state activate_state
;
127 unsigned char last_reg_rd
;
128 unsigned char last_hwstat
;
130 struct libusb_transfer
*irq_transfer
;
131 struct libusb_transfer
*img_transfer
;
135 irqs_stopped_cb_fn irqs_stopped_cb
;
139 unsigned char powerup_hwstat
;
141 int scanpwr_irq_timeouts
;
142 struct fpi_timeout
*scanpwr_irq_timeout
;
145 unsigned char fwfixer_value
;
150 /* For 2nd generation MS devices */
151 static const unsigned char crkey
[] = {
152 0x79, 0xac, 0x91, 0x79, 0x5c, 0xa1, 0x47, 0x8e,
153 0x98, 0xe0, 0x0f, 0x3c, 0x59, 0x8f, 0x5f, 0x4b,
156 /***** REGISTER I/O *****/
158 typedef void (*write_regs_cb_fn
)(struct fp_img_dev
*dev
, int status
,
161 struct write_regs_data
{
162 struct fp_img_dev
*dev
;
163 write_regs_cb_fn callback
;
167 static void write_regs_cb(struct libusb_transfer
*transfer
)
169 struct write_regs_data
*wrdata
= transfer
->user_data
;
170 struct libusb_control_setup
*setup
=
171 libusb_control_transfer_get_setup(transfer
);
174 if (transfer
->status
!= LIBUSB_TRANSFER_COMPLETED
)
176 else if (transfer
->actual_length
!= setup
->wLength
)
179 g_free(transfer
->buffer
);
180 libusb_free_transfer(transfer
);
181 wrdata
->callback(wrdata
->dev
, r
, wrdata
->user_data
);
185 static int write_regs(struct fp_img_dev
*dev
, uint16_t first_reg
,
186 uint16_t num_regs
, unsigned char *values
, write_regs_cb_fn callback
,
189 struct write_regs_data
*wrdata
;
190 struct libusb_transfer
*transfer
= libusb_alloc_transfer();
197 wrdata
= g_malloc(sizeof(*wrdata
));
199 wrdata
->callback
= callback
;
200 wrdata
->user_data
= user_data
;
202 data
= g_malloc(LIBUSB_CONTROL_SETUP_SIZE
+ num_regs
);
203 memcpy(data
+ LIBUSB_CONTROL_SETUP_SIZE
, values
, num_regs
);
204 libusb_fill_control_setup(data
, CTRL_OUT
, USB_RQ
, first_reg
, 0, num_regs
);
205 libusb_fill_control_transfer(transfer
, dev
->udev
, data
, write_regs_cb
,
206 wrdata
, CTRL_TIMEOUT
);
208 r
= libusb_submit_transfer(transfer
);
212 libusb_free_transfer(transfer
);
217 static int write_reg(struct fp_img_dev
*dev
, uint16_t reg
,
218 unsigned char value
, write_regs_cb_fn callback
, void *user_data
)
220 return write_regs(dev
, reg
, 1, &value
, callback
, user_data
);
223 typedef void (*read_regs_cb_fn
)(struct fp_img_dev
*dev
, int status
,
224 unsigned char *data
, void *user_data
);
226 struct read_regs_data
{
227 struct fp_img_dev
*dev
;
228 read_regs_cb_fn callback
;
232 static void read_regs_cb(struct libusb_transfer
*transfer
)
234 struct read_regs_data
*rrdata
= transfer
->user_data
;
235 struct libusb_control_setup
*setup
=
236 libusb_control_transfer_get_setup(transfer
);
237 unsigned char *data
= NULL
;
240 if (transfer
->status
!= LIBUSB_TRANSFER_COMPLETED
)
242 else if (transfer
->actual_length
!= setup
->wLength
)
245 data
= libusb_control_transfer_get_data(transfer
);
247 rrdata
->callback(rrdata
->dev
, r
, data
, rrdata
->user_data
);
249 g_free(transfer
->buffer
);
250 libusb_free_transfer(transfer
);
253 static int read_regs(struct fp_img_dev
*dev
, uint16_t first_reg
,
254 uint16_t num_regs
, read_regs_cb_fn callback
, void *user_data
)
256 struct read_regs_data
*rrdata
;
257 struct libusb_transfer
*transfer
= libusb_alloc_transfer();
264 rrdata
= g_malloc(sizeof(*rrdata
));
266 rrdata
->callback
= callback
;
267 rrdata
->user_data
= user_data
;
269 data
= g_malloc(LIBUSB_CONTROL_SETUP_SIZE
+ num_regs
);
270 libusb_fill_control_setup(data
, CTRL_IN
, USB_RQ
, first_reg
, 0, num_regs
);
271 libusb_fill_control_transfer(transfer
, dev
->udev
, data
, read_regs_cb
,
272 rrdata
, CTRL_TIMEOUT
);
274 r
= libusb_submit_transfer(transfer
);
278 libusb_free_transfer(transfer
);
283 static int read_reg(struct fp_img_dev
*dev
, uint16_t reg
,
284 read_regs_cb_fn callback
, void *user_data
)
286 return read_regs(dev
, reg
, 1, callback
, user_data
);
292 * This register has caused me a lot of headaches. It pretty much defines
293 * code flow, and if you don't get it right, the pretty lights don't come on.
294 * I think the situation is somewhat complicated by the fact that writing it
295 * doesn't affect the read results in the way you'd expect -- but then again
296 * it does have some obvious effects. Here's what we know
298 * BIT 7: LOW POWER MODE
299 * When this bit is set, the device is partially turned off or something. Some
300 * things, like firmware upload, need to be done in this state. But generally
301 * we want to clear this bit during late initialization, which can sometimes
304 * BIT 2: SOMETHING WENT WRONG
305 * Not sure about this, but see the init function, as when we detect it,
306 * we reboot the device. Well, we mess with hwstat until this evil bit gets
310 * Just had a brainwave. This bit is set when the device is trying to deliver
311 * and interrupt to the host. Maybe?
314 static void response_cb(struct fp_img_dev
*dev
, int status
, void *user_data
)
316 struct fpi_ssm
*ssm
= user_data
;
318 fpi_ssm_next_state(ssm
);
320 fpi_ssm_mark_aborted(ssm
, status
);
323 static void challenge_cb(struct fp_img_dev
*dev
, int status
,
324 unsigned char *data
, void *user_data
)
326 struct fpi_ssm
*ssm
= user_data
;
327 struct uru4k_dev
*urudev
= dev
->priv
;
328 unsigned char *respdata
;
332 fpi_ssm_mark_aborted(ssm
, status
);
336 /* submit response */
337 /* produce response from challenge */
338 /* FIXME would this work in-place? */
339 respdata
= g_malloc(CR_LENGTH
);
340 AES_encrypt(data
, respdata
, &urudev
->aeskey
);
342 r
= write_regs(dev
, REG_RESPONSE
, CR_LENGTH
, respdata
, response_cb
, ssm
);
345 fpi_ssm_mark_aborted(ssm
, r
);
349 * 2nd generation MS devices added an AES-based challenge/response
350 * authentication scheme, where the device challenges the authenticity of the
353 static void sm_do_challenge_response(struct fpi_ssm
*ssm
)
355 struct fp_img_dev
*dev
= ssm
->priv
;
359 r
= read_regs(dev
, REG_CHALLENGE
, CR_LENGTH
, challenge_cb
, ssm
);
361 fpi_ssm_mark_aborted(ssm
, r
);
364 /***** INTERRUPT HANDLING *****/
366 #define IRQ_HANDLER_IS_RUNNING(urudev) ((urudev)->irq_transfer)
368 static int start_irq_handler(struct fp_img_dev
*dev
);
370 static void irq_handler(struct libusb_transfer
*transfer
)
372 struct fp_img_dev
*dev
= transfer
->user_data
;
373 struct uru4k_dev
*urudev
= dev
->priv
;
374 unsigned char *data
= transfer
->buffer
;
378 if (transfer
->status
== LIBUSB_TRANSFER_CANCELLED
) {
380 if (urudev
->irqs_stopped_cb
)
381 urudev
->irqs_stopped_cb(dev
);
382 urudev
->irqs_stopped_cb
= NULL
;
384 } else if (transfer
->status
!= LIBUSB_TRANSFER_COMPLETED
) {
387 } else if (transfer
->actual_length
!= transfer
->length
) {
388 fp_err("short interrupt read? %d", transfer
->actual_length
);
393 type
= GUINT16_FROM_BE(*((uint16_t *) data
));
394 fp_dbg("recv irq type %04x", type
);
396 libusb_free_transfer(transfer
);
398 /* The 0800 interrupt seems to indicate imminent failure (0 bytes transfer)
399 * of the next scan. It still appears on occasion. */
400 if (type
== IRQDATA_DEATH
)
401 fp_warn("oh no! got the interrupt OF DEATH! expect things to go bad");
404 urudev
->irq_cb(dev
, 0, type
, urudev
->irq_cb_data
);
406 fp_dbg("ignoring interrupt");
408 r
= start_irq_handler(dev
);
416 urudev
->irq_cb(dev
, r
, 0, urudev
->irq_cb_data
);
419 libusb_free_transfer(transfer
);
420 urudev
->irq_transfer
= NULL
;
423 static int start_irq_handler(struct fp_img_dev
*dev
)
425 struct uru4k_dev
*urudev
= dev
->priv
;
426 struct libusb_transfer
*transfer
= libusb_alloc_transfer();
433 data
= g_malloc(IRQ_LENGTH
);
434 libusb_fill_bulk_transfer(transfer
, dev
->udev
, EP_INTR
, data
, IRQ_LENGTH
,
435 irq_handler
, dev
, 0);
437 urudev
->irq_transfer
= transfer
;
438 r
= libusb_submit_transfer(transfer
);
441 libusb_free_transfer(transfer
);
442 urudev
->irq_transfer
= NULL
;
447 static void stop_irq_handler(struct fp_img_dev
*dev
, irqs_stopped_cb_fn cb
)
449 struct uru4k_dev
*urudev
= dev
->priv
;
450 struct libusb_transfer
*transfer
= urudev
->irq_transfer
;
452 libusb_cancel_transfer(transfer
);
453 urudev
->irqs_stopped_cb
= cb
;
457 /***** IMAGING LOOP *****/
459 static int start_imaging_loop(struct fp_img_dev
*dev
);
461 static void image_cb(struct libusb_transfer
*transfer
)
463 struct fp_img_dev
*dev
= transfer
->user_data
;
464 struct uru4k_dev
*urudev
= dev
->priv
;
465 int hdr_skip
= CAPTURE_HDRLEN
;
466 int image_size
= DATABLK_EXPECT
- CAPTURE_HDRLEN
;
470 if (transfer
->status
== LIBUSB_TRANSFER_CANCELLED
) {
472 urudev
->img_transfer
= NULL
;
473 g_free(transfer
->buffer
);
474 libusb_free_transfer(transfer
);
476 } else if (transfer
->status
!= LIBUSB_TRANSFER_COMPLETED
) {
481 if (transfer
->actual_length
== image_size
) {
482 /* no header! this is rather odd, but it happens sometimes with my MS
484 fp_dbg("got image with no header!");
486 } else if (transfer
->actual_length
!= DATABLK_EXPECT
) {
487 fp_err("unexpected image capture size (%d)", transfer
->actual_length
);
492 img
= fpi_img_new(image_size
);
493 memcpy(img
->data
, transfer
->buffer
+ hdr_skip
, image_size
);
494 img
->flags
= FP_IMG_V_FLIPPED
| FP_IMG_H_FLIPPED
| FP_IMG_COLORS_INVERTED
;
495 fpi_imgdev_image_captured(dev
, img
);
498 g_free(transfer
->buffer
);
499 libusb_free_transfer(transfer
);
501 r
= start_imaging_loop(dev
);
504 fpi_imgdev_session_error(dev
, r
);
507 static int start_imaging_loop(struct fp_img_dev
*dev
)
509 struct uru4k_dev
*urudev
= dev
->priv
;
510 struct libusb_transfer
*transfer
= libusb_alloc_transfer();
517 data
= g_malloc(DATABLK_RQLEN
);
518 libusb_fill_bulk_transfer(transfer
, dev
->udev
, EP_DATA
, data
,
519 DATABLK_RQLEN
, image_cb
, dev
, 0);
521 urudev
->img_transfer
= transfer
;
522 r
= libusb_submit_transfer(transfer
);
525 libusb_free_transfer(transfer
);
531 static void stop_imaging_loop(struct fp_img_dev
*dev
)
533 struct uru4k_dev
*urudev
= dev
->priv
;
534 struct libusb_transfer
*transfer
= urudev
->img_transfer
;
536 libusb_cancel_transfer(transfer
);
537 /* FIXME: should probably wait for cancellation to complete */
540 /***** STATE CHANGING *****/
542 static void finger_presence_irq_cb(struct fp_img_dev
*dev
, int status
,
543 uint16_t type
, void *user_data
)
546 fpi_imgdev_session_error(dev
, status
);
547 else if (type
== IRQDATA_FINGER_ON
)
548 fpi_imgdev_report_finger_status(dev
, TRUE
);
549 else if (type
== IRQDATA_FINGER_OFF
)
550 fpi_imgdev_report_finger_status(dev
, FALSE
);
552 fp_warn("ignoring unexpected interrupt %04x", type
);
555 static void change_state_write_reg_cb(struct fp_img_dev
*dev
, int status
,
559 fpi_imgdev_session_error(dev
, status
);
562 static int dev_change_state(struct fp_img_dev
*dev
, enum fp_imgdev_state state
)
564 struct uru4k_dev
*urudev
= dev
->priv
;
566 stop_imaging_loop(dev
);
569 case IMGDEV_STATE_AWAIT_FINGER_ON
:
570 if (!IRQ_HANDLER_IS_RUNNING(urudev
))
572 urudev
->irq_cb
= finger_presence_irq_cb
;
573 return write_reg(dev
, REG_MODE
, MODE_AWAIT_FINGER_ON
,
574 change_state_write_reg_cb
, NULL
);
576 case IMGDEV_STATE_CAPTURE
:
577 urudev
->irq_cb
= NULL
;
578 start_imaging_loop(dev
);
579 return write_reg(dev
, REG_MODE
, MODE_CAPTURE
, change_state_write_reg_cb
,
582 case IMGDEV_STATE_AWAIT_FINGER_OFF
:
583 if (!IRQ_HANDLER_IS_RUNNING(urudev
))
585 urudev
->irq_cb
= finger_presence_irq_cb
;
586 return write_reg(dev
, REG_MODE
, MODE_AWAIT_FINGER_OFF
,
587 change_state_write_reg_cb
, NULL
);
590 fp_err("unrecognised state %d", state
);
595 /***** GENERIC STATE MACHINE HELPER FUNCTIONS *****/
597 static void sm_write_reg_cb(struct fp_img_dev
*dev
, int result
, void *user_data
)
599 struct fpi_ssm
*ssm
= user_data
;
602 fpi_ssm_mark_aborted(ssm
, result
);
604 fpi_ssm_next_state(ssm
);
607 static void sm_write_reg(struct fpi_ssm
*ssm
, uint16_t reg
,
610 struct fp_img_dev
*dev
= ssm
->priv
;
611 int r
= write_reg(dev
, reg
, value
, sm_write_reg_cb
, ssm
);
613 fpi_ssm_mark_aborted(ssm
, r
);
616 static void sm_read_reg_cb(struct fp_img_dev
*dev
, int result
,
617 unsigned char *data
, void *user_data
)
619 struct fpi_ssm
*ssm
= user_data
;
620 struct uru4k_dev
*urudev
= dev
->priv
;
623 fpi_ssm_mark_aborted(ssm
, result
);
625 urudev
->last_reg_rd
= *data
;
626 fp_dbg("reg value %x", urudev
->last_reg_rd
);
627 fpi_ssm_next_state(ssm
);
631 static void sm_read_reg(struct fpi_ssm
*ssm
, uint16_t reg
)
633 struct fp_img_dev
*dev
= ssm
->priv
;
636 fp_dbg("read reg %x", reg
);
637 r
= read_reg(dev
, reg
, sm_read_reg_cb
, ssm
);
639 fpi_ssm_mark_aborted(ssm
, r
);
642 static void sm_set_mode(struct fpi_ssm
*ssm
, unsigned char mode
)
644 fp_dbg("mode %02x", mode
);
645 sm_write_reg(ssm
, REG_MODE
, mode
);
648 static void sm_set_hwstat(struct fpi_ssm
*ssm
, unsigned char value
)
650 fp_dbg("set %02x", value
);
651 sm_write_reg(ssm
, REG_HWSTAT
, value
);
654 /***** INITIALIZATION *****/
656 enum fwfixer_states
{
663 static void fwfixer_read_cb(struct fp_img_dev
*dev
, int status
,
664 unsigned char *data
, void *user_data
)
666 struct fpi_ssm
*ssm
= user_data
;
667 struct uru4k_dev
*urudev
= dev
->priv
;
670 fpi_ssm_mark_aborted(ssm
, status
);
672 fp_dbg("data: %02x %02x %02x", data
[0], data
[1], data
[2]);
673 if (data
[0] == 0xff && (data
[1] & 0x0f) == 0x07 && data
[2] == 0x41) {
674 fp_dbg("using offset %x", fwenc_offsets
[urudev
->fwfixer_offset
]);
675 urudev
->fwfixer_value
= data
[1];
676 fpi_ssm_jump_to_state(ssm
, FWFIXER_WRITE
);
678 fpi_ssm_jump_to_state(ssm
, FWFIXER_READ_NEXT
);
682 static void fwfixer_run_state(struct fpi_ssm
*ssm
)
684 struct fp_img_dev
*dev
= ssm
->priv
;
685 struct uru4k_dev
*urudev
= dev
->priv
;
688 switch (ssm
->cur_state
) {
690 urudev
->fwfixer_offset
= -1;
691 fpi_ssm_next_state(ssm
);
693 case FWFIXER_READ_NEXT
: ;
694 int offset
= ++urudev
->fwfixer_offset
;
697 if (offset
== G_N_ELEMENTS(fwenc_offsets
)) {
698 fp_err("could not find encryption byte");
699 fpi_ssm_mark_aborted(ssm
, -ENODEV
);
703 try_addr
= fwenc_offsets
[offset
];
704 fp_dbg("looking for encryption byte at %x", try_addr
);
706 r
= read_regs(dev
, try_addr
, 3, fwfixer_read_cb
, ssm
);
708 fpi_ssm_mark_aborted(ssm
, r
);
710 case FWFIXER_WRITE
: ;
711 uint16_t enc_addr
= fwenc_offsets
[urudev
->fwfixer_offset
] + 1;
712 unsigned char cur
= urudev
->fwfixer_value
;
713 unsigned char new = cur
& 0xef;
715 fp_dbg("encryption is already disabled");
716 fpi_ssm_next_state(ssm
);
718 fp_dbg("fixing encryption byte at %x to %02x", enc_addr
, new);
719 sm_write_reg(ssm
, enc_addr
, new);
725 /* After closing an app and setting hwstat to 0x80, my ms keyboard gets in a
726 * confused state and returns hwstat 0x85. On next app run, we don't get the
727 * 56aa interrupt. This is the best way I've found to fix it: mess around
728 * with hwstat until it starts returning more recognisable values. This
729 * doesn't happen on my other devices: uru4000, uru4000b, ms fp rdr v2
731 * The windows driver copes with this OK, but then again it uploads firmware
732 * right after reading the 0x85 hwstat, allowing some time to pass before it
733 * attempts to tweak hwstat again...
735 * This is implemented with a reboot power state machine. the ssm runs during
736 * initialization if bits 2 and 7 are set in hwstat. it masks off the 4 high
737 * hwstat bits then checks that bit 1 is set. if not, it pauses before reading
738 * hwstat again. machine completes when reading hwstat shows bit 1 is set,
739 * and fails after 100 tries. */
741 enum rebootpwr_states
{
742 REBOOTPWR_SET_HWSTAT
= 0,
743 REBOOTPWR_GET_HWSTAT
,
744 REBOOTPWR_CHECK_HWSTAT
,
746 REBOOTPWR_NUM_STATES
,
749 static void rebootpwr_pause_cb(void *data
)
751 struct fpi_ssm
*ssm
= data
;
752 struct fp_img_dev
*dev
= ssm
->priv
;
753 struct uru4k_dev
*urudev
= dev
->priv
;
755 if (!--urudev
->rebootpwr_ctr
) {
756 fp_err("could not reboot device power");
757 fpi_ssm_mark_aborted(ssm
, -EIO
);
759 fpi_ssm_jump_to_state(ssm
, REBOOTPWR_GET_HWSTAT
);
763 static void rebootpwr_run_state(struct fpi_ssm
*ssm
)
765 struct fp_img_dev
*dev
= ssm
->priv
;
766 struct uru4k_dev
*urudev
= dev
->priv
;
768 switch (ssm
->cur_state
) {
769 case REBOOTPWR_SET_HWSTAT
:
770 urudev
->rebootpwr_ctr
= 100;
771 sm_set_hwstat(ssm
, urudev
->last_hwstat
& 0xf);
773 case REBOOTPWR_GET_HWSTAT
:
774 sm_read_reg(ssm
, REG_HWSTAT
);
776 case REBOOTPWR_CHECK_HWSTAT
:
777 urudev
->last_hwstat
= urudev
->last_reg_rd
;
778 if (urudev
->last_hwstat
& 0x1)
779 fpi_ssm_mark_completed(ssm
);
781 fpi_ssm_next_state(ssm
);
783 case REBOOTPWR_PAUSE
:
784 if (fpi_timeout_add(10, rebootpwr_pause_cb
, ssm
) == NULL
)
785 fpi_ssm_mark_aborted(ssm
, -ETIME
);
790 /* After messing with the device firmware in it's low-power state, we have to
791 * power it back up and wait for interrupt notification. It's not quite as easy
792 * as that: the combination of both modifying firmware *and* doing C-R auth on
793 * my ms fp v2 device causes us not to get to get the 56aa interrupt and
794 * for the hwstat write not to take effect. We have to loop a few times,
795 * authenticating each time, until the device wakes up.
797 * This is implemented as the powerup state machine below. Pseudo-code:
799 status = get_hwstat();
800 for (i = 0; i < 100; i++) {
801 set_hwstat(status & 0xf);
802 if ((get_hwstat() & 0x80) == 0)
811 error("could not power up device");
815 enum powerup_states
{
819 POWERUP_CHECK_HWSTAT
,
821 POWERUP_CHALLENGE_RESPONSE
,
822 POWERUP_CHALLENGE_RESPONSE_SUCCESS
,
826 static void powerup_pause_cb(void *data
)
828 struct fpi_ssm
*ssm
= data
;
829 struct fp_img_dev
*dev
= ssm
->priv
;
830 struct uru4k_dev
*urudev
= dev
->priv
;
832 if (!--urudev
->powerup_ctr
) {
833 fp_err("could not power device up");
834 fpi_ssm_mark_aborted(ssm
, -EIO
);
835 } else if (!urudev
->profile
->auth_cr
) {
836 fpi_ssm_jump_to_state(ssm
, POWERUP_SET_HWSTAT
);
838 fpi_ssm_next_state(ssm
);
842 static void powerup_run_state(struct fpi_ssm
*ssm
)
844 struct fp_img_dev
*dev
= ssm
->priv
;
845 struct uru4k_dev
*urudev
= dev
->priv
;
847 switch (ssm
->cur_state
) {
849 urudev
->powerup_ctr
= 100;
850 urudev
->powerup_hwstat
= urudev
->last_hwstat
& 0xf;
851 fpi_ssm_next_state(ssm
);
853 case POWERUP_SET_HWSTAT
:
854 sm_set_hwstat(ssm
, urudev
->powerup_hwstat
);
856 case POWERUP_GET_HWSTAT
:
857 sm_read_reg(ssm
, REG_HWSTAT
);
859 case POWERUP_CHECK_HWSTAT
:
860 urudev
->last_hwstat
= urudev
->last_reg_rd
;
861 if ((urudev
->last_reg_rd
& 0x80) == 0)
862 fpi_ssm_mark_completed(ssm
);
864 fpi_ssm_next_state(ssm
);
867 if (fpi_timeout_add(10, powerup_pause_cb
, ssm
) == NULL
)
868 fpi_ssm_mark_aborted(ssm
, -ETIME
);
870 case POWERUP_CHALLENGE_RESPONSE
:
871 sm_do_challenge_response(ssm
);
873 case POWERUP_CHALLENGE_RESPONSE_SUCCESS
:
874 fpi_ssm_jump_to_state(ssm
, POWERUP_SET_HWSTAT
);
880 * This is the main initialization state machine. As pseudo-code:
882 status = get_hwstat();
884 // correct device power state
885 if ((status & 0x84) == 0x84)
889 if ((status & 0x80) == 0)
890 set_hwstat(status | 0x80);
892 // disable encryption
893 fwenc = read_firmware_encryption_byte();
896 write_firmware_encryption_byte(new);
900 await_irq(IRQDATA_SCANPWR_ON);
905 INIT_CHECK_HWSTAT_REBOOT
,
907 INIT_CHECK_HWSTAT_POWERDOWN
,
910 INIT_AWAIT_SCAN_POWER
,
915 static void init_scanpwr_irq_cb(struct fp_img_dev
*dev
, int status
,
916 uint16_t type
, void *user_data
)
918 struct fpi_ssm
*ssm
= user_data
;
921 fpi_ssm_mark_aborted(ssm
, status
);
922 else if (type
!= IRQDATA_SCANPWR_ON
)
923 fp_dbg("ignoring interrupt");
924 else if (ssm
->cur_state
!= INIT_AWAIT_SCAN_POWER
)
925 fp_err("ignoring scanpwr interrupt due to being in wrong state %d",
928 fpi_ssm_next_state(ssm
);
931 static void init_scanpwr_timeout(void *user_data
)
933 struct fpi_ssm
*ssm
= user_data
;
934 struct fp_img_dev
*dev
= ssm
->priv
;
935 struct uru4k_dev
*urudev
= dev
->priv
;
937 fp_warn("powerup timed out");
938 urudev
->irq_cb
= NULL
;
939 urudev
->scanpwr_irq_timeout
= NULL
;
941 if (++urudev
->scanpwr_irq_timeouts
>= 3) {
942 fp_err("powerup timed out 3 times, giving up");
943 fpi_ssm_mark_aborted(ssm
, -ETIMEDOUT
);
945 fpi_ssm_jump_to_state(ssm
, INIT_GET_HWSTAT
);
949 static void init_run_state(struct fpi_ssm
*ssm
)
951 struct fp_img_dev
*dev
= ssm
->priv
;
952 struct uru4k_dev
*urudev
= dev
->priv
;
954 switch (ssm
->cur_state
) {
955 case INIT_GET_HWSTAT
:
956 sm_read_reg(ssm
, REG_HWSTAT
);
958 case INIT_CHECK_HWSTAT_REBOOT
:
959 urudev
->last_hwstat
= urudev
->last_reg_rd
;
960 if ((urudev
->last_hwstat
& 0x84) == 0x84)
961 fpi_ssm_next_state(ssm
);
963 fpi_ssm_jump_to_state(ssm
, INIT_CHECK_HWSTAT_POWERDOWN
);
965 case INIT_REBOOT_POWER
: ;
966 struct fpi_ssm
*rebootsm
= fpi_ssm_new(dev
->dev
, rebootpwr_run_state
,
967 REBOOTPWR_NUM_STATES
);
968 rebootsm
->priv
= dev
;
969 fpi_ssm_start_subsm(ssm
, rebootsm
);
971 case INIT_CHECK_HWSTAT_POWERDOWN
:
972 if ((urudev
->last_hwstat
& 0x80) == 0)
973 sm_set_hwstat(ssm
, urudev
->last_hwstat
| 0x80);
975 fpi_ssm_next_state(ssm
);
977 case INIT_FIX_FIRMWARE
: ;
978 struct fpi_ssm
*fwsm
= fpi_ssm_new(dev
->dev
, fwfixer_run_state
,
981 fpi_ssm_start_subsm(ssm
, fwsm
);
984 struct fpi_ssm
*powerupsm
= fpi_ssm_new(dev
->dev
, powerup_run_state
,
986 powerupsm
->priv
= dev
;
987 fpi_ssm_start_subsm(ssm
, powerupsm
);
989 case INIT_AWAIT_SCAN_POWER
:
990 if (!IRQ_HANDLER_IS_RUNNING(urudev
)) {
991 fpi_ssm_mark_aborted(ssm
, -EIO
);
995 /* sometimes the 56aa interrupt that we are waiting for never arrives,
996 * so we include this timeout loop to retry the whole process 3 times
997 * if we don't get an irq any time soon. */
998 urudev
->scanpwr_irq_timeout
= fpi_timeout_add(300,
999 init_scanpwr_timeout
, ssm
);
1000 if (!urudev
->scanpwr_irq_timeout
) {
1001 fpi_ssm_mark_aborted(ssm
, -ETIME
);
1005 urudev
->irq_cb_data
= ssm
;
1006 urudev
->irq_cb
= init_scanpwr_irq_cb
;
1009 fpi_timeout_cancel(urudev
->scanpwr_irq_timeout
);
1010 urudev
->scanpwr_irq_timeout
= NULL
;
1011 urudev
->irq_cb_data
= NULL
;
1012 urudev
->irq_cb
= NULL
;
1013 fpi_ssm_mark_completed(ssm
);
1018 static void activate_initsm_complete(struct fpi_ssm
*ssm
)
1020 struct fp_img_dev
*dev
= ssm
->priv
;
1021 struct uru4k_dev
*urudev
= dev
->priv
;
1026 fpi_imgdev_activate_complete(dev
, r
);
1030 r
= dev_change_state(dev
, urudev
->activate_state
);
1031 fpi_imgdev_activate_complete(dev
, r
);
1034 /* FIXME: having state parameter here is kinda useless, will we ever
1035 * see a scenario where the parameter is useful so early on in the activation
1036 * process? asynchronity means that it'll only be used in a later function
1038 static int dev_activate(struct fp_img_dev
*dev
, enum fp_imgdev_state state
)
1040 struct uru4k_dev
*urudev
= dev
->priv
;
1041 struct fpi_ssm
*ssm
;
1044 r
= start_irq_handler(dev
);
1048 urudev
->scanpwr_irq_timeouts
= 0;
1049 urudev
->activate_state
= state
;
1050 ssm
= fpi_ssm_new(dev
->dev
, init_run_state
, INIT_NUM_STATES
);
1052 fpi_ssm_start(ssm
, activate_initsm_complete
);
1056 /***** DEINITIALIZATION *****/
1058 enum deinit_states
{
1059 DEINIT_SET_MODE_INIT
= 0,
1064 static void deinit_run_state(struct fpi_ssm
*ssm
)
1066 switch (ssm
->cur_state
) {
1067 case DEINIT_SET_MODE_INIT
:
1068 sm_set_mode(ssm
, MODE_INIT
);
1070 case DEINIT_POWERDOWN
:
1071 sm_set_hwstat(ssm
, 0x80);
1076 static void deactivate_irqs_stopped(struct fp_img_dev
*dev
)
1078 fpi_imgdev_deactivate_complete(dev
);
1081 static void deactivate_deinitsm_complete(struct fpi_ssm
*ssm
)
1083 struct fp_img_dev
*dev
= ssm
->priv
;
1085 stop_irq_handler(dev
, deactivate_irqs_stopped
);
1088 static void dev_deactivate(struct fp_img_dev
*dev
)
1090 struct uru4k_dev
*urudev
= dev
->priv
;
1091 struct fpi_ssm
*ssm
= fpi_ssm_new(dev
->dev
, deinit_run_state
,
1094 stop_imaging_loop(dev
);
1095 urudev
->irq_cb
= NULL
;
1096 urudev
->irq_cb_data
= NULL
;
1098 fpi_ssm_start(ssm
, deactivate_deinitsm_complete
);
1101 /***** LIBRARY STUFF *****/
1103 static int dev_init(struct fp_img_dev
*dev
, unsigned long driver_data
)
1105 struct libusb_config_descriptor
*config
;
1106 struct libusb_interface
*iface
= NULL
;
1107 struct libusb_interface_descriptor
*iface_desc
;
1108 struct libusb_endpoint_descriptor
*ep
;
1109 struct uru4k_dev
*urudev
;
1113 /* Find fingerprint interface */
1114 config
= libusb_get_config_descriptor(libusb_get_device(dev
->udev
));
1115 for (i
= 0; i
< config
->bNumInterfaces
; i
++) {
1116 struct libusb_interface
*cur_iface
= &config
->interface
[i
];
1118 if (cur_iface
->num_altsetting
< 1)
1121 iface_desc
= &cur_iface
->altsetting
[0];
1122 if (iface_desc
->bInterfaceClass
== 255
1123 && iface_desc
->bInterfaceSubClass
== 255
1124 && iface_desc
->bInterfaceProtocol
== 255) {
1130 if (iface
== NULL
) {
1131 fp_err("could not find interface");
1135 /* Find/check endpoints */
1137 if (iface_desc
->bNumEndpoints
!= 2) {
1138 fp_err("found %d endpoints!?", iface_desc
->bNumEndpoints
);
1142 ep
= &iface_desc
->endpoint
[0];
1143 if (ep
->bEndpointAddress
!= EP_INTR
1144 || (ep
->bmAttributes
& LIBUSB_ENDPOINT_TYPE_MASK
) !=
1145 LIBUSB_ENDPOINT_TYPE_INTERRUPT
) {
1146 fp_err("unrecognised interrupt endpoint");
1150 ep
= &iface_desc
->endpoint
[1];
1151 if (ep
->bEndpointAddress
!= EP_DATA
1152 || (ep
->bmAttributes
& LIBUSB_ENDPOINT_TYPE_MASK
) !=
1153 LIBUSB_ENDPOINT_TYPE_BULK
) {
1154 fp_err("unrecognised bulk endpoint");
1158 /* Device looks like a supported reader */
1160 r
= libusb_claim_interface(dev
->udev
, iface_desc
->bInterfaceNumber
);
1162 fp_err("interface claim failed");
1166 urudev
= g_malloc0(sizeof(*urudev
));
1167 urudev
->profile
= &uru4k_dev_info
[driver_data
];
1168 urudev
->interface
= iface_desc
->bInterfaceNumber
;
1169 AES_set_encrypt_key(crkey
, 128, &urudev
->aeskey
);
1171 fpi_imgdev_open_complete(dev
, 0);
1175 static void dev_deinit(struct fp_img_dev
*dev
)
1177 struct uru4k_dev
*urudev
= dev
->priv
;
1178 libusb_release_interface(dev
->udev
, urudev
->interface
);
1180 fpi_imgdev_close_complete(dev
);
1183 static const struct usb_id id_table
[] = {
1184 /* ms kbd with fp rdr */
1185 { .vendor
= 0x045e, .product
= 0x00bb, .driver_data
= MS_KBD
},
1187 /* ms intellimouse with fp rdr */
1188 { .vendor
= 0x045e, .product
= 0x00bc, .driver_data
= MS_INTELLIMOUSE
},
1190 /* ms fp rdr (standalone) */
1191 { .vendor
= 0x045e, .product
= 0x00bd, .driver_data
= MS_STANDALONE
},
1193 /* ms fp rdr (standalone) v2 */
1194 { .vendor
= 0x045e, .product
= 0x00ca, .driver_data
= MS_STANDALONE_V2
},
1196 /* dp uru4000 (standalone) */
1197 { .vendor
= 0x05ba, .product
= 0x0007, .driver_data
= DP_URU4000
},
1199 /* dp uru4000b (standalone) */
1200 { .vendor
= 0x05ba, .product
= 0x000a, .driver_data
= DP_URU4000B
},
1202 /* terminating entry */
1206 struct fp_img_driver uru4000_driver
= {
1209 .name
= FP_COMPONENT
,
1210 .full_name
= "Digital Persona U.are.U 4000/4000B",
1211 .id_table
= id_table
,
1213 .flags
= FP_IMGDRV_SUPPORTS_UNCONDITIONAL_CAPTURE
,
1218 .close
= dev_deinit
,
1219 .activate
= dev_activate
,
1220 .deactivate
= dev_deactivate
,
1221 .change_state
= dev_change_state
,