1 #ifndef QEMU_I2C_ADDRESSABLE_H
2 #define QEMU_I2C_ADDRESSABLE_H
5 * Interface to support I2C devices with control registers accessed by I2C
7 * Contributed by Alexey Merkulov <steelart@ispras.ru>
8 * Dmitry Zhurikhin <zhur@ispras.ru>
9 * Vladimir Monakhov <vmonakhov@ispras.ru>
11 * Many I2C devices have common logic which closely corresponds to control
12 * registers. These devices are first passed with an ID of the needed command
13 * to be performed. This ID may be considered as control register address.
14 * Then the device is either passed with some data or is awaited to return
15 * some data. This may be considered as control register write and read
16 * respectively. This interface provides a generic way to implement such
17 * I2C devices emulation by writing two functions for reading and writing of
18 * control registers similar to iomem interface. One difference is that
19 * control registers may not have fixed sizes so along with the register
20 * address these functions get another parameter - offset inside this register
26 #define I2CADDR_SLAVE_FROM_QDEV(dev) DO_UPCAST(I2CAddressableState, i2c.qdev, dev)
27 #define FROM_I2CADDR_SLAVE(type, dev) DO_UPCAST(type, i2c_addressable, dev)
29 typedef struct I2CAddressableState {
30 /* I2C slave for the device */
32 /* Address of currently processing data */
34 /* Number of transferred bytes */
36 } I2CAddressableState;
38 typedef uint8_t (*i2c_addressable_read) (void *opaque, uint32_t address,
40 typedef void (*i2c_addressable_write) (void *opaque, uint32_t address,
41 uint8_t offset, uint8_t val);
42 typedef int (*i2c_addressable_init) (I2CAddressableState *i2c);
44 typedef struct I2CAddressableDeviceInfo {
47 /* Read, write and init handlers */
48 i2c_addressable_read read;
49 i2c_addressable_write write;
50 i2c_addressable_init init;
52 /* Size of passed addresses in bytes */
54 /* Byte order: reversed is big-endian (more significant bytes come before
55 * less significant ones) */
57 } I2CAddressableDeviceInfo;
59 void i2c_addressable_register_device(I2CAddressableDeviceInfo *info);