/* * QEMU DM163 8x3-channel constant current led driver * driving columns of associated 8x8 RGB matrix. * * Copyright (C) 2024 Samuel Tardieu * Copyright (C) 2024 Arnaud Minier * Copyright (C) 2024 Inès Varhol * * SPDX-License-Identifier: GPL-2.0-or-later */ #ifndef HW_DISPLAY_DM163_H #define HW_DISPLAY_DM163_H #include "qom/object.h" #include "hw/qdev-core.h" #define TYPE_DM163 "dm163" OBJECT_DECLARE_SIMPLE_TYPE(DM163State, DM163); #define RGB_MATRIX_NUM_ROWS 8 #define RGB_MATRIX_NUM_COLS 8 #define DM163_NUM_LEDS (RGB_MATRIX_NUM_COLS * 3) /* The last row is filled with 0 (turned off row) */ #define COLOR_BUFFER_SIZE (RGB_MATRIX_NUM_ROWS + 1) typedef struct DM163State { DeviceState parent_obj; /* DM163 driver */ uint64_t bank0_shift_register[3]; uint64_t bank1_shift_register[3]; uint16_t latched_outputs[DM163_NUM_LEDS]; uint16_t outputs[DM163_NUM_LEDS]; qemu_irq sout; uint8_t sin; uint8_t dck; uint8_t rst_b; uint8_t lat_b; uint8_t selbk; uint8_t en_b; /* IM120417002 colors shield */ uint8_t activated_rows; /* 8x8 RGB matrix */ QemuConsole *console; uint8_t redraw; /* Rows currently being displayed on the matrix. */ /* The last row is filled with 0 (turned off row) */ uint32_t buffer[COLOR_BUFFER_SIZE][RGB_MATRIX_NUM_COLS]; uint8_t last_buffer_idx; uint8_t buffer_idx_of_row[RGB_MATRIX_NUM_ROWS]; /* Used to simulate retinal persistence of rows */ uint8_t row_persistence_delay[RGB_MATRIX_NUM_ROWS]; } DM163State; #endif /* HW_DISPLAY_DM163_H */