On 6/21/20 12:58 AM, Philippe Mathieu-Daudé wrote: > Add a trivial representation of the PCA9552 GPIOs. > > Example booting obmc-phosphor-image: > > $ qemu-system-arm -M witherspoon-bmc -trace pca9552_gpio_status > 1592689902.327837:pca9552_gpio_status pca-unspecified GPIOs 0-15 > [*...............] > 1592689902.329934:pca9552_gpio_status pca-unspecified GPIOs 0-15 > [**..............] > 1592689902.330717:pca9552_gpio_status pca-unspecified GPIOs 0-15 > [***.............] > 1592689902.331431:pca9552_gpio_status pca-unspecified GPIOs 0-15 > [****............] > 1592689902.332163:pca9552_gpio_status pca-unspecified GPIOs 0-15 > [****.........*..] > 1592689902.332888:pca9552_gpio_status pca-unspecified GPIOs 0-15 > [****.........**.] > 1592689902.333629:pca9552_gpio_status pca-unspecified GPIOs 0-15 > [****.........***] > 1592690032.793289:pca9552_gpio_status pca-unspecified GPIOs 0-15 > [****.........*.*] > 1592690033.303163:pca9552_gpio_status pca-unspecified GPIOs 0-15 > [****.........***] > 1592690033.812962:pca9552_gpio_status pca-unspecified GPIOs 0-15 > [****.........*.*] > 1592690034.323234:pca9552_gpio_status pca-unspecified GPIOs 0-15 > [****.........***] > 1592690034.832922:pca9552_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> > --- > include/hw/misc/pca9552.h | 1 + > hw/misc/pca9552.c | 29 +++++++++++++++++++++++++++++ > hw/misc/trace-events | 3 +++ > 3 files changed, 33 insertions(+) > > diff --git a/include/hw/misc/pca9552.h b/include/hw/misc/pca9552.h > index c5be7f1c5e..755be2e8e5 100644 > --- a/include/hw/misc/pca9552.h > +++ b/include/hw/misc/pca9552.h > @@ -26,6 +26,7 @@ typedef struct PCA9552State { > uint8_t pointer; > > uint8_t regs[PCA9552_NR_REGS]; > + uint16_t pins_status; /* Holds latest INPUT0 & INPUT1 status */
Hmm, that is an extra state redundant with regs. > uint8_t max_reg; > char *description; /* For debugging purpose only */ > uint8_t nr_leds; > diff --git a/hw/misc/pca9552.c b/hw/misc/pca9552.c > index 54ccdcf6d4..f0d435e310 100644 > --- a/hw/misc/pca9552.c > +++ b/hw/misc/pca9552.c > @@ -12,12 +12,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" > > #define PCA9552_LED_ON 0x0 > #define PCA9552_LED_OFF 0x1 > @@ -34,6 +36,32 @@ static uint8_t pca9552_pin_get_config(PCA9552State *s, int > pin) > return extract32(s->regs[reg], shift, 2); > } > > +static void pca9552_display_pins_status(PCA9552State *s) > +{ > + uint16_t pins_status, pins_changed; > + int i; > + > + pins_status = (s->regs[PCA9552_INPUT1] << 8) | s->regs[PCA9552_INPUT0]; > + pins_changed = s->pins_status ^ pins_status; > + if (!pins_changed) { > + return; > + } > + s->pins_status = pins_status; It's nice to have but it won't kill puppies if we recompute the state each time when traces are on. > + if (trace_event_get_state_backends(TRACE_PCA9552_GPIO_STATUS)) { > + char buf[PCA9552_PIN_COUNT + 1]; > + > + for (i = 0; i < s->nr_leds; i++) { > + if (extract32(pins_status, i, 1)) { > + buf[i] = '*'; > + } else { > + buf[i] = '.'; > + } > + } > + buf[i] = '\0'; > + trace_pca9552_gpio_status(s->description, buf); > + } > +} > + > static void pca9552_update_pin_input(PCA9552State *s) > { > int i; > @@ -57,6 +85,7 @@ static void pca9552_update_pin_input(PCA9552State *s) > break; > } and we could test TRACE_PCA9552_GPIO_STATUS here : > } > + pca9552_display_pins_status(s); > } > > static uint8_t pca9552_read(PCA9552State *s, uint8_t reg) > diff --git a/hw/misc/trace-events b/hw/misc/trace-events > index 5561746866..7630e59652 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 > +pca9552_gpio_status(const char *description, const char *buf) "%s GPIOs 0-15 > [%s]" >