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);
> > +}
>

Reply via email to