1*c771f883SInès Varhol /* 2*c771f883SInès Varhol * QEMU DM163 8x3-channel constant current led driver 3*c771f883SInès Varhol * driving columns of associated 8x8 RGB matrix. 4*c771f883SInès Varhol * 5*c771f883SInès Varhol * Copyright (C) 2024 Samuel Tardieu <sam@rfc1149.net> 6*c771f883SInès Varhol * Copyright (C) 2024 Arnaud Minier <arnaud.minier@telecom-paris.fr> 7*c771f883SInès Varhol * Copyright (C) 2024 Inès Varhol <ines.varhol@telecom-paris.fr> 8*c771f883SInès Varhol * 9*c771f883SInès Varhol * SPDX-License-Identifier: GPL-2.0-or-later 10*c771f883SInès Varhol */ 11*c771f883SInès Varhol 12*c771f883SInès Varhol #ifndef HW_DISPLAY_DM163_H 13*c771f883SInès Varhol #define HW_DISPLAY_DM163_H 14*c771f883SInès Varhol 15*c771f883SInès Varhol #include "qom/object.h" 16*c771f883SInès Varhol #include "hw/qdev-core.h" 17*c771f883SInès Varhol 18*c771f883SInès Varhol #define TYPE_DM163 "dm163" 19*c771f883SInès Varhol OBJECT_DECLARE_SIMPLE_TYPE(DM163State, DM163); 20*c771f883SInès Varhol 21*c771f883SInès Varhol #define RGB_MATRIX_NUM_ROWS 8 22*c771f883SInès Varhol #define RGB_MATRIX_NUM_COLS 8 23*c771f883SInès Varhol #define DM163_NUM_LEDS (RGB_MATRIX_NUM_COLS * 3) 24*c771f883SInès Varhol /* The last row is filled with 0 (turned off row) */ 25*c771f883SInès Varhol #define COLOR_BUFFER_SIZE (RGB_MATRIX_NUM_ROWS + 1) 26*c771f883SInès Varhol 27*c771f883SInès Varhol typedef struct DM163State { 28*c771f883SInès Varhol DeviceState parent_obj; 29*c771f883SInès Varhol 30*c771f883SInès Varhol /* DM163 driver */ 31*c771f883SInès Varhol uint64_t bank0_shift_register[3]; 32*c771f883SInès Varhol uint64_t bank1_shift_register[3]; 33*c771f883SInès Varhol uint16_t latched_outputs[DM163_NUM_LEDS]; 34*c771f883SInès Varhol uint16_t outputs[DM163_NUM_LEDS]; 35*c771f883SInès Varhol qemu_irq sout; 36*c771f883SInès Varhol 37*c771f883SInès Varhol uint8_t sin; 38*c771f883SInès Varhol uint8_t dck; 39*c771f883SInès Varhol uint8_t rst_b; 40*c771f883SInès Varhol uint8_t lat_b; 41*c771f883SInès Varhol uint8_t selbk; 42*c771f883SInès Varhol uint8_t en_b; 43*c771f883SInès Varhol 44*c771f883SInès Varhol /* IM120417002 colors shield */ 45*c771f883SInès Varhol uint8_t activated_rows; 46*c771f883SInès Varhol 47*c771f883SInès Varhol /* 8x8 RGB matrix */ 48*c771f883SInès Varhol QemuConsole *console; 49*c771f883SInès Varhol uint8_t redraw; 50*c771f883SInès Varhol /* Rows currently being displayed on the matrix. */ 51*c771f883SInès Varhol /* The last row is filled with 0 (turned off row) */ 52*c771f883SInès Varhol uint32_t buffer[COLOR_BUFFER_SIZE][RGB_MATRIX_NUM_COLS]; 53*c771f883SInès Varhol uint8_t last_buffer_idx; 54*c771f883SInès Varhol uint8_t buffer_idx_of_row[RGB_MATRIX_NUM_ROWS]; 55*c771f883SInès Varhol /* Used to simulate retinal persistence of rows */ 56*c771f883SInès Varhol uint8_t row_persistence_delay[RGB_MATRIX_NUM_ROWS]; 57*c771f883SInès Varhol } DM163State; 58*c771f883SInès Varhol 59*c771f883SInès Varhol #endif /* HW_DISPLAY_DM163_H */ 60