version 1.1, 2018/04/24 16:48:23
|
version 1.1.1.3, 2018/04/24 17:23:30
|
Line 34 typedef enum {
|
Line 34 typedef enum {
|
} screen_state_t; |
} screen_state_t; |
|
|
typedef struct LedState { |
typedef struct LedState { |
target_phys_addr_t base; |
|
uint8_t segments; |
uint8_t segments; |
DisplayState *ds; |
DisplayState *ds; |
screen_state_t state; |
screen_state_t state; |
Line 43 typedef struct LedState {
|
Line 42 typedef struct LedState {
|
static uint32_t led_readb(void *opaque, target_phys_addr_t addr) |
static uint32_t led_readb(void *opaque, target_phys_addr_t addr) |
{ |
{ |
LedState *s = opaque; |
LedState *s = opaque; |
int relative_addr = addr - s->base; |
|
uint32_t val; |
uint32_t val; |
|
|
switch (relative_addr) { |
switch (addr) { |
case 0: |
case 0: |
val = s->segments; |
val = s->segments; |
break; |
break; |
Line 93 static uint32_t led_readl(void *opaque,
|
Line 91 static uint32_t led_readl(void *opaque,
|
static void led_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) |
static void led_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) |
{ |
{ |
LedState *s = opaque; |
LedState *s = opaque; |
int relative_addr = addr - s->base; |
|
|
|
switch (relative_addr) { |
switch (addr) { |
case 0: |
case 0: |
s->segments = val; |
s->segments = val; |
s->state |= REDRAW_SEGMENTS; |
s->state |= REDRAW_SEGMENTS; |
Line 154 static void draw_horizontal_line(Display
|
Line 151 static void draw_horizontal_line(Display
|
uint8_t *d; |
uint8_t *d; |
int x, bpp; |
int x, bpp; |
|
|
bpp = (ds->depth + 7) >> 3; |
bpp = (ds_get_bits_per_pixel(ds) + 7) >> 3; |
d = ds->data + ds->linesize * posy + bpp * posx1; |
d = ds_get_data(ds) + ds_get_linesize(ds) * posy + bpp * posx1; |
switch(bpp) { |
switch(bpp) { |
case 1: |
case 1: |
for (x = posx1; x <= posx2; x++) { |
for (x = posx1; x <= posx2; x++) { |
Line 183 static void draw_vertical_line(DisplaySt
|
Line 180 static void draw_vertical_line(DisplaySt
|
uint8_t *d; |
uint8_t *d; |
int y, bpp; |
int y, bpp; |
|
|
bpp = (ds->depth + 7) >> 3; |
bpp = (ds_get_bits_per_pixel(ds) + 7) >> 3; |
d = ds->data + ds->linesize * posy1 + bpp * posx; |
d = ds_get_data(ds) + ds_get_linesize(ds) * posy1 + bpp * posx; |
switch(bpp) { |
switch(bpp) { |
case 1: |
case 1: |
for (y = posy1; y <= posy2; y++) { |
for (y = posy1; y <= posy2; y++) { |
*((uint8_t *)d) = color; |
*((uint8_t *)d) = color; |
d += ds->linesize; |
d += ds_get_linesize(ds); |
} |
} |
break; |
break; |
case 2: |
case 2: |
for (y = posy1; y <= posy2; y++) { |
for (y = posy1; y <= posy2; y++) { |
*((uint16_t *)d) = color; |
*((uint16_t *)d) = color; |
d += ds->linesize; |
d += ds_get_linesize(ds); |
} |
} |
break; |
break; |
case 4: |
case 4: |
for (y = posy1; y <= posy2; y++) { |
for (y = posy1; y <= posy2; y++) { |
*((uint32_t *)d) = color; |
*((uint32_t *)d) = color; |
d += ds->linesize; |
d += ds_get_linesize(ds); |
} |
} |
break; |
break; |
} |
} |
Line 217 static void jazz_led_update_display(void
|
Line 214 static void jazz_led_update_display(void
|
|
|
if (s->state & REDRAW_BACKGROUND) { |
if (s->state & REDRAW_BACKGROUND) { |
/* clear screen */ |
/* clear screen */ |
bpp = (ds->depth + 7) >> 3; |
bpp = (ds_get_bits_per_pixel(ds) + 7) >> 3; |
d1 = ds->data; |
d1 = ds_get_data(ds); |
for (y = 0; y < ds->height; y++) { |
for (y = 0; y < ds_get_height(ds); y++) { |
memset(d1, 0x00, ds->width * bpp); |
memset(d1, 0x00, ds_get_width(ds) * bpp); |
d1 += ds->linesize; |
d1 += ds_get_linesize(ds); |
} |
} |
} |
} |
|
|
if (s->state & REDRAW_SEGMENTS) { |
if (s->state & REDRAW_SEGMENTS) { |
/* set colors according to bpp */ |
/* set colors according to bpp */ |
switch (ds->depth) { |
switch (ds_get_bits_per_pixel(ds)) { |
case 8: |
case 8: |
color_segment = rgb_to_pixel8(0xaa, 0xaa, 0xaa); |
color_segment = rgb_to_pixel8(0xaa, 0xaa, 0xaa); |
color_led = rgb_to_pixel8(0x00, 0xff, 0x00); |
color_led = rgb_to_pixel8(0x00, 0xff, 0x00); |
Line 271 static void jazz_led_update_display(void
|
Line 268 static void jazz_led_update_display(void
|
} |
} |
|
|
s->state = REDRAW_NONE; |
s->state = REDRAW_NONE; |
dpy_update(ds, 0, 0, ds->width, ds->height); |
dpy_update(ds, 0, 0, ds_get_width(ds), ds_get_height(ds)); |
} |
} |
|
|
static void jazz_led_invalidate_display(void *opaque) |
static void jazz_led_invalidate_display(void *opaque) |
Line 285 static void jazz_led_screen_dump(void *o
|
Line 282 static void jazz_led_screen_dump(void *o
|
printf("jazz_led_screen_dump() not implemented\n"); |
printf("jazz_led_screen_dump() not implemented\n"); |
} |
} |
|
|
void jazz_led_init(DisplayState *ds, target_phys_addr_t base) |
static void jazz_led_text_update(void *opaque, console_ch_t *chardata) |
|
{ |
|
LedState *s = opaque; |
|
char buf[2]; |
|
|
|
dpy_cursor(s->ds, -1, -1); |
|
qemu_console_resize(s->ds, 2, 1); |
|
|
|
/* TODO: draw the segments */ |
|
snprintf(buf, 2, "%02hhx\n", s->segments); |
|
console_write_ch(chardata++, 0x00200100 | buf[0]); |
|
console_write_ch(chardata++, 0x00200100 | buf[1]); |
|
|
|
dpy_update(s->ds, 0, 0, 2, 1); |
|
} |
|
|
|
void jazz_led_init(target_phys_addr_t base) |
{ |
{ |
LedState *s; |
LedState *s; |
int io; |
int io; |
|
|
s = qemu_mallocz(sizeof(LedState)); |
s = qemu_mallocz(sizeof(LedState)); |
if (!s) |
|
return; |
|
|
|
s->base = base; |
|
s->ds = ds; |
|
s->state = REDRAW_SEGMENTS | REDRAW_BACKGROUND; |
s->state = REDRAW_SEGMENTS | REDRAW_BACKGROUND; |
|
|
io = cpu_register_io_memory(0, led_read, led_write, s); |
io = cpu_register_io_memory(led_read, led_write, s); |
cpu_register_physical_memory(s->base, 1, io); |
cpu_register_physical_memory(base, 1, io); |
|
|
graphic_console_init(ds, jazz_led_update_display, jazz_led_invalidate_display, jazz_led_screen_dump, s); |
s->ds = graphic_console_init(jazz_led_update_display, |
|
jazz_led_invalidate_display, |
|
jazz_led_screen_dump, |
|
jazz_led_text_update, s); |
|
qemu_console_resize(s->ds, 60, 80); |
} |
} |