xref: /openbmc/qemu/include/hw/display/dm163.h (revision c771f883)
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