On 6/22/20 8:34 PM, Philippe Mathieu-Daudé wrote: > Add a trivial representation of the PCA9552 GPIOs. > > Example booting obmc-phosphor-image: > > $ qemu-system-arm -M witherspoon-bmc -trace pca955x_gpio_status > 1592689902.327837:pca955x_gpio_status pca-unspecified GPIOs 0-15 > [*...............] > 1592689902.329934:pca955x_gpio_status pca-unspecified GPIOs 0-15 > [**..............] > 1592689902.330717:pca955x_gpio_status pca-unspecified GPIOs 0-15 > [***.............] > 1592689902.331431:pca955x_gpio_status pca-unspecified GPIOs 0-15 > [****............] > 1592689902.332163:pca955x_gpio_status pca-unspecified GPIOs 0-15 > [****.........*..] > 1592689902.332888:pca955x_gpio_status pca-unspecified GPIOs 0-15 > [****.........**.] > 1592689902.333629:pca955x_gpio_status pca-unspecified GPIOs 0-15 > [****.........***] > 1592690032.793289:pca955x_gpio_status pca-unspecified GPIOs 0-15 > [****.........*.*] > 1592690033.303163:pca955x_gpio_status pca-unspecified GPIOs 0-15 > [****.........***] > 1592690033.812962:pca955x_gpio_status pca-unspecified GPIOs 0-15 > [****.........*.*] > 1592690034.323234:pca955x_gpio_status pca-unspecified GPIOs 0-15 > [****.........***] > 1592690034.832922:pca955x_gpio_status pca-unspecified GPIOs 0-15 > [****.........*.*] > > We notice the GPIO #14 (front-power LED) starts to blink. > > This LED is described in the witherspoon device-tree [*]: > > front-power { > retain-state-shutdown; > default-state = "keep"; > gpios = <&pca0 14 GPIO_ACTIVE_LOW>; > }; > > [*] > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts?id=b1f9be9392f0#n140 > > Suggested-by: Cédric Le Goater <c...@kaod.org> > Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org>
Reviewed-by: Cédric Le Goater <c...@kaod.org> > --- > hw/misc/pca9552.c | 39 +++++++++++++++++++++++++++++++++++++++ > hw/misc/trace-events | 3 +++ > 2 files changed, 42 insertions(+) > > diff --git a/hw/misc/pca9552.c b/hw/misc/pca9552.c > index d6d84c6451..13f5ed0da4 100644 > --- a/hw/misc/pca9552.c > +++ b/hw/misc/pca9552.c > @@ -13,12 +13,14 @@ > #include "qemu/osdep.h" > #include "qemu/log.h" > #include "qemu/module.h" > +#include "qemu/bitops.h" > #include "hw/qdev-properties.h" > #include "hw/misc/pca9552.h" > #include "hw/misc/pca9552_regs.h" > #include "migration/vmstate.h" > #include "qapi/error.h" > #include "qapi/visitor.h" > +#include "trace.h" > > typedef struct PCA955xClass { > /*< private >*/ > @@ -49,6 +51,39 @@ static uint8_t pca955x_pin_get_config(PCA955xState *s, int > pin) > return extract32(s->regs[reg], shift, 2); > } > > +/* Return INPUT status (bit #N belongs to GPIO #N) */ > +static uint16_t pca955x_pins_get_status(PCA955xState *s) > +{ > + return (s->regs[PCA9552_INPUT1] << 8) | s->regs[PCA9552_INPUT0]; > +} > + > +static void pca955x_display_pins_status(PCA955xState *s, > + uint16_t previous_pins_status) > +{ > + PCA955xClass *k = PCA955X_GET_CLASS(s); > + uint16_t pins_status, pins_changed; > + int i; > + > + pins_status = pca955x_pins_get_status(s); > + pins_changed = previous_pins_status ^ pins_status; > + if (!pins_changed) { > + return; > + } > + if (trace_event_get_state_backends(TRACE_PCA955X_GPIO_STATUS)) { > + char *buf = g_newa(char, k->pin_count + 1); > + > + for (i = 0; i < k->pin_count; i++) { > + if (extract32(pins_status, i, 1)) { > + buf[i] = '*'; > + } else { > + buf[i] = '.'; > + } > + } > + buf[i] = '\0'; > + trace_pca955x_gpio_status(s->description, buf); > + } > +} > + > static void pca955x_update_pin_input(PCA955xState *s) > { > PCA955xClass *k = PCA955X_GET_CLASS(s); > @@ -98,6 +133,8 @@ static uint8_t pca955x_read(PCA955xState *s, uint8_t reg) > > static void pca955x_write(PCA955xState *s, uint8_t reg, uint8_t data) > { > + uint16_t pins_status; > + > switch (reg) { > case PCA9552_PSC0: > case PCA9552_PWM0: > @@ -110,8 +147,10 @@ static void pca955x_write(PCA955xState *s, uint8_t reg, > uint8_t data) > case PCA9552_LS1: > case PCA9552_LS2: > case PCA9552_LS3: > + pins_status = pca955x_pins_get_status(s); > s->regs[reg] = data; > pca955x_update_pin_input(s); > + pca955x_display_pins_status(s, pins_status); > break; > > case PCA9552_INPUT0: > diff --git a/hw/misc/trace-events b/hw/misc/trace-events > index 5561746866..9282c60dd9 100644 > --- a/hw/misc/trace-events > +++ b/hw/misc/trace-events > @@ -206,3 +206,6 @@ via1_rtc_cmd_pram_sect_write(int sector, int offset, int > addr, int value) "secto > # grlib_ahb_apb_pnp.c > grlib_ahb_pnp_read(uint64_t addr, uint32_t value) "AHB PnP read > addr:0x%03"PRIx64" data:0x%08x" > grlib_apb_pnp_read(uint64_t addr, uint32_t value) "APB PnP read > addr:0x%03"PRIx64" data:0x%08x" > + > +# pca9552.c > +pca955x_gpio_status(const char *description, const char *buf) "%s GPIOs 0-15 > [%s]" >