diff options
-rw-r--r-- | board/hatch_fp/build.mk | 2 | ||||
-rw-r--r-- | board/hatch_fp/fpsensor_detect.c | 50 | ||||
-rw-r--r-- | board/nocturne_fp/build.mk | 2 | ||||
-rw-r--r-- | board/nocturne_fp/fpsensor_detect.c | 16 | ||||
-rw-r--r-- | common/fpsensor/build.mk | 1 | ||||
-rw-r--r-- | common/fpsensor/fpsensor.c | 6 | ||||
-rw-r--r-- | common/fpsensor/fpsensor_detect_common.c | 32 | ||||
-rw-r--r-- | common/mock/build.mk | 1 | ||||
-rw-r--r-- | common/mock/fpsensor_detect_mock.c | 19 | ||||
-rw-r--r-- | driver/fingerprint/fpc/bep/fpc_private.c | 7 | ||||
-rw-r--r-- | fuzz/host_command_fuzz.mocklist | 1 | ||||
-rw-r--r-- | include/fpsensor_detect.h | 28 | ||||
-rw-r--r-- | include/mock/fpsensor_detect_mock.h | 23 | ||||
-rw-r--r-- | test/fpsensor.mocklist | 1 |
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) |