Re: [PATCH 3/8] hw/misc: add a toy i2c echo device
On 2/15/23 13:26, Philippe Mathieu-Daudé wrote: On 15/2/23 12:09, Cédric Le Goater wrote: On 2/15/23 11:55, Philippe Mathieu-Daudé wrote: On 14/2/23 18:18, Cédric Le Goater wrote: From: Klaus Jensen Add an example I2C device to demonstrate how a slave may master the bus and send data asynchronously to another slave. What a rebellion... The device will echo whatever it is sent to the device identified by the first byte received. Signed-off-by: Klaus Jensen [ clg: - Changed to build to use CONFIG_ASPEED_SOC since only supported on such SoCs - folded in these fixes : https://lore.kernel.org/qemu-devel/Y3yMKAhOkYGtnkOp@cormorant.local/ ] Message-Id: <20220601210831.67259-7-...@irrelevant.dk> Signed-off-by: Cédric Le Goater --- hw/misc/i2c-echo.c | 156 hw/misc/meson.build | 2 + 2 files changed, 158 insertions(+) create mode 100644 hw/misc/i2c-echo.c diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 448e14b531..3eb1bda710 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -129,6 +129,8 @@ softmmu_ss.add(when: 'CONFIG_NRF51_SOC', if_true: files('nrf51_rng.c')) softmmu_ss.add(when: 'CONFIG_GRLIB', if_true: files('grlib_ahb_apb_pnp.c')) +softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('i2c-echo.c')) s/CONFIG_ASPEED_SOC/CONFIG_I2C/ since this is a generic device. even if only supported by the Aspeed SoC ? I am OK with both. Any machine exposing an i2c bus can use this device, isn't it? -device i2c-echo,bus=bus69,address=0x42 ... Would you have a machine with I2C buses and image to try that on ? Not an aspeed one obvioulsy Thanks, C.
Re: [PATCH 3/8] hw/misc: add a toy i2c echo device
On 15/2/23 12:09, Cédric Le Goater wrote: On 2/15/23 11:55, Philippe Mathieu-Daudé wrote: On 14/2/23 18:18, Cédric Le Goater wrote: From: Klaus Jensen Add an example I2C device to demonstrate how a slave may master the bus and send data asynchronously to another slave. What a rebellion... The device will echo whatever it is sent to the device identified by the first byte received. Signed-off-by: Klaus Jensen [ clg: - Changed to build to use CONFIG_ASPEED_SOC since only supported on such SoCs - folded in these fixes : https://lore.kernel.org/qemu-devel/Y3yMKAhOkYGtnkOp@cormorant.local/ ] Message-Id: <20220601210831.67259-7-...@irrelevant.dk> Signed-off-by: Cédric Le Goater --- hw/misc/i2c-echo.c | 156 hw/misc/meson.build | 2 + 2 files changed, 158 insertions(+) create mode 100644 hw/misc/i2c-echo.c diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 448e14b531..3eb1bda710 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -129,6 +129,8 @@ softmmu_ss.add(when: 'CONFIG_NRF51_SOC', if_true: files('nrf51_rng.c')) softmmu_ss.add(when: 'CONFIG_GRLIB', if_true: files('grlib_ahb_apb_pnp.c')) +softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('i2c-echo.c')) s/CONFIG_ASPEED_SOC/CONFIG_I2C/ since this is a generic device. even if only supported by the Aspeed SoC ? I am OK with both. Any machine exposing an i2c bus can use this device, isn't it? -device i2c-echo,bus=bus69,address=0x42 ...
Re: [PATCH 3/8] hw/misc: add a toy i2c echo device
On 2/15/23 11:55, Philippe Mathieu-Daudé wrote: On 14/2/23 18:18, Cédric Le Goater wrote: From: Klaus Jensen Add an example I2C device to demonstrate how a slave may master the bus and send data asynchronously to another slave. What a rebellion... The device will echo whatever it is sent to the device identified by the first byte received. Signed-off-by: Klaus Jensen [ clg: - Changed to build to use CONFIG_ASPEED_SOC since only supported on such SoCs - folded in these fixes : https://lore.kernel.org/qemu-devel/Y3yMKAhOkYGtnkOp@cormorant.local/ ] Message-Id: <20220601210831.67259-7-...@irrelevant.dk> Signed-off-by: Cédric Le Goater --- hw/misc/i2c-echo.c | 156 hw/misc/meson.build | 2 + 2 files changed, 158 insertions(+) create mode 100644 hw/misc/i2c-echo.c diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 448e14b531..3eb1bda710 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -129,6 +129,8 @@ softmmu_ss.add(when: 'CONFIG_NRF51_SOC', if_true: files('nrf51_rng.c')) softmmu_ss.add(when: 'CONFIG_GRLIB', if_true: files('grlib_ahb_apb_pnp.c')) +softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('i2c-echo.c')) s/CONFIG_ASPEED_SOC/CONFIG_I2C/ since this is a generic device. even if only supported by the Aspeed SoC ? I am OK with both. specific_ss.add(when: 'CONFIG_AVR_POWER', if_true: files('avr_power.c')) specific_ss.add(when: 'CONFIG_MAC_VIA', if_true: files('mac_via.c'))
Re: [PATCH 3/8] hw/misc: add a toy i2c echo device
On 14/2/23 18:18, Cédric Le Goater wrote: From: Klaus Jensen Add an example I2C device to demonstrate how a slave may master the bus and send data asynchronously to another slave. What a rebellion... The device will echo whatever it is sent to the device identified by the first byte received. Signed-off-by: Klaus Jensen [ clg: - Changed to build to use CONFIG_ASPEED_SOC since only supported on such SoCs - folded in these fixes : https://lore.kernel.org/qemu-devel/Y3yMKAhOkYGtnkOp@cormorant.local/ ] Message-Id: <20220601210831.67259-7-...@irrelevant.dk> Signed-off-by: Cédric Le Goater --- hw/misc/i2c-echo.c | 156 hw/misc/meson.build | 2 + 2 files changed, 158 insertions(+) create mode 100644 hw/misc/i2c-echo.c diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 448e14b531..3eb1bda710 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -129,6 +129,8 @@ softmmu_ss.add(when: 'CONFIG_NRF51_SOC', if_true: files('nrf51_rng.c')) softmmu_ss.add(when: 'CONFIG_GRLIB', if_true: files('grlib_ahb_apb_pnp.c')) +softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('i2c-echo.c')) s/CONFIG_ASPEED_SOC/CONFIG_I2C/ since this is a generic device. specific_ss.add(when: 'CONFIG_AVR_POWER', if_true: files('avr_power.c')) specific_ss.add(when: 'CONFIG_MAC_VIA', if_true: files('mac_via.c'))
[PATCH 3/8] hw/misc: add a toy i2c echo device
From: Klaus Jensen Add an example I2C device to demonstrate how a slave may master the bus and send data asynchronously to another slave. The device will echo whatever it is sent to the device identified by the first byte received. Signed-off-by: Klaus Jensen [ clg: - Changed to build to use CONFIG_ASPEED_SOC since only supported on such SoCs - folded in these fixes : https://lore.kernel.org/qemu-devel/Y3yMKAhOkYGtnkOp@cormorant.local/ ] Message-Id: <20220601210831.67259-7-...@irrelevant.dk> Signed-off-by: Cédric Le Goater --- hw/misc/i2c-echo.c | 156 hw/misc/meson.build | 2 + 2 files changed, 158 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 00..5705ab5d73 --- /dev/null +++ b/hw/misc/i2c-echo.c @@ -0,0 +1,156 @@ +#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_IDLE, +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_IDLE: +return; + +case I2C_ECHO_STATE_START_SEND: +if (i2c_start_send_async(state->bus, state->data[0])) { +goto release_bus; +} + +state->pos++; +state->state = I2C_ECHO_STATE_ACK; +return; + +case I2C_ECHO_STATE_ACK: +if (state->pos > 2) { +break; +} + +if (i2c_send_async(state->bus, state->data[state->pos++])) { +break; +} + +return; +} + + +i2c_end_transfer(state->bus); +release_bus: +i2c_bus_release(state->bus); + +state->state = I2C_ECHO_STATE_IDLE; +} + +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_START_SEND; +i2c_bus_master(state->bus, state->bh); + +break; + +case I2C_NACK: +break; + +default: +return -1; +} + +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(_echo); +} + +type_init(register_types); diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 448e14b531..3eb1bda710 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -129,6 +129,8 @@ softmmu_ss.add(when: 'CONFIG_NRF51_SOC', if_true: files('nrf51_rng.c')) softmmu_ss.add(when: 'CONFIG_GRLIB', if_true: files('grlib_ahb_apb_pnp.c')) +softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('i2c-echo.c')) + specific_ss.add(when: 'CONFIG_AVR_POWER', if_true: files('avr_power.c')) specific_ss.add(when: 'CONFIG_MAC_VIA', if_true: files('mac_via.c')) -- 2.39.1