summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_out/vidix/drivers/cyberblade_regs.h21
-rw-r--r--src/video_out/vidix/drivers/cyberblade_vid.c169
2 files changed, 123 insertions, 67 deletions
diff --git a/src/video_out/vidix/drivers/cyberblade_regs.h b/src/video_out/vidix/drivers/cyberblade_regs.h
index 4b0c2b1b8..49c4ec52d 100644
--- a/src/video_out/vidix/drivers/cyberblade_regs.h
+++ b/src/video_out/vidix/drivers/cyberblade_regs.h
@@ -125,22 +125,11 @@
#define BiosNewMode2 0x5c
#define BiosReg 0x5d
-/* --- MMIO Macros by AMR --- */
+/* --- IO Macros by AMR --- */
-int HACKBUCKET12345678; /* Horrible hack to work around cache/speed issue */
-
-#define INB(addr) (HACKBUCKET12345678=*(cyberblade_reg_base+addr))
-#define INW(addr) (HACKBUCKET12345678=*(unsigned short *)(cyberblade_reg_base+addr))
-#define OUTB(addr,val) (*(cyberblade_reg_base+addr)=(val))
-#define OUTW(addr,val) (*(unsigned short *)(cyberblade_reg_base+addr)=(val))
-
-#define SRINB(reg) (OUTB(0x3c4,reg), INB(0x3c5))
-#define SROUTB(reg,val) (OUTW(0x3c4,((val)<<8)|(reg)))
-
-#define CRINB(reg) \
- (OUTB(cyberblade_crtc+4,reg), INB(cyberblade_crtc+5))
-
-#define CROUTB(reg,val) \
- (OUTW(cyberblade_crtc+4,((val)<<8)|(reg)))
+#define CRINB(reg) (OUTPORT8(0x3d4,reg), INPORT8(0x3d5))
+#define SRINB(reg) (OUTPORT8(0x3c4,reg), INPORT8(0x3c5))
+#define CROUTB(reg,val) (OUTPORT8(0x3d4,reg), OUTPORT8(0x3d5,val))
+#define SROUTB(reg,val) (OUTPORT8(0x3c4,reg), OUTPORT8(0x3c5,val))
/* --- */
diff --git a/src/video_out/vidix/drivers/cyberblade_vid.c b/src/video_out/vidix/drivers/cyberblade_vid.c
index 7e6a34338..16005d1bb 100644
--- a/src/video_out/vidix/drivers/cyberblade_vid.c
+++ b/src/video_out/vidix/drivers/cyberblade_vid.c
@@ -1,9 +1,7 @@
/*
- Driver for CyberBlade/i1 - Version 0.1.1
+ Driver for CyberBlade/i1 - Version 0.1.3
Copyright (C) 2002 by Alastair M. Robinson.
- Official homepage: http://www.blackfiveservices.co.uk/EPIAVidix.shtml
-
Based on Permedia 3 driver by Måns Rullgård
Thanks to Gilles Frattini for bugfixes
@@ -55,9 +53,14 @@ unsigned char *cyberblade_mem;
int cyberblade_crtc;
char save_colourkey[6];
-/* Helper functions for reading registers.
- Implementing these as macros leads to problems
- which are either cache or timing related... */
+#ifdef DEBUG_LOGFILE
+FILE *logfile=0;
+#define LOGWRITE(x) {if(logfile) fprintf(logfile,x);}
+#else
+#define LOGWRITE(x)
+#endif
+
+/* Helper functions for reading registers. */
static int CRINW(int reg)
{
@@ -69,6 +72,7 @@ static int CRINW(int reg)
static void CROUTW(int reg,int val)
{
+ val&=0xffff;
CROUTB(reg,val&255);
CROUTB(reg+1,(val>>8)&255);
}
@@ -83,10 +87,33 @@ static int SRINW(int reg)
static void SROUTW(int reg,int val)
{
+ val&=0xffff;
SROUTB(reg,val&255);
SROUTB(reg+1,(val>>8)&255);
}
+void DumpRegisters()
+{
+#ifdef DEBUG_LOGFILE
+ int reg,val;
+ if(logfile)
+ {
+ LOGWRITE("CRTC Register Dump:\n")
+ for(reg=0;reg<256;++reg)
+ {
+ val=CRINB(reg);
+ fprintf(logfile,"CR0x%2x: 0x%2x\n",reg,val);
+ }
+ LOGWRITE("SR Register Dump:\n")
+ for(reg=0;reg<256;++reg)
+ {
+ val=SRINB(reg);
+ fprintf(logfile,"SR0x%2x: 0x%2x\n",reg,val);
+ }
+ }
+#endif
+}
+
/* --- */
static vidix_capability_t cyberblade_cap =
@@ -172,15 +199,21 @@ 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);
- if(INB(0x3cc)&1)
- cyberblade_crtc=0x3d0;
- else
- cyberblade_crtc=0x3b0;
+ enable_app_io();
+ OUTPORT8(0x3d4,0x39);
+ OUTPORT8(0x3d5,INPORT(0x3d5)|1); /* Make sure MMIO is enabled... */
- printf(CYBERBLADE_MSG" Using IOBase: 0x%lx, FBBase: 0x%lx, CRTC at 0x%x\n",
- (long unsigned) cyberblade_reg_base,(long unsigned) cyberblade_mem,
- (unsigned) cyberblade_crtc);
+#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);
@@ -188,12 +221,19 @@ int VIDIX_NAME(vixInit)(const char *args)
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");
+
return 0;
}
void VIDIX_NAME(vixDestroy)(void)
{
int protect;
+ LOGWRITE("Cleanup:\n");
protect=SRINB(0x11);
SROUTB(0x11, 0x92);
CROUTB(0x8E, 0xc4); /* Disable overlay */
@@ -204,9 +244,13 @@ 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);
- disable_app_io();
}
@@ -223,6 +267,7 @@ 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;
@@ -263,33 +308,42 @@ int VIDIX_NAME(vixSetGrKeys)(const vidix_grkey_t *grkey)
{
int pixfmt=CRINB(0x38);
int protect;
- memcpy(&cyberblade_grkey, grkey, sizeof(vidix_grkey_t));
+ 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);
}
@@ -332,13 +386,15 @@ 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;
}
@@ -385,6 +441,15 @@ 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;
@@ -396,6 +461,10 @@ 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)
@@ -415,46 +484,18 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info)
frames[i] = base0+info->offsets[i];
}
- enable_app_io();
- OUTPORT8(0x3d4,0x39);
- OUTPORT8(0x3d5,INPORT(0x3d5)|1);
-
- SRINB(0x0b); /* Select new mode */
-
+ LOGWRITE("ConfigPlayback:\n");
+ LOGWRITE("\tKey mode:\n");
/* Unprotect hardware registers... */
protect=SRINB(0x11);
SROUTB(0x11, 0x92);
- SROUTB(0x57, 0xc0); /* Playback key function */
+ SROUTB(0x57, 0xcc); /* Playback key function */
SROUTB(0x21, 0x34); /* Signature control */
- SROUTB(0x37, 0x30); /* Video key mode */
+ SROUTB(0x37, 0x30); /* Video key mode - was 0x30 */
+
+ vixSetGrKeys(&cyberblade_grkey);
- {
- int pixfmt=CRINB(0x38);
- if(pixfmt&0x28) /* 32 or 24 bpp */
- {
- 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" 24/32-bit mode detected\n");
- }
- else
- {
- int tmp=((cyberblade_grkey.ckey.blue & 0xf8)>>3)
- |((cyberblade_grkey.ckey.green & 0xfc)<<3)
- |((cyberblade_grkey.ckey.red & 0xf8)<<8);
- SROUTB(0x50, tmp&0xff); /* Colour Key */
- SROUTB(0x51, (tmp>>8)&0xff); /* Colour Key */
- SROUTB(0x52, 0x00); /* Colour Key */
- SROUTB(0x54, 0xff); /* Colour Key Mask */
- SROUTB(0x55, 0xff); /* Colour Key Mask */
- SROUTB(0x56, 0x00); /* Colour Key Mask */
- printf(CYBERBLADE_MSG" 16-bit assumed\n");
- }
- }
/* compute_scale_factor(&src_w, &drw_w, &shrink, &zoom); */
{
int HTotal,VTotal,HSync,VSync,Overflow;
@@ -462,6 +503,7 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info)
if(CRINB(0xd1)&0x80)
{
+ LOGWRITE("\tTV-CRTC:\n");
printf(CYBERBLADE_MSG" Using TV-CRTC\n");
HTotal=CRINB(0xe0);
HSync=CRINB(0xe4);
@@ -478,6 +520,7 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info)
}
else
{
+ LOGWRITE("\tStandard CRTC:\n");
printf(CYBERBLADE_MSG" Using Standard CRTC\n");
HTotal=CRINB(0x00);
HSync=CRINB(0x04);
@@ -500,6 +543,7 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info)
tx2=tx1+info->dest.w;
ty2=ty1+info->dest.h;
+ LOGWRITE("\tWindow:\n");
CROUTW(0x86,tx1);
CROUTW(0x88,ty1);
CROUTW(0x8a,tx2);
@@ -521,11 +565,15 @@ 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;
@@ -537,7 +585,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, 0x05); /* Capture control */
+ CROUTB(0xBE, 0x04); /* Was: 0x05 Capture control */
if(src_w > 384)
layout|=4; /* 2x line buffers */
@@ -560,6 +608,7 @@ int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info)
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 */
@@ -575,24 +624,40 @@ 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);
+
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);
+
CROUTB(0x8E, 0xc4); /* VDE Flags*/
+ SROUTB(0x11, protect);
+ LOGWRITE("Done\n");
return 0;
}
@@ -600,6 +665,7 @@ int VIDIX_NAME(vixPlaybackOff)(void)
int VIDIX_NAME(vixPlaybackFrameSelect)(unsigned int frame)
{
int protect;
+ LOGWRITE("Frame Select:\n");
protect=SRINB(0x11);
SROUTB(0x11, 0x92);
/* Set overlay address to that of selected frame */
@@ -613,6 +679,7 @@ 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;
}