|
@@ -12,6 +12,7 @@
|
|
enum i2c_event {
|
|
enum i2c_event {
|
|
I2C_START_RECV,
|
|
I2C_START_RECV,
|
|
I2C_START_SEND,
|
|
I2C_START_SEND,
|
|
|
|
+ I2C_START_SEND_ASYNC,
|
|
I2C_FINISH,
|
|
I2C_FINISH,
|
|
I2C_NACK /* Masker NACKed a receive byte. */
|
|
I2C_NACK /* Masker NACKed a receive byte. */
|
|
};
|
|
};
|
|
@@ -28,6 +29,9 @@ struct I2CSlaveClass {
|
|
/* Master to slave. Returns non-zero for a NAK, 0 for success. */
|
|
/* Master to slave. Returns non-zero for a NAK, 0 for success. */
|
|
int (*send)(I2CSlave *s, uint8_t data);
|
|
int (*send)(I2CSlave *s, uint8_t data);
|
|
|
|
|
|
|
|
+ /* Master to slave (asynchronous). Receiving slave must call i2c_ack(). */
|
|
|
|
+ void (*send_async)(I2CSlave *s, uint8_t data);
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Slave to master. This cannot fail, the device should always
|
|
* Slave to master. This cannot fail, the device should always
|
|
* return something here.
|
|
* return something here.
|
|
@@ -127,11 +131,23 @@ int i2c_start_recv(I2CBus *bus, uint8_t address);
|
|
*/
|
|
*/
|
|
int i2c_start_send(I2CBus *bus, uint8_t address);
|
|
int i2c_start_send(I2CBus *bus, uint8_t address);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * i2c_start_send_async: start an asynchronous 'send' transfer on an I2C bus.
|
|
|
|
+ *
|
|
|
|
+ * @bus: #I2CBus to be used
|
|
|
|
+ * @address: address of the slave
|
|
|
|
+ *
|
|
|
|
+ * Return: 0 on success, -1 on error
|
|
|
|
+ */
|
|
|
|
+int i2c_start_send_async(I2CBus *bus, uint8_t address);
|
|
|
|
+
|
|
void i2c_end_transfer(I2CBus *bus);
|
|
void i2c_end_transfer(I2CBus *bus);
|
|
void i2c_nack(I2CBus *bus);
|
|
void i2c_nack(I2CBus *bus);
|
|
|
|
+void i2c_ack(I2CBus *bus);
|
|
void i2c_bus_master(I2CBus *bus, QEMUBH *bh);
|
|
void i2c_bus_master(I2CBus *bus, QEMUBH *bh);
|
|
void i2c_bus_release(I2CBus *bus);
|
|
void i2c_bus_release(I2CBus *bus);
|
|
int i2c_send(I2CBus *bus, uint8_t data);
|
|
int i2c_send(I2CBus *bus, uint8_t data);
|
|
|
|
+int i2c_send_async(I2CBus *bus, uint8_t data);
|
|
uint8_t i2c_recv(I2CBus *bus);
|
|
uint8_t i2c_recv(I2CBus *bus);
|
|
bool i2c_scan_bus(I2CBus *bus, uint8_t address, bool broadcast,
|
|
bool i2c_scan_bus(I2CBus *bus, uint8_t address, bool broadcast,
|
|
I2CNodeList *current_devs);
|
|
I2CNodeList *current_devs);
|