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, ®, 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