Thanks for your comment! We'll incorporate them into our next patch version.
We plan to let the user use QOM get/set QMP commands to control ADC/PWM values, similar to hw/misc/tmp105.c. The user can set a voltage value as input using QOM-set, and the QEMU guest can read the converted value through this module. Similar for PWM, the user can read the duty-cycle and frequency using QOM-get. The user can also run a third-party simulator and alter these values during execution. Our test code also shows how to deal with these values. If you have a better suggestion, please let us know. On Sun, Dec 13, 2020 at 3:47 AM Philippe Mathieu-Daudé <f4...@amsat.org> wrote: > On 12/11/20 11:22 PM, Hao Wu via wrote: > > The ADC is part of NPCM7XX Module. Its behavior is controled by the > > ADC_CON register. It converts one of the eight analog inputs into a > > digital input and stores it in the ADC_DATA register when enabled. > > > > Reviewed-by: Havard Skinnemoen <hskinnem...@google.com> > > Reviewed-by: Tyrone Ting <kft...@nuvoton.com> > > Signed-off-by: Hao Wu <wuhao...@google.com> > > --- > > docs/system/arm/nuvoton.rst | 2 +- > > hw/adc/meson.build | 1 + > > hw/adc/npcm7xx_adc.c | 318 ++++++++++++++++++++++++++ > > hw/arm/npcm7xx.c | 24 +- > > include/hw/adc/npcm7xx_adc.h | 72 ++++++ > > include/hw/arm/npcm7xx.h | 2 + > > tests/qtest/meson.build | 3 +- > > tests/qtest/npcm7xx_adc-test.c | 400 +++++++++++++++++++++++++++++++++ > > 8 files changed, 819 insertions(+), 3 deletions(-) > > create mode 100644 hw/adc/npcm7xx_adc.c > > create mode 100644 include/hw/adc/npcm7xx_adc.h > > create mode 100644 tests/qtest/npcm7xx_adc-test.c > ... > > > +static void npcm7xx_adc_init(Object *obj) > > +{ > > + NPCM7xxADCState *s = NPCM7XX_ADC(obj); > > + SysBusDevice *sbd = &s->parent; > > + int i; > > + > > + sysbus_init_irq(sbd, &s->irq); > > + > > + timer_init_ns(&s->conv_timer, QEMU_CLOCK_VIRTUAL, > > + npcm7xx_adc_convert_done, s); > > + timer_init_ns(&s->reset_timer, QEMU_CLOCK_VIRTUAL, > > + npcm7xx_adc_reset_done, s); > > + memory_region_init_io(&s->iomem, obj, &npcm7xx_adc_ops, s, > > + TYPE_NPCM7XX_ADC, 4 * KiB); > > + sysbus_init_mmio(sbd, &s->iomem); > > + s->clock = qdev_init_clock_in(DEVICE(s), "clock", NULL, NULL); > > + > > + for (i = 0; i < NPCM7XX_ADC_NUM_INPUTS; ++i) { > > + object_property_add_uint32_ptr(obj, "adci[*]", > > + &s->adci[i], OBJ_PROP_FLAG_WRITE); > > How do you use this, any example? > > FWIW I'm experimenting with other ADC to use the "audio/audio.h" > API (which is not voice/audio specific, but generic DSP), then > I can pass any QEMU source and consume it using AUD_read() to fill > the ADC buffer (device sram or in main ram). > > But I'm doing that alone during my free time, so don't expect it > any time soon :( > > > + } > > + object_property_add_uint32_ptr(obj, "vref", > > + &s->vref, OBJ_PROP_FLAG_WRITE); > > + npcm7xx_adc_calibrate(s); > > +} >