10ff596d0Spbrook #ifndef QEMU_I2C_H 20ff596d0Spbrook #define QEMU_I2C_H 30ff596d0Spbrook 4a27bd6c7SMarkus Armbruster #include "hw/qdev-core.h" 5db1015e9SEduardo Habkost #include "qom/object.h" 6fe8de492SPaul Brook 70ff596d0Spbrook /* The QEMU I2C implementation only supports simple transfers that complete 80ff596d0Spbrook immediately. It does not support slave devices that need to be able to 90ff596d0Spbrook defer their response (eg. CPU slave interfaces where the data is supplied 100ff596d0Spbrook by the device driver in response to an interrupt). */ 110ff596d0Spbrook 120ff596d0Spbrook enum i2c_event { 130ff596d0Spbrook I2C_START_RECV, 140ff596d0Spbrook I2C_START_SEND, 150ff596d0Spbrook I2C_FINISH, 16aa1f17c1Sths I2C_NACK /* Masker NACKed a receive byte. */ 170ff596d0Spbrook }; 180ff596d0Spbrook 190ff596d0Spbrook 20b5ea9327SAnthony Liguori #define TYPE_I2C_SLAVE "i2c-slave" 21c821774aSEduardo Habkost OBJECT_DECLARE_TYPE(I2CSlave, I2CSlaveClass, 22*30b5707cSEduardo Habkost I2C_SLAVE) 239e07bdf8SAnthony Liguori 24db1015e9SEduardo Habkost struct I2CSlaveClass { 25b5ea9327SAnthony Liguori DeviceClass parent_class; 2602e2da45SPaul Brook 27d307c28cSCorey Minyard /* Master to slave. Returns non-zero for a NAK, 0 for success. */ 28b5ea9327SAnthony Liguori int (*send)(I2CSlave *s, uint8_t data); 29b5ea9327SAnthony Liguori 30d307c28cSCorey Minyard /* 31d307c28cSCorey Minyard * Slave to master. This cannot fail, the device should always 322ac4c5f4SCorey Minyard * return something here. 33d307c28cSCorey Minyard */ 342ac4c5f4SCorey Minyard uint8_t (*recv)(I2CSlave *s); 35b5ea9327SAnthony Liguori 36d307c28cSCorey Minyard /* 37d307c28cSCorey Minyard * Notify the slave of a bus state change. For start event, 38d307c28cSCorey Minyard * returns non-zero to NAK an operation. For other events the 39d307c28cSCorey Minyard * return code is not used and should be zero. 40d307c28cSCorey Minyard */ 41d307c28cSCorey Minyard int (*event)(I2CSlave *s, enum i2c_event event); 42db1015e9SEduardo Habkost }; 43fe8de492SPaul Brook 44373b8ac7SCorey Minyard struct I2CSlave { 45fe8de492SPaul Brook DeviceState qdev; 460ff596d0Spbrook 470ff596d0Spbrook /* Remaining fields for internal use by the I2C code. */ 485b7f5327SJuan Quintela uint8_t address; 490ff596d0Spbrook }; 500ff596d0Spbrook 51aa88d7adSCorey Minyard #define TYPE_I2C_BUS "i2c-bus" 528110fa1dSEduardo Habkost DECLARE_INSTANCE_CHECKER(I2CBus, I2C_BUS, 538110fa1dSEduardo Habkost TYPE_I2C_BUS) 54aa88d7adSCorey Minyard 55aa88d7adSCorey Minyard typedef struct I2CNode I2CNode; 56aa88d7adSCorey Minyard 57aa88d7adSCorey Minyard struct I2CNode { 58aa88d7adSCorey Minyard I2CSlave *elt; 59aa88d7adSCorey Minyard QLIST_ENTRY(I2CNode) next; 60aa88d7adSCorey Minyard }; 61aa88d7adSCorey Minyard 62aa88d7adSCorey Minyard struct I2CBus { 63aa88d7adSCorey Minyard BusState qbus; 64aa88d7adSCorey Minyard QLIST_HEAD(, I2CNode) current_devs; 65aa88d7adSCorey Minyard uint8_t saved_address; 66aa88d7adSCorey Minyard bool broadcast; 67aa88d7adSCorey Minyard }; 68aa88d7adSCorey Minyard 69a5c82852SAndreas Färber I2CBus *i2c_init_bus(DeviceState *parent, const char *name); 709e07bdf8SAnthony Liguori void i2c_set_slave_address(I2CSlave *dev, uint8_t address); 71a5c82852SAndreas Färber int i2c_bus_busy(I2CBus *bus); 72a5c82852SAndreas Färber int i2c_start_transfer(I2CBus *bus, uint8_t address, int recv); 73a5c82852SAndreas Färber void i2c_end_transfer(I2CBus *bus); 74a5c82852SAndreas Färber void i2c_nack(I2CBus *bus); 75056fca7bSPeter Crosthwaite int i2c_send_recv(I2CBus *bus, uint8_t *data, bool send); 76a5c82852SAndreas Färber int i2c_send(I2CBus *bus, uint8_t data); 772ac4c5f4SCorey Minyard uint8_t i2c_recv(I2CBus *bus); 780ff596d0Spbrook 7973d5f22eSPhilippe Mathieu-Daudé /** 8073d5f22eSPhilippe Mathieu-Daudé * Create an I2C slave device on the heap. 8173d5f22eSPhilippe Mathieu-Daudé * @name: a device type name 8273d5f22eSPhilippe Mathieu-Daudé * @addr: I2C address of the slave when put on a bus 8373d5f22eSPhilippe Mathieu-Daudé * 8473d5f22eSPhilippe Mathieu-Daudé * This only initializes the device state structure and allows 8573d5f22eSPhilippe Mathieu-Daudé * properties to be set. Type @name must exist. The device still 8673d5f22eSPhilippe Mathieu-Daudé * needs to be realized. See qdev-core.h. 8773d5f22eSPhilippe Mathieu-Daudé */ 88db437ca6SPhilippe Mathieu-Daudé I2CSlave *i2c_slave_new(const char *name, uint8_t addr); 8973d5f22eSPhilippe Mathieu-Daudé 9073d5f22eSPhilippe Mathieu-Daudé /** 9173d5f22eSPhilippe Mathieu-Daudé * Create and realize an I2C slave device on the heap. 9273d5f22eSPhilippe Mathieu-Daudé * @bus: I2C bus to put it on 9373d5f22eSPhilippe Mathieu-Daudé * @name: I2C slave device type name 9473d5f22eSPhilippe Mathieu-Daudé * @addr: I2C address of the slave when put on a bus 9573d5f22eSPhilippe Mathieu-Daudé * 9673d5f22eSPhilippe Mathieu-Daudé * Create the device state structure, initialize it, put it on the 9773d5f22eSPhilippe Mathieu-Daudé * specified @bus, and drop the reference to it (the device is realized). 9873d5f22eSPhilippe Mathieu-Daudé */ 991373b15bSPhilippe Mathieu-Daudé I2CSlave *i2c_slave_create_simple(I2CBus *bus, const char *name, uint8_t addr); 10073d5f22eSPhilippe Mathieu-Daudé 10173d5f22eSPhilippe Mathieu-Daudé /** 102d4b23573SPhilippe Mathieu-Daudé * Realize and drop a reference an I2C slave device 10373d5f22eSPhilippe Mathieu-Daudé * @dev: I2C slave device to realize 10473d5f22eSPhilippe Mathieu-Daudé * @bus: I2C bus to put it on 10573d5f22eSPhilippe Mathieu-Daudé * @addr: I2C address of the slave on the bus 10673d5f22eSPhilippe Mathieu-Daudé * @errp: pointer to NULL initialized error object 10773d5f22eSPhilippe Mathieu-Daudé * 10873d5f22eSPhilippe Mathieu-Daudé * Returns: %true on success, %false on failure. 10973d5f22eSPhilippe Mathieu-Daudé * 11073d5f22eSPhilippe Mathieu-Daudé * Call 'realize' on @dev, put it on the specified @bus, and drop the 11173d5f22eSPhilippe Mathieu-Daudé * reference to it. 11273d5f22eSPhilippe Mathieu-Daudé * 11373d5f22eSPhilippe Mathieu-Daudé * This function is useful if you have created @dev via qdev_new(), 11473d5f22eSPhilippe Mathieu-Daudé * i2c_slave_new() or i2c_slave_try_new() (which take a reference to 11573d5f22eSPhilippe Mathieu-Daudé * the device it returns to you), so that you can set properties on it 11673d5f22eSPhilippe Mathieu-Daudé * before realizing it. If you don't need to set properties then 11773d5f22eSPhilippe Mathieu-Daudé * i2c_slave_create_simple() is probably better (as it does the create, 11873d5f22eSPhilippe Mathieu-Daudé * init and realize in one step). 11973d5f22eSPhilippe Mathieu-Daudé * 12073d5f22eSPhilippe Mathieu-Daudé * If you are embedding the I2C slave into another QOM device and 12173d5f22eSPhilippe Mathieu-Daudé * initialized it via some variant on object_initialize_child() then 12273d5f22eSPhilippe Mathieu-Daudé * do not use this function, because that family of functions arrange 12373d5f22eSPhilippe Mathieu-Daudé * for the only reference to the child device to be held by the parent 12473d5f22eSPhilippe Mathieu-Daudé * via the child<> property, and so the reference-count-drop done here 12573d5f22eSPhilippe Mathieu-Daudé * would be incorrect. (Instead you would want i2c_slave_realize(), 12673d5f22eSPhilippe Mathieu-Daudé * which doesn't currently exist but would be trivial to create if we 12773d5f22eSPhilippe Mathieu-Daudé * had any code that wanted it.) 12873d5f22eSPhilippe Mathieu-Daudé */ 1292616f572SPhilippe Mathieu-Daudé bool i2c_slave_realize_and_unref(I2CSlave *dev, I2CBus *bus, Error **errp); 130fe8de492SPaul Brook 1311d4e547bSbalrog /* lm832x.c */ 132c4f05c8cSPeter Maydell void lm832x_key_event(DeviceState *dev, int key, int state); 1331d4e547bSbalrog 134701a8f76SPaolo Bonzini extern const VMStateDescription vmstate_i2c_slave; 135701a8f76SPaolo Bonzini 136701a8f76SPaolo Bonzini #define VMSTATE_I2C_SLAVE(_field, _state) { \ 137701a8f76SPaolo Bonzini .name = (stringify(_field)), \ 1389e07bdf8SAnthony Liguori .size = sizeof(I2CSlave), \ 139701a8f76SPaolo Bonzini .vmsd = &vmstate_i2c_slave, \ 140701a8f76SPaolo Bonzini .flags = VMS_STRUCT, \ 1419e07bdf8SAnthony Liguori .offset = vmstate_offset_value(_state, _field, I2CSlave), \ 142701a8f76SPaolo Bonzini } 143701a8f76SPaolo Bonzini 1440ff596d0Spbrook #endif 145