From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43370) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WUf3H-000855-Il for qemu-devel@nongnu.org; Mon, 31 Mar 2014 12:27:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WUf38-0003av-Co for qemu-devel@nongnu.org; Mon, 31 Mar 2014 12:27:11 -0400 Received: from mail-qc0-x235.google.com ([2607:f8b0:400d:c01::235]:51542) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WUf38-0003ae-6X for qemu-devel@nongnu.org; Mon, 31 Mar 2014 12:27:02 -0400 Received: by mail-qc0-f181.google.com with SMTP id e9so9094774qcy.40 for ; Mon, 31 Mar 2014 09:27:01 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Mon, 31 Mar 2014 18:26:35 +0200 Message-Id: <1396283195-6819-8-git-send-email-pbonzini@redhat.com> In-Reply-To: <1396283195-6819-1-git-send-email-pbonzini@redhat.com> References: <1396283195-6819-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH for-2.0 7/7] tmp105-test: test QOM property and precision List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, afaerber@suse.de This lets us add a regression test for the first commit in this series. Signed-off-by: Paolo Bonzini --- tests/tmp105-test.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/tests/tmp105-test.c b/tests/tmp105-test.c index 4e640b4..15ddaf3 100644 --- a/tests/tmp105-test.c +++ b/tests/tmp105-test.c @@ -20,6 +20,14 @@ static I2CAdapter *i2c; +static uint16_t tmp105_get8(I2CAdapter *i2c, uint8_t addr, uint8_t reg) +{ + uint8_t resp[1]; + i2c_send(i2c, addr, ®, 1); + i2c_recv(i2c, addr, resp, 1); + return resp[0]; +} + static uint16_t tmp105_get16(I2CAdapter *i2c, uint8_t addr, uint8_t reg) { uint8_t resp[2]; @@ -56,16 +64,81 @@ static void tmp105_set16(I2CAdapter *i2c, uint8_t addr, uint8_t reg, g_assert_cmphex(resp[1], ==, cmd[2]); } +static int qmp_tmp105_get_temperature(const char *id) +{ + QDict *response; + int ret; + response = qmp("{ 'execute': 'qom-get', 'arguments': { 'path': '%s', " + "'property': 'temperature' } }", id); + g_assert(qdict_haskey(response, "return")); + ret = qdict_get_int(response, "return"); + QDECREF(response); + return ret; +} + +static void qmp_tmp105_set_temperature(const char *id, int value) +{ + QDict *response; + + response = qmp("{ 'execute': 'qom-set', 'arguments': { 'path': '%s', " + "'property': 'temperature', 'value': %d } }", id, value); + g_assert(qdict_haskey(response, "return")); + QDECREF(response); +} + +#define TMP105_PRECISION (1000/16) static void send_and_receive(void) { uint16_t value; - value = tmp105_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_TEMPERATURE); + value = qmp_tmp105_get_temperature(TMP105_TEST_ID); g_assert_cmpuint(value, ==, 0); - /* reset */ - tmp105_set8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG, 0); + value = tmp105_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_TEMPERATURE); + g_assert_cmphex(value, ==, 0); + + qmp_tmp105_set_temperature(TMP105_TEST_ID, 20000); + value = qmp_tmp105_get_temperature(TMP105_TEST_ID); + g_assert_cmpuint(value, ==, 20000); + + value = tmp105_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_TEMPERATURE); + g_assert_cmphex(value, ==, 0x1400); + + qmp_tmp105_set_temperature(TMP105_TEST_ID, 20938); /* 20 + 15/16 */ + value = qmp_tmp105_get_temperature(TMP105_TEST_ID); + g_assert_cmpuint(value, >=, 20938 - TMP105_PRECISION/2); + g_assert_cmpuint(value, <, 20938 + TMP105_PRECISION/2); + + /* Set config */ + tmp105_set8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG, 0x60); + value = tmp105_get8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG); + g_assert_cmphex(value, ==, 0x60); + + value = tmp105_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_TEMPERATURE); + g_assert_cmphex(value, ==, 0x14f0); + + /* Set precision to 9, 10, 11 bits. */ + tmp105_set8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG, 0x00); + value = tmp105_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_TEMPERATURE); + g_assert_cmphex(value, ==, 0x1480); + + tmp105_set8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG, 0x20); + value = tmp105_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_TEMPERATURE); + g_assert_cmphex(value, ==, 0x14c0); + + tmp105_set8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG, 0x40); + value = tmp105_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_TEMPERATURE); + g_assert_cmphex(value, ==, 0x14e0); + + /* stored precision remains the same */ + value = qmp_tmp105_get_temperature(TMP105_TEST_ID); + g_assert_cmpuint(value, >=, 20938 - TMP105_PRECISION/2); + g_assert_cmpuint(value, <, 20938 + TMP105_PRECISION/2); + + tmp105_set8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG, 0x60); + value = tmp105_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_TEMPERATURE); + g_assert_cmphex(value, ==, 0x14f0); tmp105_set16(i2c, TMP105_TEST_ADDR, TMP105_REG_T_LOW, 0x1234); tmp105_set16(i2c, TMP105_TEST_ADDR, TMP105_REG_T_HIGH, 0x4231); -- 1.9.0