I've attached a rough patch for the aes1610 driver. It has the correct
changes for libusb1 support, but capture support is not correct. It
looks like it would take a complete overhaul of the algorithms for it to
work.
I can successfully open and close fprint_demo and it lists my device,
but attempting to enroll just locks up the app.
The patch is against 0.1.0-pre1 found in Fedora 11. The aes1610 driver
from 0.6.0 was used as a template.
I've attempted to look at the other two aes drivers for pointers but
they are both written differently and I don't fully understand the API
or hardware yet. Any tips would be appreciated.
Thanks,
Michael
--- libfprint-0.0.6/libfprint/drivers/aes1610.c 2008-03-20 08:37:33.000000000 -0500
+++ libfprint-0.1.0-pre1/libfprint/drivers/aes1610.c 2009-06-13 00:15:41.420401265 -0500
@@ -27,14 +27,14 @@
#include <errno.h>
#include <string.h>
-#include <usb.h>
+#include <libusb.h>
#include <aeslib.h>
#include <fp_internal.h>
/* FIXME these need checking */
-#define EP_IN (1 | USB_ENDPOINT_IN)
-#define EP_OUT (2 | USB_ENDPOINT_OUT)
+#define EP_IN (1 | LIBUSB_ENDPOINT_IN)
+#define EP_OUT (2 | LIBUSB_ENDPOINT_OUT)
#define BULK_TIMEOUT 4000
@@ -60,17 +60,28 @@
/* FIXME reduce substantially */
#define MAX_FRAMES 350
+static int capture(struct fp_img_dev *dev);
+static void detect_finger(struct fp_img_dev *dev);
+
static int read_data(struct fp_img_dev *dev, unsigned char *data, size_t len)
{
- int r;
+ struct libusb_transfer *transfer;
+ int r, rlen;
fp_dbg("len=%zd", len);
- r = usb_bulk_read(dev->udev, EP_IN, data, len, BULK_TIMEOUT);
- if (r < 0) {
+ transfer = libusb_alloc_transfer(0);
+ if (!transfer) {
+ return -ENOMEM;
+ }
+
+ r = libusb_bulk_transfer(dev->udev, EP_IN, data, len, &rlen,
+ BULK_TIMEOUT);
+
+ if (r) {
fp_err("bulk read error %d", r);
return r;
- } else if (r < (int) len) {
- fp_err("unexpected short read %d/%zd", r, len);
+ } else if (rlen < (int) len) {
+ fp_err("unexpected short read %d/%zd", rlen, len);
return -EIO;
}
return 0;
@@ -84,30 +95,44 @@
{ 0xFF, 0x00 }
};
+static void stub_reqs_cb(struct fp_img_dev *dev, int result, void *user_data)
+{
+
+}
+
static int dev_init(struct fp_img_dev *dev, unsigned long driver_data)
{
int r;
- r = usb_claim_interface(dev->udev, 0);
+ r = libusb_claim_interface(dev->udev, 0);
if (r < 0) {
fp_err("could not claim interface 0");
return r;
}
- /* FIXME check endpoints */
+ if (r == 0)
+ fpi_imgdev_open_complete(dev, 0);
- return aes_write_regv(dev, init, G_N_ELEMENTS(init));
+ return r;
}
static int do_exit(struct fp_img_dev *dev)
{
- return aes_write_regv(dev, stop_reader, G_N_ELEMENTS(stop_reader));
+ aes_write_regv(dev, stop_reader, G_N_ELEMENTS(stop_reader),
+ stub_reqs_cb, NULL);
+ return 0;
}
static void dev_exit(struct fp_img_dev *dev)
{
do_exit(dev);
- usb_release_interface(dev->udev, 0);
+ libusb_release_interface(dev->udev, 0);
+ fpi_imgdev_close_complete(dev);
+}
+
+static void dev_deactivate(struct fp_img_dev *dev)
+{
+ fpi_imgdev_deactivate_complete(dev);
}
static const struct aes_regwrite finger_det_reqs[] = {
@@ -143,41 +168,40 @@
{ 0x1D, 0x00 }
};
-static int detect_finger(struct fp_img_dev *dev)
+static void finger_det_none_cb(struct fp_img_dev *dev, int result,
+ void *user_data)
+{
+ fpi_imgdev_report_finger_status(dev, FALSE);
+ detect_finger(dev);
+}
+
+static void detect_finger(struct fp_img_dev *dev)
{
unsigned char buffer[19];
int r;
int i;
int sum = 0;
- r = aes_write_regv(dev, finger_det_reqs, G_N_ELEMENTS(finger_det_reqs));
- if (r < 0)
- return r;
-
+ aes_write_regv(dev, finger_det_reqs, G_N_ELEMENTS(finger_det_reqs),
+ stub_reqs_cb, NULL);
+ fpi_imgdev_report_finger_status(dev, FALSE);
+
r = read_data(dev, buffer, 19);
if (r < 0)
- return r;
+ return;
for (i = 3; i < 17; i++)
sum += (buffer[i] & 0xf) + (buffer[i] >> 4);
/* We need to answer something if no finger has been detected */
if (sum <= 20) {
- r = aes_write_regv(dev, finger_det_none, G_N_ELEMENTS(finger_det_none));
- if (r < 0)
- return r;
+ aes_write_regv(dev, finger_det_none, G_N_ELEMENTS(finger_det_none),
+ finger_det_none_cb, NULL);
+ }
+ else {
+ fpi_imgdev_report_finger_status(dev, TRUE);
+ capture(dev);
}
-
- return sum > 20;
-}
-
-static int await_finger_on(struct fp_img_dev *dev)
-{
- int r;
- do {
- r = detect_finger(dev);
- } while (r == 0);
- return (r < 0) ? r : 0;
}
/* find overlapping parts of frames */
@@ -393,11 +417,26 @@
{ 0x81,0x00 }
};
-static int capture(struct fp_img_dev *dev, gboolean unconditional,
- struct fp_img **ret)
+static void activate_reqs_cb(struct fp_img_dev *dev, int result, void *user_data)
+{
+ fpi_imgdev_activate_complete(dev, result);
+ if (result == 0) {
+ detect_finger(dev);
+ }
+}
+
+static int dev_activate(struct fp_img_dev *dev, enum fp_imgdev_state state)
+{
+ /* FIXME check endpoints */
+ aes_write_regv(dev, init, G_N_ELEMENTS(init), activate_reqs_cb, NULL);
+
+ return 0;
+}
+
+static int capture(struct fp_img_dev *dev)
{
- int r;
struct fp_img *img;
+ int r;
unsigned int nstrips;
unsigned int errors_sum, r_errors_sum;
unsigned char *cooked;
@@ -411,9 +450,8 @@
/* FIXME can do better here in terms of buffer management? */
fp_dbg("");
- r = aes_write_regv(dev, capture_reqs, G_N_ELEMENTS(capture_reqs));
- if (r < 0)
- return r;
+ aes_write_regv(dev, capture_reqs, G_N_ELEMENTS(capture_reqs),
+ stub_reqs_cb, NULL);
/* FIXME: use histogram data above for gain calibration (0x8e xx) */
@@ -436,7 +474,8 @@
/* we start at 2 because we captured 2 frames above. the above captures
* should possibly be moved into the loop below, or discarded altogether */
for (nstrips = 2; nstrips < MAX_FRAMES - 2; nstrips++) {
- r = aes_write_regv(dev, strip_scan_reqs, G_N_ELEMENTS(strip_scan_reqs));
+ aes_write_regv(dev, strip_scan_reqs, G_N_ELEMENTS(strip_scan_reqs),
+ stub_reqs_cb, NULL);
if (r < 0)
goto err;
r = read_data(dev, buf, 665);
@@ -473,9 +512,8 @@
break;
}
- r = aes_write_regv(dev, capture_stop, G_N_ELEMENTS(capture_stop));
- if (r < 0)
- goto err;
+ aes_write_regv(dev, capture_stop, G_N_ELEMENTS(capture_stop),
+ stub_reqs_cb, NULL);
r = read_data(dev, buf, 665);
if (r < 0)
goto err;
@@ -508,7 +546,7 @@
final_size = img->height * FRAME_WIDTH;
memcpy(img->data, cooked, final_size);
img = fpi_img_resize(img, final_size);
- *ret = img;
+ fpi_imgdev_image_captured(dev, img);
return 0;
err:
fp_img_free(img);
@@ -537,9 +575,9 @@
* area) */
.bz3_threshold = 10,
- .init = dev_init,
- .exit = dev_exit,
- .await_finger_on = await_finger_on,
- .capture = capture,
+ .open = dev_init,
+ .close = dev_exit,
+ .deactivate = dev_deactivate,
+ .activate = dev_activate,
};
_______________________________________________
fprint mailing list
[email protected]
http://lists.reactivated.net/mailman/listinfo/fprint