From aac3da46a0dee699f36eccc2fb278e8ae2373425 Mon Sep 17 00:00:00 2001 From: Jett Rink Date: Wed, 28 Mar 2018 11:19:39 -0600 Subject: [PATCH] yorp: add board version Hard code value to 0 for now. BRANCH=none BUG=b:76448181 TEST=none Change-Id: Iefe91fb02a958f40a1ff63c122792a390a545290 Signed-off-by: Jett Rink Reviewed-on: https://chromium-review.googlesource.com/984517 Reviewed-by: Aaron Durbin --- board/yorp/board.c | 82 +++++++++++++++++++++++++++++++++++++++++++++ board/yorp/board.h | 6 ++++ board/yorp/gpio.inc | 3 ++ 3 files changed, 91 insertions(+) diff --git a/board/yorp/board.c b/board/yorp/board.c index c7a9a3e56c..055708e460 100644 --- a/board/yorp/board.c +++ b/board/yorp/board.c @@ -84,6 +84,12 @@ const struct adc_t adc_channels[] = { /* Vbus C1 sensing (10x voltage divider). PPVAR_USB_C1_VBUS */ [ADC_VBUS_C1] = { "VBUS_C1", NPCX_ADC_CH9, ADC_MAX_VOLT*10, ADC_READ_MAX+1, 0}, + /* Board ID 1. Least Significant nibble */ + [ADC_BRD_ID1] = { + "BRD_ID1", NPCX_ADC_CH6, ADC_MAX_VOLT, ADC_READ_MAX+1, 0}, + /* Board ID 2. Most Significant nibble */ + [ADC_BRD_ID2] = { + "BRD_ID2", NPCX_ADC_CH7, ADC_MAX_VOLT, ADC_READ_MAX+1, 0}, }; BUILD_ASSERT(ARRAY_SIZE(adc_channels) == ADC_CH_COUNT); @@ -259,6 +265,82 @@ uint16_t tcpc_get_alert_status(void) return status; } +static const int UNKNOWN_BRD_ID = -1; +static const int board_id_thresh_mv[] = { + /* Vin = 3.3V, Ideal voltage, R2 values listed below */ + /* R1 = 51.1 kOhm */ + 200, /* 124 mV, 2.0 Kohm */ + 366, /* 278 mV, 4.7 Kohm */ + 550, /* 456 mV, 8.2 Kohm */ + 752, /* 644 mV, 12.4 Kohm */ + 927, /* 860 mV, 18.0 Kohm */ + 1073, /* 993 mV, 22.0 Kohm */ + 1235, /* 1152 mV, 27.4 Kohm */ + 1386, /* 1318 mV, 34.0 Kohm */ + 1552, /* 1453 mV, 40.2 Kohm */ + /* R1 = 10.0 kOhm */ + 1739, /* 1650 mV, 10.0 Kohm */ + 1976, /* 1827 mV, 12.4 Kohm */ + 2197, /* 2121 mV, 18.0 Kohm */ + 2344, /* 2269 mV, 22.0 Kohm */ + 2484, /* 2418 mV, 27.4 Kohm */ + 2636, /* 2550 mV, 34.0 Kohm */ + 2823, /* 2721 mV, 47.0 Kohm */ +}; + +static int read_board_id_adc(enum adc_channel chan) +{ + int mv; + int i; + + mv = adc_read_channel(chan); + cprints(CC_SYSTEM, "BOARD ID ADC %d = %d mV", + chan == ADC_BRD_ID1 ? 1 : 2, mv); + + if (mv == ADC_READ_ERROR) + return UNKNOWN_BRD_ID; + + for (i = 0; i < ARRAY_SIZE(board_id_thresh_mv); i++) + if (mv < board_id_thresh_mv[i]) + return i; + + return UNKNOWN_BRD_ID; +} + + +int board_get_version(void) +{ + static int version = UNKNOWN_BRD_ID; + int level; + + if (version != UNKNOWN_BRD_ID) + return version; + + /* Enabled Board ID circuit and wait for it to stabilize. */ + gpio_set_level(GPIO_EC_BRD_ID_EN, 1); + msleep(1); + + level = read_board_id_adc(ADC_BRD_ID1); + if (level == UNKNOWN_BRD_ID) + goto error; + version = level & 0x0F; + + level = read_board_id_adc(ADC_BRD_ID2); + if (level == UNKNOWN_BRD_ID) + goto error; + version = version | ((level & 0x0F) << 4); + + gpio_set_level(GPIO_EC_BRD_ID_EN, 0); + cprints(CC_SYSTEM, "Board version: %d", version); + return version; + +error: + gpio_set_level(GPIO_EC_BRD_ID_EN, 0); + cprints(CC_SYSTEM, "Board version unknown!"); + version = UNKNOWN_BRD_ID; + return version; +} + /* Motion sensors */ /* Mutexes */ static struct mutex g_lid_mutex; diff --git a/board/yorp/board.h b/board/yorp/board.h index a096f1e88e..d0bb7ddc11 100644 --- a/board/yorp/board.h +++ b/board/yorp/board.h @@ -30,6 +30,8 @@ #define CONFIG_VBOOT_HASH #define CONFIG_VSTORE #define CONFIG_VSTORE_SLOT_COUNT 1 +#define CONFIG_BOARD_VERSION +#define CONFIG_BOARD_SPECIFIC_VERSION /* EC console commands */ #define CONFIG_CMD_ACCELS @@ -141,6 +143,8 @@ enum adc_channel { ADC_VBUS_C0, ADC_VBUS_C1, + ADC_BRD_ID1, + ADC_BRD_ID2, ADC_CH_COUNT }; @@ -170,7 +174,9 @@ enum sensor_id { SENSOR_COUNT }; +/* Forward declare board-specific functions */ void board_reset_pd_mcu(void); +int board_get_version(void); #endif /* !__ASSEMBLER__ */ diff --git a/board/yorp/gpio.inc b/board/yorp/gpio.inc index fd095867e9..18661472ca 100644 --- a/board/yorp/gpio.inc +++ b/board/yorp/gpio.inc @@ -106,6 +106,9 @@ GPIO(USB_C1_HPD_1V8_ODL, PIN(C, 6), GPIO_ODR_HIGH | /* C1 DP Hotplug Detect */ GPIO(BAT_LED_ORANGE_L, PIN(C, 3), GPIO_OUT_HIGH) /* LED_1_L */ GPIO(BAT_LED_BLUE_L, PIN(C, 4), GPIO_OUT_HIGH) /* LED_2_L */ +/* Board IDs */ +GPIO(EC_BRD_ID_EN, PIN(9, 6), GPIO_OUT_LOW) + /* Alternate functions GPIO definitions */ /* Cr50 requires no pull-ups on UART pins. */ ALTERNATE(PIN_MASK(6, 0x30), 0, MODULE_UART, 0) /* UART from EC to Servo */