|
|
|
|
@@ -166,7 +166,7 @@ static struct libusb_transfer *alloc_send_cmd_transfer(struct fp_dev *dev,
|
|
|
|
|
buf[urblen - 2] = crc >> 8;
|
|
|
|
|
buf[urblen - 1] = crc & 0xff;
|
|
|
|
|
|
|
|
|
|
libusb_fill_bulk_transfer(transfer, dev->udev, EP_OUT, buf, urblen,
|
|
|
|
|
libusb_fill_bulk_transfer(transfer, fpi_dev_get_usb_dev(dev), EP_OUT, buf, urblen,
|
|
|
|
|
callback, user_data, TIMEOUT);
|
|
|
|
|
return transfer;
|
|
|
|
|
}
|
|
|
|
|
@@ -178,7 +178,7 @@ static struct libusb_transfer *alloc_send_cmd28_transfer(struct fp_dev *dev,
|
|
|
|
|
uint16_t _innerlen = innerlen;
|
|
|
|
|
size_t len = innerlen + 6;
|
|
|
|
|
unsigned char *buf = g_malloc0(len);
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
uint8_t seq = upekdev->seq + CMD_SEQ_INCREMENT;
|
|
|
|
|
struct libusb_transfer *ret;
|
|
|
|
|
|
|
|
|
|
@@ -417,7 +417,7 @@ static void read_msg_cb(struct libusb_transfer *transfer)
|
|
|
|
|
fp_dbg("didn't fit in buffer, need to extend by %d bytes", needed);
|
|
|
|
|
data = g_realloc((gpointer) data, MSG_READ_BUF_SIZE + needed);
|
|
|
|
|
|
|
|
|
|
libusb_fill_bulk_transfer(etransfer, udata->dev->udev, EP_IN,
|
|
|
|
|
libusb_fill_bulk_transfer(etransfer, fpi_dev_get_usb_dev(udata->dev), EP_IN,
|
|
|
|
|
data + MSG_READ_BUF_SIZE, needed, read_msg_extend_cb, udata,
|
|
|
|
|
TIMEOUT);
|
|
|
|
|
|
|
|
|
|
@@ -456,7 +456,7 @@ static int __read_msg_async(struct read_msg_data *udata)
|
|
|
|
|
return -ENOMEM;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
libusb_fill_bulk_transfer(transfer, udata->dev->udev, EP_IN, buf,
|
|
|
|
|
libusb_fill_bulk_transfer(transfer, fpi_dev_get_usb_dev(udata->dev), EP_IN, buf,
|
|
|
|
|
MSG_READ_BUF_SIZE, read_msg_cb, udata, TIMEOUT);
|
|
|
|
|
r = libusb_submit_transfer(transfer);
|
|
|
|
|
if (r < 0) {
|
|
|
|
|
@@ -530,7 +530,7 @@ static void initsm_read_msg_response_cb(struct fpi_ssm *ssm,
|
|
|
|
|
unsigned char expect_subcmd, unsigned char subcmd)
|
|
|
|
|
{
|
|
|
|
|
struct fp_dev *dev = fpi_ssm_get_dev(ssm);
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
|
|
|
|
|
if (status != READ_MSG_RESPONSE) {
|
|
|
|
|
fp_err("expected response, got %d seq=%x in state %d", status, seq,
|
|
|
|
|
@@ -594,7 +594,7 @@ static void initsm_read_msg_cmd_cb(struct fpi_ssm *ssm,
|
|
|
|
|
enum read_msg_status status, uint8_t expect_seq, uint8_t seq)
|
|
|
|
|
{
|
|
|
|
|
struct fp_dev *dev = fpi_ssm_get_dev(ssm);
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
|
|
|
|
|
if (status == READ_MSG_ERROR) {
|
|
|
|
|
fpi_ssm_mark_aborted(ssm, -1);
|
|
|
|
|
@@ -693,7 +693,7 @@ static void initsm_send_msg28_handler(struct fpi_ssm *ssm,
|
|
|
|
|
static void initsm_run_state(struct fpi_ssm *ssm)
|
|
|
|
|
{
|
|
|
|
|
struct fp_dev *dev = fpi_ssm_get_dev(ssm);
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
struct libusb_transfer *transfer;
|
|
|
|
|
int r;
|
|
|
|
|
|
|
|
|
|
@@ -710,7 +710,7 @@ static void initsm_run_state(struct fpi_ssm *ssm)
|
|
|
|
|
data = g_malloc(LIBUSB_CONTROL_SETUP_SIZE + 1);
|
|
|
|
|
libusb_fill_control_setup(data,
|
|
|
|
|
LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, 0x0c, 0x100, 0x0400, 1);
|
|
|
|
|
libusb_fill_control_transfer(transfer, dev->udev, data,
|
|
|
|
|
libusb_fill_control_transfer(transfer, fpi_dev_get_usb_dev(dev), data,
|
|
|
|
|
ctrl400_cb, ssm, TIMEOUT);
|
|
|
|
|
|
|
|
|
|
r = libusb_submit_transfer(transfer);
|
|
|
|
|
@@ -805,7 +805,7 @@ static void read_msg01_cb(struct fp_dev *dev, enum read_msg_status status,
|
|
|
|
|
void *user_data)
|
|
|
|
|
{
|
|
|
|
|
struct fpi_ssm *ssm = user_data;
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
|
|
|
|
|
if (status == READ_MSG_ERROR) {
|
|
|
|
|
fpi_ssm_mark_aborted(ssm, -1);
|
|
|
|
|
@@ -867,7 +867,7 @@ static int dev_init(struct fp_dev *dev, unsigned long driver_data)
|
|
|
|
|
struct upekts_dev *upekdev = NULL;
|
|
|
|
|
int r;
|
|
|
|
|
|
|
|
|
|
r = libusb_claim_interface(dev->udev, 0);
|
|
|
|
|
r = libusb_claim_interface(fpi_dev_get_usb_dev(dev), 0);
|
|
|
|
|
if (r < 0) {
|
|
|
|
|
fp_err("could not claim interface 0: %s", libusb_error_name(r));
|
|
|
|
|
return r;
|
|
|
|
|
@@ -875,8 +875,8 @@ static int dev_init(struct fp_dev *dev, unsigned long driver_data)
|
|
|
|
|
|
|
|
|
|
upekdev = g_malloc(sizeof(*upekdev));
|
|
|
|
|
upekdev->seq = 0xf0; /* incremented to 0x00 before first cmd */
|
|
|
|
|
dev->priv = upekdev;
|
|
|
|
|
dev->nr_enroll_stages = 3;
|
|
|
|
|
fpi_dev_set_user_data(dev, upekdev);
|
|
|
|
|
fpi_dev_set_nr_enroll_stages(dev, 3);
|
|
|
|
|
|
|
|
|
|
fpi_drvcb_open_complete(dev, 0);
|
|
|
|
|
return 0;
|
|
|
|
|
@@ -884,8 +884,10 @@ static int dev_init(struct fp_dev *dev, unsigned long driver_data)
|
|
|
|
|
|
|
|
|
|
static void dev_exit(struct fp_dev *dev)
|
|
|
|
|
{
|
|
|
|
|
libusb_release_interface(dev->udev, 0);
|
|
|
|
|
g_free(dev->priv);
|
|
|
|
|
void *user_data;
|
|
|
|
|
libusb_release_interface(fpi_dev_get_usb_dev(dev), 0);
|
|
|
|
|
user_data = fpi_dev_get_user_data(dev);
|
|
|
|
|
g_free(user_data);
|
|
|
|
|
fpi_drvcb_close_complete(dev);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -936,7 +938,7 @@ static void enroll_start_sm_cb_msg28(struct fp_dev *dev,
|
|
|
|
|
enum read_msg_status status, uint8_t seq, unsigned char subcmd,
|
|
|
|
|
unsigned char *data, size_t data_len, void *user_data)
|
|
|
|
|
{
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
struct fpi_ssm *ssm = user_data;
|
|
|
|
|
|
|
|
|
|
if (status != READ_MSG_RESPONSE) {
|
|
|
|
|
@@ -999,7 +1001,7 @@ static void enroll_iterate(struct fp_dev *dev);
|
|
|
|
|
static void e_handle_resp00(struct fp_dev *dev, unsigned char *data,
|
|
|
|
|
size_t data_len)
|
|
|
|
|
{
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
unsigned char status;
|
|
|
|
|
int result = 0;
|
|
|
|
|
|
|
|
|
|
@@ -1161,7 +1163,7 @@ static void enroll_started(struct fpi_ssm *ssm)
|
|
|
|
|
|
|
|
|
|
static int enroll_start(struct fp_dev *dev)
|
|
|
|
|
{
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
|
|
|
|
|
/* do_init state machine first */
|
|
|
|
|
struct fpi_ssm *ssm = fpi_ssm_new(dev, enroll_start_sm_run_state,
|
|
|
|
|
@@ -1249,7 +1251,7 @@ static void verify_start_sm_run_state(struct fpi_ssm *ssm)
|
|
|
|
|
fpi_ssm_start(initsm, verify_start_sm_cb_initsm);
|
|
|
|
|
break;
|
|
|
|
|
case VERIFY_INIT: ;
|
|
|
|
|
struct fp_print_data *print = dev->verify_data;
|
|
|
|
|
struct fp_print_data *print = fpi_dev_get_verify_data(dev);
|
|
|
|
|
struct fp_print_data_item *item = print->prints->data;
|
|
|
|
|
size_t data_len = sizeof(verify_hdr) + item->length;
|
|
|
|
|
unsigned char *data = g_malloc(data_len);
|
|
|
|
|
@@ -1355,7 +1357,7 @@ static void verify_rd2800_cb(struct fp_dev *dev, enum read_msg_status msgstat,
|
|
|
|
|
uint8_t seq, unsigned char subcmd, unsigned char *data, size_t data_len,
|
|
|
|
|
void *user_data)
|
|
|
|
|
{
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
|
|
|
|
|
if (msgstat != READ_MSG_RESPONSE) {
|
|
|
|
|
fp_err("expected response, got %d seq=%x", msgstat, seq);
|
|
|
|
|
@@ -1394,7 +1396,7 @@ static void verify_wr2800_cb(struct libusb_transfer *transfer)
|
|
|
|
|
|
|
|
|
|
static void verify_iterate(struct fp_dev *dev)
|
|
|
|
|
{
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
|
|
|
|
|
if (upekdev->stop_verify) {
|
|
|
|
|
do_verify_stop(dev);
|
|
|
|
|
@@ -1430,7 +1432,7 @@ static void verify_iterate(struct fp_dev *dev)
|
|
|
|
|
static void verify_started(struct fpi_ssm *ssm)
|
|
|
|
|
{
|
|
|
|
|
struct fp_dev *dev = fpi_ssm_get_dev(ssm);
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
|
|
|
|
|
fpi_drvcb_verify_started(dev, fpi_ssm_get_error(ssm));
|
|
|
|
|
if (!fpi_ssm_get_error(ssm)) {
|
|
|
|
|
@@ -1443,7 +1445,7 @@ static void verify_started(struct fpi_ssm *ssm)
|
|
|
|
|
|
|
|
|
|
static int verify_start(struct fp_dev *dev)
|
|
|
|
|
{
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
struct fpi_ssm *ssm = fpi_ssm_new(dev, verify_start_sm_run_state,
|
|
|
|
|
VERIFY_NUM_STATES);
|
|
|
|
|
upekdev->stop_verify = FALSE;
|
|
|
|
|
@@ -1453,7 +1455,7 @@ static int verify_start(struct fp_dev *dev)
|
|
|
|
|
|
|
|
|
|
static int verify_stop(struct fp_dev *dev, gboolean iterating)
|
|
|
|
|
{
|
|
|
|
|
struct upekts_dev *upekdev = dev->priv;
|
|
|
|
|
struct upekts_dev *upekdev = fpi_dev_get_user_data(dev);
|
|
|
|
|
|
|
|
|
|
if (!iterating)
|
|
|
|
|
do_verify_stop(dev);
|
|
|
|
|
|