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 */