static int bochs_video_stop() { bochs_map_video(0); vbe_write(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED); video_drv_basic_vga_set_text_mode(); return 0; }
static int bochs_set_par(struct fb_info *info) { info->screen_size = info->var.xres * info->var.yres * (info->var.bits_per_pixel / 8); vbe_write(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED); vbe_write(VBE_DISPI_INDEX_XRES, info->var.xres); vbe_write(VBE_DISPI_INDEX_YRES, info->var.yres); vbe_write(VBE_DISPI_INDEX_BPP, info->var.bits_per_pixel); vbe_write(VBE_DISPI_INDEX_VIRT_WIDTH, info->var.xres_virtual); vbe_write(VBE_DISPI_INDEX_VIRT_HEIGHT, info->var.yres_virtual); vbe_write(VBE_DISPI_INDEX_X_OFFSET, info->var.xoffset); vbe_write(VBE_DISPI_INDEX_Y_OFFSET, info->var.yoffset); vbe_write(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED); return 0; }
static int bochs_set_var(struct fb_info *info, const struct fb_var_screeninfo *var) { if (var->xres > VBE_DISPI_MAX_XRES || var->yres > VBE_DISPI_MAX_YRES || var->bits_per_pixel > VBE_DISPI_MAX_BPP) { return -EINVAL; } vbe_write(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED); vbe_write(VBE_DISPI_INDEX_XRES, var->xres); vbe_write(VBE_DISPI_INDEX_YRES, var->yres); vbe_write(VBE_DISPI_INDEX_BPP, var->bits_per_pixel); vbe_write(VBE_DISPI_INDEX_VIRT_WIDTH, var->xres_virtual); vbe_write(VBE_DISPI_INDEX_VIRT_HEIGHT, var->yres_virtual); vbe_write(VBE_DISPI_INDEX_X_OFFSET, var->xoffset); vbe_write(VBE_DISPI_INDEX_Y_OFFSET, var->yoffset); vbe_write(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED); return 0; }
static int bochs_video_probe() { //printf("Probing for "); vbe_write(VBE_DISPI_INDEX_ID, VBE_DISPI_ID2); int id = vbe_read(VBE_DISPI_INDEX_ID); if( id < VBE_DISPI_ID2 || id > VBE_DISPI_ID3 ) return VIDEO_PROBE_FAIL; if( hal_alloc_vaddress((void **)&video_driver_bochs_vesa_emulator.screen, n_pages) ) panic("Can't alloc vaddress for %d videmem pages", n_pages); SHOW_FLOW( 7, "vmem va 0x%X", video_driver_bochs_vesa_emulator.screen); printf("Bochs VBE emulator ver 0x%x found\n", id); return VIDEO_PROBE_SUCCESS; }
// Return nonzero on err int vbe_set(unsigned short xres, unsigned short yres, unsigned short bpp) { vbe_write(VBE_DISPI_INDEX_ID, VBE_DISPI_ID2); int id = vbe_read(VBE_DISPI_INDEX_ID); printf("VBE ver 0x%x... ", id); //getchar(); if( id < VBE_DISPI_ID2 || id > VBE_DISPI_ID3 ) return 1; vbe_write(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED); vbe_write(VBE_DISPI_INDEX_XRES, xres); vbe_write(VBE_DISPI_INDEX_YRES, yres); vbe_write(VBE_DISPI_INDEX_BPP, bpp); vbe_write(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED); return 0; }