*/
#include <stdio.h>
-#include <assert.h>
#include "hw.h"
#include "pc.h"
#include "console.h"
//#define DEBUG_BITBLT
#ifdef DEBUG_SM501
-#define SM501_DPRINTF(fmt...) printf(fmt)
+#define SM501_DPRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__)
#else
-#define SM501_DPRINTF(fmt...) do {} while(0)
+#define SM501_DPRINTF(fmt, ...) do {} while(0)
#endif
typedef struct SM501State {
/* graphic console status */
DisplayState *ds;
- QEMUConsole *console;
/* status & internal resources */
target_phys_addr_t base;
uint32_t local_mem_size_index;
uint8_t * local_mem;
+ ram_addr_t local_mem_offset;
uint32_t last_width;
uint32_t last_height;
uint32_t norm_size = 0;
int i, index = 0;
- for (i = 0; i < sizeof(sm501_mem_local_size)/sizeof(uint32_t); i++) {
+ for (i = 0; i < ARRAY_SIZE(sm501_mem_local_size); i++) {
uint32_t new_size = sm501_mem_local_size[i];
if (new_size >= size) {
if (norm_size == 0 || norm_size > new_size) {
static inline int get_depth_index(DisplayState *s)
{
- switch(s->depth) {
+ switch(ds_get_bits_per_pixel(s)) {
default:
case 8:
return 0;
case 15:
- if (s->bgr)
- return 5;
- else
- return 1;
+ return 1;
case 16:
- if (s->bgr)
- return 6;
- else
- return 2;
+ return 2;
case 32:
- if (s->bgr)
+ if (is_surface_bgr(s->surface))
return 4;
else
return 3;
uint8_t * src = s->local_mem;
int src_bpp = 0;
- int dst_bpp = s->ds->depth / 8 + (s->ds->depth % 8 ? 1 : 0);
+ int dst_bpp = ds_get_bytes_per_pixel(s->ds) + (ds_get_bits_per_pixel(s->ds) % 8 ? 1 : 0);
uint32_t * palette = (uint32_t *)&s->dc_palette[SM501_DC_CRT_PALETTE
- SM501_DC_PANEL_PALETTE];
int ds_depth_index = get_depth_index(s->ds);
int y_start = -1;
int page_min = 0x7fffffff;
int page_max = -1;
+ ram_addr_t offset = s->local_mem_offset;
/* choose draw_line function */
switch (s->dc_crt_control & 3) {
/* adjust console size */
if (s->last_width != width || s->last_height != height) {
- qemu_console_resize(s->console, width, height);
+ qemu_console_resize(s->ds, width, height);
s->last_width = width;
s->last_height = height;
full_update = 1;
/* draw each line according to conditions */
for (y = 0; y < height; y++) {
int update = full_update;
- uint8_t * line_end = &src[width * src_bpp - 1];
- int page0 = (src - phys_ram_base) & TARGET_PAGE_MASK;
- int page1 = (line_end - phys_ram_base) & TARGET_PAGE_MASK;
- int page;
+ ram_addr_t page0 = offset & TARGET_PAGE_MASK;
+ ram_addr_t page1 = (offset + width * src_bpp - 1) & TARGET_PAGE_MASK;
+ ram_addr_t page;
/* check dirty flags for each line */
for (page = page0; page <= page1; page += TARGET_PAGE_SIZE)
/* draw line and change status */
if (update) {
- draw_line(&s->ds->data[y * width * dst_bpp], src, width, palette);
+ draw_line(&(ds_get_data(s->ds)[y * width * dst_bpp]), src, width, palette);
if (y_start < 0)
y_start = y;
if (page0 < page_min)
}
src += width * src_bpp;
+ offset += width * src_bpp;
}
/* complete flush to display */
sm501_draw_crt(s);
}
-void sm501_init(DisplayState *ds, uint32_t base, unsigned long local_mem_base,
- uint32_t local_mem_bytes, CharDriverState *chr)
+void sm501_init(uint32_t base, uint32_t local_mem_bytes, qemu_irq irq,
+ CharDriverState *chr)
{
SM501State * s;
int sm501_system_config_index;
s->misc_control = 0x00001000; /* assumes SH, active=low */
s->dc_panel_control = 0x00010000;
s->dc_crt_control = 0x00010000;
- s->ds = ds;
/* allocate local memory */
- s->local_mem = (uint8 *)phys_ram_base + local_mem_base;
- cpu_register_physical_memory(base, local_mem_bytes, local_mem_base);
+ s->local_mem_offset = qemu_ram_alloc(local_mem_bytes);
+ s->local_mem = qemu_get_ram_ptr(s->local_mem_offset);
+ cpu_register_physical_memory(base, local_mem_bytes, s->local_mem_offset);
/* map mmio */
sm501_system_config_index
- = cpu_register_io_memory(0, sm501_system_config_readfn,
+ = cpu_register_io_memory(sm501_system_config_readfn,
sm501_system_config_writefn, s);
cpu_register_physical_memory(base + MMIO_BASE_OFFSET,
0x6c, sm501_system_config_index);
- sm501_disp_ctrl_index = cpu_register_io_memory(0, sm501_disp_ctrl_readfn,
+ sm501_disp_ctrl_index = cpu_register_io_memory(sm501_disp_ctrl_readfn,
sm501_disp_ctrl_writefn, s);
cpu_register_physical_memory(base + MMIO_BASE_OFFSET + SM501_DC,
0x1000, sm501_disp_ctrl_index);
+ /* bridge to usb host emulation module */
+ usb_ohci_init_sm501(base + MMIO_BASE_OFFSET + SM501_USB_HOST, base,
+ 2, -1, irq);
+
/* bridge to serial emulation module */
if (chr)
serial_mm_init(base + MMIO_BASE_OFFSET + SM501_UART0, 2,
115200, chr, 1);
/* create qemu graphic console */
- s->console = graphic_console_init(s->ds, sm501_update_display, NULL,
- NULL, NULL, s);
+ s->ds = graphic_console_init(sm501_update_display, NULL,
+ NULL, NULL, s);
}