Reviewed-by: Glenn Miles <[email protected]> Thanks,
Glenn On Mon, 2026-10-12 at 16:32 +0200, Emmanuel Blot via qemu development wrote: > Add coverage for the ADC_CONFIG MODE field: shutdown modes perform no > conversion and leave the measurement registers and CNVRF untouched, > triggered modes convert once per ADC_CONFIG write, and continuous > channel-select modes refresh only the enabled measurement registers. > > Signed-off-by: Emmanuel Blot <[email protected]> > --- > tests/qtest/ina238-test.c | 70 > +++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 70 insertions(+) > > diff --git a/tests/qtest/ina238-test.c b/tests/qtest/ina238-test.c > index 74912424c0..fb7bcc265c 100644 > --- a/tests/qtest/ina238-test.c > +++ b/tests/qtest/ina238-test.c > @@ -304,6 +304,73 @@ static void test_adcrange(void *obj, void *data, > QGuestAllocator *alloc) > g_assert_cmphex(i2c_get16(dev, REG_CURRENT), ==, 0x1F40); > } > > +/* Shutdown converts nothing: registers are held, CNVRF stays clear. */ > +static void test_mode_shutdown(void *obj, void *data, QGuestAllocator *alloc) > +{ > + QI2CDevice *dev = (QI2CDevice *)obj; > + > + i2c_set16(dev, REG_CONFIG, CONFIG_RST); > + i2c_set16(dev, REG_SHUNT_CAL, 0x1000); > + qmp_ina238_set("shunt-voltage", 20000000); > + qmp_ina238_set("bus-voltage", 12000000); > + g_assert_cmphex(i2c_get16(dev, REG_VSHUNT), ==, 0x0FA0); > + g_assert_cmphex(i2c_get16(dev, REG_VBUS), ==, 0x0F00); > + > + /* Clear CNVRF, then enter shutdown (MODE = 0). */ > + (void)i2c_get16(dev, REG_DIAG_ALRT); > + i2c_set16(dev, REG_ADC_CONFIG, 0x0000); > + > + /* Injecting while shut down performs no conversion: registers are held. > */ > + qmp_ina238_set("shunt-voltage", 40000000); > + qmp_ina238_set("bus-voltage", 24000000); > + g_assert_cmphex(i2c_get16(dev, REG_VSHUNT), ==, 0x0FA0); > + g_assert_cmphex(i2c_get16(dev, REG_VBUS), ==, 0x0F00); > + > + /* No conversion completed, so CNVRF stays clear. */ > + g_assert_cmphex(i2c_get16(dev, REG_DIAG_ALRT) & DIAG_CNVRF, ==, 0); > +} > + > +/* Triggered modes convert once per ADC_CONFIG write. */ > +static void test_mode_triggered(void *obj, void *data, QGuestAllocator > *alloc) > +{ > + QI2CDevice *dev = (QI2CDevice *)obj; > + > + i2c_set16(dev, REG_CONFIG, CONFIG_RST); > + i2c_set16(dev, REG_SHUNT_CAL, 0x1000); > + qmp_ina238_set("shunt-voltage", 20000000); > + > + /* Enter triggered bus+shunt+temp mode: one conversion. */ > + i2c_set16(dev, REG_ADC_CONFIG, 0x7000); > + g_assert_cmphex(i2c_get16(dev, REG_VSHUNT), ==, 0x0FA0); > + > + /* A new input does not convert until the next trigger. */ > + qmp_ina238_set("shunt-voltage", 40000000); > + g_assert_cmphex(i2c_get16(dev, REG_VSHUNT), ==, 0x0FA0); > + > + /* Re-triggering with another ADC_CONFIG write samples the new input. */ > + i2c_set16(dev, REG_ADC_CONFIG, 0x7000); > + g_assert_cmphex(i2c_get16(dev, REG_VSHUNT), ==, 0x1F40); > +} > + > +/* A bus-only mode refreshes the bus register alone; the rest are held. */ > +static void test_mode_channels(void *obj, void *data, QGuestAllocator *alloc) > +{ > + QI2CDevice *dev = (QI2CDevice *)obj; > + > + i2c_set16(dev, REG_CONFIG, CONFIG_RST); > + i2c_set16(dev, REG_SHUNT_CAL, 0x1000); > + qmp_ina238_set("shunt-voltage", 20000000); > + qmp_ina238_set("bus-voltage", 12000000); > + > + /* Continuous bus-only mode. */ > + i2c_set16(dev, REG_ADC_CONFIG, 0x9000); > + qmp_ina238_set("shunt-voltage", 40000000); > + qmp_ina238_set("bus-voltage", 24000000); > + > + g_assert_cmphex(i2c_get16(dev, REG_VSHUNT), ==, 0x0FA0); > + g_assert_cmphex(i2c_get16(dev, REG_VBUS), ==, 0x1E00); > +} > + > /* Clamping at full scale and the MATHOF flag */ > static void test_overflow(void *obj, void *data, QGuestAllocator *alloc) > { > @@ -548,6 +615,9 @@ static void ina238_register_nodes(void) > qos_add_test("power", "ina238", test_power, NULL); > qos_add_test("zero-cal", "ina238", test_zero_cal, NULL); > qos_add_test("adcrange", "ina238", test_adcrange, NULL); > + qos_add_test("mode-shutdown", "ina238", test_mode_shutdown, NULL); > + qos_add_test("mode-triggered", "ina238", test_mode_triggered, NULL); > + qos_add_test("mode-channels", "ina238", test_mode_channels, NULL); > qos_add_test("overflow", "ina238", test_overflow, NULL); > qos_add_test("alert-shunt", "ina238", test_alert_shunt, NULL); > qos_add_test("alert-bus", "ina238", test_alert_bus, NULL); >
