summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Hughes <tomhughes@chromium.org>2021-01-25 14:31:20 -0800
committerCommit Bot <commit-bot@chromium.org>2021-01-29 21:42:07 +0000
commit8552c791688d06a1d52971868c4759246369073a (patch)
tree441438a21f07ea4bc3567af535a944c8b1275fe2
parent9687476ddaa78061cd74e98259f10bfc2d26d572 (diff)
downloadchrome-ec-8552c791688d06a1d52971868c4759246369073a.tar.gz
fpsensor: Add FP sensor SPI detection logic
BRANCH=none BUG=b:177908650 TEST=Flash icetower v0.2, observed FP_SPI_SEL on console TEST=Flash nocturne, observed FP_SPI_SEL on console Signed-off-by: Tom Hughes <tomhughes@chromium.org> Change-Id: I2b221139fed817de4c58db3b6c8198942ab86e7b Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2648731 Reviewed-by: Craig Hesling <hesling@chromium.org>
-rw-r--r--board/hatch_fp/fpsensor_detect.c5
-rw-r--r--board/nocturne_fp/board.c4
-rw-r--r--board/nocturne_fp/fpsensor_detect.c23
-rw-r--r--board/nocturne_fp/gpio.inc4
-rw-r--r--common/fpsensor/fpsensor_detect_strings.c12
-rw-r--r--common/mock/fpsensor_detect_mock.c5
-rw-r--r--include/fpsensor_detect.h8
-rw-r--r--include/mock/fpsensor_detect_mock.h12
8 files changed, 69 insertions, 4 deletions
diff --git a/board/hatch_fp/fpsensor_detect.c b/board/hatch_fp/fpsensor_detect.c
index e737052b77..86071bd7f6 100644
--- a/board/hatch_fp/fpsensor_detect.c
+++ b/board/hatch_fp/fpsensor_detect.c
@@ -48,3 +48,8 @@ enum fp_transport_type get_fp_transport_type(void)
gpio_set_level(GPIO_DIVIDER_HIGHSIDE, 0);
return ret;
}
+
+enum fp_sensor_spi_select get_fp_sensor_spi_select(void)
+{
+ return FP_SENSOR_SPI_SELECT_PRODUCTION;
+}
diff --git a/board/nocturne_fp/board.c b/board/nocturne_fp/board.c
index e4886f3cc8..fdce969d7a 100644
--- a/board/nocturne_fp/board.c
+++ b/board/nocturne_fp/board.c
@@ -82,6 +82,10 @@ static void spi_configure(void)
/* Initialize board. */
static void board_init(void)
{
+ enum fp_sensor_spi_select spi_select = get_fp_sensor_spi_select();
+
+ ccprints("FP_SPI_SEL: %s", fp_sensor_spi_select_to_str(spi_select));
+
spi_configure();
ccprints("TRANSPORT_SEL: %s",
diff --git a/board/nocturne_fp/fpsensor_detect.c b/board/nocturne_fp/fpsensor_detect.c
index 72b9b89e11..fcb0cc0ec5 100644
--- a/board/nocturne_fp/fpsensor_detect.c
+++ b/board/nocturne_fp/fpsensor_detect.c
@@ -4,6 +4,8 @@
*/
#include "fpsensor_detect.h"
+#include "gpio.h"
+#include "timer.h"
enum fp_sensor_type get_fp_sensor_type(void)
{
@@ -14,3 +16,24 @@ enum fp_transport_type get_fp_transport_type(void)
{
return FP_TRANSPORT_TYPE_SPI;
}
+
+enum fp_sensor_spi_select get_fp_sensor_spi_select(void)
+{
+ enum fp_sensor_spi_select ret;
+
+ gpio_set_level(GPIO_DIVIDER_HIGHSIDE, 1);
+ usleep(1);
+ switch (gpio_get_level(GPIO_FP_SPI_SEL)) {
+ case 0:
+ ret = FP_SENSOR_SPI_SELECT_DEVELOPMENT;
+ break;
+ case 1:
+ ret = FP_SENSOR_SPI_SELECT_PRODUCTION;
+ break;
+ default:
+ ret = FP_SENSOR_SPI_SELECT_UNKNOWN;
+ break;
+ }
+ gpio_set_level(GPIO_DIVIDER_HIGHSIDE, 0);
+ return ret;
+}
diff --git a/board/nocturne_fp/gpio.inc b/board/nocturne_fp/gpio.inc
index a5ac01f1b3..1f34808203 100644
--- a/board/nocturne_fp/gpio.inc
+++ b/board/nocturne_fp/gpio.inc
@@ -23,11 +23,15 @@ GPIO_INT(WP, PIN(B, 7), GPIO_INT_BOTH, wp_event)
GPIO(WP, PIN(B, 7), GPIO_INPUT)
#endif
+/* TODO(b/178808871): Only enable pull up when doing detection. */
+GPIO(FP_SPI_SEL, PIN(E, 1), GPIO_INPUT | GPIO_PULL_UP)
+
/* Outputs */
GPIO(EC_INT_L, PIN(A, 1), GPIO_OUT_HIGH)
GPIO(FP_RST_ODL, PIN(E, 0), GPIO_OUT_HIGH)
GPIO(SPI4_NSS, PIN(E, 4), GPIO_OUT_HIGH)
GPIO(USER_PRES_L, PIN(C, 5), GPIO_ODR_HIGH)
+GPIO(DIVIDER_HIGHSIDE, PIN(B, 8), GPIO_OUT_LOW)
UNIMPLEMENTED(ENTERING_RW)
diff --git a/common/fpsensor/fpsensor_detect_strings.c b/common/fpsensor/fpsensor_detect_strings.c
index b9bcf9bb3b..352dc90ee5 100644
--- a/common/fpsensor/fpsensor_detect_strings.c
+++ b/common/fpsensor/fpsensor_detect_strings.c
@@ -30,3 +30,15 @@ const char *fp_sensor_type_to_str(enum fp_sensor_type type)
}
}
+const char *fp_sensor_spi_select_to_str(enum fp_sensor_spi_select type)
+{
+ switch (type) {
+ case FP_SENSOR_SPI_SELECT_UNKNOWN:
+ default:
+ return "UNKNOWN";
+ case FP_SENSOR_SPI_SELECT_DEVELOPMENT:
+ return "DEVELOPMENT";
+ case FP_SENSOR_SPI_SELECT_PRODUCTION:
+ return "PRODUCTION";
+ }
+}
diff --git a/common/mock/fpsensor_detect_mock.c b/common/mock/fpsensor_detect_mock.c
index fd4e2985e6..6e3ca839f1 100644
--- a/common/mock/fpsensor_detect_mock.c
+++ b/common/mock/fpsensor_detect_mock.c
@@ -21,3 +21,8 @@ enum fp_transport_type get_fp_transport_type(void)
{
return mock_ctrl_fpsensor_detect.get_fp_transport_type_return;
}
+
+enum fp_sensor_spi_select get_fp_sensor_spi_select(void)
+{
+ return mock_ctrl_fpsensor_detect.get_fp_sensor_spi_select_return;
+}
diff --git a/include/fpsensor_detect.h b/include/fpsensor_detect.h
index e12ff76595..56e04d4ae6 100644
--- a/include/fpsensor_detect.h
+++ b/include/fpsensor_detect.h
@@ -20,9 +20,17 @@ enum fp_transport_type {
FP_TRANSPORT_TYPE_UART
};
+enum fp_sensor_spi_select {
+ FP_SENSOR_SPI_SELECT_UNKNOWN = -1,
+ FP_SENSOR_SPI_SELECT_DEVELOPMENT,
+ FP_SENSOR_SPI_SELECT_PRODUCTION
+};
+
const char *fp_transport_type_to_str(enum fp_transport_type type);
const char *fp_sensor_type_to_str(enum fp_sensor_type type);
+const char *fp_sensor_spi_select_to_str(enum fp_sensor_spi_select type);
enum fp_sensor_type get_fp_sensor_type(void);
enum fp_transport_type get_fp_transport_type(void);
+enum fp_sensor_spi_select get_fp_sensor_spi_select(void);
#endif /* __CROS_EC_FPSENSOR_DETECT_H */
diff --git a/include/mock/fpsensor_detect_mock.h b/include/mock/fpsensor_detect_mock.h
index 5ffa2b4431..da23dded96 100644
--- a/include/mock/fpsensor_detect_mock.h
+++ b/include/mock/fpsensor_detect_mock.h
@@ -11,12 +11,16 @@
struct mock_ctrl_fpsensor_detect {
enum fp_sensor_type get_fp_sensor_type_return;
enum fp_transport_type get_fp_transport_type_return;
+ enum fp_sensor_spi_select get_fp_sensor_spi_select_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, \
-}
+#define MOCK_CTRL_DEFAULT_FPSENSOR_DETECT \
+ { \
+ .get_fp_sensor_type_return = FP_SENSOR_TYPE_UNKNOWN, \
+ .get_fp_transport_type_return = FP_TRANSPORT_TYPE_UNKNOWN, \
+ .get_fp_sensor_spi_select_return = \
+ FP_SENSOR_SPI_SELECT_UNKNOWN \
+ }
extern struct mock_ctrl_fpsensor_detect mock_ctrl_fpsensor_detect;