From alex at fsn.hu Fri Aug 12 18:18:09 2005 From: alex at fsn.hu (alex at fsn.hu) Date: Fri, 12 Aug 2005 18:18:09 +0200 Subject: [Vesautils-devel] test2 Message-ID: <20050812161809.GB12245@linux.gyakg.u-szeged.hu> test2 -- Alex Beregszaszi email: alex at fsn.hu Free Software Network cell: +36 70 3144424 From alex at mplayerhq.hu Fri Aug 12 17:58:02 2005 From: alex at mplayerhq.hu (Alex Beregszaszi) Date: Fri, 12 Aug 2005 17:58:02 +0200 (CEST) Subject: [Vesautils-devel] CVS: CVSROOT loginfo,1.3,1.4 Message-ID: <20050812155802.213204676D@mail.mplayerhq.hu> Update of /cvsroot/vesautils/CVSROOT In directory mail:/home/alex/vesautils/CVSROOT Modified Files: loginfo Log Message: change mailing list Index: loginfo =================================================================== RCS file: /cvsroot/vesautils/CVSROOT/loginfo,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- loginfo 23 Feb 2005 21:51:36 -0000 1.3 +++ loginfo 12 Aug 2005 15:57:59 -0000 1.4 @@ -25,4 +25,4 @@ # or #DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog -DEFAULT $CVSROOT/CVSROOT/syncmail -u %{sVv} mndiff-dev at mplayerhq.hu +DEFAULT $CVSROOT/CVSROOT/syncmail -u %{sVv} vesautils-devel at mplayerhq.hu From alex at mplayerhq.hu Fri Aug 12 19:48:18 2005 From: alex at mplayerhq.hu (Alex Beregszaszi) Date: Fri, 12 Aug 2005 19:48:18 +0200 (CEST) Subject: [Vesautils-devel] CVS: vesautils Makefile, NONE, 1.1 README, NONE, 1.1 dosint.c, NONE, 1.1 get-edid, NONE, 1.1 mode3.c, NONE, 1.1 vbe.h, NONE, 1.1 vbemodeinfo.c, NONE, 1.1 vbetest.c, NONE, 1.1 vbetool.1, NONE, 1.1 vbetool.c, NONE, 1.1 vbetool.h, NONE, 1.1 vga_reset.c, NONE, 1.1 Message-ID: <20050812174818.4DD284F33E@mail.mplayerhq.hu> Update of /cvsroot/vesautils/vesautils In directory mail:/var2/tmp/cvs-serv31043 Added Files: Makefile README dosint.c get-edid mode3.c vbe.h vbemodeinfo.c vbetest.c vbetool.1 vbetool.c vbetool.h vga_reset.c Log Message: initial commit --- NEW FILE: Makefile --- CFLAGS ?= -g -Wall LDFLAGS = -llrmi all = dosint mode3 vbemodeinfo vbetest vga_reset vbetool %.o: %.c $(CC) -c $(CFLAGS) -o $@ $< all: $(all) vbetest: vbetest.c $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ mode3: mode3.c $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ dosint: dosint.c $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ vbemodeinfo: vbemodeinfo.c $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ vga_reset: vga_reset.c $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ install: mode3 vga_reset install mode3 /sbin install vga_reset /sbin .PHONY: clean clean: rm -f $(objects) $(all) core regs-out *.bak .PHONY: distclean distclean: clean rm -f .depend .PHONY: depend depend: $(sources) -$(CC) -M $(CFLAGS) $^ >.depend --- NEW FILE: README --- VESA utils ========== 1, Intro This is a collection of utilities and a library for handling VESA BIOS Extension (VBE) with the help of LRMI under Linux and BSD systems. 2, Prerequisities Get LRMI from http://sourceforge.net/projects/lrmi and install it. 3, Tools get-edid: dump edid information mode3: set vesa mode vbemodeinfo: dump information about a vbe mode vbetest: list vbe modes and test them vga_reset: call vga bios init function 4, Authors Nick Kurshev * original vbelib for MPlayer Matan Zivav * svgalib imported utils (mode3, vga_reset, get-edid) Matthew Garrett * vbetool Josh Vanderhoof * LRMI and vbetest Alex Beregszaszi * new libvbe --- NEW FILE: dosint.c --- #include #include #include #include #include unsigned char * edid = NULL; int read_edid() { int i; struct LRMI_regs regs; if (!LRMI_init()) { return -1; } edid = LRMI_alloc_real(128); if ( edid == NULL ) { return -1; } memset(edid, 0xed, 128); memset(®s, 0, sizeof(regs)); regs.es = (unsigned int)edid >> 4; regs.edi = 0; regs.eax = 0x4f15; regs.ebx = 0x01; ioperm(0,0x400,1); iopl(3); LRMI_int( 0x10, ®s ); iopl(0); ioperm(0,0x400,0); if(*edid || *(edid+7)) return -2; for(i=1;i<=6;i++) if(*(edid+i)!=0xff) return -2; return regs.eax; } int main ( int argc, char *argv[]) { read_edid(); fwrite(edid,128,1,stdout); } --- NEW FILE: get-edid --- #!/bin/sh ./dosint 0x10 0x4f15 0x0001 0x80 --- NEW FILE: mode3.c --- /* Set mode to VESA mode 3 (80x25 text mode) */ #include #include #include #include #include #include #include #include void set_vesa_mode(int mode){ struct LRMI_regs r; memset(&r, 0, sizeof(r)); r.eax = 0x4f02; r.ebx = mode; if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't set video mode (vm86 failure)\n"); } } int main(int argc, char *argv[]){ int i; if((argc>1)&&(!strcmp(argv[1],"-h"))){ printf("Usage: mode3 [ modenum [ font ] ]\n" "\n" "uses VESA bios to set video mode to modenum (3 by default)\n" "if font is given, uses setfont to change the screen font\n\n"); return 0; }; if (!LRMI_init()) return 1; ioperm(0, 0x400, 1); iopl(3); i=3; if(argc>1){ sscanf(argv[1],"%i",&i); if((i<=0))i=3; }; set_vesa_mode(i); if(argc>2){ execlp("setfont",argv[2],NULL); return 1; }; return 0; } --- NEW FILE: vbe.h --- /* This file is in the public domain. */ #ifndef _VBE_H #define _VBE_H /* structures for vbe 2.0 */ struct vbe_info_block { char vbe_signature[4]; short vbe_version; unsigned short oem_string_off; unsigned short oem_string_seg; int capabilities; unsigned short video_mode_list_off; unsigned short video_mode_list_seg; short total_memory; short oem_software_rev; unsigned short oem_vendor_name_off; unsigned short oem_vendor_name_seg; unsigned short oem_product_name_off; unsigned short oem_product_name_seg; unsigned short oem_product_rev_off; unsigned short oem_product_rev_seg; char reserved[222]; char oem_data[256]; } __attribute__ ((packed)); #define VBE_ATTR_MODE_SUPPORTED (1 << 0) #define VBE_ATTR_TTY (1 << 2) #define VBE_ATTR_COLOR (1 << 3) #define VBE_ATTR_GRAPHICS (1 << 4) #define VBE_ATTR_NOT_VGA (1 << 5) #define VBE_ATTR_NOT_WINDOWED (1 << 6) #define VBE_ATTR_LINEAR (1 << 7) #define VBE_WIN_RELOCATABLE (1 << 0) #define VBE_WIN_READABLE (1 << 1) #define VBE_WIN_WRITEABLE (1 << 2) #define VBE_MODEL_TEXT 0 #define VBE_MODEL_CGA 1 #define VBE_MODEL_HERCULES 2 #define VBE_MODEL_PLANAR 3 #define VBE_MODEL_PACKED 4 #define VBE_MODEL_256 5 #define VBE_MODEL_RGB 6 #define VBE_MODEL_YUV 7 struct vbe_mode_info_block { unsigned short mode_attributes; unsigned char win_a_attributes; unsigned char win_b_attributes; unsigned short win_granularity; unsigned short win_size; unsigned short win_a_segment; unsigned short win_b_segment; unsigned short win_func_ptr_off; unsigned short win_func_ptr_seg; unsigned short bytes_per_scanline; unsigned short x_resolution; unsigned short y_resolution; unsigned char x_char_size; unsigned char y_char_size; unsigned char number_of_planes; unsigned char bits_per_pixel; unsigned char number_of_banks; unsigned char memory_model; unsigned char bank_size; unsigned char number_of_image_pages; unsigned char res1; unsigned char red_mask_size; unsigned char red_field_position; unsigned char green_mask_size; unsigned char green_field_position; unsigned char blue_mask_size; unsigned char blue_field_position; unsigned char rsvd_mask_size; unsigned char rsvd_field_position; unsigned char direct_color_mode_info; unsigned int phys_base_ptr; unsigned int offscreen_mem_offset; unsigned short offscreen_mem_size; unsigned char res2[206]; } __attribute__ ((packed)); struct vbe_palette_entry { unsigned char blue; unsigned char green; unsigned char red; unsigned char align; } __attribute__ ((packed)); #endif --- NEW FILE: vbemodeinfo.c --- /* List the available VESA graphics and text modes. This program is in the public domain. */ #include #include #include #include #include #include #include #include #include "vbe.h" struct { struct vbe_info_block *info; struct vbe_mode_info_block *mode; } vbe; int main(int argc, char *argv[]) { struct LRMI_regs r; int mode; if((argc!=2)||((mode=atoi(argv[1]))==0)){ printf("usage: vbemodeinfo \n" "where is a vesa mode numder.\n" "use vbetest to list available modes\n\n"); return 0; }; if (!LRMI_init()) return 1; vbe.info = LRMI_alloc_real(sizeof(struct vbe_info_block) + sizeof(struct vbe_mode_info_block)); if (vbe.info == NULL) { fprintf(stderr, "Can't alloc real mode memory\n"); return 1; } vbe.mode = (struct vbe_mode_info_block *)(vbe.info + 1); /* Allow read/write to all IO ports */ ioperm(0, 0x400 , 1); iopl(3); memset(&r, 0, sizeof(r)); r.eax = 0x4f00; r.es = (unsigned int)vbe.info >> 4; r.edi = 0; memcpy(vbe.info->vbe_signature, "VBE2", 4); if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't get VESA info (vm86 failure)\n"); return 1; } if ((r.eax & 0xffff) != 0x4f || strncmp(vbe.info->vbe_signature, "VESA", 4) != 0) { fprintf(stderr, "No VESA bios\n"); return 1; } printf("VBE Version %x.%x\n", (int)(vbe.info->vbe_version >> 8) & 0xff, (int)vbe.info->vbe_version & 0xff); printf("%s\n", (char *)(vbe.info->oem_string_seg * 16 + vbe.info->oem_string_off)); memset(&r, 0, sizeof(r)); r.eax = 0x4f01; r.ecx = mode; r.es = (unsigned int)vbe.mode >> 4; r.edi = (unsigned int)vbe.mode & 0xf; if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't get mode info (vm86 failure)\n"); return 1; } printf("mode %i\n",mode); printf ("mode_attributes = %i\n", vbe.mode->mode_attributes); printf ("win_a_attributes = %i\n", vbe.mode->win_a_attributes); printf ("win_b_attributes = %i\n", vbe.mode->win_b_attributes); printf ("win_granularity = %i\n", vbe.mode->win_granularity); printf ("win_size = %i\n", vbe.mode->win_size); printf ("win_a_segment = %i\n", vbe.mode->win_a_segment); printf ("win_b_segment = %i\n", vbe.mode->win_b_segment); printf ("win_func_ptr_off = %i\n", vbe.mode->win_func_ptr_off); printf ("win_func_ptr_seg = %i\n", vbe.mode->win_func_ptr_seg); printf ("bytes_per_scanline = %i\n", vbe.mode->bytes_per_scanline); printf ("x_resolution = %i\n", vbe.mode->x_resolution); printf ("y_resolution = %i\n", vbe.mode->y_resolution); printf ("x_char_size = %i\n", vbe.mode->x_char_size); printf ("y_char_size = %i\n", vbe.mode->y_char_size); printf ("number_of_planes = %i\n", vbe.mode->number_of_planes); printf ("bits_per_pixel = %i\n", vbe.mode->bits_per_pixel); printf ("number_of_banks = %i\n", vbe.mode->number_of_banks); printf ("memory_model = %i\n", vbe.mode->memory_model); printf ("bank_size = %i\n", vbe.mode->bank_size); printf ("number_of_image_pages = %i\n", vbe.mode->number_of_image_pages); printf ("res1 = %i\n", vbe.mode->res1); printf ("red_mask_size = %i\n", vbe.mode->red_mask_size); printf ("red_field_position = %i\n", vbe.mode->red_field_position); printf ("green_mask_size = %i\n", vbe.mode->green_mask_size); printf ("green_field_position = %i\n", vbe.mode->green_field_position); printf ("blue_mask_size = %i\n", vbe.mode->blue_mask_size); printf ("blue_field_position = %i\n", vbe.mode->blue_field_position); printf ("rsvd_mask_size = %i\n", vbe.mode->rsvd_mask_size); printf ("rsvd_field_position = %i\n", vbe.mode->rsvd_field_position); printf ("direct_color_mode_info = %i\n", vbe.mode->direct_color_mode_info); printf ("phys_base_ptr = %i\n", vbe.mode->phys_base_ptr); printf ("offscreen_mem_offset = %i\n", vbe.mode->offscreen_mem_offset); printf ("offscreen_mem_size = %i\n", vbe.mode->offscreen_mem_size); LRMI_free_real(vbe.info); return 0; } --- NEW FILE: vbetest.c --- /* List the available VESA graphics modes. This program is in the public domain. */ #include #include #include #include #include #if defined(__linux__) #include #include #include #elif defined(__NetBSD__) #include #include #include #elif defined(__FreeBSD__) #include #include #endif #include #include "vbe.h" struct { struct vbe_info_block *info; struct vbe_mode_info_block *mode; char *win; /* this doesn't point directly at the window, see update_window() */ int win_low, win_high; } vbe; static char *run_command = NULL; void * save_state(void) { struct LRMI_regs r; void *buffer; memset(&r, 0, sizeof(r)); r.eax = 0x4f04; r.ecx = 0xf; /* all states */ r.edx = 0; /* get buffer size */ if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't get video state buffer size (vm86 failure)\n"); return NULL; } if ((r.eax & 0xffff) != 0x4f) { fprintf(stderr, "Get video state buffer size failed\n"); return NULL; } buffer = LRMI_alloc_real((r.ebx & 0xffff) * 64); if (buffer == NULL) { fprintf(stderr, "Can't allocate video state buffer\n"); return NULL; } memset(&r, 0, sizeof(r)); r.eax = 0x4f04; r.ecx = 0xf; /* all states */ r.edx = 1; /* save state */ r.es = (unsigned int)buffer >> 4; r.ebx = (unsigned int)buffer & 0xf; if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't save video state (vm86 failure)\n"); return NULL; } if ((r.eax & 0xffff) != 0x4f) { fprintf(stderr, "Save video state failed\n"); return NULL; } return buffer; } void restore_state(void *buffer) { struct LRMI_regs r; memset(&r, 0, sizeof(r)); r.eax = 0x4f04; r.ecx = 0xf; /* all states */ r.edx = 2; /* restore state */ r.es = (unsigned int)buffer >> 4; r.ebx = (unsigned int)buffer & 0xf; if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't restore video state (vm86 failure)\n"); } else if ((r.eax & 0xffff) != 0x4f) { fprintf(stderr, "Restore video state failed\n"); } LRMI_free_real(buffer); } void text_mode(void) { struct LRMI_regs r; memset(&r, 0, sizeof(r)); r.eax = 3; if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't set text mode (vm86 failure)\n"); } } int update_window(int address) { struct LRMI_regs r; int w, g; if (address >= vbe.win_low && address < vbe.win_high) return 0; g = vbe.mode->win_granularity * 1024; w = address / g; memset(&r, 0, sizeof(r)); r.eax = 0x4f05; r.ebx = 0; r.edx = w; LRMI_int(0x10, &r); vbe.win_low = w * g; vbe.win_high = vbe.win_low + vbe.mode->win_size * 1024; vbe.win = (char *)(vbe.mode->win_a_segment << 4); vbe.win -= vbe.win_low; return 1; } void set_pixel(int x, int y, int r, int g, int b) { int x_res = vbe.mode->x_resolution; int y_res = vbe.mode->y_resolution; int shift_r = vbe.mode->red_field_position; int shift_g = vbe.mode->green_field_position; int shift_b = vbe.mode->blue_field_position; int pixel_size = (vbe.mode->bits_per_pixel + 7) / 8; int bpl = vbe.mode->bytes_per_scanline; int c, addr; if (x < 0 || x >= x_res || y < 0 || y >= y_res) return; r >>= 8 - vbe.mode->red_mask_size; g >>= 8 - vbe.mode->green_mask_size; b >>= 8 - vbe.mode->blue_mask_size; c = (r << shift_r) | (g << shift_g) | (b << shift_b); addr = y * bpl + (x * pixel_size); update_window(addr); memcpy(vbe.win + addr, &c, pixel_size); } void set_mode(int n) { struct LRMI_regs r; memset(&r, 0, sizeof(r)); r.eax = 0x4f02; r.ebx = n; if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't set video mode (vm86 failure)\n"); } else if ((r.eax & 0xffff) != 0x4f) { fprintf(stderr, "Set video mode failed\n"); } memset(&r, 0, sizeof(r)); r.eax = 0x4f01; r.ecx = n; r.es = (unsigned int)vbe.mode >> 4; r.edi = (unsigned int)vbe.mode & 0xf; if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't get mode info (vm86 failure)\n"); return; } if ((r.eax & 0xffff) != 0x4f) { fprintf(stderr, "Get mode info failed\n"); return; } vbe.win_low = vbe.win_high = -1; /* Draw a colorful checkerboard */ if (vbe.mode->memory_model == VBE_MODEL_RGB) { int x_res = vbe.mode->x_resolution; int y_res = vbe.mode->y_resolution; int x, y; for (y = 0; y < y_res; ++y) { for (x = 0; x < x_res; ++x) { int r, g, b; if ((x & 16) ^ (y & 16)) { r = x * 255 / x_res; g = y * 255 / y_res; b = 255 - x * 255 / x_res; } else { r = 255 - x * 255 / x_res; g = y * 255 / y_res; b = 255 - y * 255 / y_res; } set_pixel(x, y, r, g, b); } } } } void interactive_set_mode(int n) { void *state; #if defined(__linux__) struct stat stat; #elif defined(__NetBSD__) struct wsdisplay_fbinfo wsi; #elif defined(__FreeBSD__) struct vid_info vi; #endif if (n == -1) { printf("Type a mode number, or 'q' to quit - "); if (scanf("%d", &n) != 1) return; } #if defined(__linux__) if (fstat(0, &stat) != 0) { fprintf(stderr, "Can't stat() stdin\n"); return; } if ((stat.st_rdev & 0xff00) != 0x400 || (stat.st_rdev & 0xff) > 63) #elif defined(__NetBSD__) if (ioctl(0, WSDISPLAYIO_GINFO, &wsi) == -1) #elif defined(__FreeBSD__) memset(&vi, 0, sizeof(vi)); vi.size = sizeof(vi); if (ioctl(0, CONS_GETINFO, &vi) == -1) #endif { fprintf(stderr, "To switch video modes, " "this program must be run from the console\n"); return; } printf("setting mode %d\n", n); #if defined(__linux__) || defined(__FreeBSD__) ioctl(0, KDSETMODE, KD_GRAPHICS); #elif defined(__NetBSD__) ioctl(0, WSDISPLAYIO_SMODE, WSDISPLAYIO_MODE_MAPPED); #endif state = save_state(); if (state == NULL) return; set_mode(n); system(run_command); sleep(5); text_mode(); restore_state(state); #if defined(__linux__) || defined(__FreeBSD__) ioctl(0, KDSETMODE, KD_TEXT); #elif defined(__NetBSD__) ioctl(0, WSDISPLAYIO_SMODE, WSDISPLAYIO_MODE_EMUL); #endif } void usage_and_quit(int error) { fputs("Usage: vbetest [-m mode] [-c command]\n", error ? stderr : stdout); exit(error); } int main(int argc, char *argv[]) { struct LRMI_regs r; short int *mode_list; int i, mode = -1; #if defined(__NetBSD__) unsigned long iomap[32]; #endif for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-c") == 0) { i++; if (i == argc) usage_and_quit(1); run_command = argv[i]; } else if (strcmp(argv[i], "-m") == 0) { char *e; i++; if (i == argc) usage_and_quit(1); mode = strtol(argv[i], &e, 10); if (e == argv[i]) usage_and_quit(1); } else usage_and_quit(1); } if (!LRMI_init()) return 1; vbe.info = LRMI_alloc_real(sizeof(struct vbe_info_block) + sizeof(struct vbe_mode_info_block)); if (vbe.info == NULL) { fprintf(stderr, "Can't alloc real mode memory\n"); return 1; } vbe.mode = (struct vbe_mode_info_block *)(vbe.info + 1); #if 0 /* Allow read/write to video IO ports */ ioperm(0x2b0, 0x2df - 0x2b0, 1); ioperm(0x3b0, 0x3df - 0x3b0, 1); #else /* Allow read/write to ALL io ports */ #if defined(__linux__) ioperm(0, 1024, 1); iopl(3); #elif defined(__NetBSD__) memset(&iomap[0], 0xff, sizeof(iomap)); i386_set_ioperm(iomap); i386_iopl(3); #elif defined(__FreeBSD__) i386_set_ioperm(0, 0x10000, 1); #endif #endif memset(&r, 0, sizeof(r)); r.eax = 0x4f00; r.es = (unsigned int)vbe.info >> 4; r.edi = 0; memcpy(vbe.info->vbe_signature, "VBE2", 4); if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't get VESA info (vm86 failure)\n"); return 1; } if ((r.eax & 0xffff) != 0x4f || strncmp(vbe.info->vbe_signature, "VESA", 4) != 0) { fprintf(stderr, "No VESA bios\n"); return 1; } printf("VBE Version %x.%x\n", (int)(vbe.info->vbe_version >> 8) & 0xff, (int)vbe.info->vbe_version & 0xff); printf("%s\n", (char *)(vbe.info->oem_string_seg * 16 + vbe.info->oem_string_off)); mode_list = (short int *)(vbe.info->video_mode_list_seg * 16 + vbe.info->video_mode_list_off); while (*mode_list != -1) { memset(&r, 0, sizeof(r)); r.eax = 0x4f01; r.ecx = *mode_list; r.es = (unsigned int)vbe.mode >> 4; r.edi = (unsigned int)vbe.mode & 0xf; if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't get mode info (vm86 failure)\n"); return 1; } if (vbe.mode->memory_model == VBE_MODEL_RGB) printf("[%3d] %dx%d (%d:%d:%d)\n", *mode_list, vbe.mode->x_resolution, vbe.mode->y_resolution, vbe.mode->red_mask_size, vbe.mode->green_mask_size, vbe.mode->blue_mask_size); else if (vbe.mode->memory_model == VBE_MODEL_256) printf("[%3d] %dx%d (256 color palette)\n", *mode_list, vbe.mode->x_resolution, vbe.mode->y_resolution); else if (vbe.mode->memory_model == VBE_MODEL_PACKED) printf("[%3d] %dx%d (%d color palette)\n", *mode_list, vbe.mode->x_resolution, vbe.mode->y_resolution, 1 << vbe.mode->bits_per_pixel); mode_list++; } LRMI_free_real(vbe.info); interactive_set_mode(mode); return 0; } --- NEW FILE: vbetool.1 --- .TH VBETOOL "1" "31 December 2004" "vbetool 0.2" "User Commands" .SH NAME vbetool - run real-mode video BIOS code to alter hardware state .SH SYNOPSIS .B "vbetool [[vbestate save|restore]|[vbemode set|get]|[vgamode]|[dpms on|off|standby|suspend|reduced]|[post]]" .SH DESCRIPTION .B vbetool uses lrmi in order to run code from the video BIOS. Currently, it is able to alter DPMS states, save/restore video card state and attempt to initialize the video card from scratch. .SH OPTIONS .B vbetool takes the following options: .IP "vbestate" .B vbetool will use the VESA 0x4f0f extensions to save or restore hardware state. This will be sent to or read from stdin. This information is highly hardware specific - do not attempt to restore state saved from a different machine. This command will not work unless you are at a text console, as it interferes badly with X. .IP "dpms" .B vbetool will use the VESA 0x4f10 extensions to alter the power management state of your screen. "On", "off", "standby", "suspend" and "reduced" are acceptable further options and determine which state will be activated. .IP "vbemode" .B vbetool will get or set the current VESA mode. "get" will return the current mode number on stdout - "set" will set the mode to the next argument. .IP "vgamode" .B vbetool will set the legacy VGA mode to the following numeric argument. .IP "post" .B vbetool will attempt to run BIOS code located at c000:0003. This is the code run by the system BIOS at boot in order to intialise the video hardware. Note that on some machines (especially laptops), not all of this code is present after system boot - as a result, executing this command may result in undefined behaviour. This command must be run from a text console, as it will otherwise interfere with the operation of X. .SH BUGS Switching dpms modes may interact badly with X on some systems. .PP The vbestate command may behave in strange ways. .PP The post command may result in the execution of arbitrary code that happens to be lying around in the area where chunks of your video BIOS used to be. .PP The VESA specification does not require that "vbemode get" provides the correct mode if the current mode was set via some means other than the VESA BIOS extensions. .SH AUTHOR vbetool was written by Matthew Garrett , based on code from read-edid by John Fremlin , LRMI (http://sourceforge.net/projects/lrmi/) and XFree (http://www.xfree86.org). It is released under the terms of the GNU General Public License. --- NEW FILE: vbetool.c --- /* Run video BIOS code for various purposes Copyright Matthew Garrett , heavily based on vbetest.c from the lrmi package and read-edid.c by John Fremlin This program is released under the terms of the GNU General Public License, version 2 */ #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_PCI #include #endif #include #include "vbetool.h" #define access_ptr_register(reg_frame,reg) (reg_frame -> reg) #define access_seg_register(reg_frame,es) reg_frame.es #define real_mode_int(interrupt,reg_frame_ptr) !LRMI_int(interrupt,reg_frame_ptr) #define DPMS_STATE_ON 0x0000 #define DPMS_STATE_STANDBY 0x0100 #define DPMS_STATE_SUSPEND 0x0200 #define DPMS_STATE_OFF 0x0400 #define DPMS_STATE_LOW 0x0800 #ifdef HAVE_PCI static struct pci_access *pacc; #endif int main(int argc, char *argv[]) { if (!LRMI_init()) return 1; ioperm(0, 1024, 1); iopl(3); #ifdef HAVE_PCI pacc = pci_alloc(); pacc->numeric_ids = 1; pci_init(pacc); #endif if (!strcmp(argv[1], "vbestate")) { /* VBE save/restore tends to break when done underneath X */ int err = check_console(); if (err) { return err; } if (!strcmp(argv[2], "save")) { save_state(); } else if (!strcmp(argv[2], "restore")) { restore_state(); } else { goto usage; } } else if (!strcmp(argv[1], "dpms")) { if (!strcmp(argv[2], "on")) { return do_blank(DPMS_STATE_ON); } else if (!strcmp(argv[2], "suspend")) { return do_blank(DPMS_STATE_SUSPEND); } else if (!strcmp(argv[2], "standby")) { return do_blank(DPMS_STATE_STANDBY); } else if (!strcmp(argv[2], "off")) { return do_blank(DPMS_STATE_OFF); } else if (!strcmp(argv[2], "reduced")) { return do_blank(DPMS_STATE_LOW); } else { goto usage; } } else if (!strcmp(argv[1], "vbemode")) { if (!strcmp(argv[2], "set")) { return do_set_mode(atoi(argv[3]),0); } else if (!strcmp(argv[2], "get")) { return do_get_mode(); } else { goto usage; } } else if (!strcmp(argv[1], "vgamode")) { if (!strcmp(argv[2], "set")) { return do_set_mode(atoi(argv[3]),1); } else { return do_set_mode(atoi(argv[2]),1); } } else if (!strcmp(argv[1], "post")) { /* Again, we don't really want to do this while X is in control */ int err = check_console(); if (err) { return err; } #ifdef HAVE_PCI return do_post(); #else fprintf(stderr, "%s: not compiled with PCI support\n", argv[0]); return -1; #endif } else { usage: fprintf(stderr, "%s: Usage %s [[vbestate save|restore]|[vbemode set|get]|[vgamode]|[dpms on|off|standby|suspend|reduced]|[post]]\n", argv[0], argv[0]); return 1; } return 0; } int do_vbe_service(unsigned int AX, unsigned int BX, reg_frame * regs) { const unsigned interrupt = 0x10; unsigned function_sup; unsigned success; access_ptr_register(regs, eax) = AX; access_ptr_register(regs, ebx) = BX; if (real_mode_int(interrupt, regs)) { fprintf(stderr, "Error: something went wrong performing real mode interrupt\n"); return -1; } AX = access_ptr_register(regs, eax); function_sup = ((AX & 0xff) == 0x4f); success = ((AX & 0xff00) == 0); if (!success) return -2; if (!function_sup) return -3; return access_ptr_register(regs, ebx); } #ifdef HAVE_PCI int do_real_post(unsigned pci_device) { int error = 0; struct LRMI_regs r; memset(&r, 0, sizeof(r)); /* Several machines seem to want the device that they're POSTing in here */ r.eax = pci_device; /* 0xc000 is the video option ROM. The init code for each option ROM is at 0x0003 - so jump to c000:0003 and start running */ r.cs = 0xc000; r.ip = 0x0003; /* This is all heavily cargo culted but seems to work */ r.edx = 0x80; r.ss = 0x0030; r.ds = 0x0040; r.sp = 0xfffe; if (!LRMI_call(&r)) { fprintf(stderr, "Error: something went wrong performing real mode call\n"); error = 1; } return error; } int do_post() { struct pci_dev *p; unsigned int c; unsigned int pci_id; int error; pci_scan_bus(pacc); for (p = pacc->devices; p; p = p->next) { c = pci_read_word(p, PCI_CLASS_DEVICE); if (c == 0x300) { pci_id = (p->bus << 8) + (p->dev << 3) + (p->func & 0x7); error = do_real_post(pci_id); if (error != 0) { return error; } } } return 0; } #endif void restore_state() { struct LRMI_regs r; void *data = NULL; char tmpbuffer[524288]; int i, length = 0; /* We really, really don't want to fail to read the entire set */ while ((i = read(0, tmpbuffer + length, sizeof(tmpbuffer)-length))) { if (i == -1) { if (errno != EAGAIN && errno != EINTR) { perror("Failed to read state - "); return; } } else { length += i; } } data = LRMI_alloc_real(length); memcpy(data, tmpbuffer, length); /* VGA BIOS mode 3 is text mode */ do_set_mode(3,1); memset(&r, 0, sizeof(r)); r.eax = 0x4f04; r.ecx = 0xf; /* all states */ r.edx = 2; /* restore state */ r.es = (unsigned int) data >> 4; r.ebx = (unsigned int) data & 0xf; if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't restore video state (vm86 failure)\n"); } else if ((r.eax & 0xffff) != 0x4f) { fprintf(stderr, "Restore video state failed\n"); } LRMI_free_real(data); ioctl(0, KDSETMODE, KD_TEXT); } void save_state() { struct LRMI_regs r; void *buffer; unsigned int size; memset(&r, 0, sizeof(r)); r.eax = 0x4f04; r.ecx = 0xf; /* all states */ r.edx = 0; /* get buffer size */ if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't get video state buffer size (vm86 failure)\n"); } if ((r.eax & 0xffff) != 0x4f) { fprintf(stderr, "Get video state buffer size failed\n"); } size = (r.ebx & 0xffff) * 64; buffer = LRMI_alloc_real(size); if (buffer == NULL) { fprintf(stderr, "Can't allocate video state buffer\n"); } memset(&r, 0, sizeof(r)); r.eax = 0x4f04; r.ecx = 0xf; /* all states */ r.edx = 1; /* save state */ r.es = (unsigned int) buffer >> 4; r.ebx = (unsigned int) buffer & 0xf; if (!LRMI_int(0x10, &r)) { fprintf(stderr, "Can't save video state (vm86 failure)\n"); } if ((r.eax & 0xffff) != 0x4f) { fprintf(stderr, "Save video state failed\n"); } write(1, buffer, size); } int do_blank(int state) { reg_frame regs; int error; memset(®s, 0, sizeof(regs)); error = do_vbe_service(0x4f10, state |= 0x01, ®s); if (error<0) { return error; } return 0; } int do_set_mode (int mode, int vga) { reg_frame regs; int error; memset(®s, 0, sizeof(regs)); if (vga) { error = do_vbe_service(mode, 0, ®s); } else { error = do_vbe_service(0x4f02, mode, ®s); } if (error<0) { return error; } return 0; } int do_get_mode() { reg_frame regs; int error; memset(®s, 0, sizeof(regs)); error = do_vbe_service(0x4f03, 0, ®s); if (error<0) { return error; } printf("%d\n",error); return 0; } int check_console() { struct stat stat; return 0; if (fstat(0, &stat) != 0) { fprintf(stderr, "Can't stat() stdin\n"); return 10; } if ((stat.st_rdev & 0xff00) != 0x400 || (stat.st_rdev & 0xff) > 63) { fprintf(stderr, "To perform this operation, " "this program must be run from the console\n"); return 11; } ioctl(0, KDSETMODE, KD_GRAPHICS); return 0; } --- NEW FILE: vbetool.h --- typedef struct LRMI_regs reg_frame; int do_vbe_service(unsigned int AX, unsigned int BX, reg_frame *regs); int do_real_post(unsigned pci_device); int do_blank(int state); int do_set_mode (int mode, int vga); int do_get_mode(void); int do_post(void); void restore_state(void); void save_state(void); void text_mode(void); int check_console(void); --- NEW FILE: vga_reset.c --- /* Call real mode c0003 */ #include #include #include #include #include int main(int argc, char *argv[]){ struct LRMI_regs r; if (!LRMI_init()) return 1; ioperm(0, 0x400, 1); iopl(3); memset(&r,0,sizeof(r)); r.ip=3; r.cs=0xc000; LRMI_call(&r); return 0; } From alex at mplayerhq.hu Fri Aug 12 19:48:28 2005 From: alex at mplayerhq.hu (Alex Beregszaszi) Date: Fri, 12 Aug 2005 19:48:28 +0200 (CEST) Subject: [Vesautils-devel] CVS: vesautils/libvbe - New directory Message-ID: <20050812174828.0250D6A1D9@mail.mplayerhq.hu> Update of /cvsroot/vesautils/vesautils/libvbe In directory mail:/var2/tmp/cvs-serv5473/libvbe Log Message: Directory /cvsroot/vesautils/vesautils/libvbe added to the repository From alex at mplayerhq.hu Fri Aug 12 19:49:56 2005 From: alex at mplayerhq.hu (Alex Beregszaszi) Date: Fri, 12 Aug 2005 19:49:56 +0200 (CEST) Subject: [Vesautils-devel] CVS: vesautils/libvbe Makefile, NONE, 1.1 vbe.c, NONE, 1.1 vbe.h, NONE, 1.1 Message-ID: <20050812174956.4AA0D4DFC7@mail.mplayerhq.hu> Update of /cvsroot/vesautils/vesautils/libvbe In directory mail:/var2/tmp/cvs-serv32521 Added Files: Makefile vbe.c vbe.h Log Message: initial commit --- NEW FILE: Makefile --- LIBDIR ?= /usr/local/lib INCDIR ?= /usr/local/include CFLAGS = -g -Wall sources = vbe.c objects = vbe.o pic_objects = vbe.lo all = libvbe.a libvbe.so MAJOR = 0 MINOR = 2 VERSION = $(MAJOR).$(MINOR) LIBNAME = libvbe %.o: %.c $(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $< %.lo: %.c $(CC) -c $(CPPFLAGS) $(CFLAGS) -fPIC -o $@ $< all: $(all) libvbe.a: $(objects) $(AR) -rs $@ $^ libvbe.so: $(pic_objects) # $(CC) $(CPPFLAGS) $(CFLAGS) -fPIC -shared -o $@ $^ $(CC) $(CPPFLAGS) $(CFLAGS) -Wl,-soname,$(LIBNAME).so.$(MAJOR) -fPIC -shared -o $(LIBNAME).so.$(VERSION) $^ ln -s $(LIBNAME).so.$(VERSION) $(LIBNAME).so.$(MAJOR) ln -s $(LIBNAME).so.$(MAJOR) $(LIBNAME).so install: mkdir -p $(LIBDIR) install -m 755 -s -p $(LIBNAME).so.$(VERSION) $(LIBDIR)/$(LIBNAME).so.$(VERSION) rm -f $(LIBDIR)/$(LIBNAME).so ln -sf $(LIBNAME).so.$(VERSION) $(LIBDIR)/$(LIBNAME).so.$(MAJOR) ln -sf $(LIBNAME).so.$(MAJOR) $(LIBDIR)/$(LIBNAME).so install -m 744 -p vbe.h $(INCDIR)/vbe.h ldconfig .PHONY: clean clean: rm -f $(objects) $(pic_objects) $(all) core rm -f libvbe.so libvbe.so.$(MAJOR) libvbe.so.$(VERSION) .PHONY: distclean distclean: clean rm -f .depend .PHONY: depend depend: $(sources) -$(CC) -M $(CPPFLAGS) $^ >.depend --- NEW FILE: vbe.c --- /* This file contains implementation of VESA library which is based on LRMI (Linux real-mode interface). So it's not an emulator - it calls real int 10h handler under Linux. Note: VESA is available only on x86 systems. You can redistribute this file under terms and conditions of GNU General Public licence v2. Written by Nick Kurshev Neomagic TV out support by Rudolf Marek */ #include <../config.h> #ifdef HAVE_VESA #include "vbelib.h" #include "lrmi.h" #include #include #include #include #include #include #include #include #include #include #include #include static struct VesaProtModeInterface vbe_pm_info; static struct VesaModeInfoBlock curr_mode_info; static inline int VERR(const void *p) { register int retval; __asm __volatile( "xorl %0, %0\n\t" "verr %1\n\t" "setnz %b0" :"=q"(retval) :"m"(*(unsigned char *)p) :"memory","cc"); return retval; } #if 0 static inline int VERW(const void *p) { register int retval; __asm __volatile( "xorl %0, %0\n\t" "verw %1\n\t" "setnz %b0" :"=q"(retval) :"m"(*(unsigned char *)p) :"memory","cc"); return retval; } #endif #define HAVE_VERBOSE_VAR 1 #ifdef HAVE_VERBOSE_VAR extern int verbose; static void __dump_regs(struct LRMI_regs *r) { printf("vbelib: eax=%08lXh ebx=%08lXh ecx=%08lXh edx=%08lXh\n" "vbelib: edi=%08lXh esi=%08lXh ebp=%08lXh esp=%08lXh\n" "vbelib: ds=%04Xh es=%04Xh ss=%04Xh cs:ip=%04X:%04X\n" "vbelib: fs=%04Xh gs=%04Xh ss:sp=%04X:%04X flags=%04X\n" ,(unsigned long)r->eax,(unsigned long)r->ebx,(unsigned long)r->ecx,(unsigned long)r->edx ,(unsigned long)r->edi,(unsigned long)r->esi,(unsigned long)r->ebp,(unsigned long)r->reserved ,r->ds,r->es,r->ss,r->cs,r->ip ,r->fs,r->gs,r->ss,r->sp,r->flags); } static inline int VBE_LRMI_int(int int_no, struct LRMI_regs *r) { int retval; if(verbose > 1) { printf("vbelib: registers before int %02X\n",int_no); __dump_regs(r); } retval = LRMI_int(int_no,r); if(verbose > 1) { printf("vbelib: Interrupt handler returns: %X\n",retval); printf("vbelib: registers after int %02X\n",int_no); __dump_regs(r); } return retval; } #else #define VBE_LRMI_int(int_no,regs) (VBE_LRMI_int(int_no,regs)) #endif /** * Set console to graphics or text mode. * This is a clean way to enable/disable console text output * and cursor blinking. * * @param mode The new wanted mode. Can be either KD_GRAPHICS to switch * to graphics mode or anything else to switch back to the * original mode. */ static void kd_set_mode(int mode) { static int old_mode = KD_TEXT; int fd; if ((fd = open("/dev/tty0", O_RDWR)) < 0) return; if(mode == KD_GRAPHICS) old_mode = ioctl(fd, KDGETMODE); else mode = old_mode; ioctl(fd, KDSETMODE, mode); close(fd); } static unsigned hh_int_10_seg; static int fd_mem; /* the list of supported video modes is stored in the reserved portion of the SuperVGA information record by some implementations, and it may thus be necessary to either copy the mode list or use a different buffer for all subsequent VESA calls */ static void *controller_info; int vbeInit( void ) { unsigned short iopl_port; size_t i; if(!LRMI_init()) return VBE_VM86_FAIL; if(!(controller_info = LRMI_alloc_real(sizeof(struct VbeInfoBlock)))) return VBE_OUT_OF_DOS_MEM; /* Allow read/write to ALL io ports */ hh_int_10_seg = *(unsigned short *)PhysToVirtSO(0x0000,0x0042); /* Video BIOS should be at C000:0000 and above */ hh_int_10_seg >>= 12; if(hh_int_10_seg < 0xC) return VBE_BROKEN_BIOS; ioperm(0, 1024, 1); iopl(3); memset(&vbe_pm_info,0,sizeof(struct VesaProtModeInterface)); vbeGetProtModeInfo(&vbe_pm_info); i = 0; if(vbe_pm_info.iopl_ports) /* Can be NULL !!!*/ while((iopl_port=vbe_pm_info.iopl_ports[i]) != 0xFFFF && vbe_pm_info.iopl_ports[i++] > 1023) ioperm(iopl_port,1,1); iopl(3); fd_mem = open("/dev/mem",O_RDWR); kd_set_mode(KD_GRAPHICS); return VBE_OK; } int vbeDestroy( void ) { kd_set_mode(KD_TEXT); close(fd_mem); LRMI_free_real(controller_info); return VBE_OK; } /* Fixme!!! This code is compatible only with mplayer's version of lrmi*/ static inline int is_addr_valid(const void *p) { return (p < (const void *)0x502) || (p >= (const void *)0x10000 && p < (const void *)0x20000) || (p >= (const void *)0xa0000 && p < (const void *)0x100000); } static int check_str(const unsigned char *str) { size_t i; int null_found = 0; for(i = 0;i < 256;i++) { if(is_addr_valid(&str[i])) { if(VERR(&str[i])) { if(!str[i]) { null_found = 1; break; } } else break; } else break; } return null_found; } static int check_wrd(const unsigned short *str) { size_t i; int ffff_found = 0; for(i = 0;i < 1024;i++) { if(is_addr_valid(&str[i])) { if(VERR(&str[i])) { if(str[i] == 0xffff) { ffff_found = 1; break; } } else break; } else break; } return ffff_found; } static void print_str(unsigned char *str) { size_t i; fflush(stdout); printf("vbelib: "); for(i = 0;i < 256;i++) { printf("%02X(%c) ",str[i],isprint(str[i])?str[i]:'.'); if(!str[i]) break; } printf("\n"); fflush(stdout); } static void print_wrd(unsigned short *str) { size_t i; fflush(stdout); printf("vbelib: "); for(i = 0;i < 256;i++) { printf("%04X ",str[i]); if(str[i] == 0xffff) break; } printf("\n"); fflush(stdout); } int vbeGetControllerInfo(struct VbeInfoBlock *data) { struct LRMI_regs r; int retval; memcpy(controller_info,data,sizeof(struct VbeInfoBlock)); memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f00; r.es = VirtToPhysSeg(controller_info); r.edi = VirtToPhysOff(controller_info); if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) { FarPtr fpdata; retval = VBE_OK; memcpy(data,controller_info,sizeof(struct VbeInfoBlock)); fpdata.seg = (unsigned long)(data->OemStringPtr) >> 16; fpdata.off = (unsigned long)(data->OemStringPtr) & 0xffff; data->OemStringPtr = PhysToVirt(fpdata); if(!check_str(data->OemStringPtr)) data->OemStringPtr = NULL; #ifdef HAVE_VERBOSE_VAR if(verbose > 1) { printf("vbelib: OemStringPtr=%04X:%04X => %p\n",fpdata.seg,fpdata.off,data->OemStringPtr); if(data->OemStringPtr) print_str(data->OemStringPtr); fflush(stdout); } #endif fpdata.seg = (unsigned long)(data->VideoModePtr) >> 16; fpdata.off = (unsigned long)(data->VideoModePtr) & 0xffff; data->VideoModePtr = PhysToVirt(fpdata); if(!check_wrd(data->VideoModePtr)) { data->VideoModePtr = NULL; retval = VBE_BROKEN_BIOS; } #ifdef HAVE_VERBOSE_VAR if(verbose > 1) { printf("vbelib: VideoModePtr=%04X:%04X => %p\n",fpdata.seg,fpdata.off,data->VideoModePtr); if(data->VideoModePtr) print_wrd(data->VideoModePtr); fflush(stdout); } #endif fpdata.seg = (unsigned long)(data->OemVendorNamePtr) >> 16; fpdata.off = (unsigned long)(data->OemVendorNamePtr) & 0xffff; data->OemVendorNamePtr = PhysToVirt(fpdata); if(!check_str(data->OemVendorNamePtr)) data->OemVendorNamePtr = NULL; #ifdef HAVE_VERBOSE_VAR if(verbose > 1) { printf("vbelib: OemVendorNamePtr=%04X:%04X => %p\n",fpdata.seg,fpdata.off,data->OemVendorNamePtr); if(data->OemVendorNamePtr) print_str(data->OemVendorNamePtr); fflush(stdout); } #endif fpdata.seg = (unsigned long)(data->OemProductNamePtr) >> 16; fpdata.off = (unsigned long)(data->OemProductNamePtr) & 0xffff; data->OemProductNamePtr = PhysToVirt(fpdata); if(!check_str(data->OemProductNamePtr)) data->OemProductNamePtr = NULL; #ifdef HAVE_VERBOSE_VAR if(verbose > 1) { printf("vbelib: OemProductNamePtr=%04X:%04X => %p\n",fpdata.seg,fpdata.off,data->OemProductNamePtr); if(data->OemVendorNamePtr) print_str(data->OemProductNamePtr); fflush(stdout); } #endif fpdata.seg = (unsigned long)(data->OemProductRevPtr) >> 16; fpdata.off = (unsigned long)(data->OemProductRevPtr) & 0xffff; data->OemProductRevPtr = PhysToVirt(fpdata); if(!check_str(data->OemProductRevPtr)) data->OemProductRevPtr = NULL; #ifdef HAVE_VERBOSE_VAR if(verbose > 1) { printf("vbelib: OemProductRevPtr=%04X:%04X => %p\n",fpdata.seg,fpdata.off,data->OemProductRevPtr); if(data->OemProductRevPtr) print_str(data->OemProductRevPtr); fflush(stdout); } #endif } return retval; } int vbeGetModeInfo(unsigned mode,struct VesaModeInfoBlock *data) { struct LRMI_regs r; void *rm_space; int retval; if(!(rm_space = LRMI_alloc_real(sizeof(struct VesaModeInfoBlock)))) return VBE_OUT_OF_DOS_MEM; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f01; r.ecx = mode; r.es = VirtToPhysSeg(rm_space); r.edi = VirtToPhysOff(rm_space); if(!VBE_LRMI_int(0x10,&r)) { LRMI_free_real(rm_space); return VBE_VM86_FAIL; } retval = r.eax & 0xffff; if(retval == 0x4f) { retval = VBE_OK; memcpy(data,rm_space,sizeof(struct VesaModeInfoBlock)); } LRMI_free_real(rm_space); return retval; } int vbeSetTV(unsigned int vesa_mode,unsigned int TV_mode) { #define NR_MODES 8 unsigned int mode_table[NR_MODES] = {0x101,0x103,0x111,0x114,0x120,0x121,0x122,0x123}; unsigned int tv_table[][NR_MODES] = { {0x201,0x202,0x211,0x212,0x221,0x231,0x222,0x232}, {0x200,0x203,0x210,0x213,0x220,0x230,0xFFFF,0xFFFF}}; /* Alternate mode map. If modes like 320x240 and 400x300 does not work, but 640x480 and 800x600 work, then try to replace above two lines with this lines and write email to me if it works. r.marek et sh.cvut.cz {0x201,0x202,0x211,0x212,0x222,0x223,0x224,0x225}, {0x200,0x203,0x210,0x213,0x220,0x221,0xFFFF,0xFFFF}}; */ int i,retval; struct LRMI_regs r; memset(&r,0,sizeof(struct LRMI_regs)); for (i=0;((mode_table[i]!=(vesa_mode&0x3FF))&&(i 1) printf("vbelib: Trying to set TV mode %x\n",tv_table[TV_mode][i]); r.eax = 0x4f14; r.ebx = 0x20; r.edx = 0; r.edi = 0; r.ecx = tv_table[TV_mode][i]; retval = VBE_LRMI_int(0x10,&r); if(!retval) return VBE_VM86_FAIL; return r.eax & 0xffff; } int vbeSetMode(unsigned mode,struct VesaCRTCInfoBlock *data) { struct LRMI_regs r; void *rm_space = NULL; int retval; memset(&r,0,sizeof(struct LRMI_regs)); if(data) { if(!(rm_space = LRMI_alloc_real(sizeof(struct VesaCRTCInfoBlock)))) return VBE_OUT_OF_DOS_MEM; r.es = VirtToPhysSeg(rm_space); r.edi = VirtToPhysOff(rm_space); memcpy(rm_space,data,sizeof(struct VesaCRTCInfoBlock)); } r.eax = 0x4f02; r.ebx = mode; retval = VBE_LRMI_int(0x10,&r); LRMI_free_real(rm_space); if(!retval) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) { /* Just info for internal use (currently in SetDiplayStart func). */ vbeGetModeInfo(mode,&curr_mode_info); retval = VBE_OK; } return retval; } int vbeGetMode(unsigned *mode) { struct LRMI_regs r; int retval; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f03; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) { *mode = r.ebx; retval = VBE_OK; } return retval; } int vbeGetPixelClock(unsigned *mode,unsigned *pixel_clock) // in Hz { struct LRMI_regs r; int retval; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f0b; r.ebx = 0; r.edx = *mode; r.ecx = *pixel_clock; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) { *pixel_clock = r.ecx; retval = VBE_OK; } return retval; } int vbeSaveState(void **data) { struct LRMI_regs r; int retval; void *rm_space; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f04; r.edx = 0x00; r.ecx = 0x0f; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval != 0x4f) return retval; if(!(rm_space = LRMI_alloc_real((r.ebx & 0xffff)*64))) return VBE_OUT_OF_DOS_MEM; r.eax = 0x4f04; r.edx = 0x01; r.ecx = 0x0f; r.es = VirtToPhysSeg(rm_space); r.ebx = VirtToPhysOff(rm_space); if(!VBE_LRMI_int(0x10,&r)) { LRMI_free_real(rm_space); return VBE_VM86_FAIL; } retval = r.eax & 0xffff; if(retval != 0x4f) { LRMI_free_real(rm_space); return retval; } *data = rm_space; return VBE_OK; } int vbeRestoreState(void *data) { struct LRMI_regs r; int retval; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f04; r.edx = 0x02; r.ecx = 0x0f; r.es = VirtToPhysSeg(data); r.ebx = VirtToPhysOff(data); retval = VBE_LRMI_int(0x10,&r); LRMI_free_real(data); if(!retval) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) retval = VBE_OK; return retval; } int vbeGetWindow(unsigned *win_num) { struct LRMI_regs r; int retval; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f05; r.ebx = (*win_num & 0x0f) | 0x0100; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) { *win_num = r.edx & 0xffff; retval = VBE_OK; } return retval; } int vbeSetWindow(unsigned win_num,unsigned win_gran) { int retval; if(vbe_pm_info.SetWindowCall) { /* Don't verbose this stuff from performance reasons */ /* 32-bit function call is much better of int 10h */ __asm __volatile( "pushl %%ebx\n" "movl %1, %%ebx\n" ::"a"(0x4f05),"S"(win_num & 0x0f),"d"(win_gran):"memory"); (*vbe_pm_info.SetWindowCall)(); __asm __volatile("popl %%ebx":::"memory"); retval = VBE_OK; } else { struct LRMI_regs r; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f05; r.ebx = win_num & 0x0f; r.edx = win_gran; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) retval = VBE_OK; } return retval; } int vbeGetScanLineLength(unsigned *num_pixels,unsigned *num_bytes) { struct LRMI_regs r; int retval; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f06; r.ebx = 1; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) { if(num_bytes) *num_bytes = r.ebx & 0xffff; if(num_pixels) *num_pixels= r.ecx & 0xffff; retval = VBE_OK; } return retval; } int vbeGetMaxScanLines(unsigned *num_pixels,unsigned *num_bytes, unsigned *num_lines) { struct LRMI_regs r; int retval; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f06; r.ebx = 3; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) { if(num_bytes) *num_bytes = r.ebx & 0xffff; if(num_pixels) *num_pixels= r.ecx & 0xffff; if(num_lines) *num_lines = r.edx & 0xffff; retval = VBE_OK; } return retval; } int vbeSetScanLineLength(unsigned num_pixels) { int retval; struct LRMI_regs r; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f06; r.ebx = 0; r.ecx = num_pixels; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) retval = VBE_OK; return retval; } int vbeSetScanLineLengthB(unsigned num_bytes) { int retval; struct LRMI_regs r; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f06; r.ebx = 2; r.ecx = num_bytes; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) retval = VBE_OK; return retval; } int vbeGetDisplayStart(unsigned *pixel_num,unsigned *scan_line) { struct LRMI_regs r; int retval; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f07; r.ebx = 1; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) { if(pixel_num) *pixel_num = r.ecx & 0xffff; if(scan_line) *scan_line = r.edx & 0xffff; retval = VBE_OK; } return retval; } int vbeSetDisplayStart(unsigned long offset, int vsync) { int retval; if(vbe_pm_info.SetDisplayStart) { /* Don't verbose this stuff from performance reasons */ /* 32-bit function call is much better of int 10h */ __asm __volatile( "pushl %%ebx\n" "movl %1, %%ebx\n" ::"a"(0x4f07),"S"(vsync ? 0x80 : 0), "c"((offset>>2) & 0xffff),"d"((offset>>18)&0xffff):"memory"); (*vbe_pm_info.SetDisplayStart)(); __asm __volatile("popl %%ebx":::"memory"); retval = VBE_OK; } else { struct LRMI_regs r; unsigned long pixel_num; memset(&r,0,sizeof(struct LRMI_regs)); pixel_num = offset%(unsigned long)curr_mode_info.BytesPerScanLine; if(pixel_num*(unsigned long)curr_mode_info.BytesPerScanLine!=offset) pixel_num++; r.eax = 0x4f07; r.ebx = vsync ? 0x82 : 2; r.ecx = pixel_num; r.edx = offset/(unsigned long)curr_mode_info.BytesPerScanLine; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) retval = VBE_OK; else retval = VBE_BROKEN_BIOS; } return retval; } int vbeSetScheduledDisplayStart(unsigned long offset, int vsync) { int retval; struct LRMI_regs r; unsigned long pixel_num; memset(&r,0,sizeof(struct LRMI_regs)); pixel_num = offset%(unsigned long)curr_mode_info.BytesPerScanLine; if(pixel_num*(unsigned long)curr_mode_info.BytesPerScanLine!=offset) pixel_num++; r.eax = 0x4f07; r.ebx = vsync ? 0x82 : 2; r.ecx = offset; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) retval = VBE_OK; return retval; } struct realVesaProtModeInterface { unsigned short SetWindowCall; unsigned short SetDisplayStart; unsigned short SetPaletteData; unsigned short iopl_ports; }__attribute__((packed)); int vbeGetProtModeInfo(struct VesaProtModeInterface *pm_info) { struct LRMI_regs r; int retval; unsigned info_offset; struct realVesaProtModeInterface *rm_info; memset(&r,0,sizeof(struct LRMI_regs)); r.eax = 0x4f0a; r.ebx = 0; if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) { retval = VBE_OK; info_offset = r.edi&0xffff; if((r.es >> 12) != hh_int_10_seg) retval = VBE_BROKEN_BIOS; rm_info = PhysToVirtSO(r.es,info_offset); pm_info->SetWindowCall = PhysToVirtSO(r.es,info_offset+rm_info->SetWindowCall); if(!is_addr_valid(pm_info->SetWindowCall)) retval = VBE_BROKEN_BIOS; #ifdef HAVE_VERBOSE_VAR if(verbose > 1) printf("vbelib: SetWindowCall=%04X:%04X => %p\n",r.es,info_offset+rm_info->SetWindowCall,pm_info->SetWindowCall); #endif pm_info->SetDisplayStart = PhysToVirtSO(r.es,info_offset+rm_info->SetDisplayStart); if(!is_addr_valid(pm_info->SetDisplayStart)) retval = VBE_BROKEN_BIOS; #ifdef HAVE_VERBOSE_VAR if(verbose > 1) printf("vbelib: SetDisplayStart=%04X:%04X => %p\n",r.es,info_offset+rm_info->SetDisplayStart,pm_info->SetDisplayStart); #endif pm_info->SetPaletteData = PhysToVirtSO(r.es,info_offset+rm_info->SetPaletteData); if(!is_addr_valid(pm_info->SetPaletteData)) retval = VBE_BROKEN_BIOS; #ifdef HAVE_VERBOSE_VAR if(verbose > 1) printf("vbelib: SetPaletteData=%04X:%04X => %p\n",r.es,info_offset+rm_info->SetPaletteData,pm_info->SetPaletteData); #endif pm_info->iopl_ports = PhysToVirtSO(r.es,info_offset+rm_info->iopl_ports); if(!rm_info->iopl_ports) pm_info->iopl_ports = NULL; else if(!check_wrd(pm_info->iopl_ports)) { pm_info->iopl_ports = NULL; /* retval = VBE_BROKEN_BIOS; <- It's for broken BIOSes only */ } #ifdef HAVE_VERBOSE_VAR if(verbose > 1) { printf("vbelib: iopl_ports=%04X:%04X => %p\n",r.es,info_offset+rm_info->iopl_ports,pm_info->iopl_ports); if(pm_info->iopl_ports) print_wrd(pm_info->iopl_ports); fflush(stdout); } #endif } return retval; } /* --------- Standard VGA stuff -------------- */ int vbeWriteString(int x, int y, int attr, char *str) { struct LRMI_regs r; void *rm_space = NULL; int retval; memset(&r,0,sizeof(struct LRMI_regs)); r.ecx = strlen(str); r.edx = ((y<<8)&0xff00)|(x&0xff); r.ebx = attr; if(!(rm_space = LRMI_alloc_real(r.ecx))) return VBE_OUT_OF_DOS_MEM; r.es = VirtToPhysSeg(rm_space); r.ebp = VirtToPhysOff(rm_space); memcpy(rm_space,str,r.ecx); r.eax = 0x1300; retval = VBE_LRMI_int(0x10,&r); LRMI_free_real(rm_space); if(!retval) return VBE_VM86_FAIL; retval = r.eax & 0xffff; if(retval == 0x4f) retval = VBE_OK; return retval; } void * vbeMapVideoBuffer(unsigned long phys_addr,unsigned long size) { void *lfb; if(fd_mem == -1) return NULL; if(verbose > 1) printf("vbelib: vbeMapVideoBuffer(%08lX,%08lX)\n",phys_addr,size); /* Here we don't need with MAP_FIXED and prefered address (first argument) */ lfb = mmap((void *)0,size,PROT_READ | PROT_WRITE,MAP_SHARED,fd_mem,phys_addr); return lfb == (void *)-1 ? 0 : lfb; } void vbeUnmapVideoBuffer(unsigned long linear_addr,unsigned long size) { if(verbose > 1) printf("vbelib: vbeUnmapVideoBuffer(%08lX,%08lX)\n",linear_addr,size); munmap((void *)linear_addr,size); } #endif --- NEW FILE: vbe.h --- /* VESA VBE 2.0 compatible structures and definitions. You can redistribute this file under terms and conditions of GNU General Public licence v2. Written by Nick Kurshev */ #ifndef __VESA_VBELIB_INCLUDED__ #define __VESA_VBELIB_INCLUDED__ 1 /* Note: every pointer within structures is 32-bit protected mode pointer. So you don't need to convert it from real mode. */ typedef struct tagFarPtr { unsigned short off; unsigned short seg; }FarPtr; #define VBE_DAC_8BIT (1 << 0) #define VBE_NONVGA_CRTC (1 << 1) #define VBE_SNOWED_RAMDAC (1 << 2) #define VBE_STEREOSCOPIC (1 << 3) #define VBE_STEREO_EVC (1 << 4) struct VbeInfoBlock { char VESASignature[4]; /* 'VESA' 4 byte signature */ short VESAVersion; /* VBE version number */ char * OemStringPtr; /* Pointer to OEM string */ long Capabilities; /* Capabilities of video card */ unsigned short* VideoModePtr; /* Pointer to supported modes */ short TotalMemory; /* Number of 64kb memory blocks */ /* VBE 2.0 and above */ short OemSoftwareRev; char * OemVendorNamePtr; char * OemProductNamePtr; char * OemProductRevPtr; char reserved[222]; char OemData[256]; /* Pad to 512 byte block size */ }__attribute__ ((packed)); static inline FarPtr VirtToPhys(void *ptr) { FarPtr retval; retval.seg = ((unsigned long)ptr) >> 4; retval.off = ((unsigned long)ptr) & 0x0f; return retval; } static inline unsigned short VirtToPhysSeg(void *ptr) { return ((unsigned long)ptr) >> 4; } static inline unsigned short VirtToPhysOff(void *ptr) { return ((unsigned long)ptr) & 0x0f; } static inline void * PhysToVirt(FarPtr ptr) { return (void *)((ptr.seg << 4) | ptr.off); } static inline void * PhysToVirtSO(unsigned short seg,unsigned short off) { return (void *)((seg << 4) | off); } #define MODE_ATTR_MODE_SUPPORTED (1 << 0) #define MODE_ATTR_TTY (1 << 2) #define MODE_ATTR_COLOR (1 << 3) #define MODE_ATTR_GRAPHICS (1 << 4) #define MODE_ATTR_NOT_VGA (1 << 5) #define MODE_ATTR_NOT_WINDOWED (1 << 6) #define MODE_ATTR_LINEAR (1 << 7) #define MODE_ATTR_DOUBLESCAN (1 << 8) #define MODE_ATTR_INTERLACE (1 << 9) #define MODE_ATTR_TRIPLEBUFFER (1 << 10) #define MODE_ATTR_STEREOSCOPIC (1 << 11) #define MODE_ATTR_DUALDISPLAY (1 << 12) #define MODE_WIN_RELOCATABLE (1 << 0) #define MODE_WIN_READABLE (1 << 1) #define MODE_WIN_WRITEABLE (1 << 2) #define NEO_PAL 0 #define NEO_NTSC 1 /* SuperVGA mode information block */ struct VesaModeInfoBlock { unsigned short ModeAttributes; /* 00: Mode attributes */ unsigned char WinAAttributes; /* 02: Window A attributes */ unsigned char WinBAttributes; /* 03: Window B attributes */ unsigned short WinGranularity; /* 04: Window granularity in k */ unsigned short WinSize; /* 06: Window size in k */ unsigned short WinASegment; /* 08: Window A segment */ unsigned short WinBSegment; /* 0A: Window B segment */ FarPtr WinFuncPtr; /* 0C: 16-bit far pointer to window function */ unsigned short BytesPerScanLine; /* 10: Bytes per scanline */ /* VBE 1.2 and above */ unsigned short XResolution; /* 12: Horizontal resolution */ unsigned short YResolution; /* 14: Vertical resolution */ unsigned char XCharSize; /* 16: Character cell width */ unsigned char YCharSize; /* 17: Character cell height */ unsigned char NumberOfPlanes; /* 18: Number of memory planes */ unsigned char BitsPerPixel; /* 19: Bits per pixel */ unsigned char NumberOfBanks; /* 1A: Number of CGA style banks */ unsigned char MemoryModel; /* 1B: Memory model type */ unsigned char BankSize; /* 1C: Size of CGA style banks */ unsigned char NumberOfImagePages; /* 1D: Number of images pages */ unsigned char res1; /* 1E: Reserved */ /* Direct Color fields (required for direct/6 and YUV/7 memory models) */ unsigned char RedMaskSize; /* 1F: Size of direct color red mask */ unsigned char RedFieldPosition; /* 20: Bit posn of lsb of red mask */ unsigned char GreenMaskSize; /* 21: Size of direct color green mask */ unsigned char GreenFieldPosition; /* 22: Bit posn of lsb of green mask */ unsigned char BlueMaskSize; /* 23: Size of direct color blue mask */ unsigned char BlueFieldPosition; /* 24: Bit posn of lsb of blue mask */ unsigned char RsvdMaskSize; /* 25: Size of direct color res mask */ unsigned char RsvdFieldPosition; /* 26: Bit posn of lsb of res mask */ unsigned char DirectColorModeInfo; /* 27: Direct color mode attributes */ /* VBE 2.0 and above */ unsigned long PhysBasePtr; /* 28: physical address for flat memory frame buffer. (Should be converted to linear before using) */ unsigned short res3[3]; /* 2C: Reserved - always set to 0 */ /* VBE 3.0 and above */ unsigned short LinBytesPerScanLine; /* 32: bytes per scan line for linear modes */ unsigned char BnkNumberOfImagePages;/* 34: number of images for banked modes */ unsigned char LinNumberOfImagePages;/* 35: number of images for linear modes */ unsigned char LinRedMaskSize; /* 36: size of direct color red mask (linear modes) */ unsigned char LinRedFieldPosition; /* 37: bit position of lsb of red mask (linear modes) */ unsigned char LinGreenMaskSize; /* 38: size of direct color green mask (linear modes) */ unsigned char LinGreenFieldPosition;/* 39: bit position of lsb of green mask (linear modes) */ unsigned char LinBlueMaskSize; /* 40: size of direct color blue mask (linear modes) */ unsigned char LinBlueFieldPosition; /* 41: bit position of lsb of blue mask (linear modes) */ unsigned char LinRsvdMaskSize; /* 42: size of direct color reserved mask (linear modes) */ unsigned char LinRsvdFieldPosition; /* 43: bit position of lsb of reserved mask (linear modes) */ unsigned long MaxPixelClock; /* 44: maximum pixel clock (in Hz) for graphics mode */ char res4[189]; /* 48: remainder of ModeInfoBlock */ }__attribute__ ((packed)); typedef enum { memText= 0, memCGA = 1, memHercules = 2, memPL = 3, /* Planar memory model */ memPK = 4, /* Packed pixel memory model */ mem256 = 5, memRGB = 6, /* Direct color RGB memory model */ memYUV = 7, /* Direct color YUV memory model */ } memModels; struct VesaCRTCInfoBlock { unsigned short hTotal; /* Horizontal total in pixels */ unsigned short hSyncStart; /* Horizontal sync start in pixels */ unsigned short hSyncEnd; /* Horizontal sync end in pixels */ unsigned short vTotal; /* Vertical total in lines */ unsigned short vSyncStart; /* Vertical sync start in lines */ unsigned short vSyncEnd; /* Vertical sync end in lines */ unsigned char Flags; /* Flags (Interlaced, Double Scan etc) */ unsigned long PixelClock; /* Pixel clock in units of Hz */ unsigned short RefreshRate;/* Refresh rate in units of 0.01 Hz*/ unsigned char Reserved[40];/* remainder of CRTCInfoBlock*/ }__attribute__ ((packed)); #define VESA_CRTC_DOUBLESCAN 0x01 #define VESA_CRTC_INTERLACED 0x02 #define VESA_CRTC_HSYNC_NEG 0x04 #define VESA_CRTC_VSYNC_NEG 0x08 #define VESA_MODE_CRTC_REFRESH (1 << 11) #define VESA_MODE_USE_LINEAR (1 << 14) #define VESA_MODE_NOT_CLEAR (1 << 15) /* This will contain accesible 32-bit protmode pointers */ struct VesaProtModeInterface { void (*SetWindowCall)(void); void (*SetDisplayStart)(void); void (*SetPaletteData)(void); unsigned short * iopl_ports; }; /* All functions below return: 0 if succesful 0xffff if vm86 syscall error occurs 0x4fxx if VESA error occurs */ #define VBE_OK 0 #define VBE_VM86_FAIL -1 #define VBE_OUT_OF_DOS_MEM -2 #define VBE_OUT_OF_MEM -3 #define VBE_BROKEN_BIOS -4 #define VBE_VESA_ERROR_MASK 0x004f #define VBE_VESA_ERRCODE_MASK 0xff00 extern int vbeInit( void ); extern int vbeDestroy( void ); extern int vbeGetControllerInfo(struct VbeInfoBlock *); extern int vbeGetModeInfo(unsigned mode,struct VesaModeInfoBlock *); extern int vbeSetMode(unsigned mode,struct VesaCRTCInfoBlock *); extern int vbeGetMode(unsigned *mode); extern int vbeGetPixelClock(unsigned *mode,unsigned *pixel_clock); extern int vbeSaveState(void **data); /* note never copy this data */ extern int vbeRestoreState(void *data); extern int vbeGetWindow(unsigned *win_num); /* win_A=0 or win_B=1 */ extern int vbeSetWindow(unsigned win_num,unsigned win_gran); extern int vbeGetScanLineLength(unsigned *num_pixels,unsigned *num_bytes); extern int vbeGetMaxScanLines(unsigned *num_pixels,unsigned *num_bytes, unsigned *num_lines); extern int vbeSetScanLineLength(unsigned num_pixels); extern int vbeSetScanLineLengthB(unsigned num_bytes); extern int vbeGetDisplayStart(unsigned *pixel_num,unsigned *scan_line); extern int vbeSetDisplayStart(unsigned long offset, int vsync); extern int vbeSetScheduledDisplayStart(unsigned long offset, int vsync); extern int vbeSetTV(unsigned int vesa_mode,unsigned int TV_mode); /* Func 0x08-0x09: Support of palette currently is not implemented. */ extern int vbeGetProtModeInfo(struct VesaProtModeInterface *); /* Standard VGA stuff */ int vbeWriteString(int x, int y, int attr, char *str); /* Misc stuff (For portability only) */ void * vbeMapVideoBuffer(unsigned long phys_addr,unsigned long size); void vbeUnmapVideoBuffer(unsigned long linear_addr,unsigned long size); #endif From alex at mplayerhq.hu Fri Aug 12 19:51:57 2005 From: alex at mplayerhq.hu (Alex Beregszaszi) Date: Fri, 12 Aug 2005 19:51:57 +0200 (CEST) Subject: [Vesautils-devel] CVS: vesautils/libvbe vbe.c,1.1,1.2 Message-ID: <20050812175157.569BB6A186@mail.mplayerhq.hu> Update of /cvsroot/vesautils/vesautils/libvbe In directory mail:/var2/tmp/cvs-serv29067 Modified Files: vbe.c Log Message: support for lrmi library Index: vbe.c =================================================================== RCS file: /cvsroot/vesautils/vesautils/libvbe/vbe.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- vbe.c 12 Aug 2005 17:49:53 -0000 1.1 +++ vbe.c 12 Aug 2005 17:51:54 -0000 1.2 @@ -9,11 +9,6 @@ Neomagic TV out support by Rudolf Marek */ -#include <../config.h> -#ifdef HAVE_VESA - -#include "vbelib.h" -#include "lrmi.h" #include #include #include @@ -27,6 +22,9 @@ #include #include +#include +#include "vbe.h" + static struct VesaProtModeInterface vbe_pm_info; static struct VesaModeInfoBlock curr_mode_info; @@ -773,5 +771,3 @@ if(verbose > 1) printf("vbelib: vbeUnmapVideoBuffer(%08lX,%08lX)\n",linear_addr,size); munmap((void *)linear_addr,size); } - -#endif From alex at mplayerhq.hu Fri Aug 12 19:53:56 2005 From: alex at mplayerhq.hu (Alex Beregszaszi) Date: Fri, 12 Aug 2005 19:53:56 +0200 (CEST) Subject: [Vesautils-devel] CVS: vesautils/libvbe vbe.c,1.2,1.3 Message-ID: <20050812175356.3F40B4E333@mail.mplayerhq.hu> Update of /cvsroot/vesautils/vesautils/libvbe In directory mail:/var2/tmp/cvs-serv20265 Modified Files: vbe.c Log Message: vbeVersion Index: vbe.c =================================================================== RCS file: /cvsroot/vesautils/vesautils/libvbe/vbe.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- vbe.c 12 Aug 2005 17:51:54 -0000 1.2 +++ vbe.c 12 Aug 2005 17:53:54 -0000 1.3 @@ -25,6 +25,11 @@ #include #include "vbe.h" +int vbeVersion(void) +{ + return 0x0002; // 0.2 +} + static struct VesaProtModeInterface vbe_pm_info; static struct VesaModeInfoBlock curr_mode_info; From alex at mplayerhq.hu Fri Aug 12 20:29:52 2005 From: alex at mplayerhq.hu (Alex Beregszaszi) Date: Fri, 12 Aug 2005 20:29:52 +0200 (CEST) Subject: [Vesautils-devel] CVS: vesautils README,1.1,1.2 Message-ID: <20050812182952.EF93D4690A@mail.mplayerhq.hu> Update of /cvsroot/vesautils/vesautils In directory mail:/home/alex/vesautils/vesautils Modified Files: README Log Message: email, some fixes Index: README =================================================================== RCS file: /cvsroot/vesautils/vesautils/README,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- README 12 Aug 2005 17:48:15 -0000 1.1 +++ README 12 Aug 2005 18:29:50 -0000 1.2 @@ -17,21 +17,22 @@ mode3: set vesa mode vbemodeinfo: dump information about a vbe mode vbetest: list vbe modes and test them +vbetool: general utility vga_reset: call vga bios init function 4, Authors -Nick Kurshev +Nick Kurshev * original vbelib for MPlayer -Matan Zivav +Matan Ziv-av * svgalib imported utils (mode3, vga_reset, get-edid) Matthew Garrett * vbetool -Josh Vanderhoof +Josh Vanderhoof * LRMI and vbetest -Alex Beregszaszi +Alex Beregszaszi * new libvbe From gert.vandelaer at gmail.com Tue Aug 16 22:41:10 2005 From: gert.vandelaer at gmail.com (Djeezus) Date: Tue, 16 Aug 2005 22:41:10 +0200 Subject: [Vesautils-devel] CVS anonymous login ... Message-ID: <20d694e90508161341efad1b4@mail.gmail.com> Hy all, I'd like to try out the vesautils, but there seems to be a password on the anonymous CVS account. Or is there another login ? Oh yes btw, the cvs command on "http://mplayerhq.hu/homepage/vesautils/" has an "@"-sign too many right after the ":pserver" ... prolly a typo =:-) gert -- iT's aLl jUsT f0r LaUgH5 I teLLz yA ! From alex at fsn.hu Tue Aug 16 22:48:17 2005 From: alex at fsn.hu (Alex Beregszaszi) Date: Tue, 16 Aug 2005 22:48:17 +0200 Subject: [Vesautils-devel] CVS anonymous login ... In-Reply-To: <20d694e90508161341efad1b4@mail.gmail.com> References: <20d694e90508161341efad1b4@mail.gmail.com> Message-ID: <20050816224817.20837a23@caprice.artificis.hu> Hi, > I'd like to try out the vesautils, but there seems to be a password on > the anonymous CVS account. Or is there another login ? > > Oh yes btw, the cvs command on > "http://mplayerhq.hu/homepage/vesautils/" has an "@"-sign too many > right after the ":pserver" ... prolly a typo =:-) Sorry, but for some reason the anoncvs has a bug and is not working. But you still can download it via cvsweb at http://www1.mplayerhq.hu/cgi-bin/cvsweb.cgi/?cvsroot=vesautils -- Alex Beregszaszi email: alex at fsn.hu Free Software Network cell: +36 70 3144424 From gert.vandelaer at gmail.com Tue Aug 16 23:20:55 2005 From: gert.vandelaer at gmail.com (Djeezus) Date: Tue, 16 Aug 2005 23:20:55 +0200 Subject: [Vesautils-devel] CVS anonymous login ... In-Reply-To: <20050816224817.20837a23@caprice.artificis.hu> References: <20d694e90508161341efad1b4@mail.gmail.com> <20050816224817.20837a23@caprice.artificis.hu> Message-ID: <20d694e905081614204c91d308@mail.gmail.com> Ok thnx Alex, got it ... now maybe I can track down why my TridentCyberblade only runs in "VESAfb" mode and not native "Cyber fb" mode... bye, gert On 8/16/05, Alex Beregszaszi wrote: > Hi, > > > I'd like to try out the vesautils, but there seems to be a password on > > the anonymous CVS account. Or is there another login ? > > > > Oh yes btw, the cvs command on > > "http://mplayerhq.hu/homepage/vesautils/" has an "@"-sign too many > > right after the ":pserver" ... prolly a typo =:-) > > Sorry, but for some reason the anoncvs has a bug and is not working. > > But you still can download it via cvsweb at > http://www1.mplayerhq.hu/cgi-bin/cvsweb.cgi/?cvsroot=vesautils > > -- > Alex Beregszaszi email: alex at fsn.hu > Free Software Network cell: +36 70 3144424 > -- iT's aLl jUsT f0r LaUgH5 I teLLz yA ! From mjg59 at srcf.ucam.org Thu Aug 18 02:17:58 2005 From: mjg59 at srcf.ucam.org (Matthew Garrett) Date: Thu, 18 Aug 2005 01:17:58 +0100 Subject: [Vesautils-devel] x86emu/lrmi integration Message-ID: <20050818001758.GA28952@srcf.ucam.org> Hi, One of the problems with lrmi is that it's x86 only. This is a bit of a problem when it comes to dealing with getting laptop video back on x86 hardware (for instance). So last month I(*) started working on a layer that provided the lrmi API using x86emu. On x86 hardware, programs can carry on using vm86 mode. Elsewhere, they can use x86emu. http://www.srcf.ucam.org/~mjg59/tmp/vbetool-0.4-bambam.tar.bz2 contains a mostly working "thunk" layer that translates lrmi calls to x86emu ones. It doesn't quite work, though - occasionally different code paths get executed between the x86emu and lrmi cases. We haven't managed to figure out why, yet. If someone's interested in having a hack at it, please feel free. * With the assistence of the wonderful Jonathan McDowell, who pointed out all sorts of stupidities -- Matthew Garrett | mjg59 at srcf.ucam.org From alex at mplayerhq.hu Thu Aug 18 10:38:18 2005 From: alex at mplayerhq.hu (Alex Beregszaszi) Date: Thu, 18 Aug 2005 10:38:18 +0200 (CEST) Subject: [Vesautils-devel] CVS: vesautils vbetool.c,1.1,1.2 Message-ID: <20050818083818.657186A4DB@mail.mplayerhq.hu> Update of /cvsroot/vesautils/vesautils In directory mail:/home/alex/vesautils/vesautils Modified Files: vbetool.c Log Message: support do_real_post if no PCI support is present Index: vbetool.c =================================================================== RCS file: /cvsroot/vesautils/vesautils/vbetool.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- vbetool.c 12 Aug 2005 17:48:15 -0000 1.1 +++ vbetool.c 18 Aug 2005 08:38:16 -0000 1.2 @@ -105,12 +105,7 @@ if (err) { return err; } -#ifdef HAVE_PCI return do_post(); -#else - fprintf(stderr, "%s: not compiled with PCI support\n", argv[0]); - return -1; -#endif } else { usage: fprintf(stderr, @@ -150,7 +145,6 @@ return access_ptr_register(regs, ebx); } -#ifdef HAVE_PCI int do_real_post(unsigned pci_device) { int error = 0; @@ -188,6 +182,7 @@ unsigned int pci_id; int error; +#ifdef HAVE_PCI pci_scan_bus(pacc); for (p = pacc->devices; p; p = p->next) { @@ -203,8 +198,11 @@ } } return 0; -} +#else + fprintf(stderr, "Not compiled with PCI support, will not pass PCI id, thus this may fail\n"); + return do_real_post(0); #endif +} void restore_state() { From alex at mplayerhq.hu Thu Aug 18 11:14:26 2005 From: alex at mplayerhq.hu (Alex Beregszaszi) Date: Thu, 18 Aug 2005 11:14:26 +0200 (CEST) Subject: [Vesautils-devel] CVS: vesautils mode3.c, 1.1, NONE vga_reset.c, 1.1, NONE Message-ID: <20050818091426.36A3A6A5CD@mail.mplayerhq.hu> Update of /cvsroot/vesautils/vesautils In directory mail:/home/alex/vesautils/vesautils Removed Files: mode3.c vga_reset.c Log Message: functions are implemented in vbetool --- mode3.c DELETED --- --- vga_reset.c DELETED ---