xref: /qemu/tests/qtest/libqos/i2c.c (revision c0825c63cfae0d4af1f1f91867c42e609f3ed13c)
1 /*
2  * QTest I2C driver
3  *
4  * Copyright (c) 2012 Andreas Färber
5  *
6  * This work is licensed under the terms of the GNU GPL, version 2 or later.
7  * See the COPYING file in the top-level directory.
8  */
9 #include "qemu/osdep.h"
10 #include "libqos/i2c.h"
11 #include "libqtest.h"
12 
13 void i2c_send(I2CAdapter *i2c, uint8_t addr,
14               const uint8_t *buf, uint16_t len)
15 {
16     i2c->send(i2c, addr, buf, len);
17 }
18 
19 void i2c_recv(I2CAdapter *i2c, uint8_t addr,
20               uint8_t *buf, uint16_t len)
21 {
22     i2c->recv(i2c, addr, buf, len);
23 }
24 
25 void i2c_read_block(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
26                        uint8_t *buf, uint16_t len)
27 {
28     i2c_send(i2c, addr, &reg, 1);
29     i2c_recv(i2c, addr, buf, len);
30 }
31 
32 void i2c_write_block(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
33                      const uint8_t *buf, uint16_t len)
34 {
35     uint8_t *cmd = g_malloc(len + 1);
36     cmd[0] = reg;
37     memcpy(&cmd[1], buf, len);
38     i2c_send(i2c, addr, cmd, len + 1);
39     g_free(cmd);
40 }
41 
42 uint8_t i2c_get8(I2CAdapter *i2c, uint8_t addr, uint8_t reg)
43 {
44     uint8_t resp[1];
45     i2c_read_block(i2c, addr, reg, resp, sizeof(resp));
46     return resp[0];
47 }
48 
49 uint16_t i2c_get16(I2CAdapter *i2c, uint8_t addr, uint8_t reg)
50 {
51     uint8_t resp[2];
52     i2c_read_block(i2c, addr, reg, resp, sizeof(resp));
53     return (resp[0] << 8) | resp[1];
54 }
55 
56 void i2c_set8(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
57               uint8_t value)
58 {
59     i2c_write_block(i2c, addr, reg, &value, 1);
60 }
61 
62 void i2c_set16(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
63                uint16_t value)
64 {
65     uint8_t data[2];
66 
67     data[0] = value >> 8;
68     data[1] = value & 255;
69     i2c_write_block(i2c, addr, reg, data, sizeof(data));
70 }
71 
72 void *i2c_device_create(void *i2c_bus, QGuestAllocator *alloc, void *addr)
73 {
74     QI2CDevice *i2cdev = g_new0(QI2CDevice, 1);
75 
76     i2cdev->bus = i2c_bus;
77     return &i2cdev->obj;
78 }
79