upeksonly: move regwrite sequences into a header
This commit is contained in:
parent
e40f7bd1f7
commit
aab3daa28b
3 changed files with 128 additions and 99 deletions
|
@ -5,7 +5,7 @@ MOSTLYCLEANFILES = $(udev_rules_DATA)
|
||||||
UPEKE2_SRC = drivers/upeke2.c
|
UPEKE2_SRC = drivers/upeke2.c
|
||||||
UPEKTS_SRC = drivers/upekts.c
|
UPEKTS_SRC = drivers/upekts.c
|
||||||
UPEKTC_SRC = drivers/upektc.c drivers/upektc.h
|
UPEKTC_SRC = drivers/upektc.c drivers/upektc.h
|
||||||
UPEKSONLY_SRC = drivers/upeksonly.c
|
UPEKSONLY_SRC = drivers/upeksonly.c drivers/upeksonly.h
|
||||||
URU4000_SRC = drivers/uru4000.c
|
URU4000_SRC = drivers/uru4000.c
|
||||||
AES1610_SRC = drivers/aes1610.c
|
AES1610_SRC = drivers/aes1610.c
|
||||||
AES1660_SRC = drivers/aes1660.c drivers/aes1660.h
|
AES1660_SRC = drivers/aes1660.c drivers/aes1660.h
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
|
|
||||||
#include <fp_internal.h>
|
#include <fp_internal.h>
|
||||||
|
|
||||||
|
#include "upeksonly.h"
|
||||||
#include "driver_ids.h"
|
#include "driver_ids.h"
|
||||||
|
|
||||||
#define CTRL_TIMEOUT 1000
|
#define CTRL_TIMEOUT 1000
|
||||||
|
@ -96,11 +97,6 @@ struct sonly_dev {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sonly_regwrite {
|
|
||||||
uint8_t reg;
|
|
||||||
uint8_t value;
|
|
||||||
};
|
|
||||||
|
|
||||||
/***** IMAGE PROCESSING *****/
|
/***** IMAGE PROCESSING *****/
|
||||||
|
|
||||||
static void free_img_transfers(struct sonly_dev *sdev)
|
static void free_img_transfers(struct sonly_dev *sdev)
|
||||||
|
@ -663,51 +659,6 @@ static void sm_await_intr(struct fpi_ssm *ssm)
|
||||||
|
|
||||||
/***** AWAIT FINGER *****/
|
/***** AWAIT FINGER *****/
|
||||||
|
|
||||||
static const struct sonly_regwrite awfsm_2016_writev_1[] = {
|
|
||||||
{ 0x0a, 0x00 }, { 0x0a, 0x00 }, { 0x09, 0x20 }, { 0x03, 0x3b },
|
|
||||||
{ 0x00, 0x67 }, { 0x00, 0x67 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct sonly_regwrite awfsm_1000_writev_1[] = {
|
|
||||||
/* Initialize sensor settings */
|
|
||||||
{ 0x0a, 0x00 }, { 0x09, 0x20 }, { 0x03, 0x37 }, { 0x00, 0x5f },
|
|
||||||
{ 0x01, 0x6e }, { 0x01, 0xee }, { 0x0c, 0x13 }, { 0x0d, 0x0d },
|
|
||||||
{ 0x0e, 0x0e }, { 0x0f, 0x0d },
|
|
||||||
|
|
||||||
{ 0x13, 0x05 }, { 0x13, 0x45 },
|
|
||||||
|
|
||||||
/* Initialize finger detection registers (not enabling yet) */
|
|
||||||
{ 0x30, 0xe0 }, { 0x15, 0x26 },
|
|
||||||
|
|
||||||
{ 0x12, 0x01 }, { 0x20, 0x01 }, { 0x07, 0x10 },
|
|
||||||
{ 0x10, 0x00 }, { 0x11, 0xbf },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct sonly_regwrite awfsm_2016_writev_2[] = {
|
|
||||||
{ 0x01, 0xc6 }, { 0x0c, 0x13 }, { 0x0d, 0x0d }, { 0x0e, 0x0e },
|
|
||||||
{ 0x0f, 0x0d }, { 0x0b, 0x00 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct sonly_regwrite awfsm_1000_writev_2[] = {
|
|
||||||
/* Enable finger detection */
|
|
||||||
{ 0x30, 0xe1 }, { 0x15, 0x06 }, { 0x15, 0x86 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct sonly_regwrite awfsm_2016_writev_3[] = {
|
|
||||||
{ 0x13, 0x45 }, { 0x30, 0xe0 }, { 0x12, 0x01 }, { 0x20, 0x01 },
|
|
||||||
{ 0x09, 0x20 }, { 0x0a, 0x00 }, { 0x30, 0xe0 }, { 0x20, 0x01 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct sonly_regwrite awfsm_2016_writev_4[] = {
|
|
||||||
{ 0x08, 0x00 }, { 0x10, 0x00 }, { 0x12, 0x01 }, { 0x11, 0xbf },
|
|
||||||
{ 0x12, 0x01 }, { 0x07, 0x10 }, { 0x07, 0x10 }, { 0x04, 0x00 },\
|
|
||||||
{ 0x05, 0x00 }, { 0x0b, 0x00 },
|
|
||||||
|
|
||||||
/* enter finger detection mode */
|
|
||||||
{ 0x15, 0x20 }, { 0x30, 0xe1 }, { 0x15, 0x24 }, { 0x15, 0x04 },
|
|
||||||
{ 0x15, 0x84 },
|
|
||||||
};
|
|
||||||
|
|
||||||
enum awfsm_2016_states {
|
enum awfsm_2016_states {
|
||||||
AWFSM_2016_WRITEV_1,
|
AWFSM_2016_WRITEV_1,
|
||||||
AWFSM_2016_READ_01,
|
AWFSM_2016_READ_01,
|
||||||
|
@ -789,16 +740,6 @@ static void awfsm_1000_run_state(struct fpi_ssm *ssm)
|
||||||
|
|
||||||
/***** CAPTURE MODE *****/
|
/***** CAPTURE MODE *****/
|
||||||
|
|
||||||
static const struct sonly_regwrite capsm_2016_writev[] = {
|
|
||||||
/* enter capture mode */
|
|
||||||
{ 0x09, 0x28 }, { 0x13, 0x55 }, { 0x0b, 0x80 }, { 0x04, 0x00 },
|
|
||||||
{ 0x05, 0x00 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct sonly_regwrite capsm_1000_writev[] = {
|
|
||||||
{ 0x08, 0x80 }, { 0x13, 0x55 }, { 0x0b, 0x80 }, /* Enter capture mode */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum capsm_2016_states {
|
enum capsm_2016_states {
|
||||||
CAPSM_2016_INIT,
|
CAPSM_2016_INIT,
|
||||||
CAPSM_2016_WRITE_15,
|
CAPSM_2016_WRITE_15,
|
||||||
|
@ -903,18 +844,6 @@ static void capsm_1000_run_state(struct fpi_ssm *ssm)
|
||||||
|
|
||||||
/***** DEINITIALIZATION *****/
|
/***** DEINITIALIZATION *****/
|
||||||
|
|
||||||
static const struct sonly_regwrite deinitsm_2016_writev[] = {
|
|
||||||
/* reset + enter low power mode */
|
|
||||||
{ 0x0b, 0x00 }, { 0x09, 0x20 }, { 0x13, 0x45 }, { 0x13, 0x45 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct sonly_regwrite deinitsm_1000_writev[] = {
|
|
||||||
{ 0x15, 0x26 }, { 0x30, 0xe0 }, /* Disable finger detection */
|
|
||||||
|
|
||||||
{ 0x0b, 0x00 }, { 0x13, 0x45 }, { 0x08, 0x00 }, /* Disable capture mode */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
enum deinitsm_2016_states {
|
enum deinitsm_2016_states {
|
||||||
DEINITSM_2016_WRITEV,
|
DEINITSM_2016_WRITEV,
|
||||||
DEINITSM_2016_NUM_STATES,
|
DEINITSM_2016_NUM_STATES,
|
||||||
|
@ -945,32 +874,6 @@ static void deinitsm_1000_run_state(struct fpi_ssm *ssm)
|
||||||
|
|
||||||
/***** INITIALIZATION *****/
|
/***** INITIALIZATION *****/
|
||||||
|
|
||||||
static const struct sonly_regwrite initsm_2016_writev_1[] = {
|
|
||||||
{ 0x49, 0x00 },
|
|
||||||
|
|
||||||
/* BSAPI writes different values to register 0x3e each time. I initially
|
|
||||||
* thought this was some kind of clever authentication, but just blasting
|
|
||||||
* these sniffed values each time seems to work. */
|
|
||||||
{ 0x3e, 0x83 }, { 0x3e, 0x4f }, { 0x3e, 0x0f }, { 0x3e, 0xbf },
|
|
||||||
{ 0x3e, 0x45 }, { 0x3e, 0x35 }, { 0x3e, 0x1c }, { 0x3e, 0xae },
|
|
||||||
|
|
||||||
{ 0x44, 0x01 }, { 0x43, 0x06 }, { 0x43, 0x05 }, { 0x43, 0x04 },
|
|
||||||
{ 0x44, 0x00 }, { 0x0b, 0x00 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct sonly_regwrite initsm_1000_writev_1[] = {
|
|
||||||
{ 0x49, 0x00 }, /* Encryption disabled */
|
|
||||||
|
|
||||||
/* Setting encryption key. Doesn't need to be random since we don't use any
|
|
||||||
* encryption. */
|
|
||||||
{ 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f },
|
|
||||||
{ 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f },
|
|
||||||
|
|
||||||
{ 0x04, 0x00 }, { 0x05, 0x00 },
|
|
||||||
|
|
||||||
{ 0x0b, 0x00 }, { 0x08, 0x00 }, /* Initialize capture control registers */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum initsm_2016_states {
|
enum initsm_2016_states {
|
||||||
INITSM_2016_WRITEV_1,
|
INITSM_2016_WRITEV_1,
|
||||||
INITSM_2016_READ_09,
|
INITSM_2016_READ_09,
|
||||||
|
|
126
libfprint/drivers/upeksonly.h
Normal file
126
libfprint/drivers/upeksonly.h
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
/*
|
||||||
|
* UPEK TouchStrip Sensor-Only driver for libfprint
|
||||||
|
* Copyright (C) 2008 Daniel Drake <dsd@gentoo.org>
|
||||||
|
*
|
||||||
|
* TCS4C (USB ID 147e:1000) support:
|
||||||
|
* Copyright (C) 2010 Hugo Grostabussiat <dw23.devel@gmail.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct sonly_regwrite {
|
||||||
|
uint8_t reg;
|
||||||
|
uint8_t value;
|
||||||
|
};
|
||||||
|
|
||||||
|
/***** AWAIT FINGER *****/
|
||||||
|
|
||||||
|
static const struct sonly_regwrite awfsm_2016_writev_1[] = {
|
||||||
|
{ 0x0a, 0x00 }, { 0x0a, 0x00 }, { 0x09, 0x20 }, { 0x03, 0x3b },
|
||||||
|
{ 0x00, 0x67 }, { 0x00, 0x67 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct sonly_regwrite awfsm_1000_writev_1[] = {
|
||||||
|
/* Initialize sensor settings */
|
||||||
|
{ 0x0a, 0x00 }, { 0x09, 0x20 }, { 0x03, 0x37 }, { 0x00, 0x5f },
|
||||||
|
{ 0x01, 0x6e }, { 0x01, 0xee }, { 0x0c, 0x13 }, { 0x0d, 0x0d },
|
||||||
|
{ 0x0e, 0x0e }, { 0x0f, 0x0d },
|
||||||
|
|
||||||
|
{ 0x13, 0x05 }, { 0x13, 0x45 },
|
||||||
|
|
||||||
|
/* Initialize finger detection registers (not enabling yet) */
|
||||||
|
{ 0x30, 0xe0 }, { 0x15, 0x26 },
|
||||||
|
|
||||||
|
{ 0x12, 0x01 }, { 0x20, 0x01 }, { 0x07, 0x10 },
|
||||||
|
{ 0x10, 0x00 }, { 0x11, 0xbf },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct sonly_regwrite awfsm_2016_writev_2[] = {
|
||||||
|
{ 0x01, 0xc6 }, { 0x0c, 0x13 }, { 0x0d, 0x0d }, { 0x0e, 0x0e },
|
||||||
|
{ 0x0f, 0x0d }, { 0x0b, 0x00 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct sonly_regwrite awfsm_1000_writev_2[] = {
|
||||||
|
/* Enable finger detection */
|
||||||
|
{ 0x30, 0xe1 }, { 0x15, 0x06 }, { 0x15, 0x86 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct sonly_regwrite awfsm_2016_writev_3[] = {
|
||||||
|
{ 0x13, 0x45 }, { 0x30, 0xe0 }, { 0x12, 0x01 }, { 0x20, 0x01 },
|
||||||
|
{ 0x09, 0x20 }, { 0x0a, 0x00 }, { 0x30, 0xe0 }, { 0x20, 0x01 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct sonly_regwrite awfsm_2016_writev_4[] = {
|
||||||
|
{ 0x08, 0x00 }, { 0x10, 0x00 }, { 0x12, 0x01 }, { 0x11, 0xbf },
|
||||||
|
{ 0x12, 0x01 }, { 0x07, 0x10 }, { 0x07, 0x10 }, { 0x04, 0x00 },\
|
||||||
|
{ 0x05, 0x00 }, { 0x0b, 0x00 },
|
||||||
|
|
||||||
|
/* enter finger detection mode */
|
||||||
|
{ 0x15, 0x20 }, { 0x30, 0xe1 }, { 0x15, 0x24 }, { 0x15, 0x04 },
|
||||||
|
{ 0x15, 0x84 },
|
||||||
|
};
|
||||||
|
|
||||||
|
/***** CAPTURE MODE *****/
|
||||||
|
|
||||||
|
static const struct sonly_regwrite capsm_2016_writev[] = {
|
||||||
|
/* enter capture mode */
|
||||||
|
{ 0x09, 0x28 }, { 0x13, 0x55 }, { 0x0b, 0x80 }, { 0x04, 0x00 },
|
||||||
|
{ 0x05, 0x00 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct sonly_regwrite capsm_1000_writev[] = {
|
||||||
|
{ 0x08, 0x80 }, { 0x13, 0x55 }, { 0x0b, 0x80 }, /* Enter capture mode */
|
||||||
|
};
|
||||||
|
|
||||||
|
/***** DEINITIALIZATION *****/
|
||||||
|
|
||||||
|
static const struct sonly_regwrite deinitsm_2016_writev[] = {
|
||||||
|
/* reset + enter low power mode */
|
||||||
|
{ 0x0b, 0x00 }, { 0x09, 0x20 }, { 0x13, 0x45 }, { 0x13, 0x45 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct sonly_regwrite deinitsm_1000_writev[] = {
|
||||||
|
{ 0x15, 0x26 }, { 0x30, 0xe0 }, /* Disable finger detection */
|
||||||
|
|
||||||
|
{ 0x0b, 0x00 }, { 0x13, 0x45 }, { 0x08, 0x00 }, /* Disable capture mode */
|
||||||
|
};
|
||||||
|
|
||||||
|
/***** INITIALIZATION *****/
|
||||||
|
|
||||||
|
static const struct sonly_regwrite initsm_2016_writev_1[] = {
|
||||||
|
{ 0x49, 0x00 },
|
||||||
|
|
||||||
|
/* BSAPI writes different values to register 0x3e each time. I initially
|
||||||
|
* thought this was some kind of clever authentication, but just blasting
|
||||||
|
* these sniffed values each time seems to work. */
|
||||||
|
{ 0x3e, 0x83 }, { 0x3e, 0x4f }, { 0x3e, 0x0f }, { 0x3e, 0xbf },
|
||||||
|
{ 0x3e, 0x45 }, { 0x3e, 0x35 }, { 0x3e, 0x1c }, { 0x3e, 0xae },
|
||||||
|
|
||||||
|
{ 0x44, 0x01 }, { 0x43, 0x06 }, { 0x43, 0x05 }, { 0x43, 0x04 },
|
||||||
|
{ 0x44, 0x00 }, { 0x0b, 0x00 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct sonly_regwrite initsm_1000_writev_1[] = {
|
||||||
|
{ 0x49, 0x00 }, /* Encryption disabled */
|
||||||
|
|
||||||
|
/* Setting encryption key. Doesn't need to be random since we don't use any
|
||||||
|
* encryption. */
|
||||||
|
{ 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f },
|
||||||
|
{ 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f }, { 0x3e, 0x7f },
|
||||||
|
|
||||||
|
{ 0x04, 0x00 }, { 0x05, 0x00 },
|
||||||
|
|
||||||
|
{ 0x0b, 0x00 }, { 0x08, 0x00 }, /* Initialize capture control registers */
|
||||||
|
};
|
Loading…
Reference in a new issue