summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorherman lin <herman.lin@emc.com.tw>2021-01-22 15:24:00 +0800
committerCommit Bot <commit-bot@chromium.org>2021-01-27 18:08:41 +0000
commit7f020a152bbec17cae13a2ce8245d3c19e9929a2 (patch)
treea543ce383eb9c5da4360ed642ae6563771ec098e
parent8081ae39a37d4996423390f117b7dcd545aa807e (diff)
downloadchrome-ec-7f020a152bbec17cae13a2ce8245d3c19e9929a2.tar.gz
elan_private: Implement elan fp sensor on stm32f4
This patch implements the ELAN FP API, which is used to control the ELAN FP sensor and matching algorithm on stm32f4. Therefore, we reduce the size of TEMPLATE_SIZE on STM32f4 and implements elan sensor reset API. BRANCH=None BUG=None TEST=We build on bloonchipper and dartmonkey, and testing Elan sensor with libelan_515_m4/m7.a and libelan_80_m4/m7.a successfully. Signed-off-by: herman lin <herman.lin@emc.com.tw> Change-Id: Iaf4b85744a49a3ae12f20d91740515b7dc198e56 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2643744 Reviewed-by: Yicheng Li <yichengli@chromium.org> Commit-Queue: Yicheng Li <yichengli@chromium.org> Tested-by: Yicheng Li <yichengli@chromium.org>
-rw-r--r--driver/fingerprint/elan/elan_private.c5
-rw-r--r--driver/fingerprint/elan/elan_sensor.h15
-rw-r--r--driver/fingerprint/elan/elan_sensor_pal.c7
-rw-r--r--driver/fingerprint/elan/elan_sensor_pal.h15
-rw-r--r--driver/fingerprint/elan/elan_setting.h2
5 files changed, 40 insertions, 4 deletions
diff --git a/driver/fingerprint/elan/elan_private.c b/driver/fingerprint/elan/elan_private.c
index 336542c8f3..555ad14ba0 100644
--- a/driver/fingerprint/elan/elan_private.c
+++ b/driver/fingerprint/elan/elan_private.c
@@ -22,7 +22,6 @@
#include "elan_setting.h"
#include "elan_sensor_pal.h"
-extern uint16_t raw[IMAGE_TOTAL_PIXEL];
static uint16_t errors;
#define CPRINTF(format, args...) cprintf(CC_FP, format, ##args)
@@ -58,6 +57,7 @@ int fp_sensor_init(void)
CPRINTF("========%s=======\n", __func__);
errors = 0;
+ elan_execute_reset();
algorithm_parameter_setting();
if (elan_execute_calibration() < 0)
errors |= FP_ERROR_INIT_FAIL;
@@ -73,8 +73,7 @@ int fp_sensor_init(void)
int fp_sensor_deinit(void)
{
CPRINTF("========%s=======\n", __func__);
- always_memset(raw, 0, sizeof(raw));
- return EC_SUCCESS;
+ return elan_fp_deinit();
}
/**
diff --git a/driver/fingerprint/elan/elan_sensor.h b/driver/fingerprint/elan/elan_sensor.h
index a9cf4e3f72..490b1acf16 100644
--- a/driver/fingerprint/elan/elan_sensor.h
+++ b/driver/fingerprint/elan/elan_sensor.h
@@ -12,13 +12,21 @@
#define FP_SENSOR_IMAGE_SIZE (80 * 80)
#define FP_SENSOR_RES_X 80
#define FP_SENSOR_RES_Y 80
+#if defined(CHIP_FAMILY_STM32F4)
+#define FP_ALGORITHM_TEMPLATE_SIZE 15000
+#elif defined(CHIP_FAMILY_STM32H7)
#define FP_ALGORITHM_TEMPLATE_SIZE 40960
+#endif
#define FP_MAX_FINGER_COUNT 3
#elif defined(CONFIG_FP_SENSOR_ELAN515)
#define FP_SENSOR_IMAGE_SIZE (52 * 150)
#define FP_SENSOR_RES_X 52
#define FP_SENSOR_RES_Y 150
+#if defined(CHIP_FAMILY_STM32F4)
+#define FP_ALGORITHM_TEMPLATE_SIZE 15000
+#elif defined(CHIP_FAMILY_STM32H7)
#define FP_ALGORITHM_TEMPLATE_SIZE 67000
+#endif
#define FP_MAX_FINGER_COUNT 3
#endif
#define FP_SENSOR_RES_BPP (8)
@@ -161,4 +169,11 @@ int elan_sensor_get_alg_info(struct ec_response_fp_info *resp);
* @return EC_SUCCESS on success
*/
int elan_fp_maintenance(uint16_t *error_state);
+
+/**
+ * Deinitialize the sensor IC.
+ *
+ * @return EC_SUCCESS on success otherwise error.
+ */
+int elan_fp_deinit(void);
#endif
diff --git a/driver/fingerprint/elan/elan_sensor_pal.c b/driver/fingerprint/elan/elan_sensor_pal.c
index 0c8827d684..b59368b835 100644
--- a/driver/fingerprint/elan/elan_sensor_pal.c
+++ b/driver/fingerprint/elan/elan_sensor_pal.c
@@ -221,6 +221,8 @@ int elan_fp_maintenance(uint16_t *error_state)
if (error_state == NULL)
return EC_ERROR_INVAL;
+ /* Initial status */
+ *error_state &= 0xFC00;
sensor_info.num_defective_pixels = 0;
sensor_info.sensor_error_code = 0;
rv = fp_sensor_maintenance(&sensor_info);
@@ -244,3 +246,8 @@ int elan_fp_maintenance(uint16_t *error_state)
return EC_SUCCESS;
}
+
+void __unused elan_sensor_set_rst(bool state)
+{
+ gpio_set_level(GPIO_FP_RST_ODL, state ? 0 : 1);
+}
diff --git a/driver/fingerprint/elan/elan_sensor_pal.h b/driver/fingerprint/elan/elan_sensor_pal.h
index f9f85c1132..067b693245 100644
--- a/driver/fingerprint/elan/elan_sensor_pal.h
+++ b/driver/fingerprint/elan/elan_sensor_pal.h
@@ -114,6 +114,11 @@ int raw_capture(uint16_t *short_raw);
int elan_execute_calibration(void);
/**
+ * Execute reset ELAN fingerprint sensor flow.
+ */
+void elan_execute_reset(void);
+
+/**
* Runs a test for defective pixels.
*
* @param[out] fp_sensor_info Structure containing output data.
@@ -123,4 +128,14 @@ int elan_execute_calibration(void);
*/
int fp_sensor_maintenance(fp_sensor_info_t *fp_sensor_info);
+/**
+ * @brief Set sensor reset state.
+ *
+ * Set sensor reset state.
+ *
+ * @param[in] state Reset state.
+ * true => reset sensor, i.e. low GPIO state
+ * false => normal operation, i.e. high GPIO state
+ */
+void __unused elan_sensor_set_rst(bool state);
#endif
diff --git a/driver/fingerprint/elan/elan_setting.h b/driver/fingerprint/elan/elan_setting.h
index f7b16627b6..feaf5e1550 100644
--- a/driver/fingerprint/elan/elan_setting.h
+++ b/driver/fingerprint/elan/elan_setting.h
@@ -12,7 +12,7 @@
#define VID 0x04F3
#define PID 0x0903
#define MID 0x01
-#define VERSION 0x100A
+#define VERSION 0x100B
/* SPI tx and rx buffer size */
#define CONFIG_SPI_TX_BUF_SIZE 1024