returndev;}voidi2c_set_slave_address(i2c_slave*dev,intaddress){dev->address=address;}/* Return nonzero if bus is busy. */inti2c_bus_busy(i2c_bus*bus){returnbus->current_dev!=NULL;}
/* TODO: Make this handle multiple masters. */inti2c_start_transfer(i2c_bus*bus,intaddress,intrecv){i2c_slave*dev;for(dev=bus->dev;dev;dev=dev->next){if(dev->address==address)break;}if(!dev)return1;/*Ifthebusisalreadybusy,assumethisisarepeatedstartcondition.*/bus->current_dev=dev;dev->event(dev,recv?I2C_START_RECV:I2C_START_SEND);return0;}voidi2c_end_transfer(i2c_bus*bus){i2c_slave*dev=bus->current_dev;if(!dev)return;dev->event(dev,I2C_FINISH);bus->current_dev=NULL;}inti2c_send(i2c_bus*bus,uint8_tdata){i2c_slave*dev=bus->current_dev;if(!dev)return-1;returndev->send(dev,data);}inti2c_recv(i2c_bus*bus){i2c_slave*dev=bus->current_dev;if(!dev)return-1;returndev->recv(dev);}voidi2c_nack(i2c_bus*bus){i2c_slave*dev=bus->current_dev;if(!dev)return;dev->event(dev,I2C_NACK);}