upektc_img: Add sensor chip detection

Move setting up sensor type and image dimensions to
activation time.
This commit is contained in:
Toni
2022-10-11 17:49:00 +02:00
committed by Vasily Khoruzhick
parent fafe70f985
commit 522b481297

View File

@@ -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;
} }