summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Stembridge <jstembridge@users.sourceforge.net>2003-01-19 17:19:29 +0000
committerJames Stembridge <jstembridge@users.sourceforge.net>2003-01-19 17:19:29 +0000
commitc8b5b51d673a5095c8a01058c378719fd16f505c (patch)
tree1945eccf3a1237cad141fe78d5e1ec19d913e93b
parentee00f14682a2fa3f7d8c461b2e904db782555540 (diff)
downloadxine-lib-c8b5b51d673a5095c8a01058c378719fd16f505c.tar.gz
xine-lib-c8b5b51d673a5095c8a01058c378719fd16f505c.tar.bz2
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
-rw-r--r--src/video_out/vidix/drivers/cyberblade_vid.c179
1 files 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<src_h)
vscale=0x8000|((drw_h<<10)/(src_h));
- printf(CYBERBLADE_MSG" HScale: 0x%x, VScale: 0x%x\n",hscale,vscale);
-
/* Write scale factors to hardware */
- LOGWRITE("\tScale:\n");
CROUTW(0x80,hscale); /* Horizontal Scale */
CROUTW(0x82,vscale); /* Vertical Scale */
- LOGWRITE("Data layout:\n");
/* Now set the start address and data layout */
{
int lb = (y_pitch+2) >> 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;
}