yorp: Enable temperature sensors

BUG=b:77944804
BRANCH=None
TEST=On yorp; test adc values, verify they are valid.

Change-Id: I64191f33c594d8869391bab813902f59a63d2ea1
Signed-off-by: Divya Sasidharan <divya.s.sasidharan@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/1018118
Commit-Ready: Divya Sasidharan <divya.s.sasidharan@intel.corp-partner.google.com>
Tested-by: Divya Sasidharan <divya.s.sasidharan@intel.corp-partner.google.com>
Reviewed-by: Jett Rink <jettrink@chromium.org>
This commit is contained in:
Divya Sasidharan
2018-04-18 15:28:42 -07:00
committed by chrome-bot
parent 6782985535
commit dc875f284f
3 changed files with 105 additions and 3 deletions

View File

@@ -31,6 +31,8 @@
#include "power_button.h"
#include "switch.h"
#include "system.h"
#include "temp_sensor.h"
#include "thermistor.h"
#include "tcpci.h"
#include "usb_mux.h"
#include "usbc_ppc.h"
@@ -83,6 +85,10 @@ const int hibernate_wake_pins_used = ARRAY_SIZE(hibernate_wake_pins);
/* ADC channels */
const struct adc_t adc_channels[] = {
[ADC_TEMP_SENSOR_AMB] = {
"TEMP_AMB", NPCX_ADC_CH0, ADC_MAX_VOLT, ADC_READ_MAX+1, 0},
[ADC_TEMP_SENSOR_CHARGER] = {
"TEMP_CHARGER", NPCX_ADC_CH1, ADC_MAX_VOLT, ADC_READ_MAX+1, 0},
/* Vbus C0 sensing (10x voltage divider). PPVAR_USB_C0_VBUS */
[ADC_VBUS_C0] = {
"VBUS_C0", NPCX_ADC_CH4, ADC_MAX_VOLT*10, ADC_READ_MAX+1, 0},
@@ -129,6 +135,92 @@ const int usb_port_enable[USB_PORT_COUNT] = {
/* TODO(b/74388692): Add second port control after hardware fix. */
};
/*
* Data derived from Seinhart-Hart equation in a resistor divider circuit with
* Vdd=3300mV, R = 13.7Kohm, and Murata NCP15WB-series thermistor (B = 4050,
* T0 = 298.15, nominal resistance (R0) = 47Kohm).
*/
#define CHARGER_THERMISTOR_SCALING_FACTOR 13
static const struct thermistor_data_pair charger_thermistor_data[] = {
{ 3044 / CHARGER_THERMISTOR_SCALING_FACTOR, 0 },
{ 2890 / CHARGER_THERMISTOR_SCALING_FACTOR, 10 },
{ 2680 / CHARGER_THERMISTOR_SCALING_FACTOR, 20 },
{ 2418 / CHARGER_THERMISTOR_SCALING_FACTOR, 30 },
{ 2117 / CHARGER_THERMISTOR_SCALING_FACTOR, 40 },
{ 1800 / CHARGER_THERMISTOR_SCALING_FACTOR, 50 },
{ 1490 / CHARGER_THERMISTOR_SCALING_FACTOR, 60 },
{ 1208 / CHARGER_THERMISTOR_SCALING_FACTOR, 70 },
{ 966 / CHARGER_THERMISTOR_SCALING_FACTOR, 80 },
{ 860 / CHARGER_THERMISTOR_SCALING_FACTOR, 85 },
{ 766 / CHARGER_THERMISTOR_SCALING_FACTOR, 90 },
{ 679 / CHARGER_THERMISTOR_SCALING_FACTOR, 95 },
{ 603 / CHARGER_THERMISTOR_SCALING_FACTOR, 100 },
};
static const struct thermistor_info charger_thermistor_info = {
.scaling_factor = CHARGER_THERMISTOR_SCALING_FACTOR,
.num_pairs = ARRAY_SIZE(charger_thermistor_data),
.data = charger_thermistor_data,
};
int board_get_charger_temp(int idx, int *temp_ptr)
{
int mv = adc_read_channel(NPCX_ADC_CH1);
if (mv < 0)
return EC_ERROR_UNKNOWN;
*temp_ptr = thermistor_linear_interpolate(mv, &charger_thermistor_info);
*temp_ptr = C_TO_K(*temp_ptr);
return EC_SUCCESS;
}
/*
* Data derived from Seinhart-Hart equation in a resistor divider circuit with
* Vdd=3300mV, R = 51.1Kohm, and Murata NCP15WB-series thermistor (B = 4050,
* T0 = 298.15, nominal resistance (R0) = 47Kohm).
*/
#define AMB_THERMISTOR_SCALING_FACTOR 11
static const struct thermistor_data_pair amb_thermistor_data[] = {
{ 2512 / AMB_THERMISTOR_SCALING_FACTOR, 0 },
{ 2158 / AMB_THERMISTOR_SCALING_FACTOR, 10 },
{ 1772 / AMB_THERMISTOR_SCALING_FACTOR, 20 },
{ 1398 / AMB_THERMISTOR_SCALING_FACTOR, 30 },
{ 1070 / AMB_THERMISTOR_SCALING_FACTOR, 40 },
{ 803 / AMB_THERMISTOR_SCALING_FACTOR, 50 },
{ 597 / AMB_THERMISTOR_SCALING_FACTOR, 60 },
{ 443 / AMB_THERMISTOR_SCALING_FACTOR, 70 },
{ 329 / AMB_THERMISTOR_SCALING_FACTOR, 80 },
{ 285 / AMB_THERMISTOR_SCALING_FACTOR, 85 },
{ 247 / AMB_THERMISTOR_SCALING_FACTOR, 90 },
{ 214 / AMB_THERMISTOR_SCALING_FACTOR, 95 },
{ 187 / AMB_THERMISTOR_SCALING_FACTOR, 100 },
};
static const struct thermistor_info amb_thermistor_info = {
.scaling_factor = AMB_THERMISTOR_SCALING_FACTOR,
.num_pairs = ARRAY_SIZE(amb_thermistor_data),
.data = amb_thermistor_data,
};
int board_get_ambient_temp(int idx, int *temp_ptr)
{
int mv = adc_read_channel(NPCX_ADC_CH0);
if (mv < 0)
return EC_ERROR_UNKNOWN;
*temp_ptr = thermistor_linear_interpolate(mv, &amb_thermistor_info);
*temp_ptr = C_TO_K(*temp_ptr);
return EC_SUCCESS;
}
const struct temp_sensor_t temp_sensors[] = {
{"Ambient", TEMP_SENSOR_TYPE_BOARD, board_get_ambient_temp, 0, 5},
{"Charger", TEMP_SENSOR_TYPE_BOARD, board_get_charger_temp, 1, 1},
};
BUILD_ASSERT(ARRAY_SIZE(temp_sensors) == TEMP_SENSOR_COUNT);
/* Called by APL power state machine when transitioning from G3 to S5 */
void chipset_pre_init_callback(void)
{

View File

@@ -147,6 +147,8 @@
#define CONFIG_POWER_BUTTON
#define CONFIG_POWER_BUTTON_X86
#define CONFIG_POWER_PP5000_CONTROL
#define CONFIG_TEMP_SENSOR
#define CONFIG_THERMISTOR_NCP15WB
#define CONFIG_EXTPOWER_GPIO
#undef CONFIG_EXTPOWER_DEBOUNCE_MS
/*
@@ -162,8 +164,10 @@
#include "registers.h"
enum adc_channel {
ADC_VBUS_C0,
ADC_VBUS_C1,
ADC_TEMP_SENSOR_AMB, /* ADC0 */
ADC_TEMP_SENSOR_CHARGER, /* ADC1 */
ADC_VBUS_C0, /* ADC4 */
ADC_VBUS_C1, /* ADC9 */
ADC_CH_COUNT
};
@@ -184,8 +188,13 @@ enum power_signal {
POWER_SIGNAL_COUNT
};
/* Motion sensors */
enum temp_sensor_id {
TEMP_SENSOR_AMBIENT = 0,
TEMP_SENSOR_CHARGER,
TEMP_SENSOR_COUNT
};
/* Motion sensors */
enum sensor_id {
LID_ACCEL,
BASE_ACCEL,

View File

@@ -123,6 +123,7 @@ ALTERNATE(PIN_MASK(8, 0x80), 0, MODULE_I2C, 0) /* I2C1 SDA */
ALTERNATE(PIN_MASK(D, 0x03), 0, MODULE_I2C, 0) /* I2C3 */
ALTERNATE(PIN_MASK(F, 0x0C), 0, MODULE_I2C, 0) /* I2C4 */
ALTERNATE(PIN_MASK(B, 0x0C), 0, MODULE_I2C, 0) /* I2C7 */
ALTERNATE(PIN_MASK(4, 0x30), 0, MODULE_ADC, 0) /* ADC0-1 */
ALTERNATE(PIN_MASK(4, 0x02), 0, MODULE_ADC, 0) /* ADC4: ADC_USB_C0_VBUS */
ALTERNATE(PIN_MASK(F, 0x01), 0, MODULE_ADC, 0) /* ADC9: ADC_USB_C1_VBUS */
ALTERNATE(PIN_MASK(C, 0x18), 0, MODULE_PWM, 0) /* LED 1 & 2 */