summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/hatch_fp/build.mk2
-rw-r--r--board/hatch_fp/fpsensor_detect.c50
-rw-r--r--board/nocturne_fp/build.mk2
-rw-r--r--board/nocturne_fp/fpsensor_detect.c16
-rw-r--r--common/fpsensor/build.mk1
-rw-r--r--common/fpsensor/fpsensor.c6
-rw-r--r--common/fpsensor/fpsensor_detect_common.c32
-rw-r--r--common/mock/build.mk1
-rw-r--r--common/mock/fpsensor_detect_mock.c19
-rw-r--r--driver/fingerprint/fpc/bep/fpc_private.c7
-rw-r--r--fuzz/host_command_fuzz.mocklist1
-rw-r--r--include/fpsensor_detect.h28
-rw-r--r--include/mock/fpsensor_detect_mock.h23
-rw-r--r--test/fpsensor.mocklist1
14 files changed, 187 insertions, 2 deletions
diff --git a/board/hatch_fp/build.mk b/board/hatch_fp/build.mk
index 038819ff4d..a6a37a3ace 100644
--- a/board/hatch_fp/build.mk
+++ b/board/hatch_fp/build.mk
@@ -9,6 +9,6 @@ CHIP:=stm32
CHIP_FAMILY:=stm32f4
CHIP_VARIANT:=stm32f412
-board-y=board.o
+board-y=board.o fpsensor_detect.o
test-list-y=aes sha256 sha256_unrolled
diff --git a/board/hatch_fp/fpsensor_detect.c b/board/hatch_fp/fpsensor_detect.c
new file mode 100644
index 0000000000..e737052b77
--- /dev/null
+++ b/board/hatch_fp/fpsensor_detect.c
@@ -0,0 +1,50 @@
+/* Copyright 2020 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "fpsensor_detect.h"
+#include "gpio.h"
+#include "timer.h"
+
+enum fp_sensor_type get_fp_sensor_type(void)
+{
+ enum fp_sensor_type ret;
+
+ gpio_set_level(GPIO_DIVIDER_HIGHSIDE, 1);
+ usleep(1);
+ switch (gpio_get_level(GPIO_FP_SENSOR_SEL)) {
+ case 0:
+ ret = FP_SENSOR_TYPE_ELAN;
+ break;
+ case 1:
+ ret = FP_SENSOR_TYPE_FPC;
+ break;
+ default:
+ ret = FP_SENSOR_TYPE_UNKNOWN;
+ break;
+ }
+ gpio_set_level(GPIO_DIVIDER_HIGHSIDE, 0);
+ return ret;
+}
+
+enum fp_transport_type get_fp_transport_type(void)
+{
+ enum fp_transport_type ret;
+
+ gpio_set_level(GPIO_DIVIDER_HIGHSIDE, 1);
+ usleep(1);
+ switch (gpio_get_level(GPIO_TRANSPORT_SEL)) {
+ case 0:
+ ret = FP_TRANSPORT_TYPE_UART;
+ break;
+ case 1:
+ ret = FP_TRANSPORT_TYPE_SPI;
+ break;
+ default:
+ ret = FP_TRANSPORT_TYPE_UNKNOWN;
+ break;
+ }
+ gpio_set_level(GPIO_DIVIDER_HIGHSIDE, 0);
+ return ret;
+}
diff --git a/board/nocturne_fp/build.mk b/board/nocturne_fp/build.mk
index 2c7a5d3d73..1116b15149 100644
--- a/board/nocturne_fp/build.mk
+++ b/board/nocturne_fp/build.mk
@@ -9,6 +9,6 @@ CHIP:=stm32
CHIP_FAMILY:=stm32h7
CHIP_VARIANT:=stm32h7x3
-board-y=board.o
+board-y=board.o fpsensor_detect.o
test-list-y=aes sha256 sha256_unrolled
diff --git a/board/nocturne_fp/fpsensor_detect.c b/board/nocturne_fp/fpsensor_detect.c
new file mode 100644
index 0000000000..72b9b89e11
--- /dev/null
+++ b/board/nocturne_fp/fpsensor_detect.c
@@ -0,0 +1,16 @@
+/* Copyright 2020 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "fpsensor_detect.h"
+
+enum fp_sensor_type get_fp_sensor_type(void)
+{
+ return FP_SENSOR_TYPE_FPC;
+}
+
+enum fp_transport_type get_fp_transport_type(void)
+{
+ return FP_TRANSPORT_TYPE_SPI;
+}
diff --git a/common/fpsensor/build.mk b/common/fpsensor/build.mk
index a1eeaa9932..0a5ec373de 100644
--- a/common/fpsensor/build.mk
+++ b/common/fpsensor/build.mk
@@ -10,3 +10,4 @@ _fpsensor_dir:=$(dir $(lastword $(MAKEFILE_LIST)))
all-obj-$(HAS_TASK_FPSENSOR)+=$(_fpsensor_dir)fpsensor_state.o
all-obj-$(HAS_TASK_FPSENSOR)+=$(_fpsensor_dir)fpsensor_crypto.o
all-obj-$(HAS_TASK_FPSENSOR)+=$(_fpsensor_dir)fpsensor.o
+all-obj-$(HAS_TASK_FPSENSOR)+=$(_fpsensor_dir)fpsensor_detect_common.o
diff --git a/common/fpsensor/fpsensor.c b/common/fpsensor/fpsensor.c
index 8aa9a1d09e..dd228ade09 100644
--- a/common/fpsensor/fpsensor.c
+++ b/common/fpsensor/fpsensor.c
@@ -11,6 +11,7 @@
#include "ec_commands.h"
#include "fpsensor.h"
#include "fpsensor_crypto.h"
+#include "fpsensor_detect.h"
#include "fpsensor_private.h"
#include "fpsensor_state.h"
#include "gpio.h"
@@ -203,6 +204,11 @@ void fp_task(void)
gpio_config_module(MODULE_SPI_MASTER, 1);
spi_enable(CONFIG_SPI_FP_PORT, 1);
+ CPRINTS("TRANSPORT_SEL: %s",
+ fp_transport_type_to_str(get_fp_transport_type()));
+ CPRINTS("FP_SENSOR_SEL: %s",
+ fp_sensor_type_to_str(get_fp_sensor_type()));
+
#ifdef HAVE_FP_PRIVATE_DRIVER
/* Reset and initialize the sensor IC */
fp_sensor_init();
diff --git a/common/fpsensor/fpsensor_detect_common.c b/common/fpsensor/fpsensor_detect_common.c
new file mode 100644
index 0000000000..b9bcf9bb3b
--- /dev/null
+++ b/common/fpsensor/fpsensor_detect_common.c
@@ -0,0 +1,32 @@
+/* Copyright 2020 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#include "fpsensor_detect.h"
+
+const char *fp_transport_type_to_str(enum fp_transport_type type)
+{
+ switch (type) {
+ case FP_TRANSPORT_TYPE_UNKNOWN:
+ default:
+ return "UNKNOWN";
+ case FP_TRANSPORT_TYPE_SPI:
+ return "SPI";
+ case FP_TRANSPORT_TYPE_UART:
+ return "UART";
+ }
+}
+
+const char *fp_sensor_type_to_str(enum fp_sensor_type type)
+{
+ switch (type) {
+ case FP_SENSOR_TYPE_UNKNOWN:
+ default:
+ return "UNKNOWN";
+ case FP_SENSOR_TYPE_FPC:
+ return "FPC";
+ case FP_SENSOR_TYPE_ELAN:
+ return "ELAN";
+ }
+}
+
diff --git a/common/mock/build.mk b/common/mock/build.mk
index c8aac53723..9d808adefa 100644
--- a/common/mock/build.mk
+++ b/common/mock/build.mk
@@ -5,6 +5,7 @@
# See common/mock/README.md for more information.
mock-$(HAS_MOCK_FP_SENSOR) += fp_sensor_mock.o
+mock-$(HAS_MOCK_FPSENSOR_DETECT) += fpsensor_detect_mock.o
mock-$(HAS_MOCK_MKBP_EVENTS) += mkbp_events_mock.o
mock-$(HAS_MOCK_ROLLBACK) += rollback_mock.o
mock-$(HAS_MOCK_TCPC) += tcpc_mock.o
diff --git a/common/mock/fpsensor_detect_mock.c b/common/mock/fpsensor_detect_mock.c
new file mode 100644
index 0000000000..af1d7f5103
--- /dev/null
+++ b/common/mock/fpsensor_detect_mock.c
@@ -0,0 +1,19 @@
+/* Copyright 2020 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "mock/fpsensor_detect_mock.h"
+
+struct mock_ctrl_fpsensor_detect mock_ctrl_fpsensor_detect =
+ MOCK_CTRL_DEFAULT_FPSENSOR_DETECT;
+
+enum fp_sensor_type get_fp_sensor_type(void)
+{
+ return mock_ctrl_fpsensor_detect.get_fp_sensor_type_return;
+}
+
+enum fp_transport_type get_fp_transport_type(void)
+{
+ return mock_ctrl_fpsensor_detect.get_fp_transport_type_return;
+}
diff --git a/driver/fingerprint/fpc/bep/fpc_private.c b/driver/fingerprint/fpc/bep/fpc_private.c
index 9bcd4f65ff..61bad9f101 100644
--- a/driver/fingerprint/fpc/bep/fpc_private.c
+++ b/driver/fingerprint/fpc/bep/fpc_private.c
@@ -8,6 +8,7 @@
#include "fpc_bio_algorithm.h"
#include "fpsensor.h"
+#include "gpio.h"
#include "spi.h"
#include "system.h"
#include "util.h"
@@ -142,6 +143,12 @@ int fp_sensor_init(void)
{
int rc;
+ /* The dragonclaw development board needs this enabled to enable the
+ * AND gate (U10) to CS. Production boards could disable this to save
+ * power since it's only needed for initial detection on those boards.
+ */
+ gpio_set_level(GPIO_DIVIDER_HIGHSIDE, 1);
+
/* Print the binary libfpbep.a library version */
CPRINTS("FPC libfpbep.a %s", fp_sensor_get_version());
diff --git a/fuzz/host_command_fuzz.mocklist b/fuzz/host_command_fuzz.mocklist
index be1527bff0..4ffc786b32 100644
--- a/fuzz/host_command_fuzz.mocklist
+++ b/fuzz/host_command_fuzz.mocklist
@@ -5,5 +5,6 @@
#define CONFIG_TEST_MOCK_LIST \
MOCK(FP_SENSOR) \
+ MOCK(FPSENSOR_DETECT) \
MOCK(MKBP_EVENTS) \
MOCK(ROLLBACK)
diff --git a/include/fpsensor_detect.h b/include/fpsensor_detect.h
new file mode 100644
index 0000000000..e12ff76595
--- /dev/null
+++ b/include/fpsensor_detect.h
@@ -0,0 +1,28 @@
+/* Copyright 2020 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* Fingerprint sensor detection (transport and sensor). */
+
+#ifndef __CROS_EC_FPSENSOR_DETECT_H
+#define __CROS_EC_FPSENSOR_DETECT_H
+
+enum fp_sensor_type {
+ FP_SENSOR_TYPE_UNKNOWN = -1,
+ FP_SENSOR_TYPE_FPC,
+ FP_SENSOR_TYPE_ELAN,
+};
+
+enum fp_transport_type {
+ FP_TRANSPORT_TYPE_UNKNOWN = -1,
+ FP_TRANSPORT_TYPE_SPI,
+ FP_TRANSPORT_TYPE_UART
+};
+
+const char *fp_transport_type_to_str(enum fp_transport_type type);
+const char *fp_sensor_type_to_str(enum fp_sensor_type type);
+enum fp_sensor_type get_fp_sensor_type(void);
+enum fp_transport_type get_fp_transport_type(void);
+
+#endif /* __CROS_EC_FPSENSOR_DETECT_H */
diff --git a/include/mock/fpsensor_detect_mock.h b/include/mock/fpsensor_detect_mock.h
new file mode 100644
index 0000000000..5ffa2b4431
--- /dev/null
+++ b/include/mock/fpsensor_detect_mock.h
@@ -0,0 +1,23 @@
+/* Copyright 2020 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef __MOCK_FPSENSOR_DETECT_MOCK_H
+#define __MOCK_FPSENSOR_DETECT_MOCK_H
+
+#include "fpsensor_detect.h"
+
+struct mock_ctrl_fpsensor_detect {
+ enum fp_sensor_type get_fp_sensor_type_return;
+ enum fp_transport_type get_fp_transport_type_return;
+};
+
+#define MOCK_CTRL_DEFAULT_FPSENSOR_DETECT { \
+ .get_fp_sensor_type_return = FP_SENSOR_TYPE_UNKNOWN, \
+ .get_fp_transport_type_return = FP_TRANSPORT_TYPE_UNKNOWN, \
+}
+
+extern struct mock_ctrl_fpsensor_detect mock_ctrl_fpsensor_detect;
+
+#endif /* __MOCK_FPSENSOR_DETECT_MOCK_H */
diff --git a/test/fpsensor.mocklist b/test/fpsensor.mocklist
index 3a90debc1f..0c0fbcc0a7 100644
--- a/test/fpsensor.mocklist
+++ b/test/fpsensor.mocklist
@@ -5,5 +5,6 @@
#define CONFIG_TEST_MOCK_LIST \
MOCK(FP_SENSOR) \
+ MOCK(FPSENSOR_DETECT) \
MOCK(MKBP_EVENTS) \
MOCK(TIMER)