|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1990-1992 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: jzvxl484.c ! 8: ! 9: Abstract: ! 10: ! 11: This module contains the code that implements the Jazz kernel ! 12: video driver for the VXL graphics accelerator board. ! 13: ! 14: Environment: ! 15: ! 16: Kernel mode ! 17: ! 18: Revision History: ! 19: ! 20: --*/ ! 21: ! 22: #include "dderror.h" ! 23: #include "devioctl.h" ! 24: #include "miniport.h" ! 25: ! 26: #include "ntddvdeo.h" ! 27: #include "video.h" ! 28: ! 29: #include "jaginit.h" ! 30: #include "jzvxldat.h" ! 31: ! 32: #include "jazzvdeo.h" ! 33: #include "jzvxl484.h" ! 34: ! 35: #define VXL_NAME L"VXL" ! 36: #define VXL_NAME_LENGTH 8 ! 37: ! 38: // ! 39: // Define macros to access video memory, jaguar base registers, jaguar fifo registers, ! 40: // the Bt484, ICS1494 clock chip and Board ROM. ! 41: // ! 42: ! 43: #define VXL_JAGUAR_BASE ((PJAGUAR_REGISTERS)((ULONG)hwDeviceExtension->VideoAddress + VXL_JAGUAR_BASE_OFFSET)) ! 44: #define VXL_FIFO_BASE ((PJAGUAR_FIFO)((ULONG)hwDeviceExtension->FrameAddress + VXL_FIFO_BASE_OFFSET)) ! 45: #define VXL_BT484_BASE ((PBT484_REGISTERS)((ULONG)hwDeviceExtension->VideoAddress + VXL_BT484_BASE_OFFSET)) ! 46: #define VXL_CLOCK_BASE ((PVXL_BYTE_REGISTER)((ULONG)hwDeviceExtension->VideoAddress + VXL_CLOCK_BASE_OFFSET)) ! 47: ! 48: ! 49: // ! 50: // Define device extension structure. ! 51: // ! 52: ! 53: typedef struct _HW_DEVICE_EXTENSION { ! 54: PHYSICAL_ADDRESS PhysicalFrameAddress; ! 55: PHYSICAL_ADDRESS PhysicalFifoAddress; ! 56: ULONG PhysicalFifoLength; ! 57: PHYSICAL_ADDRESS PhysicalControlAddress; ! 58: union { ! 59: VIDEO_CLUTDATA RgbData; ! 60: ULONG RgbLong; ! 61: } ColorMap[NUMBER_OF_COLORS]; ! 62: PVOID VideoAddress; ! 63: PVOID FrameAddress; ! 64: ULONG FrameLength; ! 65: ULONG PhysicalControlLength; ! 66: USHORT FirstEntry; ! 67: USHORT LastEntry; ! 68: USHORT CursorControlOn; ! 69: USHORT CursorControlOff; ! 70: USHORT CursorWidth; ! 71: USHORT CursorHeight; ! 72: SHORT CursorColumn; ! 73: SHORT CursorRow; ! 74: USHORT CursorPixels[VXL_CURSOR_NUMBER_OF_BYTES]; ! 75: USHORT CursorXOrigin; ! 76: USHORT CursorYOrigin; ! 77: USHORT HorizontalResolution; ! 78: USHORT HorizontalDisplayTime; ! 79: USHORT HorizontalBackPorch; ! 80: USHORT HorizontalFrontPorch; ! 81: USHORT HorizontalSync; ! 82: USHORT HorizontalScreenSize; ! 83: USHORT VerticalResolution; ! 84: USHORT VerticalBackPorch; ! 85: USHORT VerticalFrontPorch; ! 86: USHORT VerticalSync; ! 87: USHORT VerticalScreenSize; ! 88: UCHAR CursorEnable; ! 89: UCHAR UpdateColorMap; ! 90: UCHAR UpdateCursorPosition; ! 91: UCHAR UpdateCursorPixels; ! 92: UCHAR UpdateController; ! 93: ULONG ModeNumber; ! 94: ULONG NumAvailableModes; ! 95: ULONG BoardType; ! 96: PVOID QueueAddress; ! 97: PVOID QueueSystemAddress; ! 98: ULONG QueueSize; ! 99: ULONG QueueNumberOfEntries; ! 100: HANDLE QueueFrameSection; ! 101: ULONG QueueReadPointer; ! 102: } HW_DEVICE_EXTENSION, *PHW_DEVICE_EXTENSION; ! 103: ! 104: ! 105: ! 106: // ! 107: // Function Prototypes ! 108: // ! 109: ! 110: VP_STATUS ! 111: VxlFindAdapter( ! 112: PVOID HwDeviceExtension, ! 113: PVOID HwContext, ! 114: PWSTR ArgumentString, ! 115: PVIDEO_PORT_CONFIG_INFO ConfigInfo, ! 116: PUCHAR Again ! 117: ); ! 118: ! 119: BOOLEAN ! 120: VxlInitialize( ! 121: PVOID HwDeviceExtension ! 122: ); ! 123: ! 124: BOOLEAN ! 125: VxlInterruptService ( ! 126: PVOID HwDeviceExtension ! 127: ); ! 128: ! 129: BOOLEAN ! 130: VxlStartIO( ! 131: PVOID HwDeviceExtension, ! 132: PVIDEO_REQUEST_PACKET RequestPacket ! 133: ); ! 134: ! 135: // ! 136: // Define device driver procedure prototypes. ! 137: // ! 138: ! 139: VP_STATUS ! 140: VxlGetDeviceDataCallback( ! 141: PVOID HwDeviceExtension, ! 142: PVOID Context, ! 143: VIDEO_DEVICE_DATA_TYPE DeviceDataType, ! 144: PVOID Identifier, ! 145: ULONG IdentifierLength, ! 146: PVOID ConfigurationData, ! 147: ULONG ConfigurationDataLength, ! 148: PVOID ComponentInformation, ! 149: ULONG ComponentInformationLength ! 150: ); ! 151: ! 152: VOID ! 153: VxlSetMode( ! 154: PHW_DEVICE_EXTENSION hwDeviceExtension ! 155: ); ! 156: ! 157: ! 158: ULONG ! 159: DriverEntry ( ! 160: PVOID Context1, ! 161: PVOID Context2 ! 162: ) ! 163: ! 164: /*++ ! 165: ! 166: Routine Description: ! 167: ! 168: Installable driver initialization entry point. ! 169: This entry point is called directly by the I/O system. ! 170: ! 171: Arguments: ! 172: ! 173: Context1 - First context value passed by the operating system. This is ! 174: the value with which the miniport driver calls VideoPortInitialize(). ! 175: ! 176: Context2 - Second context value passed by the operating system. This is ! 177: the value with which the miniport driver calls VideoPortInitialize(). ! 178: ! 179: Return Value: ! 180: ! 181: Status from VideoPortInitialize() ! 182: ! 183: --*/ ! 184: ! 185: { ! 186: ! 187: VIDEO_HW_INITIALIZATION_DATA hwInitData; ! 188: ! 189: // ! 190: // Zero out structure. ! 191: // ! 192: ! 193: VideoPortZeroMemory(&hwInitData, sizeof(VIDEO_HW_INITIALIZATION_DATA)); ! 194: ! 195: // ! 196: // Specify sizes of structure and extension. ! 197: // ! 198: ! 199: hwInitData.HwInitDataSize = sizeof(VIDEO_HW_INITIALIZATION_DATA); ! 200: ! 201: // ! 202: // Set entry points. ! 203: // ! 204: ! 205: hwInitData.HwFindAdapter = VxlFindAdapter; ! 206: hwInitData.HwInitialize = VxlInitialize; ! 207: hwInitData.HwInterrupt = VxlInterruptService; ! 208: hwInitData.HwStartIO = VxlStartIO; ! 209: ! 210: // ! 211: // Determine the size we require for the device extension. ! 212: // ! 213: ! 214: hwInitData.HwDeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION); ! 215: ! 216: // ! 217: // Always start with parameters for device0 in this case. ! 218: // ! 219: ! 220: // hwInitData.StartingDeviceNumber = 0; ! 221: ! 222: // ! 223: // This device only supports the internal bus type. So return the status ! 224: // value directly to the operating system. ! 225: // ! 226: ! 227: hwInitData.AdapterInterfaceType = Internal; ! 228: ! 229: return VideoPortInitialize(Context1, ! 230: Context2, ! 231: &hwInitData, ! 232: NULL); ! 233: ! 234: } // end DriverEntry() ! 235: ! 236: VP_STATUS ! 237: VxlFindAdapter( ! 238: PVOID HwDeviceExtension, ! 239: PVOID HwContext, ! 240: PWSTR ArgumentString, ! 241: PVIDEO_PORT_CONFIG_INFO ConfigInfo, ! 242: PUCHAR Again ! 243: ) ! 244: ! 245: /*++ ! 246: ! 247: Routine Description: ! 248: ! 249: This routine is called to determine if the adapter for this driver ! 250: is present in the system. ! 251: If it is present, the function fills out some information describing ! 252: the adapter. ! 253: ! 254: Arguments: ! 255: ! 256: HwDeviceExtension - Supplies the miniport driver's adapter storage. This ! 257: storage is initialized to zero before this call. ! 258: ! 259: HwContext - Supplies the context value which was passed to ! 260: VideoPortInitialize(). ! 261: ! 262: ArgumentString - Suuplies a NULL terminated ASCII string. This string ! 263: originates from the user. ! 264: ! 265: ConfigInfo - Returns the configuration information structure which is ! 266: filled by the miniport driver. This structure is initialized with ! 267: any knwon configuration information (such as SystemIoBusNumber) by ! 268: the port driver. Where possible, drivers should have one set of ! 269: defaults which do not require any supplied configuration information. ! 270: ! 271: Again - Indicates if the miniport driver wants the port driver to call ! 272: its VIDEO_HW_FIND_ADAPTER function again with a new device extension ! 273: and the same config info. This is used by the miniport drivers which ! 274: can search for several adapters on a bus. ! 275: ! 276: Return Value: ! 277: ! 278: This routine must return: ! 279: ! 280: NO_ERROR - Indicates a host adapter was found and the ! 281: configuration information was successfully determined. ! 282: ! 283: ERROR_INVALID_PARAMETER - Indicates an adapter was found but there was an ! 284: error obtaining the configuration information. If possible an error ! 285: should be logged. ! 286: ! 287: ERROR_DEV_NOT_EXIST - Indicates no host adapter was found for the ! 288: supplied configuration information. ! 289: ! 290: --*/ ! 291: ! 292: { ! 293: ! 294: PHW_DEVICE_EXTENSION hwDeviceExtension = HwDeviceExtension; ! 295: ! 296: // ! 297: // Make sure the size of the structure is at least as large as what we ! 298: // are expecting (check version of the config info structure). ! 299: // ! 300: ! 301: ! 302: ! 303: if (ConfigInfo->Length < sizeof(VIDEO_PORT_CONFIG_INFO)) { ! 304: ! 305: return ERROR_INVALID_PARAMETER; ! 306: ! 307: } ! 308: ! 309: if (VideoPortGetDeviceData(hwDeviceExtension, ! 310: VpControllerData, ! 311: &VxlGetDeviceDataCallback, ! 312: ConfigInfo)) { ! 313: ! 314: VideoDebugPrint((2, "Vxl: VideoPort get controller info failed\n")); ! 315: ! 316: return ERROR_INVALID_PARAMETER; ! 317: ! 318: } ! 319: ! 320: if (VideoPortGetDeviceData(hwDeviceExtension, ! 321: VpMonitorData, ! 322: &VxlGetDeviceDataCallback, ! 323: NULL)) { ! 324: ! 325: VideoDebugPrint((2, "Vxl: VideoPort get monitor info failed\n")); ! 326: ! 327: return ERROR_INVALID_PARAMETER; ! 328: ! 329: } ! 330: ! 331: // ! 332: // Clear out the Emulator entries and the state size since this driver ! 333: // does not support them. ! 334: // ! 335: ! 336: ConfigInfo->NumEmulatorAccessEntries = 0; ! 337: ConfigInfo->EmulatorAccessEntries = NULL; ! 338: ConfigInfo->EmulatorAccessEntriesContext = 0; ! 339: ! 340: ConfigInfo->VdmPhysicalVideoMemoryAddress.LowPart = 0x00000000; ! 341: ConfigInfo->VdmPhysicalVideoMemoryAddress.HighPart = 0x00000000; ! 342: ConfigInfo->VdmPhysicalVideoMemoryLength = 0x00000000; ! 343: ! 344: ConfigInfo->HardwareStateSize = 0; ! 345: ! 346: // ! 347: // Initialize the color map update information. ! 348: // ! 349: ! 350: hwDeviceExtension->FirstEntry = 0; ! 351: hwDeviceExtension->LastEntry = 0; ! 352: hwDeviceExtension->UpdateController = FALSE; ! 353: ! 354: // ! 355: // Set cursor enable FALSE. ! 356: // ! 357: ! 358: hwDeviceExtension->CursorEnable = FALSE; ! 359: ! 360: // ! 361: // Indicate we do not wish to be called over ! 362: // ! 363: ! 364: *Again = 0; ! 365: ! 366: // ! 367: // Indicate a successful completion status. ! 368: // ! 369: ! 370: return NO_ERROR; ! 371: ! 372: } // end VxlFindAdapter() ! 373: ! 374: VP_STATUS ! 375: VxlGetDeviceDataCallback( ! 376: PVOID HwDeviceExtension, ! 377: PVOID Context, ! 378: VIDEO_DEVICE_DATA_TYPE DeviceDataType, ! 379: PVOID Identifier, ! 380: ULONG IdentifierLength, ! 381: PVOID ConfigurationData, ! 382: ULONG ConfigurationDataLength, ! 383: PVOID ComponentInformation, ! 384: ULONG ComponentInformationLength ! 385: ) ! 386: ! 387: /*++ ! 388: ! 389: Routine Description: ! 390: ! 391: Callback routine for the VideoPortGetDeviceData function. ! 392: ! 393: Arguments: ! 394: ! 395: HwDeviceExtension - Pointer to the miniport drivers device extension. ! 396: ! 397: Context - Context value passed to the VideoPortGetDeviceData function. ! 398: ! 399: DeviceDataType - The type of data that was requested in ! 400: VideoPortGetDeviceData. ! 401: ! 402: Identifier - Pointer to a string that contains the name of the device, ! 403: as setup by the ROM or ntdetect. ! 404: ! 405: IdentifierLength - Length of the Identifier string. ! 406: ! 407: ConfigurationData - Pointer to the configuration data for the device or ! 408: BUS. ! 409: ! 410: ConfigurationDataLength - Length of the data in the configurationData ! 411: field. ! 412: ! 413: ComponentInformation - Undefined. ! 414: ! 415: ComponentInformationLength - Undefined. ! 416: ! 417: Return Value: ! 418: ! 419: Returns NO_ERROR if the function completed properly. ! 420: Returns ERROR_DEV_NOT_EXIST if we did not find the device. ! 421: Returns ERROR_INVALID_PARAMETER otherwise. ! 422: ! 423: --*/ ! 424: ! 425: { ! 426: PHW_DEVICE_EXTENSION hwDeviceExtension = HwDeviceExtension; ! 427: PVIDEO_PORT_CONFIG_INFO ConfigInfo = Context; ! 428: PWCHAR identifier = Identifier; ! 429: PJAZZ_Vxl_CONFIGURATION_DATA VxlConfigData = ConfigurationData; ! 430: PMONITOR_CONFIG_DATA monitorConfigData = ConfigurationData; ! 431: VIDEO_ACCESS_RANGE accessRanges[2]; ! 432: VP_STATUS status; ! 433: ULONG NameLength; ! 434: ! 435: ! 436: switch (DeviceDataType) { ! 437: ! 438: case VpControllerData: ! 439: ! 440: // ! 441: // BUGBUG because we had a RESOURCE LIST header at the top. ! 442: // + 8 should be the offset of the paertial resource descriptor ! 443: // in a full resource descriptor. ! 444: // ! 445: ! 446: VxlConfigData = (PJAZZ_Vxl_CONFIGURATION_DATA)(((PUCHAR)VxlConfigData) + 8); ! 447: ! 448: // ! 449: // Compare the name to what is should be. If it is wrong, then return ! 450: // an error and initialization will fail. ! 451: // What is the right way of doing this?? ! 452: // ! 453: ! 454: ! 455: if ( VXL_NAME_LENGTH != VideoPortCompareMemory(identifier, ! 456: VXL_NAME, ! 457: VXL_NAME_LENGTH)) { ! 458: ! 459: return ERROR_DEV_NOT_EXIST; ! 460: } ! 461: ! 462: // ! 463: // Fill up the device extension and the configuration information ! 464: // with the appropriate data. ! 465: // ! 466: ! 467: ! 468: ConfigInfo->BusInterruptLevel = VxlConfigData->Irql; ! 469: ConfigInfo->BusInterruptVector = VxlConfigData->Vector; ! 470: ! 471: // ! 472: // Map in 4MB access ranges for VXL control and 4MB + 1 Page for ! 473: // Video Memory. ! 474: // ! 475: ! 476: accessRanges[0].RangeStart.HighPart = 0; ! 477: accessRanges[0].RangeStart.LowPart = 0x60000000; ! 478: accessRanges[0].RangeLength = 0x00400000; ! 479: accessRanges[0].RangeInIoSpace = 0; ! 480: accessRanges[0].RangeVisible = 0; ! 481: accessRanges[0].RangeShareable = 0; ! 482: ! 483: accessRanges[1].RangeStart.HighPart = 0; ! 484: accessRanges[1].RangeStart.LowPart = 0x40000000; ! 485: accessRanges[1].RangeLength = 0x00401000; ! 486: accessRanges[1].RangeInIoSpace = 0; ! 487: accessRanges[1].RangeVisible = 0; ! 488: accessRanges[1].RangeShareable = 0; ! 489: ! 490: // ! 491: // Check to see if there is a hardware resource conflict. ! 492: // ! 493: ! 494: status = VideoPortVerifyAccessRanges(HwDeviceExtension, ! 495: 2, ! 496: accessRanges); ! 497: ! 498: if (status != NO_ERROR) { ! 499: ! 500: return status; ! 501: ! 502: } ! 503: ! 504: // ! 505: // Save in device extension ! 506: // ! 507: ! 508: hwDeviceExtension->PhysicalFrameAddress.HighPart = 0; ! 509: hwDeviceExtension->PhysicalFrameAddress.LowPart = 0x40000000; ! 510: hwDeviceExtension->FrameLength = 0x00400000; ! 511: ! 512: hwDeviceExtension->PhysicalFifoAddress.HighPart = 0; ! 513: hwDeviceExtension->PhysicalFifoAddress.LowPart = 0x40400000; ! 514: hwDeviceExtension->PhysicalFifoLength = 0x1000; ! 515: ! 516: hwDeviceExtension->PhysicalControlAddress.HighPart = 0; ! 517: hwDeviceExtension->PhysicalControlAddress.LowPart = 0x60300000; ! 518: hwDeviceExtension->PhysicalControlLength = 0x1000; ! 519: ! 520: // ! 521: // Map the video controller into the system virtual address space. ! 522: // ! 523: ! 524: if ( (hwDeviceExtension->VideoAddress = ! 525: VideoPortGetDeviceBase(hwDeviceExtension, ! 526: accessRanges[0].RangeStart, // Control ! 527: accessRanges[0].RangeLength, ! 528: FALSE)) == NULL) { ! 529: ! 530: return ERROR_INVALID_PARAMETER; ! 531: ! 532: } ! 533: ! 534: // ! 535: // Map the video memory into the system virtual address space so we ! 536: // can clear it out. ! 537: // ! 538: ! 539: if ( (hwDeviceExtension->FrameAddress = ! 540: VideoPortGetDeviceBase(hwDeviceExtension, ! 541: accessRanges[1].RangeStart, // Frame ! 542: accessRanges[1].RangeLength, ! 543: FALSE)) == NULL) { ! 544: ! 545: return ERROR_INVALID_PARAMETER; ! 546: ! 547: } ! 548: ! 549: return NO_ERROR; ! 550: ! 551: break; ! 552: ! 553: ! 554: case VpMonitorData: ! 555: ! 556: VideoDebugPrint((2, "Vxl: getting monitor information\n")); ! 557: ! 558: // ! 559: // BUGBUG because we had a RESOURCE LIST header at the top. ! 560: // + 8 should be the offset of the paertial resource descriptor ! 561: // in a full resource descriptor. ! 562: // ! 563: ! 564: monitorConfigData = (PMONITOR_CONFIG_DATA)(((PUCHAR)monitorConfigData) + 8); ! 565: ! 566: // ! 567: // Initialize the monitor parameters. ! 568: // ! 569: ! 570: hwDeviceExtension->HorizontalResolution = ! 571: monitorConfigData->HorizontalResolution; ! 572: ! 573: hwDeviceExtension->HorizontalDisplayTime = ! 574: monitorConfigData->HorizontalDisplayTime; ! 575: ! 576: hwDeviceExtension->HorizontalBackPorch = ! 577: monitorConfigData->HorizontalBackPorch; ! 578: ! 579: hwDeviceExtension->HorizontalFrontPorch = ! 580: monitorConfigData->HorizontalFrontPorch; ! 581: ! 582: hwDeviceExtension->HorizontalSync = ! 583: monitorConfigData->HorizontalSync; ! 584: ! 585: hwDeviceExtension->HorizontalScreenSize = ! 586: monitorConfigData->HorizontalScreenSize; ! 587: ! 588: hwDeviceExtension->VerticalResolution = ! 589: monitorConfigData->VerticalResolution; ! 590: ! 591: hwDeviceExtension->VerticalBackPorch = ! 592: monitorConfigData->VerticalBackPorch; ! 593: ! 594: hwDeviceExtension->VerticalFrontPorch = ! 595: monitorConfigData->VerticalFrontPorch; ! 596: ! 597: hwDeviceExtension->VerticalSync = ! 598: monitorConfigData->VerticalSync; ! 599: ! 600: hwDeviceExtension->VerticalScreenSize = ! 601: monitorConfigData->VerticalScreenSize; ! 602: ! 603: ! 604: return NO_ERROR; ! 605: ! 606: break; ! 607: ! 608: default: ! 609: ! 610: return ERROR_INVALID_PARAMETER; ! 611: ! 612: } ! 613: ! 614: } //end VxlGetDeviceDataCallback() ! 615: ! 616: BOOLEAN ! 617: VxlInitialize( ! 618: PVOID HwDeviceExtension ! 619: ) ! 620: ! 621: /*++ ! 622: ! 623: Routine Description: ! 624: ! 625: This routine does one time initialization of the device. ! 626: ! 627: Arguments: ! 628: ! 629: HwDeviceExtension - Supplies a pointer to the miniport's device extension. ! 630: ! 631: Return Value: ! 632: ! 633: Always returns TRUE since this routine can never fail. ! 634: ! 635: --*/ ! 636: ! 637: { ! 638: ! 639: PULONG buffer; ! 640: ULONG index,i; ! 641: ULONG limit; ! 642: PHW_DEVICE_EXTENSION hwDeviceExtension = HwDeviceExtension; ! 643: UCHAR DataChar; ! 644: PBT484_REGISTERS Bt484 = VXL_BT484_BASE; ! 645: ! 646: // ! 647: // Determine if this is a Bt484 or Bt485 board. To do this write a 1 to ! 648: // command register bit 07 then write 01 to the address register 0. This ! 649: // will enable read/writes to command register 3 on a Bt485 but not on a ! 650: // Bt484. Clear Command register 3 then read it back. On a Bt485 the ! 651: // return value will be 0x00, on a Bt484 it will be 0x40. ! 652: // ! 653: ! 654: // ! 655: // Get the value in command register 0, then set bit 07 ! 656: // ! 657: ! 658: DataChar = VideoPortReadRegisterUchar(&Bt484->Command0.Byte); ! 659: DataChar |= 0x80; ! 660: VideoPortWriteRegisterUchar(&Bt484->Command0.Byte,DataChar); ! 661: ! 662: // ! 663: // Write 0x01 to the address register ! 664: // ! 665: ! 666: VideoPortWriteRegisterUchar(&Bt484->PaletteCursorWrAddress.Byte,0x01); ! 667: ! 668: // ! 669: // Clear command register 3 ! 670: // ! 671: ! 672: VideoPortWriteRegisterUchar(&Bt484->Status.Byte,0x00); ! 673: ! 674: // ! 675: // Read Command Register 3 back and compare ! 676: // ! 677: ! 678: DataChar = VideoPortReadRegisterUchar(&Bt484->Status.Byte); ! 679: ! 680: if (DataChar == 0x00) { ! 681: ! 682: // ! 683: // This is a Bt485 ! 684: // ! 685: ! 686: hwDeviceExtension->BoardType = BOARD_TYPE_BT485; ! 687: ! 688: } else { ! 689: ! 690: // ! 691: // This is a Bt484 ! 692: // ! 693: ! 694: hwDeviceExtension->BoardType = BOARD_TYPE_BT484; ! 695: ! 696: } ! 697: ! 698: // ! 699: // Calculated the number of valid modes ! 700: // ! 701: ! 702: hwDeviceExtension->NumAvailableModes = 0; ! 703: ! 704: for (i = 0; i < JAG_MAX_MODE; i++) { ! 705: ! 706: if (JagModes[i].SupportedBoard & hwDeviceExtension->BoardType) { ! 707: ! 708: hwDeviceExtension->NumAvailableModes++; ! 709: ! 710: } ! 711: } ! 712: ! 713: // ! 714: // Initialize the color map copy in the device extension. ! 715: // ! 716: ! 717: for (index = 0; index < NUMBER_OF_COLORS; index++) { ! 718: ! 719: hwDeviceExtension->ColorMap[index].RgbData.Red = ! 720: ((index & 0x7) << 2) | ((index & 0x7) << 5); ! 721: hwDeviceExtension->ColorMap[index].RgbData.Green = ! 722: ((index & 0x38) >> 1) | ((index & 0x38) << 2); ! 723: hwDeviceExtension->ColorMap[index].RgbData.Blue = ! 724: ((index & 0xc0) >> 6) | ((index & 0xc0) >> 4) | ! 725: ((index & 0xc0) >> 2) | (index & 0xc0); ! 726: } ! 727: ! 728: // ! 729: // Set colors for map entries 0 and 1 which are used by text output ! 730: // and the hardware cursor. ! 731: // ! 732: ! 733: hwDeviceExtension->ColorMap[0].RgbData.Red = 255; ! 734: hwDeviceExtension->ColorMap[0].RgbData.Green = 255; ! 735: hwDeviceExtension->ColorMap[0].RgbData.Blue = 255; ! 736: hwDeviceExtension->ColorMap[1].RgbData.Red = 0; ! 737: hwDeviceExtension->ColorMap[1].RgbData.Green = 0; ! 738: hwDeviceExtension->ColorMap[1].RgbData.Blue = 0x90; ! 739: ! 740: // ! 741: // Set color map update parameters and enable update on next vertical ! 742: // retrace interrupt. ! 743: // ! 744: ! 745: hwDeviceExtension->FirstEntry = 0; ! 746: hwDeviceExtension->LastEntry = NUMBER_OF_COLORS - 1; ! 747: hwDeviceExtension->UpdateColorMap = TRUE; ! 748: ! 749: // ! 750: // Set the hardware cursor width, height, column, and row values. ! 751: // ! 752: ! 753: hwDeviceExtension->CursorWidth = VXL_CURSOR_WIDTH; ! 754: hwDeviceExtension->CursorHeight = VXL_CURSOR_HEIGHT; ! 755: hwDeviceExtension->CursorColumn = 0; ! 756: hwDeviceExtension->CursorRow = 0; ! 757: ! 758: // ! 759: // Set the cursor offsets ! 760: // ! 761: ! 762: ! 763: hwDeviceExtension->CursorXOrigin = 32; ! 764: hwDeviceExtension->CursorYOrigin = 32; ! 765: ! 766: // ! 767: // Set the device extension copy of the hardware cursor ram memory. ! 768: // ! 769: ! 770: for (index = 0; index < VXL_CURSOR_NUMBER_OF_BYTES ; index++) { ! 771: hwDeviceExtension->CursorPixels[index] = 0x00ff; ! 772: } ! 773: ! 774: // ! 775: // Leave the cursor disabled until it is explicitly enabled ! 776: // attributes. This is the default values in the device extension. ! 777: // ! 778: // hwDeviceExtension->CursorEnable = FALSE; ! 779: // hwDeviceExtension->UpdateCursorPixels = FALSE; ! 780: // hwDeviceExtension->UpdateCursorPosition = FALSE; ! 781: // ! 782: ! 783: // ! 784: // Enable the vertical retrace interrupt to set up color map. ! 785: // ! 786: ! 787: VideoPortEnableInterrupt(hwDeviceExtension); ! 788: VideoPortWriteRegisterUchar(&VXL_JAGUAR_BASE->InterruptEnable.Byte, ! 789: VXL_INTERRUPT_VERTICAL_RETRACE); ! 790: ! 791: ! 792: return TRUE; ! 793: ! 794: } // end VxlInitialize() ! 795: ! 796: BOOLEAN ! 797: VxlStartIO( ! 798: PVOID HwDeviceExtension, ! 799: PVIDEO_REQUEST_PACKET RequestPacket ! 800: ) ! 801: ! 802: /*++ ! 803: ! 804: Routine Description: ! 805: ! 806: This routine is the main execution routine for the miniport driver. It ! 807: accepts0s a Video Request Packet, performs the request, and then returns ! 808: with the appropriate status. ! 809: ! 810: Arguments: ! 811: ! 812: HwDeviceExtension - Supplies a pointer to the miniport's device extension. ! 813: ! 814: RequestPacket - Pointer to the video request packet. This structure ! 815: contains all the parameters passed to the VideoIoControl function. ! 816: ! 817: Return Value: ! 818: ! 819: ! 820: --*/ ! 821: ! 822: { ! 823: VP_STATUS status; ! 824: PHW_DEVICE_EXTENSION hwDeviceExtension = HwDeviceExtension; ! 825: ULONG inIoSpace; ! 826: PULONG colorSource; ! 827: PVIDEO_MODE_INFORMATION modeInformation; ! 828: PVIDEO_POINTER_ATTRIBUTES pointerAttributes; ! 829: PVIDEO_MEMORY_INFORMATION memoryInformation; ! 830: PVIDEO_POINTER_CAPABILITIES VideoPointerCapabilities; ! 831: PVIDEO_POINTER_POSITION pointerPostion; ! 832: PVIDEO_CLUT clutBuffer; ! 833: ULONG index1; ! 834: ULONG index2; ! 835: ULONG CursorMaskSize; ! 836: PUCHAR pixelDestination; ! 837: ULONG pixelIndex; ! 838: ULONG pixelShift; ! 839: PUCHAR pixelSource; ! 840: UCHAR pixelValue; ! 841: UCHAR turnOnInterrupts = FALSE; ! 842: ULONG i; ! 843: ! 844: // ! 845: // Switch on the IoContolCode in the RequestPacket. It indicates which ! 846: // function must be performed by the driver. ! 847: // ! 848: ! 849: switch (RequestPacket->IoControlCode) { ! 850: ! 851: ! 852: case IOCTL_VIDEO_MAP_VIDEO_MEMORY: ! 853: ! 854: VideoDebugPrint((2, "VxlStartIO - MapVideoMemory\n")); ! 855: ! 856: if ( (RequestPacket->OutputBufferLength < ! 857: (RequestPacket->StatusBlock->Information = ! 858: sizeof(VIDEO_MEMORY_INFORMATION))) || ! 859: (RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY)) ) { ! 860: ! 861: status = ERROR_INSUFFICIENT_BUFFER; ! 862: ! 863: } else { ! 864: ! 865: memoryInformation = RequestPacket->OutputBuffer; ! 866: ! 867: memoryInformation->VideoRamBase = ((PVIDEO_MEMORY) ! 868: (RequestPacket->InputBuffer))->RequestedVirtualAddress; ! 869: ! 870: memoryInformation->VideoRamLength = ! 871: hwDeviceExtension->FrameLength; ! 872: ! 873: inIoSpace = 0; ! 874: ! 875: status = VideoPortMapMemory(hwDeviceExtension, ! 876: hwDeviceExtension->PhysicalFrameAddress, ! 877: &(memoryInformation->VideoRamLength), ! 878: &inIoSpace, ! 879: &(memoryInformation->VideoRamBase)); ! 880: ! 881: // ! 882: // The frame buffer and virtual memory and equivalent in this ! 883: // case. ! 884: // ! 885: ! 886: memoryInformation->FrameBufferBase = ! 887: memoryInformation->VideoRamBase; ! 888: ! 889: memoryInformation->FrameBufferLength = ! 890: memoryInformation->VideoRamLength; ! 891: } ! 892: ! 893: break; ! 894: ! 895: ! 896: case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY: ! 897: ! 898: VideoDebugPrint((2, "VxlStartIO - UnMapVideoMemory\n")); ! 899: ! 900: if (RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY)) { ! 901: ! 902: status = ERROR_INSUFFICIENT_BUFFER; ! 903: } else { ! 904: ! 905: status = VideoPortUnmapMemory(hwDeviceExtension, ! 906: ((PVIDEO_MEMORY) ! 907: (RequestPacket->InputBuffer))-> ! 908: RequestedVirtualAddress, ! 909: 0); ! 910: } ! 911: ! 912: break; ! 913: ! 914: ! 915: case IOCTL_VIDEO_QUERY_AVAIL_MODES: ! 916: ! 917: VideoDebugPrint((2, "VxlStartIO - QueryAvailableModes\n")); ! 918: ! 919: if (RequestPacket->OutputBufferLength < ! 920: (RequestPacket->StatusBlock->Information = ! 921: hwDeviceExtension->NumAvailableModes * ! 922: sizeof(VIDEO_MODE_INFORMATION)) ) { ! 923: ! 924: status = ERROR_INSUFFICIENT_BUFFER; ! 925: ! 926: } else { ! 927: ! 928: modeInformation = RequestPacket->OutputBuffer; ! 929: ! 930: for (i = 0; i < JAG_MAX_MODE; i++) { ! 931: ! 932: if (JagModes[i].SupportedBoard & hwDeviceExtension->BoardType) { ! 933: ! 934: *modeInformation = JagModes[i].modeInformation; ! 935: modeInformation++; ! 936: ! 937: } ! 938: } ! 939: ! 940: status = NO_ERROR; ! 941: } ! 942: ! 943: break; ! 944: ! 945: ! 946: case IOCTL_VIDEO_QUERY_CURRENT_MODE: ! 947: ! 948: VideoDebugPrint((2, "VxlStartIO - Query(Available/Current)Modes\n")); ! 949: ! 950: if (RequestPacket->OutputBufferLength < ! 951: (RequestPacket->StatusBlock->Information = ! 952: sizeof(VIDEO_MODE_INFORMATION)) ) { ! 953: ! 954: status = ERROR_INSUFFICIENT_BUFFER; ! 955: ! 956: } else { ! 957: ! 958: *((PVIDEO_MODE_INFORMATION)RequestPacket->OutputBuffer) = ! 959: JagModes[hwDeviceExtension->ModeNumber].modeInformation; ! 960: ! 961: status = NO_ERROR; ! 962: ! 963: } ! 964: ! 965: break; ! 966: ! 967: ! 968: case IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES: ! 969: ! 970: ! 971: VideoDebugPrint((2, "VxlStartIO - QueryNumAvailableModes\n")); ! 972: ! 973: // ! 974: // Find out the size of the data to be put in the the buffer and ! 975: // return that in the status information (whether or not the ! 976: // information is there). If the buffer passed in is not large ! 977: // enough return an appropriate error code. ! 978: // ! 979: ! 980: if (RequestPacket->OutputBufferLength < ! 981: (RequestPacket->StatusBlock->Information = ! 982: sizeof(VIDEO_NUM_MODES)) ) { ! 983: ! 984: status = ERROR_INSUFFICIENT_BUFFER; ! 985: ! 986: } else { ! 987: ! 988: ((PVIDEO_NUM_MODES)RequestPacket->OutputBuffer)->NumModes = ! 989: hwDeviceExtension->NumAvailableModes; ! 990: ! 991: ((PVIDEO_NUM_MODES)RequestPacket->OutputBuffer)->ModeInformationLength = ! 992: sizeof(VIDEO_MODE_INFORMATION); ! 993: ! 994: status = NO_ERROR; ! 995: } ! 996: ! 997: break; ! 998: ! 999: ! 1000: case IOCTL_VIDEO_SET_CURRENT_MODE: ! 1001: ! 1002: ! 1003: VideoDebugPrint((2, "VxlStartIO - SetCurrentMode\n")); ! 1004: ! 1005: if (*(ULONG *)(RequestPacket->InputBuffer) >= JAG_MAX_MODE) { ! 1006: status = ERROR_INVALID_PARAMETER; ! 1007: break; ! 1008: } ! 1009: ! 1010: hwDeviceExtension->ModeNumber = *(ULONG *)(RequestPacket->InputBuffer); ! 1011: ! 1012: VxlSetMode(hwDeviceExtension); ! 1013: ! 1014: status = NO_ERROR; ! 1015: ! 1016: break; ! 1017: ! 1018: ! 1019: case IOCTL_VIDEO_SET_PALETTE_REGISTERS: ! 1020: ! 1021: ! 1022: VideoDebugPrint((2, "VxlStartIO - SetPaletteRegs\n")); ! 1023: ! 1024: status = NO_ERROR; ! 1025: ! 1026: break; ! 1027: ! 1028: ! 1029: case IOCTL_VIDEO_SET_COLOR_REGISTERS: ! 1030: ! 1031: ! 1032: ! 1033: VideoDebugPrint((2, "VxlStartIO - SetColorRegs\n")); ! 1034: ! 1035: clutBuffer = RequestPacket->InputBuffer; ! 1036: ! 1037: // ! 1038: // Check if the size of the data in the input buffer is large enough. ! 1039: // ! 1040: ! 1041: if ( (RequestPacket->InputBufferLength < sizeof(VIDEO_CLUT) - ! 1042: sizeof(ULONG)) || ! 1043: (RequestPacket->InputBufferLength < sizeof(VIDEO_CLUT) + ! 1044: (sizeof(ULONG) * (clutBuffer->NumEntries - 1)) ) ) { ! 1045: ! 1046: status = ERROR_INSUFFICIENT_BUFFER; ! 1047: break; ! 1048: ! 1049: } ! 1050: ! 1051: // ! 1052: // Check to see if the parameters are valid. ! 1053: // ! 1054: ! 1055: if ( (clutBuffer->NumEntries == 0) || ! 1056: (clutBuffer->FirstEntry > NUMBER_OF_COLORS) || ! 1057: (clutBuffer->FirstEntry + clutBuffer->NumEntries > ! 1058: NUMBER_OF_COLORS + 1) ) { ! 1059: ! 1060: status = ERROR_INVALID_PARAMETER; ! 1061: break; ! 1062: ! 1063: } ! 1064: ! 1065: index1 = clutBuffer->FirstEntry; ! 1066: hwDeviceExtension->FirstEntry = index1; ! 1067: hwDeviceExtension->LastEntry = index1 + clutBuffer->NumEntries; ! 1068: colorSource = (PULONG)&(clutBuffer->LookupTable[0]); ! 1069: ! 1070: while (index1 < hwDeviceExtension->LastEntry) { ! 1071: ! 1072: hwDeviceExtension->ColorMap[index1++].RgbLong = *colorSource++; ! 1073: ! 1074: } ! 1075: ! 1076: // ! 1077: // Enable the verticle retrace interrupt to perform the update. ! 1078: // ! 1079: ! 1080: hwDeviceExtension->UpdateColorMap = TRUE; ! 1081: turnOnInterrupts = TRUE; ! 1082: ! 1083: status = NO_ERROR; ! 1084: ! 1085: break; ! 1086: ! 1087: ! 1088: ! 1089: case IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES: ! 1090: ! 1091: // ! 1092: // return type of pointer supported: assyncronous monochrome ! 1093: // ! 1094: ! 1095: ! 1096: VideoPointerCapabilities = RequestPacket->OutputBuffer; ! 1097: ! 1098: if (RequestPacket->OutputBufferLength < ! 1099: (RequestPacket->StatusBlock->Information = ! 1100: sizeof(VIDEO_POINTER_CAPABILITIES)) ) { ! 1101: ! 1102: status = ERROR_INSUFFICIENT_BUFFER; ! 1103: ! 1104: } else { ! 1105: VideoPointerCapabilities->Flags = (VIDEO_MODE_ASYNC_POINTER | ! 1106: VIDEO_MODE_MONO_POINTER); ! 1107: VideoPointerCapabilities->MaxWidth = VXL_CURSOR_WIDTH; ! 1108: VideoPointerCapabilities->MaxHeight = VXL_CURSOR_HEIGHT; ! 1109: VideoPointerCapabilities->HWPtrBitmapStart = -1; ! 1110: VideoPointerCapabilities->HWPtrBitmapEnd = -1; ! 1111: ! 1112: status = NO_ERROR; ! 1113: } ! 1114: ! 1115: break; ! 1116: ! 1117: case IOCTL_VIDEO_ENABLE_POINTER: ! 1118: ! 1119: // ! 1120: // If the hardware cursor is currently disabled, then enable ! 1121: // it and update the cursor position and cursor ram memory. ! 1122: // ! 1123: // N.B. Explicit synchronization is required since the enable, ! 1124: // update cursor position, and update cursor pixels parameters ! 1125: // must all be atomically written. ! 1126: // ! 1127: // ! 1128: // Enable the verticle retrace interrupt to perform the update. ! 1129: // ! 1130: ! 1131: if (hwDeviceExtension->CursorEnable == FALSE) { ! 1132: ! 1133: hwDeviceExtension->CursorEnable = TRUE; ! 1134: hwDeviceExtension->UpdateCursorPixels = TRUE; ! 1135: hwDeviceExtension->UpdateCursorPosition = TRUE; ! 1136: turnOnInterrupts = TRUE; ! 1137: } ! 1138: ! 1139: status = NO_ERROR; ! 1140: ! 1141: break; ! 1142: ! 1143: ! 1144: case IOCTL_VIDEO_DISABLE_POINTER: ! 1145: ! 1146: VideoDebugPrint((2, "VxlStartIO - DisableCursor\n")); ! 1147: ! 1148: // If the hardware cursor is currently enabled, then disable ! 1149: // it and update the cursor position. ! 1150: // ! 1151: // N.B. Explicit synchronization is required since both the enable ! 1152: // and update cursor position parameters must be atomically ! 1153: // written. ! 1154: // ! 1155: ! 1156: // ! 1157: // Enable the verticle retrace interrupt to perform the update. ! 1158: // ! 1159: ! 1160: if (hwDeviceExtension->CursorEnable != FALSE) { ! 1161: ! 1162: hwDeviceExtension->CursorEnable = FALSE; ! 1163: hwDeviceExtension->UpdateCursorPosition = TRUE; ! 1164: turnOnInterrupts = TRUE; ! 1165: ! 1166: } ! 1167: ! 1168: status = NO_ERROR; ! 1169: ! 1170: break; ! 1171: ! 1172: ! 1173: case IOCTL_VIDEO_SET_POINTER_POSITION: ! 1174: ! 1175: VideoDebugPrint((2, "VxlStartIO - SetpointerPostion\n")); ! 1176: ! 1177: // ! 1178: // Check if the size of the data in the input buffer is large enough. ! 1179: // ! 1180: ! 1181: if (RequestPacket->InputBufferLength < sizeof(VIDEO_POINTER_POSITION)) { ! 1182: ! 1183: status = ERROR_INSUFFICIENT_BUFFER; ! 1184: ! 1185: } else { ! 1186: ! 1187: // ! 1188: // Capture the hardware cursor column and height values. ! 1189: // ! 1190: ! 1191: pointerPostion = RequestPacket->InputBuffer; ! 1192: ! 1193: hwDeviceExtension->CursorColumn = pointerPostion->Column; ! 1194: hwDeviceExtension->CursorRow = pointerPostion->Row; ! 1195: ! 1196: // ! 1197: // If the hardware cursor is not disabled, then update the ! 1198: // hardware cursor position. ! 1199: // ! 1200: // N.B. No explicit synchronization is required since only ! 1201: // the update cursor parameter needs to be written. ! 1202: // ! 1203: ! 1204: // ! 1205: // Enable the verticle retrace interrupt to perform the update. ! 1206: // ! 1207: ! 1208: hwDeviceExtension->UpdateCursorPosition = TRUE; ! 1209: turnOnInterrupts = TRUE; ! 1210: ! 1211: status = NO_ERROR; ! 1212: ! 1213: } ! 1214: ! 1215: break; ! 1216: ! 1217: ! 1218: case IOCTL_VIDEO_QUERY_POINTER_POSITION: ! 1219: ! 1220: ! 1221: // ! 1222: // Find out the size of the data to be put in the the buffer and ! 1223: // return that in the status information (whether or not the ! 1224: // information is there). If the buffer passed in is not large ! 1225: // enough return an appropriate error code. ! 1226: // ! 1227: ! 1228: if (RequestPacket->OutputBufferLength < ! 1229: (RequestPacket->StatusBlock->Information = ! 1230: sizeof(VIDEO_POINTER_POSITION)) ) { ! 1231: ! 1232: status = ERROR_INSUFFICIENT_BUFFER; ! 1233: ! 1234: } else { ! 1235: ! 1236: // ! 1237: // Return the current hardware cursor column and row values. ! 1238: // ! 1239: ! 1240: pointerPostion = RequestPacket->OutputBuffer; ! 1241: ! 1242: pointerPostion->Column = hwDeviceExtension->CursorColumn; ! 1243: pointerPostion->Row = hwDeviceExtension->CursorRow; ! 1244: ! 1245: status = NO_ERROR; ! 1246: } ! 1247: ! 1248: break; ! 1249: ! 1250: ! 1251: case IOCTL_VIDEO_SET_POINTER_ATTR: ! 1252: ! 1253: pointerAttributes = RequestPacket->InputBuffer; ! 1254: ! 1255: // ! 1256: // Check if the size of the data in the input buffer is large enough. ! 1257: // ! 1258: ! 1259: if ( (RequestPacket->InputBufferLength < ! 1260: (sizeof(VXL_POINTER_ATTRIBUTES)))) { ! 1261: ! 1262: status = ERROR_INSUFFICIENT_BUFFER; ! 1263: break; ! 1264: } ! 1265: ! 1266: // ! 1267: // Make sure the cursor size is correct: WidthInBytes = 4, ! 1268: // Height = 32 ! 1269: // ! 1270: ! 1271: if ((pointerAttributes->WidthInBytes != 4) || ! 1272: (pointerAttributes->Height != 32)) { ! 1273: ! 1274: // ! 1275: // We must return an error here but I'm not sure which code! ! 1276: // ! 1277: ! 1278: status = ERROR_INSUFFICIENT_BUFFER; ! 1279: break; ! 1280: ! 1281: } ! 1282: ! 1283: // ! 1284: // Capture the hardware cursor column, and row values. ! 1285: // ! 1286: ! 1287: hwDeviceExtension->CursorColumn = pointerAttributes->Column; ! 1288: hwDeviceExtension->CursorRow = pointerAttributes->Row; ! 1289: ! 1290: // ! 1291: // The cursor shape is passed as a AND MASK and an XOR MASK. These ! 1292: // MASKS are 1bpp, width = pointerAttributes->WidthInBytes, each ! 1293: // height = pointerAttributes->Height. First copy the XOR mask to ! 1294: // the hwDeviceExtension structure then the AND mask since this ! 1295: // is the order needed by the Bt484. ! 1296: // ! 1297: ! 1298: // ! 1299: // calculate the size in bytes of 1 mask ! 1300: // ! 1301: ! 1302: CursorMaskSize = pointerAttributes->WidthInBytes * pointerAttributes->Height; ! 1303: ! 1304: // ! 1305: // copy the xor mask to the first plane for the Bt484 ! 1306: // ! 1307: ! 1308: for (index1=0;index1<CursorMaskSize;index1++) { ! 1309: ! 1310: hwDeviceExtension->CursorPixels[index1] = ! 1311: pointerAttributes->Pixels[index1 + CursorMaskSize]; ! 1312: } ! 1313: ! 1314: ! 1315: // ! 1316: // copy the and mask to the second plane for the Bt484 ! 1317: // ! 1318: ! 1319: for (index1=0;index1<CursorMaskSize;index1++) { ! 1320: ! 1321: hwDeviceExtension->CursorPixels[index1 + CursorMaskSize] = ! 1322: pointerAttributes->Pixels[index1]; ! 1323: } ! 1324: ! 1325: ! 1326: // ! 1327: // Enable the vertical retrace interrupt to perform the update. ! 1328: // ! 1329: // N.B. Explicit synchronization is required since if the enable is ! 1330: // set, the update cursor position and update cursor pixels ! 1331: // parameters must all be atomically written. ! 1332: // ! 1333: ! 1334: if ( (hwDeviceExtension->CursorEnable = ! 1335: (UCHAR) pointerAttributes->Enable) == TRUE) { ! 1336: ! 1337: hwDeviceExtension->UpdateCursorPixels = TRUE; ! 1338: ! 1339: } ! 1340: ! 1341: hwDeviceExtension->UpdateCursorPosition = TRUE; ! 1342: turnOnInterrupts = TRUE; ! 1343: ! 1344: status = NO_ERROR; ! 1345: ! 1346: break; ! 1347: ! 1348: ! 1349: case IOCTL_VIDEO_QUERY_POINTER_ATTR: ! 1350: ! 1351: // ! 1352: // Find out the size of the data to be put in the the buffer and ! 1353: // return that in the status information (whether or not the ! 1354: // information is there). If the buffer passed in is not large ! 1355: // enough return an appropriate error code. ! 1356: // ! 1357: ! 1358: pointerAttributes = RequestPacket->OutputBuffer; ! 1359: ! 1360: if (RequestPacket->OutputBufferLength < ! 1361: (RequestPacket->StatusBlock->Information = ! 1362: sizeof(VXL_POINTER_ATTRIBUTES))) { ! 1363: ! 1364: status = ERROR_INSUFFICIENT_BUFFER; ! 1365: ! 1366: } else { ! 1367: ! 1368: // ! 1369: // Return the current hardware cursor width, height, column, ! 1370: // row and enable values. ! 1371: // ! 1372: ! 1373: pointerAttributes->Column = hwDeviceExtension->CursorColumn; ! 1374: pointerAttributes->Row = hwDeviceExtension->CursorRow; ! 1375: pointerAttributes->Enable = hwDeviceExtension->CursorEnable; ! 1376: pointerAttributes->WidthInBytes = 4; ! 1377: pointerAttributes->Width = 32; ! 1378: pointerAttributes->Height = 32; ! 1379: ! 1380: // ! 1381: // Return the hardware pixel values. ! 1382: // ! 1383: ! 1384: // ! 1385: // calculate the size in bytes of 1 mask ! 1386: // ! 1387: ! 1388: CursorMaskSize = pointerAttributes->WidthInBytes * pointerAttributes->Height; ! 1389: ! 1390: // ! 1391: // copy the xor mask to the first plane for the Bt484 ! 1392: // ! 1393: ! 1394: for (index1=0;index1<CursorMaskSize;index1++) { ! 1395: ! 1396: pointerAttributes->Pixels[index1 + CursorMaskSize] = ! 1397: hwDeviceExtension->CursorPixels[index1]; ! 1398: } ! 1399: ! 1400: ! 1401: // ! 1402: // copy the and mask to the second plane for the Bt484 ! 1403: // ! 1404: ! 1405: for (index1=0;index1<CursorMaskSize;index1++) { ! 1406: ! 1407: pointerAttributes->Pixels[index1] = ! 1408: hwDeviceExtension->CursorPixels[index1 + CursorMaskSize]; ! 1409: } ! 1410: ! 1411: status = NO_ERROR; ! 1412: ! 1413: } ! 1414: ! 1415: break; ! 1416: ! 1417: case IOCTL_VIDEO_QUERY_JAGUAR: ! 1418: ! 1419: // ! 1420: // Map 1 page for jaguar registers into user address space. ! 1421: // Map 1 page for Jagaur FIFO into user address space. ! 1422: // Determin the amount of video memory installed. ! 1423: // return this information ! 1424: // ! 1425: ! 1426: if (RequestPacket->OutputBufferLength < ! 1427: (RequestPacket->StatusBlock->Information = sizeof(VIDEO_JAGUAR_INFO)) ) { ! 1428: ! 1429: status = ERROR_INSUFFICIENT_BUFFER; ! 1430: ! 1431: } else { ! 1432: ! 1433: PVOID UserVirtualAddress; ! 1434: ULONG AddressLength; ! 1435: ! 1436: // ! 1437: // Map the jagaur registers into user virual address space ! 1438: // ! 1439: ! 1440: UserVirtualAddress = NULL; ! 1441: AddressLength = hwDeviceExtension->PhysicalControlLength; ! 1442: ! 1443: // ! 1444: // Map this address range into user address space ! 1445: // ! 1446: ! 1447: inIoSpace = 0; ! 1448: ! 1449: status = VideoPortMapMemory(hwDeviceExtension, ! 1450: hwDeviceExtension->PhysicalControlAddress, ! 1451: &AddressLength, ! 1452: &inIoSpace, ! 1453: &UserVirtualAddress); ! 1454: ! 1455: if (status != NO_ERROR) { ! 1456: break; ! 1457: } ! 1458: ! 1459: ! 1460: // ! 1461: // Copy the address to the output buffer ! 1462: // ! 1463: ! 1464: ((PVIDEO_JAGUAR_INFO)RequestPacket->OutputBuffer)->VideoControlVirtualBase = ! 1465: UserVirtualAddress; ! 1466: ! 1467: ! 1468: // ! 1469: // Map the jaguar fifo regs into user address space ! 1470: // ! 1471: ! 1472: UserVirtualAddress = NULL; ! 1473: AddressLength = hwDeviceExtension->PhysicalFifoLength; ! 1474: ! 1475: inIoSpace = 0; ! 1476: ! 1477: status = VideoPortMapMemory(hwDeviceExtension, ! 1478: hwDeviceExtension->PhysicalFifoAddress, ! 1479: &AddressLength, ! 1480: &inIoSpace, ! 1481: &UserVirtualAddress); ! 1482: ! 1483: // ! 1484: // Copy the address to the output buffer ! 1485: // ! 1486: ! 1487: ((PVIDEO_JAGUAR_INFO)RequestPacket->OutputBuffer)->FifoVirtualBase = ! 1488: UserVirtualAddress; ! 1489: ! 1490: // ! 1491: // Determine the length of video memory (if a second 2MB bank has been installed) ! 1492: // ! 1493: ! 1494: { ! 1495: ULONG TestValue; ! 1496: PULONG TestAddress; ! 1497: ! 1498: TestAddress = (PULONG)((PUCHAR)hwDeviceExtension->FrameAddress + 0x00200000); ! 1499: TestValue = 0xdeadbeef; ! 1500: VideoPortWriteRegisterUlong(TestAddress,TestValue); ! 1501: ! 1502: if (TestValue == VideoPortReadRegisterUlong(TestAddress)) { ! 1503: ((PVIDEO_JAGUAR_INFO)RequestPacket->OutputBuffer)->VideoMemoryLength = 0x00400000; ! 1504: } else { ! 1505: ((PVIDEO_JAGUAR_INFO)RequestPacket->OutputBuffer)->VideoMemoryLength = 0x00200000; ! 1506: } ! 1507: ! 1508: } ! 1509: ! 1510: ! 1511: } ! 1512: ! 1513: break ; ! 1514: ! 1515: // ! 1516: // if we get here, an invalid IoControlCode was specified. ! 1517: // ! 1518: ! 1519: default: ! 1520: ! 1521: status = ERROR_INVALID_FUNCTION; ! 1522: ! 1523: break; ! 1524: ! 1525: } ! 1526: ! 1527: if (turnOnInterrupts) { ! 1528: ! 1529: VideoPortWriteRegisterUchar(&VXL_JAGUAR_BASE->InterruptEnable.Byte, ! 1530: VXL_INTERRUPT_VERTICAL_RETRACE); ! 1531: ! 1532: } ! 1533: ! 1534: ! 1535: ! 1536: RequestPacket->StatusBlock->Status = status; ! 1537: ! 1538: return TRUE; ! 1539: ! 1540: } // end VxlStartIO() ! 1541: ! 1542: BOOLEAN ! 1543: VxlInterruptService( ! 1544: PVOID HwDeviceExtension ! 1545: ) ! 1546: ! 1547: /*++ ! 1548: ! 1549: Routine Description: ! 1550: ! 1551: This routine is the interrupt service routine for the Jazz kernel video ! 1552: driver. ! 1553: ! 1554: Arguments: ! 1555: ! 1556: HwDeviceExtension - Pointer to the miniport driver's adapter information. ! 1557: ! 1558: Return Value: ! 1559: ! 1560: TRUE since the interrupt is always serviced. ! 1561: ! 1562: --*/ ! 1563: ! 1564: { ! 1565: ! 1566: PHW_DEVICE_EXTENSION hwDeviceExtension = HwDeviceExtension; ! 1567: ULONG index; ! 1568: SHORT x; ! 1569: SHORT y; ! 1570: UCHAR InterruptSource; ! 1571: UCHAR PaletteData; ! 1572: ULONG Index; ! 1573: PBT484_REGISTERS Bt484 = VXL_BT484_BASE; ! 1574: ! 1575: // ! 1576: // Disable the verticle retrace interrupt. ! 1577: // ! 1578: ! 1579: // ! 1580: // Read the interrupt source before disabling interrupts ! 1581: // ! 1582: ! 1583: InterruptSource = ! 1584: VideoPortReadRegisterUchar(&VXL_JAGUAR_BASE->InterruptSource.Byte); ! 1585: ! 1586: VideoPortWriteRegisterUchar(&VXL_JAGUAR_BASE->InterruptEnable.Byte, 0); ! 1587: ! 1588: // VideoPortDisableInterrupt(hwDeviceExtension); ! 1589: ! 1590: // ! 1591: // Determin whether this is a vertical retrace interrupt, a JAGUAR command FIFO interrupt or ! 1592: // a writeable GDI interrupt. ! 1593: // ! 1594: ! 1595: ! 1596: // ! 1597: // Clear all but lower three bits ! 1598: // ! 1599: ! 1600: InterruptSource &= 0x07; ! 1601: ! 1602: // ! 1603: // Only the vertical retrace bit should be set, any other condition is an error ! 1604: // ! 1605: ! 1606: if (InterruptSource == VXL_INTERRUPT_VERTICAL_RETRACE) { ! 1607: ! 1608: // ! 1609: // Clear this interrupt in the JAGUAR interrupt source register ! 1610: // ! 1611: ! 1612: VideoPortWriteRegisterUchar(&VXL_JAGUAR_BASE->InterruptSource.Byte,InterruptSource); ! 1613: ! 1614: // ! 1615: // If the color map should be updated, then load the color map into the ! 1616: // Bt484 Display controller. ! 1617: // ! 1618: ! 1619: if (hwDeviceExtension->UpdateColorMap != FALSE) { ! 1620: ! 1621: // ! 1622: // Init the Bt484 Palette Write Address register to the first ! 1623: // palette location to be updated. ! 1624: // ! 1625: ! 1626: VideoPortWriteRegisterUchar(&VXL_BT484_BASE->PaletteCursorWrAddress.Byte, ! 1627: (UCHAR)(hwDeviceExtension->FirstEntry & 0xff)); ! 1628: ! 1629: // ! 1630: // Update all entries by performing three writes to each location, R,G,B ! 1631: // ! 1632: ! 1633: for (index = hwDeviceExtension->FirstEntry; ! 1634: index < hwDeviceExtension->LastEntry; index += 1) { ! 1635: ! 1636: VideoPortWriteRegisterUchar(&VXL_BT484_BASE->PaletteColor.Byte, ! 1637: hwDeviceExtension->ColorMap[index].RgbData.Red); ! 1638: ! 1639: VideoPortWriteRegisterUchar(&VXL_BT484_BASE->PaletteColor.Byte, ! 1640: hwDeviceExtension->ColorMap[index].RgbData.Green); ! 1641: ! 1642: VideoPortWriteRegisterUchar(&VXL_BT484_BASE->PaletteColor.Byte, ! 1643: hwDeviceExtension->ColorMap[index].RgbData.Blue); ! 1644: ! 1645: } ! 1646: ! 1647: hwDeviceExtension->UpdateColorMap = FALSE; ! 1648: } ! 1649: ! 1650: // ! 1651: // If the hardware cursor position and/or enable control information ! 1652: // should be updated, then write the appropriate control registers. ! 1653: // ! 1654: ! 1655: if (hwDeviceExtension->UpdateCursorPosition != FALSE) { ! 1656: ! 1657: // ! 1658: // If the hardware cursor is enabled, then set the appropriate ! 1659: // control information and update the column and row position. ! 1660: // Otherwise, clear the appropriate control information. ! 1661: // ! 1662: ! 1663: if (hwDeviceExtension->CursorEnable != FALSE) { ! 1664: ! 1665: // ! 1666: // Update the CURSOR Location ! 1667: // ! 1668: ! 1669: x = hwDeviceExtension->CursorColumn + ! 1670: hwDeviceExtension->CursorXOrigin; ! 1671: y = hwDeviceExtension->CursorRow + ! 1672: hwDeviceExtension->CursorYOrigin; ! 1673: ! 1674: VideoPortWriteRegisterUchar(&VXL_BT484_BASE->CursorXLow.Byte, ! 1675: (x & 0xff)); ! 1676: ! 1677: VideoPortWriteRegisterUchar(&VXL_BT484_BASE->CursorXHigh.Byte, ! 1678: ((x & 0xff00) >> 8)); ! 1679: ! 1680: VideoPortWriteRegisterUchar(&VXL_BT484_BASE->CursorYLow.Byte, ! 1681: (y & 0xff)); ! 1682: ! 1683: VideoPortWriteRegisterUchar(&VXL_BT484_BASE->CursorYHigh.Byte, ! 1684: ((y & 0xff00) >> 8)); ! 1685: ! 1686: } else { ! 1687: ! 1688: // ! 1689: // Initialize cursor RAM ! 1690: // ! 1691: // Set address pointer to base of ram. ! 1692: // Set both planes to transparent (cursor disabled) ! 1693: // ! 1694: ! 1695: VideoPortWriteRegisterUchar(&Bt484->PaletteCursorWrAddress.Byte,0); ! 1696: ! 1697: // ! 1698: // Plane 0 = 0 ! 1699: // ! 1700: ! 1701: for (Index=0; Index < (VXL_CURSOR_NUMBER_OF_BYTES / 2); Index++) { ! 1702: VideoPortWriteRegisterUchar(&Bt484->CursorRam.Byte,0); ! 1703: } ! 1704: ! 1705: // ! 1706: // Plane 1 = 1 ! 1707: // ! 1708: ! 1709: for (Index= (VXL_CURSOR_NUMBER_OF_BYTES / 2); Index < VXL_CURSOR_NUMBER_OF_BYTES ; Index++) { ! 1710: VideoPortWriteRegisterUchar(&Bt484->CursorRam.Byte,0xff); ! 1711: } ! 1712: ! 1713: ! 1714: } ! 1715: ! 1716: hwDeviceExtension->UpdateCursorPosition = FALSE; ! 1717: } ! 1718: ! 1719: // ! 1720: // If the hardware cursor pixels should be updated, then load the cursor ! 1721: // ram into the Bt484 cursor. ! 1722: // ! 1723: ! 1724: if (hwDeviceExtension->UpdateCursorPixels != FALSE) { ! 1725: ! 1726: // ! 1727: // only change to the new shape if the cursor is enabled ! 1728: // ! 1729: ! 1730: if (hwDeviceExtension->CursorEnable != FALSE) { ! 1731: ! 1732: // ! 1733: // Set the cursor RAM address pointer to location 0 ! 1734: // ! 1735: ! 1736: VideoPortWriteRegisterUchar(&VXL_BT484_BASE->PaletteCursorWrAddress.Byte,0); ! 1737: ! 1738: // ! 1739: // Update both cursor planes. ! 1740: // ! 1741: ! 1742: for (index = 0; index < VXL_CURSOR_NUMBER_OF_BYTES ; index++) { ! 1743: ! 1744: VideoPortWriteRegisterUchar(&VXL_BT484_BASE->CursorRam.Byte, ! 1745: hwDeviceExtension->CursorPixels[index]); ! 1746: ! 1747: } ! 1748: ! 1749: hwDeviceExtension->UpdateCursorPixels = FALSE; ! 1750: } ! 1751: } ! 1752: ! 1753: return TRUE; ! 1754: ! 1755: } else { ! 1756: ! 1757: // ! 1758: // Illegal type of video interrupt was received... ! 1759: // ! 1760: ! 1761: return FALSE; ! 1762: ! 1763: } ! 1764: ! 1765: ! 1766: } // end VxlInterruptService() ! 1767: ! 1768: ! 1769: VOID ! 1770: VxlSetMode( ! 1771: PHW_DEVICE_EXTENSION hwDeviceExtension ! 1772: ) ! 1773: ! 1774: /*++ ! 1775: ! 1776: Routine Description: ! 1777: ! 1778: Set the current mode based on the video mode number selected in the device extension. ! 1779: ! 1780: Arguments: ! 1781: ! 1782: HwDeviceExtension - Supplies a pointer to the miniport's device extension. ! 1783: ! 1784: Return Value: ! 1785: ! 1786: None. ! 1787: ! 1788: --*/ ! 1789: ! 1790: { ! 1791: ULONG Index; ! 1792: PJAGUAR_REGISTERS Jaguar = VXL_JAGUAR_BASE; ! 1793: PBT484_REGISTERS Bt484 = VXL_BT484_BASE; ! 1794: PUCHAR Clock = (PUCHAR)VXL_CLOCK_BASE; ! 1795: UCHAR DataChar,CmdReg0,CmdReg1; ! 1796: ! 1797: // ! 1798: // The mode information is stored in ! 1799: // JagModes[hwDeviceExtension->ModeNumber].pJagInitData ! 1800: // ! 1801: ! 1802: PJAGUAR_REG_INIT JaguarInitData = (PVOID) ! 1803: (JagModes[hwDeviceExtension->ModeNumber].ModeSetTable); ! 1804: ! 1805: // ! 1806: // ! 1807: // Start ICS Clock pll and stabilize. ! 1808: // ! 1809: ! 1810: VideoPortWriteRegisterUchar(Clock, JaguarInitData->ClockFreq); ! 1811: ! 1812: // ! 1813: // Wait 10 uS for PLL clock to stabilize on the video board ! 1814: // ! 1815: ! 1816: VideoPortStallExecution(10); ! 1817: ! 1818: // ! 1819: // Initialize Bt484 Command Register 0 to: ! 1820: // ! 1821: // 8 Bit DAC Resolution ! 1822: // ! 1823: ! 1824: CmdReg0 = 0; ! 1825: ((PBT484_COMMAND0)(&CmdReg0))->DacResolution = 1; ! 1826: ((PBT484_COMMAND0)(&CmdReg0))->GreenSyncEnable = 1; ! 1827: ((PBT484_COMMAND0)(&CmdReg0))->SetupEnable = 1; ! 1828: VideoPortWriteRegisterUchar(&Bt484->Command0.Byte,CmdReg0); ! 1829: ! 1830: // ! 1831: // Initialize Command Register 1 to: ! 1832: // ! 1833: ! 1834: CmdReg1 = 0; ! 1835: ! 1836: switch (JagModes[hwDeviceExtension->ModeNumber].modeInformation.BitsPerPlane) { ! 1837: ! 1838: case 24: ! 1839: ((PBT484_COMMAND1)(&CmdReg1))->BitsPerPixel = VXL_THIRTYTWO_BITS_PER_PIXEL; ! 1840: ((PBT484_COMMAND1)(&CmdReg1))->TrueColorBypass = 0; ! 1841: break; ! 1842: ! 1843: case 16: ! 1844: ! 1845: ((PBT484_COMMAND1)(&CmdReg1))->BitsPerPixel = VXL_SIXTEEN_BITS_PER_PIXEL; ! 1846: ((PBT484_COMMAND1)(&CmdReg1))->TrueColorBypass = 0; ! 1847: break; ! 1848: ! 1849: case 8: ! 1850: ! 1851: ((PBT484_COMMAND1)(&CmdReg1))->BitsPerPixel = VXL_EIGHT_BITS_PER_PIXEL; ! 1852: break; ! 1853: ! 1854: } ! 1855: ! 1856: VideoPortWriteRegisterUchar(&Bt484->Command1.Byte,CmdReg1); ! 1857: ! 1858: // ! 1859: // Initialize Command Register 2 to: ! 1860: // ! 1861: // SCLK Enabled ! 1862: // TestMode disabled ! 1863: // PortselMask Non Masked ! 1864: // PCLK 1 ! 1865: // NonInterlaced ! 1866: // ! 1867: ! 1868: DataChar = 0; ! 1869: ((PBT484_COMMAND2)(&DataChar))->SclkDisable = 0; ! 1870: ((PBT484_COMMAND2)(&DataChar))->TestEnable = 0; ! 1871: ((PBT484_COMMAND2)(&DataChar))->PortselMask = 1; ! 1872: ((PBT484_COMMAND2)(&DataChar))->PclkSelect = 1; ! 1873: ((PBT484_COMMAND2)(&DataChar))->InterlacedDisplay = 0; ! 1874: ((PBT484_COMMAND2)(&DataChar))->PaletteIndexing = CONTIGUOUS_PALETTE; ! 1875: ((PBT484_COMMAND2)(&DataChar))->CursorMode = BT_CURSOR_WINDOWS; ! 1876: ! 1877: VideoPortWriteRegisterUchar(&Bt484->Command2.Byte,DataChar); ! 1878: ! 1879: ! 1880: // ! 1881: // If the mode is set to 1 and the Bt485 flag is set then set the internal ! 1882: // 2x multiplier inside the Bt485. All other init steps are identical for the ! 1883: // Bt484 and Bt485. ! 1884: // ! 1885: ! 1886: ! 1887: if (JaguarInitData->Bt485Multiply == 1) { ! 1888: ! 1889: // ! 1890: // To access cmd register 3, first set bit CR17 in command register 0 ! 1891: // ! 1892: ! 1893: CmdReg0 |= 0x80; ! 1894: VideoPortWriteRegisterUchar(&Bt484->Command0.Byte,CmdReg0); ! 1895: ! 1896: // ! 1897: // Write a 0x01 to Address register ! 1898: // ! 1899: ! 1900: VideoPortWriteRegisterUchar(&Bt484->PaletteCursorWrAddress.Byte,0x01); ! 1901: ! 1902: // ! 1903: // Write to cmd register 3 in the status register location. Cmd3 is initialized ! 1904: // to turn on the 2x clock multiplier. ! 1905: // ! 1906: ! 1907: DataChar = 0; ! 1908: ((PBT484_COMMAND3)(&DataChar))->ClockMultiplier = 1; ! 1909: ! 1910: VideoPortWriteRegisterUchar(&Bt484->Status.Byte,DataChar); ! 1911: ! 1912: // ! 1913: // Allow 10 uS for the 2x multiplier to stabilize ! 1914: // ! 1915: ! 1916: VideoPortStallExecution(10); ! 1917: ! 1918: } ! 1919: // ! 1920: // Initialize Cursor and Overscan color. ! 1921: // ! 1922: // Set address pointer base. ! 1923: // Zero 4 entries. ! 1924: // ! 1925: ! 1926: VideoPortWriteRegisterUchar(&Bt484->CursorColorWrAddress.Byte,0); ! 1927: ! 1928: // ! 1929: // Zero overlay color ! 1930: // ! 1931: ! 1932: VideoPortWriteRegisterUchar(&Bt484->CursorColor.Byte,0); ! 1933: VideoPortWriteRegisterUchar(&Bt484->CursorColor.Byte,0); ! 1934: VideoPortWriteRegisterUchar(&Bt484->CursorColor.Byte,0); ! 1935: ! 1936: // ! 1937: // Set cursor color 1 to black ! 1938: // ! 1939: ! 1940: VideoPortWriteRegisterUchar(&Bt484->CursorColor.Byte,0); ! 1941: VideoPortWriteRegisterUchar(&Bt484->CursorColor.Byte,0); ! 1942: VideoPortWriteRegisterUchar(&Bt484->CursorColor.Byte,0); ! 1943: ! 1944: // ! 1945: // Set cursor color 2 to white ! 1946: // ! 1947: ! 1948: VideoPortWriteRegisterUchar(&Bt484->CursorColor.Byte,0xff); ! 1949: VideoPortWriteRegisterUchar(&Bt484->CursorColor.Byte,0xff); ! 1950: VideoPortWriteRegisterUchar(&Bt484->CursorColor.Byte,0xff); ! 1951: ! 1952: // ! 1953: // Set Cursor color 3 to red (error) ! 1954: // ! 1955: ! 1956: VideoPortWriteRegisterUchar(&Bt484->CursorColor.Byte,0xff); ! 1957: VideoPortWriteRegisterUchar(&Bt484->CursorColor.Byte,0x00); ! 1958: VideoPortWriteRegisterUchar(&Bt484->CursorColor.Byte,0x00); ! 1959: ! 1960: // ! 1961: // Initialize cursor RAM ! 1962: // ! 1963: // Set address pointer to base of ram. ! 1964: // Set both planes to transparent (cursor disabled) ! 1965: // ! 1966: ! 1967: VideoPortWriteRegisterUchar(&Bt484->PaletteCursorWrAddress.Byte,0); ! 1968: ! 1969: // ! 1970: // Plane 0 = 0 ! 1971: // ! 1972: ! 1973: for (Index=0; Index < (VXL_CURSOR_NUMBER_OF_BYTES / 2); Index++) { ! 1974: VideoPortWriteRegisterUchar(&Bt484->CursorRam.Byte,0); ! 1975: } ! 1976: ! 1977: // ! 1978: // Plane 1 = 1 ! 1979: // ! 1980: ! 1981: for (Index= (VXL_CURSOR_NUMBER_OF_BYTES / 2); Index < VXL_CURSOR_NUMBER_OF_BYTES ; Index++) { ! 1982: VideoPortWriteRegisterUchar(&Bt484->CursorRam.Byte,1); ! 1983: } ! 1984: ! 1985: // ! 1986: // Initialize cursor position registers--cursor off. ! 1987: // ! 1988: ! 1989: VideoPortWriteRegisterUchar(&Bt484->CursorXLow.Byte,0); ! 1990: VideoPortWriteRegisterUchar(&Bt484->CursorXHigh.Byte,0); ! 1991: VideoPortWriteRegisterUchar(&Bt484->CursorYLow.Byte,0); ! 1992: VideoPortWriteRegisterUchar(&Bt484->CursorYHigh.Byte,0); ! 1993: ! 1994: // ! 1995: // Initialize pixel mask. ! 1996: // ! 1997: ! 1998: VideoPortWriteRegisterUchar(&Bt484->PixelMask.Byte,0xFF); ! 1999: ! 2000: // ! 2001: // Init Jaguar Registers ! 2002: // ! 2003: ! 2004: //DbgPrint("Init Timing registers:\n"); ! 2005: ! 2006: VideoPortWriteRegisterUshort(&Jaguar->TopOfScreen.Short, ! 2007: JaguarInitData->TopOfScreen); ! 2008: //DbgPrint("TopOfScreen %lx\n",JaguarInitData->TopOfScreen); ! 2009: ! 2010: VideoPortWriteRegisterUshort(&Jaguar->HorizontalBlank.Short, ! 2011: JaguarInitData->HorizontalBlank); ! 2012: //DbgPrint("HorizontalBlank %lx\n",JaguarInitData->HorizontalBlank); ! 2013: ! 2014: VideoPortWriteRegisterUshort(&Jaguar->HorizontalBeginSync.Short, ! 2015: JaguarInitData->HorizontalBeginSync); ! 2016: //DbgPrint("HorizontalBeginSync %lx\n",JaguarInitData->HorizontalBeginSync); ! 2017: ! 2018: VideoPortWriteRegisterUshort(&Jaguar->HorizontalEndSync.Short, ! 2019: JaguarInitData->HorizontalEndSync); ! 2020: //DbgPrint("HorizontalEndSync %lx\n",JaguarInitData->HorizontalEndSync); ! 2021: ! 2022: VideoPortWriteRegisterUshort(&Jaguar->HorizontalLine.Short, ! 2023: JaguarInitData->HorizontalLine); ! 2024: //DbgPrint("HorizontalLine %lx\n",JaguarInitData->HorizontalLine); ! 2025: ! 2026: VideoPortWriteRegisterUshort(&Jaguar->VerticalBlank.Short, ! 2027: JaguarInitData->VerticalBlank); ! 2028: //DbgPrint("VerticalBlank %lx\n",JaguarInitData->VerticalBlank); ! 2029: ! 2030: VideoPortWriteRegisterUshort(&Jaguar->VerticalBeginSync.Short, ! 2031: JaguarInitData->VerticalBeginSync); ! 2032: //DbgPrint("VerticalBeginSync %lx\n",JaguarInitData->VerticalBeginSync); ! 2033: ! 2034: VideoPortWriteRegisterUshort(&Jaguar->VerticalEndSync.Short, ! 2035: JaguarInitData->VerticalEndSync); ! 2036: //DbgPrint("VerticalEndSync %lx\n",JaguarInitData->VerticalEndSync); ! 2037: ! 2038: VideoPortWriteRegisterUshort(&Jaguar->VerticalLine.Short, ! 2039: JaguarInitData->VerticalLine); ! 2040: //DbgPrint("VerticalLine %lx\n",JaguarInitData->VerticalLine); ! 2041: ! 2042: VideoPortWriteRegisterUshort(&Jaguar->XferLength.Short, ! 2043: JaguarInitData->XferLength); ! 2044: //DbgPrint("XferLength %lx\n",JaguarInitData->XferLength); ! 2045: ! 2046: VideoPortWriteRegisterUshort(&Jaguar->VerticalInterruptLine.Short, ! 2047: JaguarInitData->VerticalInterruptLine); ! 2048: //DbgPrint("VerticalInterruptLine %lx\n",JaguarInitData->VerticalInterruptLine); ! 2049: ! 2050: VideoPortWriteRegisterUshort(&Jaguar->HorizontalDisplay.Short, ! 2051: JaguarInitData->HorizontalDisplay); ! 2052: //DbgPrint("HorizontalDisplay %lx\n",JaguarInitData->HorizontalDisplay); ! 2053: ! 2054: VideoPortWriteRegisterUchar(&Jaguar->BitBltControl.Byte, ! 2055: JaguarInitData->BitBltControl); ! 2056: //DbgPrint("BitBltControl %lx\n",JaguarInitData->BitBltControl); ! 2057: ! 2058: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.