> compile NEMU

221220000 张三
Linux zzy 5.15.146.1-microsoft-standard-WSL2 #1 SMP Thu Jan 11 04:09:03 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
 23:06:41 up 2 days, 13:20,  1 user,  load average: 0.64, 0.62, 0.46
This commit is contained in:
tracer-ics2023
2024-09-14 23:06:42 +08:00
committed by zzy
parent 22bfc09837
commit ef8815e93b
2 changed files with 30 additions and 3 deletions

View File

@ -2,24 +2,43 @@
#include <nemu.h>
#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;
}

View File

@ -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());