# HG changeset patch # User alex # Date 1088184558 0 # Node ID 430a71a762b4044f2e3e56524c29ab15dedc4179 # Parent 2cb92251da72f95837362c7c92c6c6b102f30d3a neomagic tv out support throught vesa vbe, patch by Rudolf Marek diff -r 2cb92251da72 -r 430a71a762b4 AUTHORS --- a/AUTHORS Fri Jun 25 17:19:58 2004 +0000 +++ b/AUTHORS Fri Jun 25 17:29:18 2004 +0000 @@ -456,6 +456,7 @@ Marek, Rudolf * gtf code for -vo vesa + * neomagic tv out support through vesa vbe Megyer, László (Lez, Laaz) * subtitle reader diff -r 2cb92251da72 -r 430a71a762b4 libvo/vo_vesa.c --- a/libvo/vo_vesa.c Fri Jun 25 17:19:58 2004 +0000 +++ b/libvo/vo_vesa.c Fri Jun 25 17:29:18 2004 +0000 @@ -123,6 +123,10 @@ static vidix_grkey_t gr_key; #endif +/* Neomagic TV out */ +static int neomagic_tvout = 0; +static int neomagic_tvnorm = NEO_PAL; + #define HAS_DGA() (win.idx == -1) #define MOVIE_MODE (MODE_ATTR_COLOR | MODE_ATTR_GRAPHICS) #define FRAME_MODE (MODE_WIN_RELOCATABLE | MODE_WIN_WRITEABLE) @@ -444,6 +448,10 @@ else if(strcmp(sd,"dga") == 0) { flags &= ~(SUBDEV_NODGA); flags |= SUBDEV_FORCEDGA; } else + if(strcmp(sd,"neotv_pal") == 0) { neomagic_tvout = 1; neomagic_tvnorm = NEO_PAL; } + else + if(strcmp(sd,"neotv_ntsc") == 0) { neomagic_tvout = 1; neomagic_tvnorm = NEO_NTSC; } + else if(memcmp(sd,"lvo:",4) == 0) lvo_name = &sd[4]; /* lvo_name will be valid within init() */ #ifdef CONFIG_VIDIX else @@ -927,6 +935,15 @@ return -1; } + if (neomagic_tvout) { + err = vbeSetTV(video_mode,neomagic_tvnorm); + if (err!=0x4f) { + printf("vo_vesa: Sorry unsupported mode, try -x 640 -zoom\n"); + } + else { + printf("vo_vesa: Oh you really have picture on TV!\n"); + } + } /* Now we are in video mode!!!*/ /* Below 'return -1' is impossible */ if(verbose) diff -r 2cb92251da72 -r 430a71a762b4 osdep/vbelib.c --- a/osdep/vbelib.c Fri Jun 25 17:19:58 2004 +0000 +++ b/osdep/vbelib.c Fri Jun 25 17:29:18 2004 +0000 @@ -6,6 +6,7 @@ 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> @@ -336,6 +337,46 @@ 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; diff -r 2cb92251da72 -r 430a71a762b4 osdep/vbelib.h --- a/osdep/vbelib.h Fri Jun 25 17:19:58 2004 +0000 +++ b/osdep/vbelib.h Fri Jun 25 17:29:18 2004 +0000 @@ -82,6 +82,8 @@ #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 { @@ -211,6 +213,7 @@ 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.