Merge tag 'upstream/0.5.1' into debian

This commit is contained in:
Didier Raboud
2013-09-29 13:31:20 +02:00
15 changed files with 68 additions and 55 deletions
+1
View File
@@ -8,3 +8,4 @@ Copyright (C) 2007-2008,2012 Vasily Khoruzhick <anarsoul@gmail.com>
Copyright (C) 2007 Jan-Michael Brummer <buzz2@gmx.de> Copyright (C) 2007 Jan-Michael Brummer <buzz2@gmx.de>
Copyright (C) 2007 Anthony Bretaudeau <wxcover@users.sourceforge.net> Copyright (C) 2007 Anthony Bretaudeau <wxcover@users.sourceforge.net>
Copyright (C) 2010 Hugo Grostabussiat <dw23.devel@gmail.com> Copyright (C) 2010 Hugo Grostabussiat <dw23.devel@gmail.com>
Copyright (C) 2012 Timo Teräs <timo.teras@iki.fi>
+11
View File
@@ -1,6 +1,17 @@
This file lists notable changes in each release. For the full history of all This file lists notable changes in each release. For the full history of all
changes, see ChangeLog. changes, see ChangeLog.
2013-08-11: v0.5.1 release
* Drivers
- Add support for 147e:2020 to upeke2 driver
- Fix possible race condition, and cancellation in uru4000 driver
* Udev rules:
- Add Microsoft keyboard to the suspend blacklist
* Plenty of build fixes
2012-12-03: v0.5.0 release 2012-12-03: v0.5.0 release
* Drivers: * Drivers:
+8 -4
View File
@@ -1,8 +1,8 @@
AC_INIT([libfprint], [0.5.0]) AC_INIT([libfprint], [0.5.1])
AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz check-news]) AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz check-news])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_SRCDIR([libfprint/core.c]) AC_CONFIG_SRCDIR([libfprint/core.c])
AM_CONFIG_HEADER([config.h]) AC_CONFIG_HEADERS([config.h])
# Enable silent build when available (Automake 1.11) # Enable silent build when available (Automake 1.11)
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
@@ -156,7 +156,7 @@ PKG_CHECK_MODULES(CRYPTO, nss)
AC_SUBST(CRYPTO_CFLAGS) AC_SUBST(CRYPTO_CFLAGS)
AC_SUBST(CRYPTO_LIBS) AC_SUBST(CRYPTO_LIBS)
PKG_CHECK_MODULES(GLIB, "glib-2.0") PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.28])
AC_SUBST(GLIB_CFLAGS) AC_SUBST(GLIB_CFLAGS)
AC_SUBST(GLIB_LIBS) AC_SUBST(GLIB_LIBS)
@@ -173,6 +173,10 @@ AC_ARG_ENABLE(udev-rules,
[ENABLE_UDEV_RULES=yes]) dnl Default value [ENABLE_UDEV_RULES=yes]) dnl Default value
AM_CONDITIONAL(ENABLE_UDEV_RULES, test x$ENABLE_UDEV_RULES = "xyes") AM_CONDITIONAL(ENABLE_UDEV_RULES, test x$ENABLE_UDEV_RULES = "xyes")
if test $ENABLE_UDEV_RULES = no && test -d .git/ ; then
AC_MSG_ERROR(--disable-udev-rules can only be used when building from tarballs)
fi
AC_ARG_WITH(udev-rules-dir, AC_ARG_WITH(udev-rules-dir,
AS_HELP_STRING([--with-udev-rules-dir=DIR],[Installation path for udev rules @<:@auto@:>@]), AS_HELP_STRING([--with-udev-rules-dir=DIR],[Installation path for udev rules @<:@auto@:>@]),
[ac_with_udev_rules_dir=$withval], [ac_with_udev_rules_dir=$withval],
@@ -260,7 +264,7 @@ fi
# Restore gnu89 inline semantics on gcc 4.3 and newer # Restore gnu89 inline semantics on gcc 4.3 and newer
saved_cflags="$CFLAGS" saved_cflags="$CFLAGS"
CFLAGS="$CFLAGS -fgnu89-inline" CFLAGS="$CFLAGS -fgnu89-inline"
AC_COMPILE_IFELSE(AC_LANG_PROGRAM([]), inline_cflags="-fgnu89-inline", inline_cflags="") AC_COMPILE_IFELSE([AC_LANG_SOURCE([[]])], inline_cflags="-fgnu89-inline", inline_cflags="")
CFLAGS="$saved_cflags" CFLAGS="$saved_cflags"
AC_DEFINE([API_EXPORTED], [__attribute__((visibility("default")))], [Default visibility]) AC_DEFINE([API_EXPORTED], [__attribute__((visibility("default")))], [Default visibility])
+1 -1
View File
@@ -1,4 +1,4 @@
INCLUDES = -I$(top_srcdir) AM_CFLAGS = -I$(top_srcdir)
noinst_PROGRAMS = verify_live enroll verify img_capture cpp-test noinst_PROGRAMS = verify_live enroll verify img_capture cpp-test
verify_live_SOURCES = verify_live.c verify_live_SOURCES = verify_live.c
+1 -1
View File
@@ -88,7 +88,7 @@ libfprint_la_LIBADD = -lm $(LIBUSB_LIBS) $(GLIB_LIBS) $(CRYPTO_LIBS)
fprint_list_udev_rules_SOURCES = fprint-list-udev-rules.c fprint_list_udev_rules_SOURCES = fprint-list-udev-rules.c
fprint_list_udev_rules_CFLAGS = -fvisibility=hidden -I$(srcdir)/nbis/include $(LIBUSB_CFLAGS) $(GLIB_CFLAGS) $(IMAGEMAGICK_CFLAGS) $(CRYPTO_CFLAGS) $(AM_CFLAGS) fprint_list_udev_rules_CFLAGS = -fvisibility=hidden -I$(srcdir)/nbis/include $(LIBUSB_CFLAGS) $(GLIB_CFLAGS) $(IMAGEMAGICK_CFLAGS) $(CRYPTO_CFLAGS) $(AM_CFLAGS)
fprint_list_udev_rules_LDADD = $(builddir)/libfprint.la fprint_list_udev_rules_LDADD = $(builddir)/libfprint.la $(GLIB_LIBS)
udev_rules_DATA = 60-fprint-autosuspend.rules udev_rules_DATA = 60-fprint-autosuspend.rules
+1 -2
View File
@@ -97,9 +97,8 @@ static const char *finger_num_to_str(enum fp_finger finger)
static struct fp_print_data *print_data_new(uint16_t driver_id, static struct fp_print_data *print_data_new(uint16_t driver_id,
uint32_t devtype, enum fp_print_data_type type, size_t length) uint32_t devtype, enum fp_print_data_type type, size_t length)
{ {
struct fp_print_data *data = g_malloc(sizeof(*data) + length); struct fp_print_data *data = g_malloc0(sizeof(*data) + length);
fp_dbg("length=%zd driver=%02x devtype=%04x", length, driver_id, devtype); fp_dbg("length=%zd driver=%02x devtype=%04x", length, driver_id, devtype);
memset(data, 0, sizeof(*data));
data->driver_id = driver_id; data->driver_id = driver_id;
data->devtype = devtype; data->devtype = devtype;
data->type = type; data->type = type;
-9
View File
@@ -48,16 +48,7 @@ static int dev_init(struct fp_img_dev *dev, unsigned long driver_data)
} }
dev->priv = aesdev = g_malloc0(sizeof(struct aesX660_dev)); dev->priv = aesdev = g_malloc0(sizeof(struct aesX660_dev));
if (!aesdev)
return -ENOMEM;
aesdev->buffer = g_malloc0(AES1660_FRAME_SIZE + AESX660_HEADER_SIZE); aesdev->buffer = g_malloc0(AES1660_FRAME_SIZE + AESX660_HEADER_SIZE);
if (!aesdev->buffer) {
g_free(aesdev);
dev->priv = NULL;
return -ENOMEM;
}
aesdev->h_scale_factor = SCALE_FACTOR; aesdev->h_scale_factor = SCALE_FACTOR;
aesdev->init_seqs[0] = aes1660_init_1; aesdev->init_seqs[0] = aes1660_init_1;
aesdev->init_seqs_len[0] = array_n_elements(aes1660_init_1); aesdev->init_seqs_len[0] = array_n_elements(aes1660_init_1);
-4
View File
@@ -215,10 +215,6 @@ static int process_strip_data(struct fpi_ssm *ssm, unsigned char *data)
fp_dbg("Bogus frame len: %.4x\n", len); fp_dbg("Bogus frame len: %.4x\n", len);
} }
stripdata = g_malloc(FRAME_WIDTH * FRAME_HEIGHT / 2); /* 4 bits per pixel */ stripdata = g_malloc(FRAME_WIDTH * FRAME_HEIGHT / 2); /* 4 bits per pixel */
if (!stripdata) {
fpi_ssm_mark_aborted(ssm, -ENOMEM);
return -ENOMEM;
}
memcpy(stripdata, data + 33, FRAME_WIDTH * FRAME_HEIGHT / 2); memcpy(stripdata, data + 33, FRAME_WIDTH * FRAME_HEIGHT / 2);
aesdev->strips = g_slist_prepend(aesdev->strips, stripdata); aesdev->strips = g_slist_prepend(aesdev->strips, stripdata);
aesdev->strips_len++; aesdev->strips_len++;
-9
View File
@@ -47,16 +47,7 @@ static int dev_init(struct fp_img_dev *dev, unsigned long driver_data)
} }
dev->priv = aesdev = g_malloc0(sizeof(struct aesX660_dev)); dev->priv = aesdev = g_malloc0(sizeof(struct aesX660_dev));
if (!aesdev)
return -ENOMEM;
aesdev->buffer = g_malloc0(AES2660_FRAME_SIZE + AESX660_HEADER_SIZE); aesdev->buffer = g_malloc0(AES2660_FRAME_SIZE + AESX660_HEADER_SIZE);
if (!aesdev->buffer) {
g_free(aesdev);
dev->priv = NULL;
return -ENOMEM;
}
/* No scaling for AES2660 */ /* No scaling for AES2660 */
aesdev->h_scale_factor = 1; aesdev->h_scale_factor = 1;
aesdev->init_seqs[0] = aes2660_init_1; aesdev->init_seqs[0] = aes2660_init_1;
-4
View File
@@ -278,10 +278,6 @@ static int process_stripe_data(struct fpi_ssm *ssm, unsigned char *data)
struct aesX660_dev *aesdev = dev->priv; struct aesX660_dev *aesdev = dev->priv;
stripdata = g_malloc(aesdev->frame_width * FRAME_HEIGHT / 2); /* 4 bits per pixel */ stripdata = g_malloc(aesdev->frame_width * FRAME_HEIGHT / 2); /* 4 bits per pixel */
if (!stripdata) {
fpi_ssm_mark_aborted(ssm, -ENOMEM);
return 1;
}
fp_dbg("Processing frame %.2x %.2x", data[AESX660_IMAGE_OK_OFFSET], fp_dbg("Processing frame %.2x %.2x", data[AESX660_IMAGE_OK_OFFSET],
data[AESX660_LAST_FRAME_OFFSET]); data[AESX660_LAST_FRAME_OFFSET]);
+11 -3
View File
@@ -46,6 +46,11 @@
#define MSG_READ_BUF_SIZE 0x40 #define MSG_READ_BUF_SIZE 0x40
#define MAX_DATA_IN_READ_BUF (MSG_READ_BUF_SIZE - 9) #define MAX_DATA_IN_READ_BUF (MSG_READ_BUF_SIZE - 9)
enum {
UPEKE2_2016,
UPEKE2_2020,
};
struct upeke2_dev { struct upeke2_dev {
gboolean enroll_passed; gboolean enroll_passed;
gboolean first_verify_iteration; gboolean first_verify_iteration;
@@ -848,8 +853,10 @@ static struct fpi_ssm *deinitsm_new(struct fp_dev *dev)
static int discover(struct libusb_device_descriptor *dsc, uint32_t *devtype) static int discover(struct libusb_device_descriptor *dsc, uint32_t *devtype)
{ {
/* Revision 2 is what we're interested in */ if (dsc->idProduct == 0x2016 && dsc->bcdDevice == 2)
if (dsc->bcdDevice == 2) return 1;
if (dsc->idProduct == 0x2020 && dsc->bcdDevice == 1)
return 1; return 1;
return 0; return 0;
@@ -1453,7 +1460,8 @@ static int verify_stop(struct fp_dev *dev, gboolean iterating)
} }
static const struct usb_id id_table[] = { static const struct usb_id id_table[] = {
{ .vendor = 0x147e, .product = 0x2016 }, { .vendor = 0x147e, .product = 0x2016, .driver_data = UPEKE2_2016 },
{ .vendor = 0x147e, .product = 0x2020, .driver_data = UPEKE2_2020 },
{ 0, 0, 0, }, /* terminating entry */ { 0, 0, 0, }, /* terminating entry */
}; };
+26 -14
View File
@@ -789,15 +789,18 @@ static void imaging_complete(struct fpi_ssm *ssm)
int r = ssm->error; int r = ssm->error;
fpi_ssm_free(ssm); fpi_ssm_free(ssm);
/* Report error before exiting imaging loop - the error handler
* can request state change, which needs to be postponed to end of
* this function. */
if (r)
fpi_imgdev_session_error(dev, r);
g_free(urudev->img_data); g_free(urudev->img_data);
urudev->img_data = NULL; urudev->img_data = NULL;
libusb_free_transfer(urudev->img_transfer); libusb_free_transfer(urudev->img_transfer);
urudev->img_transfer = NULL; urudev->img_transfer = NULL;
if (r)
fpi_imgdev_session_error(dev, r);
r = execute_state_change(dev); r = execute_state_change(dev);
if (r) if (r)
fpi_imgdev_session_error(dev, r); fpi_imgdev_session_error(dev, r);
@@ -994,16 +997,19 @@ static void init_scanpwr_irq_cb(struct fp_img_dev *dev, int status,
uint16_t type, void *user_data) uint16_t type, void *user_data)
{ {
struct fpi_ssm *ssm = user_data; struct fpi_ssm *ssm = user_data;
struct uru4k_dev *urudev = dev->priv;
if (status) if (status)
fpi_ssm_mark_aborted(ssm, status); fpi_ssm_mark_aborted(ssm, status);
else if (type != IRQDATA_SCANPWR_ON) else if (type != IRQDATA_SCANPWR_ON)
fp_dbg("ignoring interrupt"); fp_dbg("ignoring interrupt");
else if (ssm->cur_state != INIT_AWAIT_SCAN_POWER) else if (ssm->cur_state != INIT_AWAIT_SCAN_POWER) {
fp_err("ignoring scanpwr interrupt due to being in wrong state %d", fp_dbg("early scanpwr interrupt");
ssm->cur_state); urudev->scanpwr_irq_timeouts = -1;
else } else {
fp_dbg("late scanpwr interrupt");
fpi_ssm_next_state(ssm); fpi_ssm_next_state(ssm);
}
} }
static void init_scanpwr_timeout(void *user_data) static void init_scanpwr_timeout(void *user_data)
@@ -1053,14 +1059,21 @@ static void init_run_state(struct fpi_ssm *ssm)
fpi_ssm_next_state(ssm); fpi_ssm_next_state(ssm);
break; break;
case INIT_POWERUP: ; case INIT_POWERUP: ;
if (!IRQ_HANDLER_IS_RUNNING(urudev)) {
fpi_ssm_mark_aborted(ssm, -EIO);
break;
}
urudev->irq_cb_data = ssm;
urudev->irq_cb = init_scanpwr_irq_cb;
struct fpi_ssm *powerupsm = fpi_ssm_new(dev->dev, powerup_run_state, struct fpi_ssm *powerupsm = fpi_ssm_new(dev->dev, powerup_run_state,
POWERUP_NUM_STATES); POWERUP_NUM_STATES);
powerupsm->priv = dev; powerupsm->priv = dev;
fpi_ssm_start_subsm(ssm, powerupsm); fpi_ssm_start_subsm(ssm, powerupsm);
break; break;
case INIT_AWAIT_SCAN_POWER: case INIT_AWAIT_SCAN_POWER:
if (!IRQ_HANDLER_IS_RUNNING(urudev)) { if (urudev->scanpwr_irq_timeouts < 0) {
fpi_ssm_mark_aborted(ssm, -EIO); fpi_ssm_next_state(ssm);
break; break;
} }
@@ -1073,13 +1086,12 @@ static void init_run_state(struct fpi_ssm *ssm)
fpi_ssm_mark_aborted(ssm, -ETIME); fpi_ssm_mark_aborted(ssm, -ETIME);
break; break;
} }
urudev->irq_cb_data = ssm;
urudev->irq_cb = init_scanpwr_irq_cb;
break; break;
case INIT_DONE: case INIT_DONE:
fpi_timeout_cancel(urudev->scanpwr_irq_timeout); if (urudev->scanpwr_irq_timeout) {
urudev->scanpwr_irq_timeout = NULL; fpi_timeout_cancel(urudev->scanpwr_irq_timeout);
urudev->scanpwr_irq_timeout = NULL;
}
urudev->irq_cb_data = NULL; urudev->irq_cb_data = NULL;
urudev->irq_cb = NULL; urudev->irq_cb = NULL;
fpi_ssm_next_state(ssm); fpi_ssm_next_state(ssm);
+3 -1
View File
@@ -30,6 +30,8 @@ static const struct usb_id whitelist_id_table[] = {
static const struct usb_id blacklist_id_table[] = { static const struct usb_id blacklist_id_table[] = {
{ .vendor = 0x0483, .product = 0x2016 }, { .vendor = 0x0483, .product = 0x2016 },
/* https://bugs.freedesktop.org/show_bug.cgi?id=66659 */
{ .vendor = 0x045e, .product = 0x00bb },
{ 0, 0, 0 }, { 0, 0, 0 },
}; };
@@ -52,7 +54,7 @@ static void print_driver (struct fp_driver *driver)
blacklist = 0; blacklist = 0;
for (j = 0; blacklist_id_table[j].vendor != 0; j++) { for (j = 0; blacklist_id_table[j].vendor != 0; j++) {
if (driver->id_table[i].vendor == blacklist_id_table[j].vendor && if (driver->id_table[i].vendor == blacklist_id_table[j].vendor &&
driver->id_table[j].product == blacklist_id_table[j].product) { driver->id_table[i].product == blacklist_id_table[j].product) {
blacklist = 1; blacklist = 1;
break; break;
} }
+1 -2
View File
@@ -47,8 +47,7 @@
struct fp_img *fpi_img_new(size_t length) struct fp_img *fpi_img_new(size_t length)
{ {
struct fp_img *img = g_malloc(sizeof(*img) + length); struct fp_img *img = g_malloc0(sizeof(*img) + length);
memset(img, 0, sizeof(*img));
fp_dbg("length=%zd", length); fp_dbg("length=%zd", length);
img->length = length; img->length = length;
return img; return img;
+4 -1
View File
@@ -145,7 +145,10 @@ void fpi_imgdev_report_finger_status(struct fp_img_dev *imgdev,
case IMG_ACTION_ENROLL: case IMG_ACTION_ENROLL:
fp_dbg("reporting enroll result"); fp_dbg("reporting enroll result");
fpi_drvcb_enroll_stage_completed(imgdev->dev, r, data, img); fpi_drvcb_enroll_stage_completed(imgdev->dev, r, data, img);
if (r > 0 && r != FP_ENROLL_COMPLETE && r != FP_ENROLL_FAIL) { /* the callback can cancel enrollment, so recheck current
* action and the status to see if retry is needed */
if (imgdev->action == IMG_ACTION_ENROLL &&
r > 0 && r != FP_ENROLL_COMPLETE && r != FP_ENROLL_FAIL) {
imgdev->action_result = 0; imgdev->action_result = 0;
imgdev->action_state = IMG_ACQUIRE_STATE_AWAIT_FINGER_ON; imgdev->action_state = IMG_ACQUIRE_STATE_AWAIT_FINGER_ON;
dev_change_state(imgdev, IMG_ACQUIRE_STATE_AWAIT_FINGER_ON); dev_change_state(imgdev, IMG_ACQUIRE_STATE_AWAIT_FINGER_ON);