/* The controller can support a variety of different displays, but we only
implement one. Most of the commends relating to brightness and geometry
setup are ignored. */
-#include "hw.h"
-#include "devices.h"
+#include "ssi.h"
#include "console.h"
//#define DEBUG_SSD0323 1
#ifdef DEBUG_SSD0323
-#define DPRINTF(fmt, args...) \
-do { printf("ssd0323: " fmt , ##args); } while (0)
-#define BADF(fmt, args...) \
-do { fprintf(stderr, "ssd0323: error: " fmt , ##args); exit(1);} while (0)
+#define DPRINTF(fmt, ...) \
+do { printf("ssd0323: " fmt , ## __VA_ARGS__); } while (0)
+#define BADF(fmt, ...) \
+do { fprintf(stderr, "ssd0323: error: " fmt , ## __VA_ARGS__); exit(1);} while (0)
#else
-#define DPRINTF(fmt, args...) do {} while(0)
-#define BADF(fmt, args...) \
-do { fprintf(stderr, "ssd0323: error: " fmt , ##args);} while (0)
+#define DPRINTF(fmt, ...) do {} while(0)
+#define BADF(fmt, ...) \
+do { fprintf(stderr, "ssd0323: error: " fmt , ## __VA_ARGS__);} while (0)
#endif
/* Scaling factor for pixels. */
};
typedef struct {
+ SSISlave ssidev;
DisplayState *ds;
- QEMUConsole *console;
int cmd_len;
int cmd;
uint8_t framebuffer[128 * 80 / 2];
} ssd0323_state;
-int ssd0323_xfer_ssi(void *opaque, int data)
+static uint32_t ssd0323_transfer(SSISlave *dev, uint32_t data)
{
- ssd0323_state *s = (ssd0323_state *)opaque;
+ ssd0323_state *s = FROM_SSI_SLAVE(ssd0323_state, dev);
+
switch (s->mode) {
case SSD0323_DATA:
DPRINTF("data 0x%02x\n", data);
if (!s->redraw)
return;
- switch (s->ds->depth) {
+ switch (ds_get_bits_per_pixel(s->ds)) {
case 0:
return;
case 15:
for (i = 0; i < 16; i++) {
int n;
colors[i] = p;
- switch (s->ds->depth) {
+ switch (ds_get_bits_per_pixel(s->ds)) {
case 15:
n = i * 2 + (i >> 3);
p[0] = n | (n << 5);
p += dest_width;
}
/* TODO: Implement row/column remapping. */
- dest = s->ds->data;
+ dest = ds_get_data(s->ds);
for (y = 0; y < 64; y++) {
line = y;
src = s->framebuffer + 64 * line;
return 0;
}
-void *ssd0323_init(DisplayState *ds, qemu_irq *cmd_p)
+static int ssd0323_init(SSISlave *dev)
{
- ssd0323_state *s;
- qemu_irq *cmd;
+ ssd0323_state *s = FROM_SSI_SLAVE(ssd0323_state, dev);
- s = (ssd0323_state *)qemu_mallocz(sizeof(ssd0323_state));
s->col_end = 63;
s->row_end = 79;
- s->ds = ds;
- s->console = graphic_console_init(ds, ssd0323_update_display,
- ssd0323_invalidate_display,
- NULL, NULL, s);
- qemu_console_resize(s->console, 128 * MAGNIFY, 64 * MAGNIFY);
+ s->ds = graphic_console_init(ssd0323_update_display,
+ ssd0323_invalidate_display,
+ NULL, NULL, s);
+ qemu_console_resize(s->ds, 128 * MAGNIFY, 64 * MAGNIFY);
- cmd = qemu_allocate_irqs(ssd0323_cd, s, 1);
- *cmd_p = *cmd;
+ qdev_init_gpio_in(&dev->qdev, ssd0323_cd, 1);
register_savevm("ssd0323_oled", -1, 1, ssd0323_save, ssd0323_load, s);
+ return 0;
+}
- return s;
+static SSISlaveInfo ssd0323_info = {
+ .qdev.name = "ssd0323",
+ .qdev.size = sizeof(ssd0323_state),
+ .init = ssd0323_init,
+ .transfer = ssd0323_transfer
+};
+
+static void ssd03232_register_devices(void)
+{
+ ssi_register_slave(&ssd0323_info);
}
+
+device_init(ssd03232_register_devices)