From bf1011e2bab8658300ebc5ca5ebc5b11ccb64695 Mon Sep 17 00:00:00 2001 From: Kevin Lange Date: Fri, 16 Dec 2011 13:39:34 -0600 Subject: [PATCH] [vid] Support setting video resolution from kernel args --- kernel/include/system.h | 2 +- kernel/misc/args.c | 14 +++++++++++--- kernel/video/bochs.c | 12 +++++------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/kernel/include/system.h b/kernel/include/system.h index 8d026ae1..4dfa23da 100644 --- a/kernel/include/system.h +++ b/kernel/include/system.h @@ -281,7 +281,7 @@ extern int detect_cpu(); /* Video Drivers */ /* BOCHS / QEMU VBE Driver */ -extern void graphics_install_bochs(); +extern void graphics_install_bochs(uint16_t, uint16_t); extern void bochs_set_csr(int x, int y); extern int bochs_get_csr_x(); extern int bochs_get_csr_y(); diff --git a/kernel/misc/args.c b/kernel/misc/args.c index 8a7cc93d..92283b63 100644 --- a/kernel/misc/args.c +++ b/kernel/misc/args.c @@ -45,12 +45,12 @@ parse_args( char * save_i; char * argp[1024]; int argc = 0; - pch_i = strtok_r(argv[i],"=",&save_i); + pch_i = strtok_r(argv[i],"=,",&save_i); if (!pch_i) { continue; } while (pch_i != NULL) { argp[argc] = (char *)pch_i; ++argc; - pch_i = strtok_r(NULL,"=",&save_i); + pch_i = strtok_r(NULL,"=,",&save_i); } argp[argc] = NULL; @@ -58,7 +58,15 @@ parse_args( if (argc < 2) { kprintf("vid=?\n"); continue; } if (!strcmp(argp[1],"qemu")) { /* Bochs / Qemu Video Device */ - graphics_install_bochs(); + uint16_t x, y; + if (argc < 4) { + x = 1024; + y = 768; + } else { + x = atoi(argp[2]); + y = atoi(argp[3]); + } + graphics_install_bochs(x,y); } else { kprintf("Unrecognized video adapter: %s\n", argp[1]); } diff --git a/kernel/video/bochs.c b/kernel/video/bochs.c index 69c2d68d..057e2e0b 100644 --- a/kernel/video/bochs.c +++ b/kernel/video/bochs.c @@ -11,8 +11,6 @@ * ie the one on my laptop, but it's 2048 on * the EWS machines. */ #define BOCHS_BUFFER_SIZE 2048 -#define PREFERRED_X 1280 //1024 -#define PREFERRED_Y 720 //768 #define PREFERRED_VY 4096 #define PREFERRED_B 32 @@ -154,7 +152,7 @@ bochs_install_wallpaper(char * filename) { } void -graphics_install_bochs() { +graphics_install_bochs(uint16_t resolution_x, uint16_t resolution_y) { outports(0x1CE, 0x00); uint16_t i = inports(0x1CF); if (i < 0xB0C0 || i > 0xB0C6) { @@ -167,10 +165,10 @@ graphics_install_bochs() { outports(0x1CF, 0x00); /* Set X resolution to 1024 */ outports(0x1CE, 0x01); - outports(0x1CF, PREFERRED_X); + outports(0x1CF, resolution_x); /* Set Y resolution to 768 */ outports(0x1CE, 0x02); - outports(0x1CF, PREFERRED_Y); + outports(0x1CF, resolution_y); /* Set bpp to 32 */ outports(0x1CE, 0x03); outports(0x1CF, PREFERRED_B); @@ -208,8 +206,8 @@ graphics_install_bochs() { } mem_found: - bochs_resolution_x = PREFERRED_X; - bochs_resolution_y = PREFERRED_Y; + bochs_resolution_x = resolution_x; + bochs_resolution_y = resolution_y; bochs_resolution_b = PREFERRED_B; term_width = bochs_resolution_x / 8;