diff options
author | Tom Hughes <tomhughes@chromium.org> | 2021-01-25 14:31:20 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-01-29 21:42:07 +0000 |
commit | 8552c791688d06a1d52971868c4759246369073a (patch) | |
tree | 441438a21f07ea4bc3567af535a944c8b1275fe2 | |
parent | 9687476ddaa78061cd74e98259f10bfc2d26d572 (diff) | |
download | chrome-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.c | 5 | ||||
-rw-r--r-- | board/nocturne_fp/board.c | 4 | ||||
-rw-r--r-- | board/nocturne_fp/fpsensor_detect.c | 23 | ||||
-rw-r--r-- | board/nocturne_fp/gpio.inc | 4 | ||||
-rw-r--r-- | common/fpsensor/fpsensor_detect_strings.c | 12 | ||||
-rw-r--r-- | common/mock/fpsensor_detect_mock.c | 5 | ||||
-rw-r--r-- | include/fpsensor_detect.h | 8 | ||||
-rw-r--r-- | include/mock/fpsensor_detect_mock.h | 12 |
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; |