From ef8815e93bb358c69d519e336aee99707150c6dd Mon Sep 17 00:00:00 2001 From: tracer-ics2023 Date: Sat, 14 Sep 2024 23:06:42 +0800 Subject: [PATCH] =?UTF-8?q?>=20=20compile=20NEMU=20221220000=20=E5=BC=A0?= =?UTF-8?q?=E4=B8=89=20Linux=20zzy=205.15.146.1-microsoft-standard-WSL2=20?= =?UTF-8?q?#1=20SMP=20Thu=20Jan=2011=2004:09:03=20UTC=202024=20x86=5F64=20?= =?UTF-8?q?x86=5F64=20x86=5F64=20GNU/Linux=20=2023:06:41=20up=202=20days,?= =?UTF-8?q?=2013:20,=20=201=20user,=20=20load=20average:=200.64,=200.62,?= =?UTF-8?q?=200.46?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../am/src/platform/nemu/ioe/gpu.c | 25 ++++++++++++++++--- nemu/src/device/vga.c | 8 ++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/abstract-machine/am/src/platform/nemu/ioe/gpu.c b/abstract-machine/am/src/platform/nemu/ioe/gpu.c index fb33096..cf8067e 100644 --- a/abstract-machine/am/src/platform/nemu/ioe/gpu.c +++ b/abstract-machine/am/src/platform/nemu/ioe/gpu.c @@ -2,24 +2,43 @@ #include #define SYNC_ADDR (VGACTL_ADDR + 4) +#define GET_W(var) uint16_t var = inw(VGACTL_ADDR + 2) +#define GET_H(var) uint16_t var = inw(VGACTL_ADDR) void __am_gpu_init() { + int i; + GET_W(w); + GET_H(h); + // int w = inw(VGACTL_ADDR + 2); // TODO: get the correct width + // int h = inw(VGACTL_ADDR); // TODO: get the correct height + uint32_t *fb = (uint32_t *)(uintptr_t)FB_ADDR; + for (i = 0; i < w * h; i ++) fb[i] = i; + outl(SYNC_ADDR, 1); } void __am_gpu_config(AM_GPU_CONFIG_T *cfg) { + // uint32_t vgactl = inl(VGACTL_ADDR); + GET_W(w); + GET_H(h); *cfg = (AM_GPU_CONFIG_T) { .present = true, .has_accel = false, - .width = 0, .height = 0, - .vmemsz = 0 + .width = w, .height = h, + .vmemsz = w*h*32 }; } void __am_gpu_fbdraw(AM_GPU_FBDRAW_T *ctl) { + GET_W(w); + for (int i = 0; i < ctl->h; i++) { + for (int j = 0; j < ctl->w; j++) { + outl(FB_ADDR + w * j + i, (uint32_t)ctl->pixels + w * j + i); + } + } if (ctl->sync) { outl(SYNC_ADDR, 1); } } void __am_gpu_status(AM_GPU_STATUS_T *status) { - status->ready = true; + status->ready = inl(SYNC_ADDR) == 0 ? true : false; } diff --git a/nemu/src/device/vga.c b/nemu/src/device/vga.c index f30bf77..4914906 100644 --- a/nemu/src/device/vga.c +++ b/nemu/src/device/vga.c @@ -33,6 +33,7 @@ static uint32_t screen_size() { static void *vmem = NULL; static uint32_t *vgactl_port_base = NULL; +static uint32_t *sync_reg = NULL; #ifdef CONFIG_VGA_SHOW_SCREEN #ifndef CONFIG_TARGET_AM @@ -74,6 +75,10 @@ static inline void update_screen() { void vga_update_screen() { // TODO: call `update_screen()` when the sync register is non-zero, // then zero out the sync register + if (*sync_reg) { + update_screen(); + *sync_reg = 0; + } } void init_vga() { @@ -85,6 +90,9 @@ void init_vga() { add_mmio_map("vgactl", CONFIG_VGA_CTL_MMIO, vgactl_port_base, 8, NULL); #endif + sync_reg = (uint32_t*)new_space(8); + add_mmio_map("sync", CONFIG_VGA_CTL_MMIO + 8, sync_reg, 8, NULL); + vmem = new_space(screen_size()); add_mmio_map("vmem", CONFIG_FB_ADDR, vmem, screen_size(), NULL); IFDEF(CONFIG_VGA_SHOW_SCREEN, init_screen());