[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 7/7] tmp105: Add temperature QOM property
From: |
Alex Horn |
Subject: |
Re: [Qemu-devel] [PATCH v2 7/7] tmp105: Add temperature QOM property |
Date: |
Sat, 15 Dec 2012 16:52:53 +0000 |
> +static void tmp105_initfn(Object *obj)
> +{
> + object_property_add(obj, "temperature", "int",
> + tmp105_get_temperature,
> + tmp105_set_temperature, NULL, NULL, NULL);
> +}
> +
> static void tmp105_class_init(ObjectClass *klass, void *data)
> {
> DeviceClass *dc = DEVICE_CLASS(klass);
> @@ -234,6 +258,7 @@ static const TypeInfo tmp105_info = {
> .name = TYPE_TMP105,
> .parent = TYPE_I2C_SLAVE,
> .instance_size = sizeof(TMP105State),
> + .instance_init = tmp105_initfn,
> .class_init = tmp105_class_init,
> };
>
> diff --git a/hw/tmp105.h b/hw/tmp105.h
> index c21396f..d218919 100644
> --- a/hw/tmp105.h
> +++ b/hw/tmp105.h
> @@ -44,19 +44,4 @@ typedef struct TMP105State {
> uint8_t alarm;
> } TMP105State;
>
> -/**
> - * tmp105_set:
> - * @i2c: dispatcher to TMP105 hardware model
> - * @temp: temperature with 0.001 centigrades units in the range -40 C to
> +125 C
> - *
> - * Sets the temperature of the TMP105 hardware model.
> - *
> - * Bits 5 and 6 (value 32 and 64) in the register indexed by
> TMP105_REG_CONFIG
> - * determine the precision of the temperature. See Table 8 in the data sheet.
> - *
> - * @see_also: I2C_SLAVE macro
> - * @see_also: http://www.ti.com/lit/gpn/tmp105
> - */
> -void tmp105_set(I2CSlave *i2c, int temp);
Would it be possible to keep the C API? The traditional C API is
useful when a project cannot support QOM. These C APIs also simplify
unit testing and allow QEMU hardware models to be more easily reused
as standalone modules.
With kind regards,
Alex
On 14 December 2012 11:34, Andreas Färber <address@hidden> wrote:
> This obsoletes tmp105_set() and allows for better error handling.
>
> Signed-off-by: Andreas Färber <address@hidden>
> ---
> hw/tmp105.c | 39 ++++++++++++++++++++++++++++++++-------
> hw/tmp105.h | 15 ---------------
> 2 Dateien geändert, 32 Zeilen hinzugefügt(+), 22 Zeilen entfernt(-)
>
> diff --git a/hw/tmp105.c b/hw/tmp105.c
> index a16f538..34c7d24 100644
> --- a/hw/tmp105.c
> +++ b/hw/tmp105.c
> @@ -21,6 +21,7 @@
> #include "hw.h"
> #include "i2c.h"
> #include "tmp105.h"
> +#include "qapi/qapi-visit-core.h"
>
> static void tmp105_interrupt_update(TMP105State *s)
> {
> @@ -51,18 +52,34 @@ static void tmp105_alarm_update(TMP105State *s)
> tmp105_interrupt_update(s);
> }
>
> +static void tmp105_get_temperature(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + TMP105State *s = TMP105(obj);
> + int64_t value = s->temperature;
> +
> + visit_type_int(v, &value, name, errp);
> +}
> +
> /* Units are 0.001 centigrades relative to 0 C. */
> -void tmp105_set(I2CSlave *i2c, int temp)
> +static void tmp105_set_temperature(Object *obj, Visitor *v, void *opaque,
> + const char *name, Error **errp)
> {
> - TMP105State *s = TMP105(i2c);
> + TMP105State *s = TMP105(obj);
>
> - if (temp >= 128000 || temp < -128000) {
> - fprintf(stderr, "%s: values is out of range (%i.%03i C)\n",
> - __FUNCTION__, temp / 1000, temp % 1000);
> - exit(-1);
> + int64_t value;
> +
> + visit_type_int(v, &value, name, errp);
> + if (error_is_set(errp)) {
> + return;
> + }
> + if (value >= 128000 || value < -128000) {
> + error_setg(errp, "value %" PRId64 ".%03" PRIu64 " °C is out of
> range",
> + value / 1000, value % 1000);
> + return;
> }
>
> - s->temperature = ((int16_t) (temp * 0x800 / 128000)) << 4;
> + s->temperature = ((int16_t) (value * 0x800 / 128000)) << 4;
>
> tmp105_alarm_update(s);
> }
> @@ -218,6 +235,13 @@ static int tmp105_init(I2CSlave *i2c)
> return 0;
> }
>
> +static void tmp105_initfn(Object *obj)
> +{
> + object_property_add(obj, "temperature", "int",
> + tmp105_get_temperature,
> + tmp105_set_temperature, NULL, NULL, NULL);
> +}
> +
> static void tmp105_class_init(ObjectClass *klass, void *data)
> {
> DeviceClass *dc = DEVICE_CLASS(klass);
> @@ -234,6 +258,7 @@ static const TypeInfo tmp105_info = {
> .name = TYPE_TMP105,
> .parent = TYPE_I2C_SLAVE,
> .instance_size = sizeof(TMP105State),
> + .instance_init = tmp105_initfn,
> .class_init = tmp105_class_init,
> };
>
> diff --git a/hw/tmp105.h b/hw/tmp105.h
> index c21396f..d218919 100644
> --- a/hw/tmp105.h
> +++ b/hw/tmp105.h
> @@ -44,19 +44,4 @@ typedef struct TMP105State {
> uint8_t alarm;
> } TMP105State;
>
> -/**
> - * tmp105_set:
> - * @i2c: dispatcher to TMP105 hardware model
> - * @temp: temperature with 0.001 centigrades units in the range -40 C to
> +125 C
> - *
> - * Sets the temperature of the TMP105 hardware model.
> - *
> - * Bits 5 and 6 (value 32 and 64) in the register indexed by
> TMP105_REG_CONFIG
> - * determine the precision of the temperature. See Table 8 in the data sheet.
> - *
> - * @see_also: I2C_SLAVE macro
> - * @see_also: http://www.ti.com/lit/gpn/tmp105
> - */
> -void tmp105_set(I2CSlave *i2c, int temp);
> -
> #endif
> --
> 1.7.10.4
>
- [Qemu-devel] [PATCH v2 0/7] I2C libqos and tmp105 qtest support, Andreas Färber, 2012/12/14
- [Qemu-devel] [PATCH v2 2/7] libqtest: Prepare I2C libqos, Andreas Färber, 2012/12/14
- [Qemu-devel] [PATCH v2 6/7] tmp105: QOM'ify, Andreas Färber, 2012/12/14
- [Qemu-devel] [PATCH v2 3/7] tmp105: Split out I2C message constants from header, Andreas Färber, 2012/12/14
- [Qemu-devel] [PATCH v2 4/7] tests: Add tmp105 qtest test case, Andreas Färber, 2012/12/14
- [Qemu-devel] [PATCH v2 1/7] tmp105: Create API for TMP105 temperature sensor, Andreas Färber, 2012/12/14
- [Qemu-devel] [PATCH v2 5/7] tmp105: Fix I2C protocol bug, Andreas Färber, 2012/12/14
- [Qemu-devel] [PATCH v2 7/7] tmp105: Add temperature QOM property, Andreas Färber, 2012/12/14
- Re: [Qemu-devel] [PATCH v2 7/7] tmp105: Add temperature QOM property,
Alex Horn <=