|
@@ -188,50 +188,42 @@ void i2c_end_transfer(I2CBus *bus)
|
|
bus->broadcast = false;
|
|
bus->broadcast = false;
|
|
}
|
|
}
|
|
|
|
|
|
-int i2c_send_recv(I2CBus *bus, uint8_t *data, bool send)
|
|
|
|
|
|
+int i2c_send(I2CBus *bus, uint8_t data)
|
|
{
|
|
{
|
|
I2CSlaveClass *sc;
|
|
I2CSlaveClass *sc;
|
|
I2CSlave *s;
|
|
I2CSlave *s;
|
|
I2CNode *node;
|
|
I2CNode *node;
|
|
int ret = 0;
|
|
int ret = 0;
|
|
|
|
|
|
- if (send) {
|
|
|
|
- QLIST_FOREACH(node, &bus->current_devs, next) {
|
|
|
|
- s = node->elt;
|
|
|
|
- sc = I2C_SLAVE_GET_CLASS(s);
|
|
|
|
- if (sc->send) {
|
|
|
|
- trace_i2c_send(s->address, *data);
|
|
|
|
- ret = ret || sc->send(s, *data);
|
|
|
|
- } else {
|
|
|
|
- ret = -1;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return ret ? -1 : 0;
|
|
|
|
- } else {
|
|
|
|
- ret = 0xff;
|
|
|
|
- if (!QLIST_EMPTY(&bus->current_devs) && !bus->broadcast) {
|
|
|
|
- sc = I2C_SLAVE_GET_CLASS(QLIST_FIRST(&bus->current_devs)->elt);
|
|
|
|
- if (sc->recv) {
|
|
|
|
- s = QLIST_FIRST(&bus->current_devs)->elt;
|
|
|
|
- ret = sc->recv(s);
|
|
|
|
- trace_i2c_recv(s->address, ret);
|
|
|
|
- }
|
|
|
|
|
|
+ QLIST_FOREACH(node, &bus->current_devs, next) {
|
|
|
|
+ s = node->elt;
|
|
|
|
+ sc = I2C_SLAVE_GET_CLASS(s);
|
|
|
|
+ if (sc->send) {
|
|
|
|
+ trace_i2c_send(s->address, data);
|
|
|
|
+ ret = ret || sc->send(s, data);
|
|
|
|
+ } else {
|
|
|
|
+ ret = -1;
|
|
}
|
|
}
|
|
- *data = ret;
|
|
|
|
- return 0;
|
|
|
|
}
|
|
}
|
|
-}
|
|
|
|
|
|
|
|
-int i2c_send(I2CBus *bus, uint8_t data)
|
|
|
|
-{
|
|
|
|
- return i2c_send_recv(bus, &data, true);
|
|
|
|
|
|
+ return ret ? -1 : 0;
|
|
}
|
|
}
|
|
|
|
|
|
uint8_t i2c_recv(I2CBus *bus)
|
|
uint8_t i2c_recv(I2CBus *bus)
|
|
{
|
|
{
|
|
uint8_t data = 0xff;
|
|
uint8_t data = 0xff;
|
|
|
|
+ I2CSlaveClass *sc;
|
|
|
|
+ I2CSlave *s;
|
|
|
|
+
|
|
|
|
+ if (!QLIST_EMPTY(&bus->current_devs) && !bus->broadcast) {
|
|
|
|
+ sc = I2C_SLAVE_GET_CLASS(QLIST_FIRST(&bus->current_devs)->elt);
|
|
|
|
+ if (sc->recv) {
|
|
|
|
+ s = QLIST_FIRST(&bus->current_devs)->elt;
|
|
|
|
+ data = sc->recv(s);
|
|
|
|
+ trace_i2c_recv(s->address, data);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- i2c_send_recv(bus, &data, false);
|
|
|
|
return data;
|
|
return data;
|
|
}
|
|
}
|
|
|
|
|