2222#include "hal_i2c.h"
2323#include "pmbus.h"
2424#include "mp2971.h"
25+ #include "util_pmbus.h"
2526
2627LOG_MODULE_REGISTER (mp2971 );
2728
@@ -718,7 +719,7 @@ bool mp2971_get_checksum(uint8_t bus, uint8_t addr, uint32_t *checksum)
718719 return true;
719720}
720721
721- bool get_vout_scale (sensor_cfg * cfg , float * vout_scale )
722+ bool get_vout_scale (const sensor_cfg * cfg , float * vout_scale )
722723{
723724 CHECK_NULL_ARG_WITH_RETURN (vout_scale , false);
724725 uint8_t i2c_max_retry = 5 ;
@@ -749,7 +750,7 @@ float get_resolution(sensor_cfg *cfg)
749750
750751 bool vout_scale_enable = false;
751752 if (cfg -> init_args != NULL ) {
752- mp2971_init_arg * init_arg = (mp2971_init_arg * )cfg -> init_args ;
753+ const mp2971_init_arg * init_arg = (mp2971_init_arg * )cfg -> init_args ;
753754 vout_scale_enable = init_arg -> vout_scale_enable ;
754755 }
755756
@@ -906,6 +907,9 @@ float get_resolution(sensor_cfg *cfg)
906907 pout_reso = pout_reso / vout_scale ;
907908 return pout_reso ;
908909 break ;
910+ case PMBUS_READ_VIN :
911+ return 0.03125 ; // 1/32V per LSB
912+ break ;
909913 default :
910914 LOG_WRN ("offset not supported: 0x%x" , offset );
911915 break ;
@@ -922,7 +926,7 @@ bool mp2971_vid_to_direct(sensor_cfg *cfg, uint8_t rail, uint16_t *millivolt)
922926 float vout_scale = 1.0 ;
923927
924928 if (cfg -> init_args != NULL ) {
925- mp2971_init_arg * init_arg = (mp2971_init_arg * )cfg -> init_args ;
929+ const mp2971_init_arg * init_arg = (mp2971_init_arg * )cfg -> init_args ;
926930 if (init_arg -> vout_scale_enable ) {
927931 if (get_vout_scale (cfg , & vout_scale ) == false)
928932 LOG_WRN ("get vout scale failed" );
@@ -1011,7 +1015,7 @@ bool mp2971_direct_to_vid(sensor_cfg *cfg, uint8_t rail, uint16_t *millivolt)
10111015 float vout_scale = 1.0 ;
10121016
10131017 if (cfg -> init_args != NULL ) {
1014- mp2971_init_arg * init_arg = (mp2971_init_arg * )cfg -> init_args ;
1018+ const mp2971_init_arg * init_arg = (mp2971_init_arg * )cfg -> init_args ;
10151019 if (init_arg -> vout_scale_enable ) {
10161020 if (get_vout_scale (cfg , & vout_scale ) == false)
10171021 LOG_WRN ("get vout scale failed" );
@@ -1277,6 +1281,7 @@ uint8_t mp2971_read(sensor_cfg *cfg, int *reading)
12771281
12781282 uint8_t i2c_max_retry = 5 ;
12791283 int val = 0 ;
1284+ float f_val = 0.0 ;
12801285 sensor_val * sval = (sensor_val * )reading ;
12811286 I2C_MSG msg ;
12821287 memset (sval , 0 , sizeof (sensor_val ));
@@ -1312,6 +1317,11 @@ uint8_t mp2971_read(sensor_cfg *cfg, int *reading)
13121317 case PMBUS_READ_POUT :
13131318 val = val & BIT_MASK (11 );
13141319 break ;
1320+ case PMBUS_READ_VIN :
1321+ val = val & BIT_MASK (9 );
1322+ f_val = slinear11_to_float ((uint16_t )val );
1323+ val = (uint16_t )f_val ;
1324+ break ;
13151325 default :
13161326 LOG_WRN ("offset not supported: 0x%x" , offset );
13171327 return SENSOR_FAIL_TO_ACCESS ;
0 commit comments