comparison vidix/drivers/cyberblade_vid.c @ 8513:679abb24a76e

more safer version by the author
author alex
date Sat, 21 Dec 2002 21:01:19 +0000
parents d794e866cf5f
children e40760677a83
comparison
equal deleted inserted replaced
8512:9c784bd027ad 8513:679abb24a76e
1 /* 1 /*
2 Driver for CyberBlade/i1 - Version 0.1.1 2 Driver for CyberBlade/i1 - Version 0.1.1
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
6
5 Based on Permedia 3 driver by Måns Rullgård 7 Based on Permedia 3 driver by Måns Rullgård
6 8
7 Thanks to Gilles Frattini for bugfixes 9 Thanks to Gilles Frattini for bugfixes
8
9 Official homepage: http://www.blackfiveservices.co.uk/EPIAVidix.shtml
10 10
11 This program is free software; you can redistribute it and/or modify 11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by 12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2 of the License, or 13 the Free Software Foundation; either version 2 of the License, or
14 (at your option) any later version. 14 (at your option) any later version.
198 SROUTB(0x55,save_colourkey[4]); 198 SROUTB(0x55,save_colourkey[4]);
199 SROUTB(0x56,save_colourkey[5]); 199 SROUTB(0x56,save_colourkey[5]);
200 SROUTB(0x11, protect); 200 SROUTB(0x11, protect);
201 unmap_phys_mem(cyberblade_reg_base, 0x20000); 201 unmap_phys_mem(cyberblade_reg_base, 0x20000);
202 unmap_phys_mem(cyberblade_mem, 0x800000); 202 unmap_phys_mem(cyberblade_mem, 0x800000);
203 disable_app_io();
203 } 204 }
204 205
205 206
206 int vixGetCapability(vidix_capability_t *to) 207 int vixGetCapability(vidix_capability_t *to)
207 { 208 {
253 } 254 }
254 255
255 int vixSetGrKeys(const vidix_grkey_t *grkey) 256 int vixSetGrKeys(const vidix_grkey_t *grkey)
256 { 257 {
257 int pixfmt=CRINB(0x38); 258 int pixfmt=CRINB(0x38);
259 int protect;
258 memcpy(&cyberblade_grkey, grkey, sizeof(vidix_grkey_t)); 260 memcpy(&cyberblade_grkey, grkey, sizeof(vidix_grkey_t));
261
262 protect=SRINB(0x11);
263 SROUTB(0x11, 0x92);
259 264
260 if(pixfmt&0x28) /* 32 or 24 bpp */ 265 if(pixfmt&0x28) /* 32 or 24 bpp */
261 { 266 {
262 SROUTB(0x50, cyberblade_grkey.ckey.blue); /* Colour Key */ 267 SROUTB(0x50, cyberblade_grkey.ckey.blue); /* Colour Key */
263 SROUTB(0x51, cyberblade_grkey.ckey.green); /* Colour Key */ 268 SROUTB(0x51, cyberblade_grkey.ckey.green); /* Colour Key */
276 SROUTB(0x52, 0); /* Colour Key */ 281 SROUTB(0x52, 0); /* Colour Key */
277 SROUTB(0x54, 0xff); /* Colour Key Mask */ 282 SROUTB(0x54, 0xff); /* Colour Key Mask */
278 SROUTB(0x55, 0xff); /* Colour Key Mask */ 283 SROUTB(0x55, 0xff); /* Colour Key Mask */
279 SROUTB(0x56, 0x00); /* Colour Key Mask */ 284 SROUTB(0x56, 0x00); /* Colour Key Mask */
280 } 285 }
286 SROUTB(0x11,protect);
281 return(0); 287 return(0);
282 } 288 }
283 289
284 290
285 vidix_video_eq_t equal = 291 vidix_video_eq_t equal =
383 info->frame_size = y_pitch*src_h + 2*uv_pitch*(src_h/4); 389 info->frame_size = y_pitch*src_h + 2*uv_pitch*(src_h/4);
384 layout=0x51; /* planar, 16:1:1 */ 390 layout=0x51; /* planar, 16:1:1 */
385 break; 391 break;
386 } 392 }
387 393
388 /* Assume we have 4 MB to play with */ 394 /* Assume we have 2 MB to play with */
389 info->num_frames = 0x400000 / info->frame_size; 395 info->num_frames = 0x200000 / info->frame_size;
390 if(info->num_frames > VID_PLAY_MAXFRAMES) 396 if(info->num_frames > VID_PLAY_MAXFRAMES)
391 info->num_frames = VID_PLAY_MAXFRAMES; 397 info->num_frames = VID_PLAY_MAXFRAMES;
392 398
393 /* Start at 4 MB. Let's hope it's not in use. */ 399 /* Start at 6 MB. Let's hope it's not in use. */
394 base0 = 0x400000; 400 base0 = 0x600000;
395 info->dga_addr = cyberblade_mem + base0; 401 info->dga_addr = cyberblade_mem + base0;
396 402
397 info->dest.pitch.y = 16; 403 info->dest.pitch.y = 16;
398 info->dest.pitch.u = 16; 404 info->dest.pitch.u = 16;
399 info->dest.pitch.v = 16; 405 info->dest.pitch.v = 16;
401 for(i = 0; i < info->num_frames; i++) 407 for(i = 0; i < info->num_frames; i++)
402 { 408 {
403 info->offsets[i] = info->frame_size * i; 409 info->offsets[i] = info->frame_size * i;
404 frames[i] = base0+info->offsets[i]; 410 frames[i] = base0+info->offsets[i];
405 } 411 }
412
413 enable_app_io();
414 OUTPORT8(0x3d4,0x39);
415 OUTPORT8(0x3d5,INPORT(0x3d5)|1);
416
417 SRINB(0x0b); /* Select new mode */
406 418
407 /* Unprotect hardware registers... */ 419 /* Unprotect hardware registers... */
408 protect=SRINB(0x11); 420 protect=SRINB(0x11);
409 SROUTB(0x11, 0x92); 421 SROUTB(0x11, 0x92);
410 422
420 SROUTB(0x51, cyberblade_grkey.ckey.green); /* Colour Key */ 432 SROUTB(0x51, cyberblade_grkey.ckey.green); /* Colour Key */
421 SROUTB(0x52, cyberblade_grkey.ckey.red); /* Colour Key */ 433 SROUTB(0x52, cyberblade_grkey.ckey.red); /* Colour Key */
422 SROUTB(0x54, 0xff); /* Colour Key Mask */ 434 SROUTB(0x54, 0xff); /* Colour Key Mask */
423 SROUTB(0x55, 0xff); /* Colour Key Mask */ 435 SROUTB(0x55, 0xff); /* Colour Key Mask */
424 SROUTB(0x56, 0xff); /* Colour Key Mask */ 436 SROUTB(0x56, 0xff); /* Colour Key Mask */
437 printf("[cyberblade] 24/32-bit mode detected\n");
425 } 438 }
426 else 439 else
427 { 440 {
428 int tmp=((cyberblade_grkey.ckey.blue & 0xf8)>>3) 441 int tmp=((cyberblade_grkey.ckey.blue & 0xf8)>>3)
429 |((cyberblade_grkey.ckey.green & 0xfc)<<3) 442 |((cyberblade_grkey.ckey.green & 0xfc)<<3)
432 SROUTB(0x51, (tmp>>8)&0xff); /* Colour Key */ 445 SROUTB(0x51, (tmp>>8)&0xff); /* Colour Key */
433 SROUTB(0x52, 0x00); /* Colour Key */ 446 SROUTB(0x52, 0x00); /* Colour Key */
434 SROUTB(0x54, 0xff); /* Colour Key Mask */ 447 SROUTB(0x54, 0xff); /* Colour Key Mask */
435 SROUTB(0x55, 0xff); /* Colour Key Mask */ 448 SROUTB(0x55, 0xff); /* Colour Key Mask */
436 SROUTB(0x56, 0x00); /* Colour Key Mask */ 449 SROUTB(0x56, 0x00); /* Colour Key Mask */
450 printf("[cyberblade] 16-bit assumed\n");
437 } 451 }
438 } 452 }
439 /* compute_scale_factor(&src_w, &drw_w, &shrink, &zoom); */ 453 /* compute_scale_factor(&src_w, &drw_w, &shrink, &zoom); */
440 { 454 {
441 int HTotal,VTotal,HSync,VSync,Overflow; 455 int HTotal,VTotal,HSync,VSync,Overflow;
442 int tx1,ty1,tx2,ty2; 456 int tx1,ty1,tx2,ty2;
443 457
444 if(CRINB(0xd1)&0x80) 458 if(CRINB(0xd1)&0x80)
445 { 459 {
446 fprintf(stderr,"[cyberblade] Using TV-CRTC\n"); 460 printf("[cyberblade] Using TV-CRTC\n");
447 HTotal=CRINB(0xe0); 461 HTotal=CRINB(0xe0);
448 HSync=CRINB(0xe4); 462 HSync=CRINB(0xe4);
449 VTotal=CRINB(0xe6); 463 VTotal=CRINB(0xe6);
450 VSync=CRINB(0xf0); 464 VSync=CRINB(0xf0);
451 Overflow=CRINB(0xe7); 465 Overflow=CRINB(0xe7);
457 VSync |= (Overflow & 4) <<6; 471 VSync |= (Overflow & 4) <<6;
458 VSync |= (Overflow & 0x80) <<2; 472 VSync |= (Overflow & 0x80) <<2;
459 } 473 }
460 else 474 else
461 { 475 {
462 fprintf(stderr,"[cyberblade] Using Standard CRTC\n"); 476 printf("[cyberblade] Using Standard CRTC\n");
463 HTotal=CRINB(0x00); 477 HTotal=CRINB(0x00);
464 HSync=CRINB(0x04); 478 HSync=CRINB(0x04);
465 VTotal=CRINB(0x06); 479 VTotal=CRINB(0x06);
466 VSync=CRINB(0x10); 480 VSync=CRINB(0x10);
467 Overflow=CRINB(0x07); 481 Overflow=CRINB(0x07);
468 HTotal <<=3; 482 HTotal <<=3;
469 HSync <<=3; 483 HSync <<=3;
470 VTotal |= (Overflow & 1) <<8; 484 VTotal |= (Overflow & 1) <<8;
471 VTotal |= (Overflow & 0x20) <<4; 485 VTotal |= (Overflow & 0x20) <<4;
486 VTotal +=4;
472 VSync |= (Overflow & 4) <<6; 487 VSync |= (Overflow & 4) <<6;
473 VSync |= (Overflow & 0x80) <<2; 488 VSync |= (Overflow & 0x80) <<2;
474 } 489 }
475 490
491 printf("[cyberblade] HTotal: 0x%x, HSStart: 0x%x\n",HTotal,HSync);
492 printf(" VTotal: 0x%x, VStart: 0x%x\n",VTotal,VSync);
476 tx1=(HTotal-HSync)+15+info->dest.x; 493 tx1=(HTotal-HSync)+15+info->dest.x;
477 ty1=(VTotal-VSync)-8+info->dest.y; 494 ty1=(VTotal-VSync)-8+info->dest.y;
478 tx2=tx1+info->dest.w; 495 tx2=tx1+info->dest.w;
479 ty2=ty1+info->dest.h; 496 ty2=ty1+info->dest.h;
480 497