blob: c530a221df6b1e1438fff99a511d699acbbc9034 [file] [log] [blame]
/* Copyright 2023 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "pac.h"
#include "dolos_smbus.h"
#include "log.h"
#include "error.h"
#define PAC_SMBUS_ADDRESS 0x10
#define PAC_VOLTAGE_REGISTER 0x0F
#define PAC_CURRENT_REGISTER 0x13
#define PAC_REFRESH_REGISTER 0x00
#define PAC_REFRESH_DELAY 640000
static double voltage_mv, current_ma;
static inline uint16_t swap(uint16_t data)
{
return (data >> 8) | ((data & 0xff) << 8);
}
int pac_init(void)
{
DEBUG("Initializing PAC");
return DOLOS_SUCCESS;
}
int pac_refresh(void)
{
int ret;
uint16_t data;
DEBUG("Refreshing PAC");
ret = dsb_controller_write(PAC_SMBUS_ADDRESS, PAC_REFRESH_REGISTER, NULL, 0);
if (ret) {
DEBUG("Failed to refresh PAC registers %d", ret);
return DOLOS_ERROR_PAC;
}
delay_cycles(PAC_REFRESH_DELAY);
ret = dsb_controller_read_word(PAC_SMBUS_ADDRESS, PAC_VOLTAGE_REGISTER, (uint8_t *)&data);
if (ret) {
DEBUG("Failed to read voltage from PAC %d", ret);
return DOLOS_ERROR_PAC;
}
voltage_mv = (double)swap(data) * 0.488288701f;
ret = dsb_controller_read_word(PAC_SMBUS_ADDRESS, PAC_CURRENT_REGISTER, (uint8_t *)&data);
if (ret) {
DEBUG("Failed to read current from PAC %d", ret);
return DOLOS_ERROR_PAC;
}
current_ma = (double)swap(data) * 1.5259021896696423f;
DEBUG("Voltage :%5.0fmv Current :%5.0fma", voltage_mv, current_ma);
return DOLOS_SUCCESS;
}
uint32_t pac_read_voltage_mv(void)
{
return voltage_mv;
}
uint32_t pac_read_current_ma(void)
{
return current_ma;
}
void pac_print_readings(void)
{
printf("PAC:\r\n");
printf(" Voltage:%5.0fmV\r\n", voltage_mv);
printf(" Current:%5.0fmA\r\n", current_ma);
}