xref: /qemu/include/hw/i2c/i2c.h (revision 2b4c1125ac3db2734222ff43c25388a16aca4a99)
10ff596d0Spbrook #ifndef QEMU_I2C_H
20ff596d0Spbrook #define QEMU_I2C_H
30ff596d0Spbrook 
483c9f4caSPaolo Bonzini #include "hw/qdev.h"
5fe8de492SPaul Brook 
60ff596d0Spbrook /* The QEMU I2C implementation only supports simple transfers that complete
70ff596d0Spbrook    immediately.  It does not support slave devices that need to be able to
80ff596d0Spbrook    defer their response (eg. CPU slave interfaces where the data is supplied
90ff596d0Spbrook    by the device driver in response to an interrupt).  */
100ff596d0Spbrook 
110ff596d0Spbrook enum i2c_event {
120ff596d0Spbrook     I2C_START_RECV,
130ff596d0Spbrook     I2C_START_SEND,
140ff596d0Spbrook     I2C_FINISH,
15aa1f17c1Sths     I2C_NACK /* Masker NACKed a receive byte.  */
160ff596d0Spbrook };
170ff596d0Spbrook 
189e07bdf8SAnthony Liguori typedef struct I2CSlave I2CSlave;
190ff596d0Spbrook 
20b5ea9327SAnthony Liguori #define TYPE_I2C_SLAVE "i2c-slave"
21b5ea9327SAnthony Liguori #define I2C_SLAVE(obj) \
22b5ea9327SAnthony Liguori      OBJECT_CHECK(I2CSlave, (obj), TYPE_I2C_SLAVE)
23b5ea9327SAnthony Liguori #define I2C_SLAVE_CLASS(klass) \
24b5ea9327SAnthony Liguori      OBJECT_CLASS_CHECK(I2CSlaveClass, (klass), TYPE_I2C_SLAVE)
25b5ea9327SAnthony Liguori #define I2C_SLAVE_GET_CLASS(obj) \
26b5ea9327SAnthony Liguori      OBJECT_GET_CLASS(I2CSlaveClass, (obj), TYPE_I2C_SLAVE)
279e07bdf8SAnthony Liguori 
28373b8ac7SCorey Minyard typedef struct I2CSlaveClass {
29b5ea9327SAnthony Liguori     DeviceClass parent_class;
3002e2da45SPaul Brook 
31d307c28cSCorey Minyard     /* Master to slave. Returns non-zero for a NAK, 0 for success. */
32b5ea9327SAnthony Liguori     int (*send)(I2CSlave *s, uint8_t data);
33b5ea9327SAnthony Liguori 
34d307c28cSCorey Minyard     /*
35d307c28cSCorey Minyard      * Slave to master.  This cannot fail, the device should always
36d307c28cSCorey Minyard      * return something here.  Negative values probably result in 0xff
37d307c28cSCorey Minyard      * and a possible log from the driver, and shouldn't be used.
38d307c28cSCorey Minyard      */
39b5ea9327SAnthony Liguori     int (*recv)(I2CSlave *s);
40b5ea9327SAnthony Liguori 
41d307c28cSCorey Minyard     /*
42d307c28cSCorey Minyard      * Notify the slave of a bus state change.  For start event,
43d307c28cSCorey Minyard      * returns non-zero to NAK an operation.  For other events the
44d307c28cSCorey Minyard      * return code is not used and should be zero.
45d307c28cSCorey Minyard      */
46d307c28cSCorey Minyard     int (*event)(I2CSlave *s, enum i2c_event event);
47b5ea9327SAnthony Liguori } I2CSlaveClass;
48fe8de492SPaul Brook 
49373b8ac7SCorey Minyard struct I2CSlave {
50fe8de492SPaul Brook     DeviceState qdev;
510ff596d0Spbrook 
520ff596d0Spbrook     /* Remaining fields for internal use by the I2C code.  */
535b7f5327SJuan Quintela     uint8_t address;
540ff596d0Spbrook };
550ff596d0Spbrook 
56aa88d7adSCorey Minyard #define TYPE_I2C_BUS "i2c-bus"
57aa88d7adSCorey Minyard #define I2C_BUS(obj) OBJECT_CHECK(I2CBus, (obj), TYPE_I2C_BUS)
58aa88d7adSCorey Minyard 
59aa88d7adSCorey Minyard typedef struct I2CNode I2CNode;
60aa88d7adSCorey Minyard 
61aa88d7adSCorey Minyard struct I2CNode {
62aa88d7adSCorey Minyard     I2CSlave *elt;
63aa88d7adSCorey Minyard     QLIST_ENTRY(I2CNode) next;
64aa88d7adSCorey Minyard };
65aa88d7adSCorey Minyard 
66aa88d7adSCorey Minyard struct I2CBus {
67aa88d7adSCorey Minyard     BusState qbus;
68aa88d7adSCorey Minyard     QLIST_HEAD(, I2CNode) current_devs;
69aa88d7adSCorey Minyard     uint8_t saved_address;
70aa88d7adSCorey Minyard     bool broadcast;
71aa88d7adSCorey Minyard };
72aa88d7adSCorey Minyard 
73a5c82852SAndreas Färber I2CBus *i2c_init_bus(DeviceState *parent, const char *name);
749e07bdf8SAnthony Liguori void i2c_set_slave_address(I2CSlave *dev, uint8_t address);
75a5c82852SAndreas Färber int i2c_bus_busy(I2CBus *bus);
76a5c82852SAndreas Färber int i2c_start_transfer(I2CBus *bus, uint8_t address, int recv);
77a5c82852SAndreas Färber void i2c_end_transfer(I2CBus *bus);
78a5c82852SAndreas Färber void i2c_nack(I2CBus *bus);
79056fca7bSPeter Crosthwaite int i2c_send_recv(I2CBus *bus, uint8_t *data, bool send);
80a5c82852SAndreas Färber int i2c_send(I2CBus *bus, uint8_t data);
81a5c82852SAndreas Färber int i2c_recv(I2CBus *bus);
820ff596d0Spbrook 
83a5c82852SAndreas Färber DeviceState *i2c_create_slave(I2CBus *bus, const char *name, uint8_t addr);
84fe8de492SPaul Brook 
85*2b4c1125SBALATON Zoltan typedef struct bitbang_i2c_interface bitbang_i2c_interface;
86*2b4c1125SBALATON Zoltan 
871d4e547bSbalrog /* lm832x.c */
88c4f05c8cSPeter Maydell void lm832x_key_event(DeviceState *dev, int key, int state);
891d4e547bSbalrog 
90701a8f76SPaolo Bonzini extern const VMStateDescription vmstate_i2c_slave;
91701a8f76SPaolo Bonzini 
92701a8f76SPaolo Bonzini #define VMSTATE_I2C_SLAVE(_field, _state) {                          \
93701a8f76SPaolo Bonzini     .name       = (stringify(_field)),                               \
949e07bdf8SAnthony Liguori     .size       = sizeof(I2CSlave),                                  \
95701a8f76SPaolo Bonzini     .vmsd       = &vmstate_i2c_slave,                                \
96701a8f76SPaolo Bonzini     .flags      = VMS_STRUCT,                                        \
979e07bdf8SAnthony Liguori     .offset     = vmstate_offset_value(_state, _field, I2CSlave),    \
98701a8f76SPaolo Bonzini }
99701a8f76SPaolo Bonzini 
1000ff596d0Spbrook #endif
101