mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2025-11-15 07:38:12 +00:00
upektc_img: Add sensor chip detection
Move setting up sensor type and image dimensions to activation time.
This commit is contained in:
@@ -31,10 +31,6 @@ static void start_deactivation (FpImageDevice *dev);
|
|||||||
#define CTRL_TIMEOUT 4000
|
#define CTRL_TIMEOUT 4000
|
||||||
#define BULK_TIMEOUT 4000
|
#define BULK_TIMEOUT 4000
|
||||||
|
|
||||||
#define IMAGE_WIDTH 144
|
|
||||||
#define IMAGE_HEIGHT 384
|
|
||||||
#define IMAGE_SIZE (IMAGE_WIDTH * IMAGE_HEIGHT)
|
|
||||||
|
|
||||||
#define MAX_CMD_SIZE 64
|
#define MAX_CMD_SIZE 64
|
||||||
#define MAX_RESPONSE_SIZE 2052
|
#define MAX_RESPONSE_SIZE 2052
|
||||||
#define SHORT_RESPONSE_SIZE 64
|
#define SHORT_RESPONSE_SIZE 64
|
||||||
@@ -47,8 +43,10 @@ struct _FpiDeviceUpektcImg
|
|||||||
unsigned char response[MAX_RESPONSE_SIZE];
|
unsigned char response[MAX_RESPONSE_SIZE];
|
||||||
unsigned char *image_bits;
|
unsigned char *image_bits;
|
||||||
unsigned char seq;
|
unsigned char seq;
|
||||||
|
size_t expected_image_size;
|
||||||
size_t image_size;
|
size_t image_size;
|
||||||
size_t response_rest;
|
size_t response_rest;
|
||||||
|
gboolean area_sensor;
|
||||||
gboolean deactivating;
|
gboolean deactivating;
|
||||||
};
|
};
|
||||||
G_DECLARE_FINAL_TYPE (FpiDeviceUpektcImg, fpi_device_upektc_img, FPI,
|
G_DECLARE_FINAL_TYPE (FpiDeviceUpektcImg, fpi_device_upektc_img, FPI,
|
||||||
@@ -180,6 +178,7 @@ capture_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
gpointer user_data, GError *error)
|
gpointer user_data, GError *error)
|
||||||
{
|
{
|
||||||
FpImageDevice *dev = FP_IMAGE_DEVICE (device);
|
FpImageDevice *dev = FP_IMAGE_DEVICE (device);
|
||||||
|
FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_GET_CLASS (dev);
|
||||||
FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev);
|
FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev);
|
||||||
unsigned char *data = self->response;
|
unsigned char *data = self->response;
|
||||||
FpImage *img;
|
FpImage *img;
|
||||||
@@ -307,13 +306,13 @@ capture_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
self->image_size +=
|
self->image_size +=
|
||||||
upektc_img_process_image_frame (self->image_bits + self->image_size,
|
upektc_img_process_image_frame (self->image_bits + self->image_size,
|
||||||
data);
|
data);
|
||||||
BUG_ON (self->image_size != IMAGE_SIZE);
|
BUG_ON (self->image_size != self->expected_image_size);
|
||||||
fp_dbg ("Image size is %lu",
|
fp_dbg ("Image size is %lu",
|
||||||
(gulong) self->image_size);
|
(gulong) self->image_size);
|
||||||
img = fp_image_new (IMAGE_WIDTH, IMAGE_HEIGHT);
|
img = fp_image_new (img_class->img_width, img_class->img_height);
|
||||||
img->flags |= FPI_IMAGE_PARTIAL;
|
img->flags |= FPI_IMAGE_PARTIAL;
|
||||||
memcpy (img->data, self->image_bits,
|
memcpy (img->data, self->image_bits,
|
||||||
IMAGE_SIZE);
|
self->image_size);
|
||||||
fpi_image_device_image_captured (dev, img);
|
fpi_image_device_image_captured (dev, img);
|
||||||
fpi_image_device_report_finger_status (dev,
|
fpi_image_device_report_finger_status (dev,
|
||||||
FALSE);
|
FALSE);
|
||||||
@@ -513,15 +512,77 @@ init_reqs_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
|||||||
fpi_ssm_mark_failed (transfer->ssm, error);
|
fpi_ssm_mark_failed (transfer->ssm, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: process response properly */
|
|
||||||
static void
|
static void
|
||||||
init_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
init_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device,
|
||||||
gpointer user_data, GError *error)
|
gpointer user_data, GError *error)
|
||||||
{
|
{
|
||||||
|
FpImageDevice *dev = FP_IMAGE_DEVICE (device);
|
||||||
|
FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev);
|
||||||
|
unsigned char *data = self->response;
|
||||||
|
|
||||||
if (!error)
|
if (!error)
|
||||||
fpi_ssm_next_state (transfer->ssm);
|
fpi_ssm_next_state (transfer->ssm);
|
||||||
else
|
else
|
||||||
fpi_ssm_mark_failed (transfer->ssm, error);
|
fpi_ssm_mark_failed (transfer->ssm, error);
|
||||||
|
|
||||||
|
if (data[12] == 0x06 && data[13] == 0x14) /* if get_info */
|
||||||
|
{
|
||||||
|
FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_GET_CLASS (dev);
|
||||||
|
uint16_t width = 0;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (data[46] == 0x26 && data[47] == 0x00 && data[48] == 0x00 && data[49] == 0x66) /* Sensor type 66000026 = TCS1s */
|
||||||
|
fp_dbg ("Sensor type : TCS1s");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
width = (data[51] << 8) | data[50];
|
||||||
|
|
||||||
|
switch (width)
|
||||||
|
{
|
||||||
|
case 256:
|
||||||
|
fp_dbg ("Sensor type : TCS1x"); /* 360x256 --- 270x192 must be set*/
|
||||||
|
img_class->img_width = 192;
|
||||||
|
img_class->img_height = 270;
|
||||||
|
self->area_sensor = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 208:
|
||||||
|
fp_dbg ("Sensor type : TCS2"); /* 288x208 --- 216x156 must be set*/
|
||||||
|
img_class->img_width = 156;
|
||||||
|
img_class->img_height = 216;
|
||||||
|
self->area_sensor = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 248:
|
||||||
|
fp_dbg ("Sensor type : TCS3"); /* 360x248 --- 270x186 must be set*/
|
||||||
|
img_class->img_width = 186;
|
||||||
|
img_class->img_height = 270;
|
||||||
|
self->area_sensor = FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 192:
|
||||||
|
fp_dbg ("Sensor type : TCS4x"); /* 512x192 --- 384x144 must be set*/
|
||||||
|
img_class->img_width = 144;
|
||||||
|
img_class->img_height = 384;
|
||||||
|
self->area_sensor = FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 144:
|
||||||
|
fp_dbg ("Sensor type : TCS5x"); /* 512x144 --- 384x108 must be set*/
|
||||||
|
img_class->img_width = 108;
|
||||||
|
img_class->img_height = 384;
|
||||||
|
self->area_sensor = FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fp_dbg ("Sensor type : Unknown");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
BUG_ON (img_class->img_width == -1 || img_class->img_height == -1);
|
||||||
|
self->expected_image_size = img_class->img_width * img_class->img_height;
|
||||||
|
self->image_bits = g_malloc0 (self->expected_image_size * 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -616,7 +677,6 @@ dev_deactivate (FpImageDevice *dev)
|
|||||||
static void
|
static void
|
||||||
dev_init (FpImageDevice *dev)
|
dev_init (FpImageDevice *dev)
|
||||||
{
|
{
|
||||||
FpiDeviceUpektcImg *self = FPI_DEVICE_UPEKTC_IMG (dev);
|
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
/* TODO check that device has endpoints we're using */
|
/* TODO check that device has endpoints we're using */
|
||||||
@@ -627,7 +687,6 @@ dev_init (FpImageDevice *dev)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self->image_bits = g_malloc0 (IMAGE_SIZE * 2);
|
|
||||||
fpi_image_device_open_complete (dev, NULL);
|
fpi_image_device_open_complete (dev, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -687,6 +746,6 @@ fpi_device_upektc_img_class_init (FpiDeviceUpektcImgClass *klass)
|
|||||||
|
|
||||||
img_class->bz3_threshold = 20;
|
img_class->bz3_threshold = 20;
|
||||||
|
|
||||||
img_class->img_width = IMAGE_WIDTH;
|
img_class->img_width = -1;
|
||||||
img_class->img_height = IMAGE_HEIGHT;
|
img_class->img_height = -1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user