From: Klaus Jensen <its@irrelevant.dk>
To: qemu-devel@nongnu.org
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
"Arun Kumar Kashinath Agasar" <arun.kka@samsung.com>,
"Corey Minyard" <cminyard@mvista.com>,
"Andrew Jeffery" <andrew@aj.id.au>,
"Klaus Jensen" <k.jensen@samsung.com>,
"Cédric Le Goater" <clg@kaod.org>,
qemu-arm@nongnu.org, "Joel Stanley" <joel@jms.id.au>,
"Padmakar Kalghatgi" <p.kalghatgi@samsung.com>,
"Matt Johnston" <matt@codeconstruct.com.au>,
"Jeremy Kerr" <jk@ozlabs.org>
Subject: [RFC PATCH 4/4] hw/misc: add a toy i2c echo device
Date: Thu, 31 Mar 2022 18:57:37 +0200 [thread overview]
Message-ID: <20220331165737.1073520-5-its@irrelevant.dk> (raw)
In-Reply-To: <20220331165737.1073520-1-its@irrelevant.dk>
From: Klaus Jensen <k.jensen@samsung.com>
Add an example i2c device that can master the bus. The device will echo
whatever it is sent to the device identified by the first byte received.
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
---
hw/misc/i2c-echo.c | 144 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 144 insertions(+)
create mode 100644 hw/misc/i2c-echo.c
diff --git a/hw/misc/i2c-echo.c b/hw/misc/i2c-echo.c
new file mode 100644
index 000000000000..72155d850d5f
--- /dev/null
+++ b/hw/misc/i2c-echo.c
@@ -0,0 +1,144 @@
+#include "qemu/osdep.h"
+#include "qemu/timer.h"
+#include "qemu/main-loop.h"
+#include "block/aio.h"
+#include "hw/i2c/i2c.h"
+
+#define TYPE_I2C_ECHO "i2c-echo"
+OBJECT_DECLARE_SIMPLE_TYPE(I2CEchoState, I2C_ECHO)
+
+enum i2c_echo_state {
+ I2C_ECHO_STATE_REQUEST_MASTER,
+ I2C_ECHO_STATE_START_SEND,
+ I2C_ECHO_STATE_ACK,
+};
+
+typedef struct I2CEchoState {
+ I2CSlave parent_obj;
+
+ I2CBus *bus;
+
+ enum i2c_echo_state state;
+ QEMUBH *bh;
+
+ unsigned int pos;
+ uint8_t data[3];
+} I2CEchoState;
+
+static void i2c_echo_bh(void *opaque)
+{
+ I2CEchoState *state = opaque;
+
+ switch (state->state) {
+ case I2C_ECHO_STATE_REQUEST_MASTER:
+ i2c_bus_master(state->bus, state->bh);
+ state->state = I2C_ECHO_STATE_START_SEND;
+ break;
+
+ case I2C_ECHO_STATE_START_SEND:
+ i2c_start_send(state->bus, state->data[0]);
+ state->pos++;
+ state->state = I2C_ECHO_STATE_ACK;
+ break;
+
+ case I2C_ECHO_STATE_ACK:
+ if (state->pos > 2) {
+ i2c_end_transfer(state->bus);
+ i2c_bus_release(state->bus);
+ break;
+ }
+
+ i2c_send_async(state->bus, state->data[state->pos++]);
+ break;
+ }
+}
+
+static int i2c_echo_event(I2CSlave *s, enum i2c_event event)
+{
+ I2CEchoState *state = I2C_ECHO(s);
+
+ switch (event) {
+ case I2C_START_RECV:
+ state->pos = 0;
+
+ break;
+
+ case I2C_START_SEND:
+ state->pos = 0;
+
+ break;
+
+ case I2C_FINISH:
+ state->pos = 0;
+ state->state = I2C_ECHO_STATE_REQUEST_MASTER;
+ qemu_bh_schedule(state->bh);
+
+ break;
+
+ case I2C_NACK:
+ break;
+ }
+
+ return 0;
+}
+
+static uint8_t i2c_echo_recv(I2CSlave *s)
+{
+ I2CEchoState *state = I2C_ECHO(s);
+
+ if (state->pos > 2) {
+ return 0xff;
+ }
+
+ return state->data[state->pos++];
+}
+
+static int i2c_echo_send(I2CSlave *s, uint8_t data)
+{
+ I2CEchoState *state = I2C_ECHO(s);
+
+ if (state->pos > 2) {
+ return -1;
+ }
+
+ state->data[state->pos++] = data;
+
+ return 0;
+}
+
+static void i2c_echo_realize(DeviceState *dev, Error **errp)
+{
+ I2CEchoState *state = I2C_ECHO(dev);
+ BusState *bus = qdev_get_parent_bus(dev);
+
+ state->bus = I2C_BUS(bus);
+ state->bh = qemu_bh_new(i2c_echo_bh, state);
+
+ return;
+}
+
+static void i2c_echo_class_init(ObjectClass *oc, void *data)
+{
+ I2CSlaveClass *sc = I2C_SLAVE_CLASS(oc);
+ DeviceClass *dc = DEVICE_CLASS(oc);
+
+ dc->realize = i2c_echo_realize;
+
+ sc->event = i2c_echo_event;
+ sc->recv = i2c_echo_recv;
+ sc->send = i2c_echo_send;
+}
+
+static const TypeInfo i2c_echo = {
+ .name = TYPE_I2C_ECHO,
+ .parent = TYPE_I2C_SLAVE,
+ .instance_size = sizeof(I2CEchoState),
+ .class_init = i2c_echo_class_init,
+};
+
+static void register_types(void)
+{
+ type_register_static(&i2c_echo);
+}
+
+type_init(register_types);
--
2.35.1
next prev parent reply other threads:[~2022-03-31 17:05 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-31 16:57 [RFC PATCH 0/4] hw/i2c: i2c slave mode support Klaus Jensen
2022-03-31 16:57 ` [RFC PATCH 1/4] hw/i2c: support multiple masters Klaus Jensen
2022-03-31 16:57 ` [RFC PATCH 2/4] hw/i2c: add async send Klaus Jensen
2022-03-31 16:57 ` [RFC PATCH 3/4] hw/i2c: add slave mode for aspeed_i2c Klaus Jensen
2022-03-31 20:44 ` Philippe Mathieu-Daudé
2022-04-01 6:30 ` Klaus Jensen
2022-04-06 6:14 ` Cédric Le Goater
2022-04-06 7:40 ` Klaus Jensen
2022-04-06 8:52 ` Cédric Le Goater
2022-04-06 9:16 ` Klaus Jensen
2022-04-06 9:44 ` Cédric Le Goater
2022-03-31 16:57 ` Klaus Jensen [this message]
2022-03-31 20:32 ` [RFC PATCH 0/4] hw/i2c: i2c slave mode support Corey Minyard
2022-04-01 6:29 ` Klaus Jensen
2022-04-01 8:58 ` Damien Hedde
2022-04-01 9:05 ` Klaus Jensen
2022-04-01 13:06 ` Corey Minyard
2022-04-05 20:52 ` Peter Delevoryas
2022-04-06 6:07 ` Klaus Jensen
2022-04-06 17:03 ` Peter Delevoryas
2022-04-06 18:41 ` Klaus Jensen
2022-04-06 22:06 ` Peter Delevoryas
2022-05-06 14:07 ` Jonathan Cameron via
2022-05-06 16:49 ` Cédric Le Goater
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220331165737.1073520-5-its@irrelevant.dk \
--to=its@irrelevant.dk \
--cc=andrew@aj.id.au \
--cc=arun.kka@samsung.com \
--cc=clg@kaod.org \
--cc=cminyard@mvista.com \
--cc=jk@ozlabs.org \
--cc=joel@jms.id.au \
--cc=k.jensen@samsung.com \
--cc=matt@codeconstruct.com.au \
--cc=p.kalghatgi@samsung.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).