diff options
-rw-r--r-- | board/edgar/board.c | 53 | ||||
-rw-r--r-- | board/edgar/board.h | 6 |
2 files changed, 58 insertions, 1 deletions
diff --git a/board/edgar/board.c b/board/edgar/board.c index 6a33fb5cd2..229bc02ed4 100644 --- a/board/edgar/board.c +++ b/board/edgar/board.c @@ -27,6 +27,7 @@ #include "thermal.h" #include "uart.h" #include "util.h" +#include "adc_chip.h" #define GPIO_KB_INPUT (GPIO_INPUT | GPIO_PULL_UP) #define GPIO_KB_OUTPUT (GPIO_ODR_HIGH) @@ -34,6 +35,8 @@ #include "gpio_list.h" +static int adc_get_val(int idx, int *temp_ptr); + /* power signal list. Must match order of enum power_signal. */ const struct power_signal_info power_signal_list[] = { {GPIO_ALL_SYS_PGOOD, 1, "ALL_SYS_PWRGD"}, @@ -43,6 +46,11 @@ const struct power_signal_info power_signal_list[] = { }; BUILD_ASSERT(ARRAY_SIZE(power_signal_list) == POWER_SIGNAL_COUNT); +const struct adc_t adc_channels[] = { + {"ADC0", 1, 1, 0, 0}, +}; +BUILD_ASSERT(ARRAY_SIZE(adc_channels) == ADC_CH_COUNT); + const struct i2c_port_t i2c_ports[] = { {"batt_chg", MEC1322_I2C0_0, 100, GPIO_I2C_PORT0_0_SCL, GPIO_I2C_PORT0_0_SDA}, @@ -69,6 +77,8 @@ const struct temp_sensor_t temp_sensors[] = { TMP432_IDX_REMOTE1, 4}, {"TMP432_Sensor_2", TEMP_SENSOR_TYPE_BOARD, tmp432_get_val, TMP432_IDX_REMOTE2, 4}, + {"ADC_Sensor_1", TEMP_SENSOR_TYPE_BOARD, adc_get_val, + ADC_CH_0, 4}, {"Battery", TEMP_SENSOR_TYPE_BATTERY, charge_temp_sensor_get_val, 0, 4}, }; @@ -81,6 +91,7 @@ struct ec_thermal_config thermal_params[] = { {{0, 0, 0}, 0, 0}, /* TMP432_Internal */ {{0, 0, 0}, 0, 0}, /* TMP432_Sensor_1 */ {{0, 0, 0}, 0, 0}, /* TMP432_Sensor_2 */ + {{0, 0, 0}, 0, 0}, /* ADC_Sensor_1 */ {{0, 0, 0}, 0, 0}, /* Battery Sensor */ }; BUILD_ASSERT(ARRAY_SIZE(thermal_params) == TEMP_SENSOR_COUNT); @@ -92,3 +103,45 @@ static void adc_pre_init(void) gpio_config_module(MODULE_ADC, 1); } DECLARE_HOOK(HOOK_INIT, adc_pre_init, HOOK_PRIO_INIT_ADC - 1); + +static const int adc_temp[] = { + 158780, 150690, 143060, 135870, 129070, 122660, 116600, 110870, + 105450, 100330, 95488, 90904, 86565, 82456, 78565, 74878, + 71384, 68071, 64930, 61951, 59124, 56442, 53895, 51478, + 49181, 47000, 44927, 42957, 41084, 39303, 37609, 35997, + 34463, 33004, 31614, 30290, 29029, 27828, 26683, 25592, + 24551, 23559, 22613, 21710, 20848, 20025, 19239, 18489, + 17772, 17087, 16432, 15807, 15208, 14636, 14088, 13564, + 13063, 12582, 12123, 11682, 11260, 10856, 10468, 10097, + 9704, 9398, 9070, 8756, 8454, 8164, 7885, 7618, + 7361, 7114, 6876, 6648, 6429, 6217, 6014, 5819, + 5631, 5450, 5276, 5108, 4947, 4791, 4641, 4496, + 4357, 4223, 4093, 3968, 3848, 3732, 3620, 3511, + 3407, 3306, 3209, 3115, 3024, 2936, 2851, 2769, +}; + +static int adc_get_val(int idx, int *temp_ptr) +{ + int head, tail, mid; + int voltage_value = adc_read_channel(idx); + int ohm_value = (voltage_value == 1023) + ? 158780 : (24900 * voltage_value) / (1023 - voltage_value); + + /* Binary search to find proper table entry */ + head = 0; + tail = ARRAY_SIZE(adc_temp)-1; + while (head != tail) { + mid = (head + tail) / 2; + if (adc_temp[mid] >= ohm_value && + adc_temp[mid+1] < ohm_value) + break; + if (adc_temp[mid] > ohm_value) + head = mid + 1; + else + tail = mid; + } + + /* Offset 3 dergee */ + *temp_ptr = C_TO_K(mid) + 3; + return EC_SUCCESS; +} diff --git a/board/edgar/board.h b/board/edgar/board.h index e18a1ab87d..a4cd6e3328 100644 --- a/board/edgar/board.h +++ b/board/edgar/board.h @@ -62,6 +62,7 @@ #define CONFIG_LED_COMMON #define CONFIG_I2C +#define CONFIG_ADC /* Wireless signals */ #define WIRELESS_GPIO_WLAN GPIO_WLAN_OFF_L @@ -72,7 +73,6 @@ #undef CONFIG_PSTORE #undef CONFIG_PECI #undef CONFIG_FANS -#undef CONFIG_ADC #ifndef __ASSEMBLER__ #include "gpio_signal.h" @@ -85,6 +85,8 @@ /* ADC signal */ enum adc_channel { + ADC_CH_0 = 0, + /* Number of ADC channels */ ADC_CH_COUNT }; @@ -105,6 +107,8 @@ enum temp_sensor_id { TEMP_SENSOR_I2C_TMP432_LOCAL, TEMP_SENSOR_I2C_TMP432_REMOTE1, TEMP_SENSOR_I2C_TMP432_REMOTE2, + /* ADC Sensors */ + TEMP_SENSOR_ADC_SENSOR1, /* Battery temperature sensor */ TEMP_SENSOR_BATTERY, |