]> git.proxmox.com Git - mirror_qemu.git/commitdiff
libqos: move common i2c code to libqos
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 18 Mar 2019 14:09:51 +0000 (15:09 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 3 Jun 2019 12:03:01 +0000 (14:03 +0200)
The functions to read/write 8-bit or 16-bit registers are the same
in tmp105 and pca9552 tests, and in fact they are a special case of
"read block"/"write block" functionality; read block in turn is used
in ds1338-test.

Move everything inside libqos-test, removing the duplication.  Account
for the small differences by adding to tmp105-test.c the "read register
after writing" behavior that is specific to it.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
tests/ds1338-test.c
tests/libqos/i2c.c
tests/libqos/i2c.h
tests/pca9552-test.c
tests/tmp105-test.c

index 742dad911328af732d1d188019eb9c15514830f3..88f829f241c567e05ddf43920bb45e7321d4282c 100644 (file)
@@ -35,17 +35,11 @@ static inline uint8_t bcd2bin(uint8_t x)
 
 static void send_and_receive(void)
 {
-    uint8_t cmd[1];
     uint8_t resp[7];
     time_t now = time(NULL);
     struct tm *tm_ptr = gmtime(&now);
 
-    /* reset the index in the RTC memory */
-    cmd[0] = 0;
-    i2c_send(i2c, addr, cmd, 1);
-
-    /* retrieve the date */
-    i2c_recv(i2c, addr, resp, 7);
+    i2c_read_block(i2c, addr, 0, resp, sizeof(resp));
 
     /* check retrieved time againt local time */
     g_assert_cmpuint(bcd2bin(resp[4]), == , tm_ptr->tm_mday);
index 23bc2a3eb2219935fbf51e41ecdd9673ab9f9dd0..daf9a96617c8deead3042775a5799ff3c50a8d8e 100644 (file)
@@ -21,3 +21,50 @@ void i2c_recv(I2CAdapter *i2c, uint8_t addr,
 {
     i2c->recv(i2c, addr, buf, len);
 }
+
+void i2c_read_block(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
+                       uint8_t *buf, uint16_t len)
+{
+    i2c_send(i2c, addr, &reg, 1);
+    i2c_recv(i2c, addr, buf, len);
+}
+
+void i2c_write_block(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
+                     const uint8_t *buf, uint16_t len)
+{
+    uint8_t *cmd = g_malloc(len + 1);
+    cmd[0] = reg;
+    memcpy(&cmd[1], buf, len);
+    i2c_send(i2c, addr, cmd, len + 1);
+    g_free(cmd);
+}
+
+uint8_t i2c_get8(I2CAdapter *i2c, uint8_t addr, uint8_t reg)
+{
+    uint8_t resp[1];
+    i2c_read_block(i2c, addr, reg, resp, sizeof(resp));
+    return resp[0];
+}
+
+uint16_t i2c_get16(I2CAdapter *i2c, uint8_t addr, uint8_t reg)
+{
+    uint8_t resp[2];
+    i2c_read_block(i2c, addr, reg, resp, sizeof(resp));
+    return (resp[0] << 8) | resp[1];
+}
+
+void i2c_set8(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
+              uint8_t value)
+{
+    i2c_write_block(i2c, addr, reg, &value, 1);
+}
+
+void i2c_set16(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
+               uint16_t value)
+{
+    uint8_t data[2];
+
+    data[0] = value >> 8;
+    data[1] = value & 255;
+    i2c_write_block(i2c, addr, reg, data, sizeof(data));
+}
index cc01358a9f68679aa4ab22ac80055ecfc3c7931a..a4621145975cbde3730eef1d23b0a236c9c3fd3e 100644 (file)
@@ -28,6 +28,17 @@ void i2c_send(I2CAdapter *i2c, uint8_t addr,
 void i2c_recv(I2CAdapter *i2c, uint8_t addr,
               uint8_t *buf, uint16_t len);
 
+void i2c_read_block(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
+                    uint8_t *buf, uint16_t len);
+void i2c_write_block(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
+                     const uint8_t *buf, uint16_t len);
+uint8_t i2c_get8(I2CAdapter *i2c, uint8_t addr, uint8_t reg);
+uint16_t i2c_get16(I2CAdapter *i2c, uint8_t addr, uint8_t reg);
+void i2c_set8(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
+              uint8_t value);
+void i2c_set16(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
+               uint16_t value);
+
 /* libi2c-omap.c */
 I2CAdapter *omap_i2c_create(QTestState *qts, uint64_t addr);
 
index 5466a67ed700e4d3cff531c3c0d32578d1b023e6..06359b743501d91bf3fdb3c5e3edc9bb753e9f5c 100644 (file)
 
 static I2CAdapter *i2c;
 
-static uint8_t pca9552_get8(I2CAdapter *i2c, uint8_t addr, uint8_t reg)
-{
-    uint8_t resp[1];
-    i2c_send(i2c, addr, &reg, 1);
-    i2c_recv(i2c, addr, resp, 1);
-    return resp[0];
-}
-
-static void pca9552_set8(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
-                         uint8_t value)
-{
-    uint8_t cmd[2];
-    uint8_t resp[1];
-
-    cmd[0] = reg;
-    cmd[1] = value;
-    i2c_send(i2c, addr, cmd, 2);
-    i2c_recv(i2c, addr, resp, 1);
-    g_assert_cmphex(resp[0], ==, cmd[1]);
-}
-
 static void receive_autoinc(void)
 {
     uint8_t resp;
@@ -67,26 +46,26 @@ static void send_and_receive(void)
 {
     uint8_t value;
 
-    value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0);
+    value = i2c_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0);
     g_assert_cmphex(value, ==, 0x55);
 
-    value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT0);
+    value = i2c_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT0);
     g_assert_cmphex(value, ==, 0x0);
 
     /* Switch on LED 0 */
-    pca9552_set8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0, 0x54);
-    value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0);
+    i2c_set8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0, 0x54);
+    value = i2c_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0);
     g_assert_cmphex(value, ==, 0x54);
 
