SIM_INTERFACE(i2c_slave) {
void (*start_request)(conf_object_t *device, uint32 address);
void (*read_request)(conf_object_t *device);
void (*ack_read_request)(conf_object_t *device, i2c_status_t ack);
void (*write_request)(conf_object_t *device, uint8 value);
void (*stop)(conf_object_t *device, uint8 repeated_start);
};
#define I2C_SLAVE_INTERFACE "i2c_slave"
The i2c_slave interface is implemented by devices
that may act as slaves on an I2C link. The start_request
function is called by the I2C link to start a transaction. Bits 7
down to 1 of the address parameter are the address of
the slave, and bit 0 is the write bit. The started transaction is a
write transaction if the write bit is 0, and a read
transaction otherwise. The I2C slave device accepts the transaction
by calling the start_response function in the I2C
link. The transaction consists of a number of calls to
write_request (or read_request, depending on
the write bit). The slave responds to each of these with a call to
write_response (or read_response) in the I2C
link. The ack_read_request function is called by the I2C
link as response to the read_response function. The
transfer can end in three ways:
stop(0) is called in the slave device.
stop(1) call in the first slave device.
Note that a call to stop doesn't necessarily represent
an I2C stop condition: If the repeated_start
parameter is 1, the call actually represents an I2C start
condition, whose effect is similar to that of a stop condition.
Note that a call to ack_read_request always is followed
by a call to read_request if ack is
I2C_status_success, or by a call to either
stop or start_request if ack
is I2C_status_noack. Moreover, the interface calls
to an i2c slave device always follow the regular expression
(((R(ra)*rA)|(Ww*))+P)*, where R and W
are calls to start_request with odd and even addresses,
respectively; r is read_request; w is
write_request; a and A are
ack_read_request calls with ack set to
I2C_status_success and
I2C_status_noack, respectively; and P is a
call to stop.
See the description for the i2c_link interface for
more information how to call the *_response functions.