Mercurial > mplayer.hg
comparison vidix/drivers/cyberblade_vid.c @ 9023:e40760677a83
Updated to v0.1.4 by Alastair Robinson <blackfive@fakenhamweb.co.uk>
author | alex |
---|---|
date | Sun, 19 Jan 2003 16:10:38 +0000 |
parents | 679abb24a76e |
children | f6d2772efca3 |
comparison
equal
deleted
inserted
replaced
9022:b345f92422b4 | 9023:e40760677a83 |
---|---|
1 /* | 1 /* |
2 Driver for CyberBlade/i1 - Version 0.1.1 | 2 Driver for CyberBlade/i1 - Version 0.1.4 |
3 | 3 |
4 Copyright (C) 2002 by Alastair M. Robinson. | 4 Copyright (C) 2002 by Alastair M. Robinson. |
5 Official homepage: http://www.blackfiveservices.co.uk/EPIAVidix.shtml | 5 Official homepage: http://www.blackfiveservices.co.uk/EPIAVidix.shtml |
6 | 6 |
7 Based on Permedia 3 driver by Måns Rullgård | 7 Based on Permedia 3 driver by Måns Rullgård |
19 GNU General Public License for more details. | 19 GNU General Public License for more details. |
20 | 20 |
21 You should have received a copy of the GNU General Public License | 21 You should have received a copy of the GNU General Public License |
22 along with this program; if not, write to the Free Software | 22 along with this program; if not, write to the Free Software |
23 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 23 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
24 | |
25 Changes: | |
26 18/01/03 | |
27 MMIO is no longer used, sidestepping cache issues on EPIA-800 | |
28 TV-Out modes are now better supported - this should be the end | |
29 of the magenta stripes :) | |
30 Brightness/Contrast controls disabled for the time being - they were | |
31 seriously degrading picture quality, especially with TV-Out. | |
24 | 32 |
25 To Do: | 33 To Do: |
26 Implement Hue/Saturation controls | 34 Implement Hue/Saturation controls |
27 Support / Test multiple frames | 35 Support / Test multiple frames |
28 Test colour-key code more extensively | 36 Test colour-key code more extensively |
44 | 52 |
45 #include "cyberblade_regs.h" | 53 #include "cyberblade_regs.h" |
46 | 54 |
47 pciinfo_t pci_info; | 55 pciinfo_t pci_info; |
48 | 56 |
49 unsigned char *cyberblade_reg_base; | |
50 unsigned char *cyberblade_mem; | |
51 int cyberblade_crtc; | |
52 char save_colourkey[6]; | 57 char save_colourkey[6]; |
53 | 58 char *cyberblade_mem; |
54 /* Helper functions for reading registers. | 59 |
55 Implementing these as macros leads to problems | 60 #ifdef DEBUG_LOGFILE |
56 which are either cache or timing related... */ | 61 FILE *logfile=0; |
62 #define LOGWRITE(x) {if(logfile) fprintf(logfile,x);} | |
63 #else | |
64 #define LOGWRITE(x) | |
65 #endif | |
66 | |
67 /* Helper functions for reading registers. */ | |
57 | 68 |
58 static int CRINW(int reg) | 69 static int CRINW(int reg) |
59 { | 70 { |
60 int result; | 71 int result; |
61 result=CRINB(reg); | 72 result=CRINB(reg); |
81 { | 92 { |
82 SROUTB(reg,val&255); | 93 SROUTB(reg,val&255); |
83 SROUTB(reg+1,(val>>8)&255); | 94 SROUTB(reg+1,(val>>8)&255); |
84 } | 95 } |
85 | 96 |
97 void DumpRegisters() | |
98 { | |
99 int reg,val; | |
100 #ifdef DEBUG_LOGFILE | |
101 if(logfile) | |
102 { | |
103 LOGWRITE("CRTC Register Dump:\n") | |
104 for(reg=0;reg<256;++reg) | |
105 { | |
106 val=CRINB(reg); | |
107 fprintf(logfile,"CR0x%2x: 0x%2x\n",reg,val); | |
108 } | |
109 LOGWRITE("SR Register Dump:\n") | |
110 for(reg=0;reg<256;++reg) | |
111 { | |
112 val=SRINB(reg); | |
113 fprintf(logfile,"SR0x%2x: 0x%2x\n",reg,val); | |
114 } | |
115 } | |
116 #endif | |
117 } | |
86 /* --- */ | 118 /* --- */ |
87 | 119 |
88 static vidix_capability_t cyberblade_cap = | 120 static vidix_capability_t cyberblade_cap = |
89 { | 121 { |
90 "Trident CyberBlade i1 driver", | 122 "Trident CyberBlade i1 driver", |
164 } | 196 } |
165 | 197 |
166 | 198 |
167 int vixInit(void) | 199 int vixInit(void) |
168 { | 200 { |
169 cyberblade_reg_base = map_phys_mem(pci_info.base1, 0x20000); | 201 cyberblade_mem = map_phys_mem(pci_info.base0, 0x800000); |
170 cyberblade_mem = map_phys_mem(pci_info.base0, 0x800000); | 202 enable_app_io(); |
171 if(INB(0x3cc)&1) | |
172 cyberblade_crtc=0x3d0; | |
173 else | |
174 cyberblade_crtc=0x3b0; | |
175 | |
176 printf("[cyberblade] Using IOBase: 0x%lx, FBBase: 0x%lx, CRTC at 0x%x\n",cyberblade_reg_base,cyberblade_mem,cyberblade_crtc); | |
177 | |
178 save_colourkey[0]=SRINB(0x50); | 203 save_colourkey[0]=SRINB(0x50); |
179 save_colourkey[1]=SRINB(0x51); | 204 save_colourkey[1]=SRINB(0x51); |
180 save_colourkey[2]=SRINB(0x52); | 205 save_colourkey[2]=SRINB(0x52); |
181 save_colourkey[3]=SRINB(0x54); | 206 save_colourkey[3]=SRINB(0x54); |
182 save_colourkey[4]=SRINB(0x55); | 207 save_colourkey[4]=SRINB(0x55); |
183 save_colourkey[5]=SRINB(0x56); | 208 save_colourkey[5]=SRINB(0x56); |
184 | 209 #ifdef DEBUG_LOGFILE |
210 logfile=fopen("/tmp/cyberblade_vidix.log","w"); | |
211 #endif | |
185 return 0; | 212 return 0; |
186 } | 213 } |
187 | 214 |
188 void vixDestroy(void) | 215 void vixDestroy(void) |
189 { | 216 { |
190 int protect; | 217 int protect; |
218 #ifdef DEBUG_LOGFILE | |
219 if(logfile) | |
220 fclose(logfile); | |
221 #endif | |
191 protect=SRINB(0x11); | 222 protect=SRINB(0x11); |
192 SROUTB(0x11, 0x92); | 223 SROUTB(0x11, 0x92); |
193 CROUTB(0x8E, 0xc4); /* Disable overlay */ | 224 CROUTB(0x8E, 0xc4); /* Disable overlay */ |
194 SROUTB(0x50,save_colourkey[0]); | 225 SROUTB(0x50,save_colourkey[0]); |
195 SROUTB(0x51,save_colourkey[1]); | 226 SROUTB(0x51,save_colourkey[1]); |
196 SROUTB(0x52,save_colourkey[2]); | 227 SROUTB(0x52,save_colourkey[2]); |
197 SROUTB(0x54,save_colourkey[3]); | 228 SROUTB(0x54,save_colourkey[3]); |
198 SROUTB(0x55,save_colourkey[4]); | 229 SROUTB(0x55,save_colourkey[4]); |
199 SROUTB(0x56,save_colourkey[5]); | 230 SROUTB(0x56,save_colourkey[5]); |
200 SROUTB(0x11, protect); | 231 SROUTB(0x11, protect); |
201 unmap_phys_mem(cyberblade_reg_base, 0x20000); | |
202 unmap_phys_mem(cyberblade_mem, 0x800000); | |
203 disable_app_io(); | 232 disable_app_io(); |
233 unmap_phys_mem(cyberblade_mem, 0x800000); | |
204 } | 234 } |
205 | 235 |
206 | 236 |
207 int vixGetCapability(vidix_capability_t *to) | 237 int vixGetCapability(vidix_capability_t *to) |
208 { | 238 { |
408 { | 438 { |
409 info->offsets[i] = info->frame_size * i; | 439 info->offsets[i] = info->frame_size * i; |
410 frames[i] = base0+info->offsets[i]; | 440 frames[i] = base0+info->offsets[i]; |
411 } | 441 } |
412 | 442 |
413 enable_app_io(); | |
414 OUTPORT8(0x3d4,0x39); | 443 OUTPORT8(0x3d4,0x39); |
415 OUTPORT8(0x3d5,INPORT(0x3d5)|1); | 444 OUTPORT8(0x3d5,INPORT(0x3d5)|1); |
416 | 445 |
417 SRINB(0x0b); /* Select new mode */ | 446 SRINB(0x0b); /* Select new mode */ |
418 | 447 |
422 | 451 |
423 SROUTB(0x57, 0xc0); /* Playback key function */ | 452 SROUTB(0x57, 0xc0); /* Playback key function */ |
424 SROUTB(0x21, 0x34); /* Signature control */ | 453 SROUTB(0x21, 0x34); /* Signature control */ |
425 SROUTB(0x37, 0x30); /* Video key mode */ | 454 SROUTB(0x37, 0x30); /* Video key mode */ |
426 | 455 |
427 { | 456 vixSetGrKeys(&cyberblade_grkey); |
428 int pixfmt=CRINB(0x38); | 457 |
429 if(pixfmt&0x28) /* 32 or 24 bpp */ | 458 /* compute_scale_factor(&src_w, &drw_w, &shrink, &zoom); */ |
459 { | |
460 int HTotal,VTotal,HSync,VSync,Overflow,HDisp,VDisp; | |
461 int HWinStart,VWinStart; | |
462 int tx1,ty1,tx2,ty2; | |
463 | |
464 HTotal=CRINB(0x00); | |
465 HSync=CRINB(0x04); | |
466 VTotal=CRINB(0x06); | |
467 VSync=CRINB(0x10); | |
468 Overflow=CRINB(0x07); | |
469 HTotal <<=3; | |
470 HSync <<=3; | |
471 VTotal |= (Overflow & 1) <<8; | |
472 VTotal |= (Overflow & 0x20) <<4; | |
473 VTotal +=4; | |
474 VSync |= (Overflow & 4) <<6; | |
475 VSync |= (Overflow & 0x80) <<2; | |
476 | |
477 if(CRINB(0xd1)&0x80) | |
430 { | 478 { |
431 SROUTB(0x50, cyberblade_grkey.ckey.blue); /* Colour Key */ | 479 int hcorr,vcorr; |
432 SROUTB(0x51, cyberblade_grkey.ckey.green); /* Colour Key */ | 480 int TVHTotal,TVVTotal,TVHSyncStart,TVVSyncStart,TVOverflow; |
433 SROUTB(0x52, cyberblade_grkey.ckey.red); /* Colour Key */ | 481 LOGWRITE("[cyberblade] Using TV-CRTC\n"); |
434 SROUTB(0x54, 0xff); /* Colour Key Mask */ | 482 |
435 SROUTB(0x55, 0xff); /* Colour Key Mask */ | 483 HDisp=(1+CRINB(0x01))*8; |
436 SROUTB(0x56, 0xff); /* Colour Key Mask */ | 484 VDisp=1+CRINB(0x12); |
437 printf("[cyberblade] 24/32-bit mode detected\n"); | 485 Overflow=CRINB(0x07); |
486 VDisp |= (Overflow & 2) <<7; | |
487 VDisp |= (Overflow & 0x40) << 3; | |
488 | |
489 TVHTotal=CRINB(0xe0)*8; | |
490 TVVTotal=CRINB(0xe6); | |
491 TVOverflow=CRINB(0xe7); | |
492 if(TVOverflow&0x20) TVVTotal|=512; | |
493 if(TVOverflow&0x01) TVVTotal|=256; | |
494 TVHTotal+=40; TVVTotal+=2; | |
495 | |
496 TVHSyncStart=CRINB(0xe4)*8; | |
497 TVVSyncStart=CRINB(0xf0); | |
498 if(TVOverflow&0x80) TVVSyncStart|=512; | |
499 if(TVOverflow&0x04) TVVSyncStart|=256; | |
500 | |
501 HWinStart=(TVHTotal-HDisp)&15; | |
502 HWinStart|=(HTotal-HDisp)&15; | |
503 HWinStart+=(TVHTotal-TVHSyncStart)-49; | |
504 | |
505 VWinStart=(TVVTotal-VDisp)/2-1; | |
506 VWinStart-=(1-((TVVTotal-VDisp)&1))+4; | |
438 } | 507 } |
439 else | 508 else |
440 { | 509 { |
441 int tmp=((cyberblade_grkey.ckey.blue & 0xf8)>>3) | 510 LOGWRITE("[cyberblade] Using Standard CRTC\n"); |
442 |((cyberblade_grkey.ckey.green & 0xfc)<<3) | 511 HWinStart=(HTotal-HSync)+15; |
443 |((cyberblade_grkey.ckey.red & 0xf8)<<8); | 512 VWinStart=(VTotal-VSync)-8; |
444 SROUTB(0x50, tmp&0xff); /* Colour Key */ | |
445 SROUTB(0x51, (tmp>>8)&0xff); /* Colour Key */ | |
446 SROUTB(0x52, 0x00); /* Colour Key */ | |
447 SROUTB(0x54, 0xff); /* Colour Key Mask */ | |
448 SROUTB(0x55, 0xff); /* Colour Key Mask */ | |
449 SROUTB(0x56, 0x00); /* Colour Key Mask */ | |
450 printf("[cyberblade] 16-bit assumed\n"); | |
451 } | |
452 } | |
453 /* compute_scale_factor(&src_w, &drw_w, &shrink, &zoom); */ | |
454 { | |
455 int HTotal,VTotal,HSync,VSync,Overflow; | |
456 int tx1,ty1,tx2,ty2; | |
457 | |
458 if(CRINB(0xd1)&0x80) | |
459 { | |
460 printf("[cyberblade] Using TV-CRTC\n"); | |
461 HTotal=CRINB(0xe0); | |
462 HSync=CRINB(0xe4); | |
463 VTotal=CRINB(0xe6); | |
464 VSync=CRINB(0xf0); | |
465 Overflow=CRINB(0xe7); | |
466 HTotal <<=3; HTotal-=16; | |
467 HSync <<=3; | |
468 VTotal |= (Overflow & 1) <<8; | |
469 VTotal |= (Overflow & 0x20) <<4; | |
470 VTotal +=5; | |
471 VSync |= (Overflow & 4) <<6; | |
472 VSync |= (Overflow & 0x80) <<2; | |
473 } | |
474 else | |
475 { | |
476 printf("[cyberblade] Using Standard CRTC\n"); | |
477 HTotal=CRINB(0x00); | |
478 HSync=CRINB(0x04); | |
479 VTotal=CRINB(0x06); | |
480 VSync=CRINB(0x10); | |
481 Overflow=CRINB(0x07); | |
482 HTotal <<=3; | |
483 HSync <<=3; | |
484 VTotal |= (Overflow & 1) <<8; | |
485 VTotal |= (Overflow & 0x20) <<4; | |
486 VTotal +=4; | |
487 VSync |= (Overflow & 4) <<6; | |
488 VSync |= (Overflow & 0x80) <<2; | |
489 } | 513 } |
490 | 514 |
491 printf("[cyberblade] HTotal: 0x%x, HSStart: 0x%x\n",HTotal,HSync); | 515 printf("[cyberblade] HTotal: 0x%x, HSStart: 0x%x\n",HTotal,HSync); |
492 printf(" VTotal: 0x%x, VStart: 0x%x\n",VTotal,VSync); | 516 printf(" VTotal: 0x%x, VStart: 0x%x\n",VTotal,VSync); |
493 tx1=(HTotal-HSync)+15+info->dest.x; | 517 tx1=HWinStart+info->dest.x; |
494 ty1=(VTotal-VSync)-8+info->dest.y; | 518 ty1=VWinStart+info->dest.y; |
495 tx2=tx1+info->dest.w; | 519 tx2=tx1+info->dest.w; |
496 ty2=ty1+info->dest.h; | 520 ty2=ty1+info->dest.h; |
497 | 521 |
498 CROUTW(0x86,tx1); | 522 CROUTW(0x86,tx1); |
499 CROUTW(0x88,ty1); | 523 CROUTW(0x88,ty1); |
530 CROUTB(0x97, 0x00); /* VDE Flags */ | 554 CROUTB(0x97, 0x00); /* VDE Flags */ |
531 CROUTB(0xBA, 0x00); /* Chroma key */ | 555 CROUTB(0xBA, 0x00); /* Chroma key */ |
532 CROUTB(0xBB, 0x00); /* Chroma key */ | 556 CROUTB(0xBB, 0x00); /* Chroma key */ |
533 CROUTB(0xBC, 0xFF); /* Chroma key */ | 557 CROUTB(0xBC, 0xFF); /* Chroma key */ |
534 CROUTB(0xBD, 0xFF); /* Chroma key */ | 558 CROUTB(0xBD, 0xFF); /* Chroma key */ |
535 CROUTB(0xBE, 0x05); /* Capture control */ | 559 CROUTB(0xBE, 0x04); /* Capture control */ |
536 | 560 |
537 if(src_w > 384) | 561 if(src_w > 384) |
538 layout|=4; /* 2x line buffers */ | 562 layout|=4; /* 2x line buffers */ |
539 SROUTB(0x97, layout); | 563 SROUTB(0x97, layout); |
540 | 564 |
549 SROUTB(0xBE, 0x0); /* HSCB disabled */ | 573 SROUTB(0xBE, 0x0); /* HSCB disabled */ |
550 break; | 574 break; |
551 default: | 575 default: |
552 CROUTB(0x8F, 0x20); /* VDE Flags - Edge Recovery */ | 576 CROUTB(0x8F, 0x20); /* VDE Flags - Edge Recovery */ |
553 CROUTB(0xBF, 0x00); /* Video format - YUV */ | 577 CROUTB(0xBF, 0x00); /* Video format - YUV */ |
554 SROUTB(0xBE, 0x03); /* HSCB enabled */ | 578 SROUTB(0xBE, 0x00); /* HSCB disable - was 0x03*/ |
555 break; | 579 break; |
556 } | 580 } |
557 | 581 |
558 CROUTB(0x92, ((base0+info->offset.y) >> 3) &0xff); /* Lower 8 bits of start address */ | 582 CROUTB(0x92, ((base0+info->offset.y) >> 3) &0xff); /* Lower 8 bits of start address */ |
559 CROUTB(0x93, ((base0+info->offset.y) >> 11) &0xff); /* Mid 8 bits of start address */ | 583 CROUTB(0x93, ((base0+info->offset.y) >> 11) &0xff); /* Mid 8 bits of start address */ |
574 } | 598 } |
575 | 599 |
576 | 600 |
577 int vixPlaybackOn(void) | 601 int vixPlaybackOn(void) |
578 { | 602 { |
579 /* Enable overlay */ | 603 LOGWRITE("Enable overlay\n"); |
580 CROUTB(0x8E, 0xd4); /* VDE Flags*/ | 604 CROUTB(0x8E, 0xd4); /* VDE Flags*/ |
581 | 605 |
582 return 0; | 606 return 0; |
583 } | 607 } |
584 | 608 |
585 | 609 |
586 int vixPlaybackOff(void) | 610 int vixPlaybackOff(void) |
587 { | 611 { |
588 /* Disable overlay */ | 612 LOGWRITE("Disable overlay\n"); |
589 CROUTB(0x8E, 0xc4); /* VDE Flags*/ | 613 CROUTB(0x8E, 0xc4); /* VDE Flags*/ |
590 | 614 |
591 return 0; | 615 return 0; |
592 } | 616 } |
593 | 617 |
594 | 618 |
595 int vixPlaybackFrameSelect(unsigned int frame) | 619 int vixPlaybackFrameSelect(unsigned int frame) |
596 { | 620 { |
597 int protect; | 621 int protect; |
622 LOGWRITE("Frame select\n"); | |
598 protect=SRINB(0x11); | 623 protect=SRINB(0x11); |
599 SROUTB(0x11, 0x92); | 624 SROUTB(0x11, 0x92); |
600 /* Set overlay address to that of selected frame */ | 625 /* Set overlay address to that of selected frame */ |
601 CROUTB(0x92, ((frames[frame]+YOffs) >> 3) &0xff); /* Lower 8 bits of start address */ | 626 CROUTB(0x92, ((frames[frame]+YOffs) >> 3) &0xff); /* Lower 8 bits of start address */ |
602 CROUTB(0x93, ((frames[frame]+YOffs) >> 11) &0xff); /* Mid 8 bits of start address */ | 627 CROUTB(0x93, ((frames[frame]+YOffs) >> 11) &0xff); /* Mid 8 bits of start address */ |