-    value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT0);
+    value = i2c_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT0);
     g_assert_cmphex(value, ==, 0x01);
 
     /* Switch on LED 12 */
-    pca9552_set8(i2c, PCA9552_TEST_ADDR, PCA9552_LS3, 0x54);
-    value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS3);
+    i2c_set8(i2c, PCA9552_TEST_ADDR, PCA9552_LS3, 0x54);
+    value = i2c_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS3);
     g_assert_cmphex(value, ==, 0x54);
 
-    value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT1);
+    value = i2c_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT1);
     g_assert_cmphex(value, ==, 0x10);
 }
 
index 34cae7a582487aff63ac235dbe9b654c7f2f0506..c86d2571e2792272b523666d37caae8d08f8fc59 100644 (file)
 
 static I2CAdapter *i2c;
 
-static uint16_t tmp105_get8(I2CAdapter *i2c, uint8_t addr, uint8_t reg)
-{
-    uint8_t resp[1];
-    i2c_send(i2c, addr, &reg, 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];
-    i2c_send(i2c, addr, &reg, 1);
-    i2c_recv(i2c, addr, resp, 2);
-    return (resp[0] << 8) | resp[1];
-}
-
-static void tmp105_set8(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
-                        uint8_t value)
-{
-    uint8_t cmd[2];
-    uint8_t resp[1];
-
-    cmd[0] = reg;
-    cmd[1] = value;
-    i2c_send(i2c, addr, cmd, 2);
-    i2c_recv(i2c, addr, resp, 1);
-    g_assert_cmphex(resp[0], ==, cmd[1]);
-}
-
-static void tmp105_set16(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
-                         uint16_t value)
-{
-    uint8_t cmd[3];
-    uint8_t resp[2];
-
-    cmd[0] = reg;
-    cmd[1] = value >> 8;
-    cmd[2] = value & 255;
-    i2c_send(i2c, addr, cmd, 3);
-    i2c_recv(i2c, addr, resp, 2);
-    g_assert_cmphex(resp[0], ==, cmd[1]);
-    g_assert_cmphex(resp[1], ==, cmd[2]);
-}
-
 static int qmp_tmp105_get_temperature(const char *id)
 {
     QDict *response;
@@ -94,14 +50,14 @@ static void send_and_receive(void)
     value = qmp_tmp105_get_temperature(TMP105_TEST_ID);
     g_assert_cmpuint(value, ==, 0);
 
-    value = tmp105_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_TEMPERATURE);
+    value = i2c_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);
+    value = i2c_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_TEMPERATURE);
     g_assert_cmphex(value, ==, 0x1400);
 
     qmp_tmp105_set_temperature(TMP105_TEST_ID, 20938); /* 20 + 15/16 */
@@ -110,24 +66,27 @@ static void send_and_receive(void)
     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);
+    i2c_set8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG, 0x60);
+    value = i2c_get8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG);
     g_assert_cmphex(value, ==, 0x60);
 
-    value = tmp105_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_TEMPERATURE);
+    value = i2c_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);
+    i2c_set8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG, 0x00);
+    g_assert_cmphex(i2c_get8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG), ==, 0x00);
+    value = i2c_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);
+    i2c_set8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG, 0x20);
+    g_assert_cmphex(i2c_get8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG), ==, 0x20);
+    value = i2c_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);
+    i2c_set8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG, 0x40);
+    g_assert_cmphex(i2c_get8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG), ==, 0x40);
+    value = i2c_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_TEMPERATURE);
     g_assert_cmphex(value, ==, 0x14e0);
 
     /* stored precision remains the same */
@@ -135,12 +94,15 @@ static void send_and_receive(void)
     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);
+    i2c_set8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG, 0x60);
+    g_assert_cmphex(i2c_get8(i2c, TMP105_TEST_ADDR, TMP105_REG_CONFIG), ==, 0x60);
+    value = i2c_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);
+    i2c_set16(i2c, TMP105_TEST_ADDR, TMP105_REG_T_LOW, 0x1234);
+    g_assert_cmphex(i2c_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_T_LOW), ==, 0x1234);
+    i2c_set16(i2c, TMP105_TEST_ADDR, TMP105_REG_T_HIGH, 0x4231);
+    g_assert_cmphex(i2c_get16(i2c, TMP105_TEST_ADDR, TMP105_REG_T_HIGH), ==, 0x4231);
 }
 
 int main(int argc, char **argv)