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

Reply via email to