10ff596d0Spbrook #ifndef QEMU_I2C_H 20ff596d0Spbrook #define QEMU_I2C_H 30ff596d0Spbrook 4a27bd6c7SMarkus Armbruster #include "hw/qdev-core.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 362ac4c5f4SCorey Minyard * return something here. 37d307c28cSCorey Minyard */ 382ac4c5f4SCorey Minyard uint8_t (*recv)(I2CSlave *s); 39b5ea9327SAnthony Liguori 40d307c28cSCorey Minyard /* 41d307c28cSCorey Minyard * Notify the slave of a bus state change. For start event, 42d307c28cSCorey Minyard * returns non-zero to NAK an operation. For other events the 43d307c28cSCorey Minyard * return code is not used and should be zero. 44d307c28cSCorey Minyard */ 45d307c28cSCorey Minyard int (*event)(I2CSlave *s, enum i2c_event event); 46b5ea9327SAnthony Liguori } I2CSlaveClass; 47fe8de492SPaul Brook 48373b8ac7SCorey Minyard struct I2CSlave { 49fe8de492SPaul Brook DeviceState qdev; 500ff596d0Spbrook 510ff596d0Spbrook /* Remaining fields for internal use by the I2C code. */ 525b7f5327SJuan Quintela uint8_t address; 530ff596d0Spbrook }; 540ff596d0Spbrook 55aa88d7adSCorey Minyard #define TYPE_I2C_BUS "i2c-bus" 56aa88d7adSCorey Minyard #define I2C_BUS(obj) OBJECT_CHECK(I2CBus, (obj), TYPE_I2C_BUS) 57aa88d7adSCorey Minyard 58aa88d7adSCorey Minyard typedef struct I2CNode I2CNode; 59aa88d7adSCorey Minyard 60aa88d7adSCorey Minyard struct I2CNode { 61aa88d7adSCorey Minyard I2CSlave *elt; 62aa88d7adSCorey Minyard QLIST_ENTRY(I2CNode) next; 63aa88d7adSCorey Minyard }; 64aa88d7adSCorey Minyard 65aa88d7adSCorey Minyard struct I2CBus { 66aa88d7adSCorey Minyard BusState qbus; 67aa88d7adSCorey Minyard QLIST_HEAD(, I2CNode) current_devs; 68aa88d7adSCorey Minyard uint8_t saved_address; 69aa88d7adSCorey Minyard bool broadcast; 70aa88d7adSCorey Minyard }; 71aa88d7adSCorey Minyard 72a5c82852SAndreas Färber I2CBus *i2c_init_bus(DeviceState *parent, const char *name); 739e07bdf8SAnthony Liguori void i2c_set_slave_address(I2CSlave *dev, uint8_t address); 74a5c82852SAndreas Färber int i2c_bus_busy(I2CBus *bus); 75a5c82852SAndreas Färber int i2c_start_transfer(I2CBus *bus, uint8_t address, int recv); 76a5c82852SAndreas Färber void i2c_end_transfer(I2CBus *bus); 77a5c82852SAndreas Färber void i2c_nack(I2CBus *bus); 78056fca7bSPeter Crosthwaite int i2c_send_recv(I2CBus *bus, uint8_t *data, bool send); 79a5c82852SAndreas Färber int i2c_send(I2CBus *bus, uint8_t data); 802ac4c5f4SCorey Minyard uint8_t i2c_recv(I2CBus *bus); 810ff596d0Spbrook 82*db437ca6SPhilippe Mathieu-Daudé I2CSlave *i2c_slave_new(const char *name, uint8_t addr); 83a5c82852SAndreas Färber DeviceState *i2c_create_slave(I2CBus *bus, const char *name, uint8_t addr); 84d88c42ffSPhilippe Mathieu-Daudé bool i2c_realize_and_unref(DeviceState *dev, I2CBus *bus, Error **errp); 85fe8de492SPaul Brook 861d4e547bSbalrog /* lm832x.c */ 87c4f05c8cSPeter Maydell void lm832x_key_event(DeviceState *dev, int key, int state); 881d4e547bSbalrog 89701a8f76SPaolo Bonzini extern const VMStateDescription vmstate_i2c_slave; 90701a8f76SPaolo Bonzini 91701a8f76SPaolo Bonzini #define VMSTATE_I2C_SLAVE(_field, _state) { \ 92701a8f76SPaolo Bonzini .name = (stringify(_field)), \ 939e07bdf8SAnthony Liguori .size = sizeof(I2CSlave), \ 94701a8f76SPaolo Bonzini .vmsd = &vmstate_i2c_slave, \ 95701a8f76SPaolo Bonzini .flags = VMS_STRUCT, \ 969e07bdf8SAnthony Liguori .offset = vmstate_offset_value(_state, _field, I2CSlave), \ 97701a8f76SPaolo Bonzini } 98701a8f76SPaolo Bonzini 990ff596d0Spbrook #endif 100