1 #include "qemu/osdep.h"
2 #include "qemu/timer.h"
3 #include "qemu/main-loop.h"
5 #include "hw/i2c/i2c.h"
7 #define TYPE_I2C_ECHO "i2c-echo"
8 OBJECT_DECLARE_SIMPLE_TYPE(I2CEchoState
, I2C_ECHO
)
12 I2C_ECHO_STATE_START_SEND
,
16 typedef struct I2CEchoState
{
21 enum i2c_echo_state state
;
28 static void i2c_echo_bh(void *opaque
)
30 I2CEchoState
*state
= opaque
;
32 switch (state
->state
) {
33 case I2C_ECHO_STATE_IDLE
:
36 case I2C_ECHO_STATE_START_SEND
:
37 if (i2c_start_send_async(state
->bus
, state
->data
[0])) {
42 state
->state
= I2C_ECHO_STATE_ACK
;
45 case I2C_ECHO_STATE_ACK
:
50 if (i2c_send_async(state
->bus
, state
->data
[state
->pos
++])) {
58 i2c_end_transfer(state
->bus
);
60 i2c_bus_release(state
->bus
);
62 state
->state
= I2C_ECHO_STATE_IDLE
;
65 static int i2c_echo_event(I2CSlave
*s
, enum i2c_event event
)
67 I2CEchoState
*state
= I2C_ECHO(s
);
82 state
->state
= I2C_ECHO_STATE_START_SEND
;
83 i2c_bus_master(state
->bus
, state
->bh
);
97 static uint8_t i2c_echo_recv(I2CSlave
*s
)
99 I2CEchoState
*state
= I2C_ECHO(s
);
101 if (state
->pos
> 2) {
105 return state
->data
[state
->pos
++];
108 static int i2c_echo_send(I2CSlave
*s
, uint8_t data
)
110 I2CEchoState
*state
= I2C_ECHO(s
);
112 if (state
->pos
> 2) {
116 state
->data
[state
->pos
++] = data
;
121 static void i2c_echo_realize(DeviceState
*dev
, Error
**errp
)
123 I2CEchoState
*state
= I2C_ECHO(dev
);
124 BusState
*bus
= qdev_get_parent_bus(dev
);
126 state
->bus
= I2C_BUS(bus
);
127 state
->bh
= qemu_bh_new(i2c_echo_bh
, state
);
132 static void i2c_echo_class_init(ObjectClass
*oc
, void *data
)
134 I2CSlaveClass
*sc
= I2C_SLAVE_CLASS(oc
);
135 DeviceClass
*dc
= DEVICE_CLASS(oc
);
137 dc
->realize
= i2c_echo_realize
;
139 sc
->event
= i2c_echo_event
;
140 sc
->recv
= i2c_echo_recv
;
141 sc
->send
= i2c_echo_send
;
144 static const TypeInfo i2c_echo
= {
145 .name
= TYPE_I2C_ECHO
,
146 .parent
= TYPE_I2C_SLAVE
,
147 .instance_size
= sizeof(I2CEchoState
),
148 .class_init
= i2c_echo_class_init
,
151 static void register_types(void)
153 type_register_static(&i2c_echo
);
156 type_init(register_types
);