From c8b5b51d673a5095c8a01058c378719fd16f505c Mon Sep 17 00:00:00 2001 From: James Stembridge Date: Sun, 19 Jan 2003 17:19:29 +0000 Subject: Update to cyberblade_vid driver. Fixes cache issues with EPIA-800 and improves TV-Out mode support. CVS patchset: 3967 CVS date: 2003/01/19 17:19:29 --- src/video_out/vidix/drivers/cyberblade_vid.c | 179 ++++++++++----------------- 1 file changed, 62 insertions(+), 117 deletions(-) diff --git a/src/video_out/vidix/drivers/cyberblade_vid.c b/src/video_out/vidix/drivers/cyberblade_vid.c index 16005d1bb..423916a4d 100644 --- a/src/video_out/vidix/drivers/cyberblade_vid.c +++ b/src/video_out/vidix/drivers/cyberblade_vid.c @@ -1,5 +1,5 @@ /* - Driver for CyberBlade/i1 - Version 0.1.3 + Driver for CyberBlade/i1 - Version 0.1.4 Copyright (C) 2002 by Alastair M. Robinson. Based on Permedia 3 driver by Måns Rullgård @@ -48,10 +48,8 @@ pciinfo_t pci_info; -unsigned char *cyberblade_reg_base; -unsigned char *cyberblade_mem; -int cyberblade_crtc; char save_colourkey[6]; +char *cyberblade_mem; #ifdef DEBUG_LOGFILE FILE *logfile=0; @@ -72,7 +70,6 @@ static int CRINW(int reg) static void CROUTW(int reg,int val) { - val&=0xffff; CROUTB(reg,val&255); CROUTB(reg+1,(val>>8)&255); } @@ -87,7 +84,6 @@ static int SRINW(int reg) static void SROUTW(int reg,int val) { - val&=0xffff; SROUTB(reg,val&255); SROUTB(reg+1,(val>>8)&255); } @@ -197,43 +193,27 @@ int VIDIX_NAME(vixProbe)(int verbose, int force) int VIDIX_NAME(vixInit)(const char *args) { - cyberblade_reg_base = map_phys_mem(pci_info.base1, 0x20000); cyberblade_mem = map_phys_mem(pci_info.base0, 0x800000); enable_app_io(); - OUTPORT8(0x3d4,0x39); - OUTPORT8(0x3d5,INPORT(0x3d5)|1); /* Make sure MMIO is enabled... */ - -#ifdef DEBUG_LOGFILE - logfile=fopen("/tmp/cyberblade_vidix.log","w"); -#endif - - SRINB(0x0b); /* Select new mode */ - - printf(CYBERBLADE_MSG" Using IOBase: 0x%lx, FBBase: 0x%lx\n", - (unsigned long) cyberblade_reg_base, - (unsigned long) cyberblade_mem); - - LOGWRITE("Colour key:\n"); save_colourkey[0]=SRINB(0x50); save_colourkey[1]=SRINB(0x51); save_colourkey[2]=SRINB(0x52); save_colourkey[3]=SRINB(0x54); save_colourkey[4]=SRINB(0x55); save_colourkey[5]=SRINB(0x56); - - printf(CYBERBLADE_MSG" Saved colourkey: %x, %x, %x, %x, %x, %x\n", - save_colourkey[0],save_colourkey[1],save_colourkey[2], - save_colourkey[3],save_colourkey[4],save_colourkey[5]); - - LOGWRITE("Colour key done:\n"); - +#ifdef DEBUG_LOGFILE + logfile=fopen("/tmp/cyberblade_vidix.log","w"); +#endif return 0; } void VIDIX_NAME(vixDestroy)(void) { int protect; - LOGWRITE("Cleanup:\n"); +#ifdef DEBUG_LOGFILE + if(logfile) + fclose(logfile); +#endif protect=SRINB(0x11); SROUTB(0x11, 0x92); CROUTB(0x8E, 0xc4); /* Disable overlay */ @@ -244,13 +224,7 @@ void VIDIX_NAME(vixDestroy)(void) SROUTB(0x55,save_colourkey[4]); SROUTB(0x56,save_colourkey[5]); SROUTB(0x11, protect); - LOGWRITE("Done\n"); -#ifdef DEBUG_LOGFILE - fclose(logfile); -#endif disable_app_io(); - unmap_phys_mem(cyberblade_reg_base, 0x20000); - unmap_phys_mem(cyberblade_mem, 0x800000); } @@ -267,7 +241,6 @@ static int is_supported_fourcc(uint32_t fourcc) { case IMGFMT_YUY2: case IMGFMT_YV12: - case IMGFMT_I420: case IMGFMT_YVU9: case IMGFMT_BGR16: return 1; @@ -308,42 +281,33 @@ int VIDIX_NAME(vixSetGrKeys)(const vidix_grkey_t *grkey) { int pixfmt=CRINB(0x38); int protect; - if(grkey!=(&cyberblade_grkey)) memcpy(&cyberblade_grkey, grkey, sizeof(vidix_grkey_t)); - LOGWRITE("Setting colour key:\n"); protect=SRINB(0x11); SROUTB(0x11, 0x92); if(pixfmt&0x28) /* 32 or 24 bpp */ { - LOGWRITE("\t24 / 32 bit:\n"); SROUTB(0x50, cyberblade_grkey.ckey.blue); /* Colour Key */ SROUTB(0x51, cyberblade_grkey.ckey.green); /* Colour Key */ SROUTB(0x52, cyberblade_grkey.ckey.red); /* Colour Key */ SROUTB(0x54, 0xff); /* Colour Key Mask */ SROUTB(0x55, 0xff); /* Colour Key Mask */ SROUTB(0x56, 0xff); /* Colour Key Mask */ - printf(CYBERBLADE_MSG" Setting colourkey for 24/32 bit: %x, %x, %x\n", - cyberblade_grkey.ckey.blue,cyberblade_grkey.ckey.green,cyberblade_grkey.ckey.red); } else { int tmp=((cyberblade_grkey.ckey.blue & 0xF8)>>3) | ((cyberblade_grkey.ckey.green & 0xfc)<<3) | ((cyberblade_grkey.ckey.red & 0xf8)<<8); - LOGWRITE("\t16 bit:\n"); SROUTB(0x50, tmp&0xff); /* Colour Key */ SROUTB(0x51, (tmp>>8)&0xff); /* Colour Key */ SROUTB(0x52, 0); /* Colour Key */ SROUTB(0x54, 0xff); /* Colour Key Mask */ SROUTB(0x55, 0xff); /* Colour Key Mask */ SROUTB(0x56, 0x00); /* Colour Key Mask */ - printf(CYBERBLADE_MSG" Setting colourkey for 16 bit: %x, %x\n", - tmp&0xff,(tmp>>8)&0xff); } SROUTB(0x11,protect); - LOGWRITE("Done\n"); return(0); } @@ -386,15 +350,13 @@ int VIDIX_NAME(vixPlaybackSetEq)( const vidix_video_eq_t * eq) sat = (equal.saturation + 1000) * 16 / 2000; if (sat < 0) sat = 0; if(sat > 31) sat = 31; - LOGWRITE("Contrast/Brightness:\n"); protect=SRINB(0x11); SROUTB(0x11, 0x92); SROUTB(0xBC,cr); SROUTW(0xB0,(br<<10)|4); - printf(CYBERBLADE_MSG" Setting contrast and brightness: %x, %x\n",cr,(br<<10|4)); + SROUTB(0x11, protect); - LOGWRITE("Done:\n"); return 0; } @@ -441,15 +403,6 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) info->frame_size = y_pitch*src_h + 2*uv_pitch*(src_h/2); layout=0x1; /* planar, 4:1:1 */ break; - case IMGFMT_I420: - y_pitch = (src_w+15) & ~15; - uv_pitch = ((src_w/2)+7) & ~7; - YOffs=info->offset.y = 0; - VOffs=info->offset.u = y_pitch*src_h; - UOffs=info->offset.v = info->offset.u+(uv_pitch)*(src_h/2); - info->frame_size = y_pitch*src_h + 2*uv_pitch*(src_h/2); - layout=0x1; /* planar, 4:1:1 */ - break; case IMGFMT_YVU9: y_pitch = (src_w+15) & ~15; uv_pitch = ((src_w/4)+3) & ~3; @@ -461,10 +414,6 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) break; } - printf(CYBERBLADE_MSG" Initialised FourCC: %lx, Pitches: %x, %x\n", - (unsigned long) info->fourcc,(unsigned) y_pitch,(unsigned) uv_pitch); - printf(CYBERBLADE_MSG" Framesize: %x, Offsets: %x, %x, %x\n",info->frame_size,YOffs,UOffs,VOffs); - /* Assume we have 2 MB to play with */ info->num_frames = 0x200000 / info->frame_size; if(info->num_frames > VID_PLAY_MAXFRAMES) @@ -484,44 +433,27 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) frames[i] = base0+info->offsets[i]; } - LOGWRITE("ConfigPlayback:\n"); - LOGWRITE("\tKey mode:\n"); + OUTPORT8(0x3d4,0x39); + OUTPORT8(0x3d5,INPORT(0x3d5)|1); + + SRINB(0x0b); /* Select new mode */ + /* Unprotect hardware registers... */ protect=SRINB(0x11); SROUTB(0x11, 0x92); - SROUTB(0x57, 0xcc); /* Playback key function */ + SROUTB(0x57, 0xc0); /* Playback key function */ SROUTB(0x21, 0x34); /* Signature control */ - SROUTB(0x37, 0x30); /* Video key mode - was 0x30 */ + SROUTB(0x37, 0x30); /* Video key mode */ vixSetGrKeys(&cyberblade_grkey); /* compute_scale_factor(&src_w, &drw_w, &shrink, &zoom); */ { - int HTotal,VTotal,HSync,VSync,Overflow; + int HTotal,VTotal,HSync,VSync,Overflow,HDisp,VDisp; + int HWinStart,VWinStart; int tx1,ty1,tx2,ty2; - if(CRINB(0xd1)&0x80) - { - LOGWRITE("\tTV-CRTC:\n"); - printf(CYBERBLADE_MSG" Using TV-CRTC\n"); - HTotal=CRINB(0xe0); - HSync=CRINB(0xe4); - VTotal=CRINB(0xe6); - VSync=CRINB(0xf0); - Overflow=CRINB(0xe7); - HTotal <<=3; HTotal-=16; - HSync <<=3; - VTotal |= (Overflow & 1) <<8; - VTotal |= (Overflow & 0x20) <<4; - VTotal +=5; - VSync |= (Overflow & 4) <<6; - VSync |= (Overflow & 0x80) <<2; - } - else - { - LOGWRITE("\tStandard CRTC:\n"); - printf(CYBERBLADE_MSG" Using Standard CRTC\n"); HTotal=CRINB(0x00); HSync=CRINB(0x04); VTotal=CRINB(0x06); @@ -534,16 +466,51 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) VTotal +=4; VSync |= (Overflow & 4) <<6; VSync |= (Overflow & 0x80) <<2; + + if(CRINB(0xd1)&0x80) + { + int TVHTotal,TVVTotal,TVHSyncStart,TVVSyncStart,TVOverflow; + LOGWRITE("[cyberblade] Using TV-CRTC\n"); + + HDisp=(1+CRINB(0x01))*8; + VDisp=1+CRINB(0x12); + Overflow=CRINB(0x07); + VDisp |= (Overflow & 2) <<7; + VDisp |= (Overflow & 0x40) << 3; + + TVHTotal=CRINB(0xe0)*8; + TVVTotal=CRINB(0xe6); + TVOverflow=CRINB(0xe7); + if(TVOverflow&0x20) TVVTotal|=512; + if(TVOverflow&0x01) TVVTotal|=256; + TVHTotal+=40; TVVTotal+=2; + + TVHSyncStart=CRINB(0xe4)*8; + TVVSyncStart=CRINB(0xf0); + if(TVOverflow&0x80) TVVSyncStart|=512; + if(TVOverflow&0x04) TVVSyncStart|=256; + + HWinStart=(TVHTotal-HDisp)&15; + HWinStart|=(HTotal-HDisp)&15; + HWinStart+=(TVHTotal-TVHSyncStart)-49; + + VWinStart=(TVVTotal-VDisp)/2-1; + VWinStart-=(1-((TVVTotal-VDisp)&1))+4; + } + else + { + LOGWRITE("[cyberblade] Using Standard CRTC\n"); + HWinStart=(HTotal-HSync)+15; + VWinStart=(VTotal-VSync)-8; } printf(CYBERBLADE_MSG" HTotal: 0x%x, HSStart: 0x%x\n",HTotal,HSync); printf(" VTotal: 0x%x, VStart: 0x%x\n",VTotal,VSync); - tx1=(HTotal-HSync)+15+info->dest.x; - ty1=(VTotal-VSync)-8+info->dest.y; + tx1=HWinStart+info->dest.x; + ty1=VWinStart+info->dest.y; tx2=tx1+info->dest.w; ty2=ty1+info->dest.h; - LOGWRITE("\tWindow:\n"); CROUTW(0x86,tx1); CROUTW(0x88,ty1); CROUTW(0x8a,tx2); @@ -565,15 +532,11 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) if(drw_h> 2; @@ -585,7 +548,7 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) CROUTB(0xBB, 0x00); /* Chroma key */ CROUTB(0xBC, 0xFF); /* Chroma key */ CROUTB(0xBD, 0xFF); /* Chroma key */ - CROUTB(0xBE, 0x04); /* Was: 0x05 Capture control */ + CROUTB(0xBE, 0x04); /* Capture control */ if(src_w > 384) layout|=4; /* 2x line buffers */ @@ -604,11 +567,10 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) default: CROUTB(0x8F, 0x20); /* VDE Flags - Edge Recovery */ CROUTB(0xBF, 0x00); /* Video format - YUV */ - SROUTB(0xBE, 0x03); /* HSCB enabled */ + SROUTB(0xBE, 0x00); /* HSCB disable - was 0x03*/ break; } - LOGWRITE("\tFramebuffer address:\n"); CROUTB(0x92, ((base0+info->offset.y) >> 3) &0xff); /* Lower 8 bits of start address */ CROUTB(0x93, ((base0+info->offset.y) >> 11) &0xff); /* Mid 8 bits of start address */ CROUTB(0x94, ((base0+info->offset.y) >> 19) &0xf); /* Upper 4 bits of start address */ @@ -624,40 +586,24 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) /* Protect hardware registers again */ SROUTB(0x11, protect); - LOGWRITE("Done\n"); - DumpRegisters(); return 0; } int VIDIX_NAME(vixPlaybackOn)(void) { - int protect; - /* Enable overlay */ - LOGWRITE("Enable overlay:\n"); - protect=SRINB(0x11); - SROUTB(0x11, 0x92); - + LOGWRITE("Enable overlay\n"); CROUTB(0x8E, 0xd4); /* VDE Flags*/ - SROUTB(0x11, protect); - LOGWRITE("Done\n"); return 0; } int VIDIX_NAME(vixPlaybackOff)(void) { - int protect; - /* Disable overlay */ - LOGWRITE("Disable overlay:\n"); - protect=SRINB(0x11); - SROUTB(0x11, 0x92); - + LOGWRITE("Disable overlay\n"); CROUTB(0x8E, 0xc4); /* VDE Flags*/ - SROUTB(0x11, protect); - LOGWRITE("Done\n"); return 0; } @@ -665,7 +611,7 @@ int VIDIX_NAME(vixPlaybackOff)(void) int VIDIX_NAME(vixPlaybackFrameSelect)(unsigned int frame) { int protect; - LOGWRITE("Frame Select:\n"); + LOGWRITE("Frame select\n"); protect=SRINB(0x11); SROUTB(0x11, 0x92); /* Set overlay address to that of selected frame */ @@ -679,7 +625,6 @@ int VIDIX_NAME(vixPlaybackFrameSelect)(unsigned int frame) SROUTB(0x84, ((frames[frame]+UOffs) >> 11) &0xff); /* Mid 8 bits of start address */ SROUTB(0x85, ((frames[frame]+UOffs) >> 19) &0xf); /* Upper 4 bits of start address */ SROUTB(0x11, protect); - LOGWRITE("Done\n"); return 0; } -- cgit v1.2.3