BT.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /*
  2. * Copyright 1998 by Alan Hourihane, Wigan, England.
  3. *
  4. * Permission to use, copy, modify, distribute, and sell this software and its
  5. * documentation for any purpose is hereby granted without fee, provided that
  6. * the above copyright notice appear in all copies and that both that
  7. * copyright notice and this permission notice appear in supporting
  8. * documentation, and that the name of Alan Hourihane not be used in
  9. * advertising or publicity pertaining to distribution of the software without
  10. * specific, written prior permission. Alan Hourihane makes no representations
  11. * about the suitability of this software for any purpose. It is provided
  12. * "as is" without express or implied warranty.
  13. *
  14. * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  15. * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
  16. * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  17. * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  18. * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  19. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  20. * PERFORMANCE OF THIS SOFTWARE.
  21. *
  22. * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk>
  23. *
  24. * BT RAMDAC routines.
  25. */
  26. #ifdef HAVE_XORG_CONFIG_H
  27. #include <xorg-config.h>
  28. #endif
  29. #include "xf86.h"
  30. #include "xf86_OSproc.h"
  31. #define INIT_BT_RAMDAC_INFO
  32. #include "BTPriv.h"
  33. #include "xf86RamDacPriv.h"
  34. void
  35. BTramdacRestore(ScrnInfoPtr pScrn, RamDacRecPtr ramdacPtr,
  36. RamDacRegRecPtr ramdacReg)
  37. {
  38. int i;
  39. /* Here we pass a short, so that we can evaluate a mask too */
  40. /* So that the mask is the high byte and the data the low byte */
  41. /* Just the command/status registers */
  42. for (i = 0x06; i < 0x0A; i++)
  43. (*ramdacPtr->WriteDAC)
  44. (pScrn, i, (ramdacReg->DacRegs[i] & 0xFF00) >> 8,
  45. ramdacReg->DacRegs[i]);
  46. }
  47. void
  48. BTramdacSave(ScrnInfoPtr pScrn, RamDacRecPtr ramdacPtr,
  49. RamDacRegRecPtr ramdacReg)
  50. {
  51. int i;
  52. (*ramdacPtr->ReadAddress) (pScrn, 0); /* Start at index 0 */
  53. for (i = 0; i < 768; i++)
  54. ramdacReg->DAC[i] = (*ramdacPtr->ReadData) (pScrn);
  55. /* Just the command/status registers */
  56. for (i = 0x06; i < 0x0A; i++)
  57. ramdacReg->DacRegs[i] = (*ramdacPtr->ReadDAC) (pScrn, i);
  58. }
  59. RamDacHelperRecPtr
  60. BTramdacProbe(ScrnInfoPtr pScrn,
  61. RamDacSupportedInfoRecPtr ramdacs /*, RamDacRecPtr ramdacPtr */ )
  62. {
  63. RamDacRecPtr ramdacPtr = RAMDACSCRPTR(pScrn);
  64. Bool RamDacIsSupported = FALSE;
  65. RamDacHelperRecPtr ramdacHelperPtr = NULL;
  66. int BTramdac_ID = -1;
  67. int i, status, cmd0;
  68. /* Save COMMAND Register 0 */
  69. cmd0 = (*ramdacPtr->ReadDAC) (pScrn, BT_COMMAND_REG_0);
  70. /* Ensure were going to access the STATUS Register on next read */
  71. (*ramdacPtr->WriteDAC) (pScrn, BT_COMMAND_REG_0, 0x7F, 0x00);
  72. status = (*ramdacPtr->ReadDAC) (pScrn, BT_STATUS_REG);
  73. switch (status) {
  74. case 0x40:
  75. BTramdac_ID = ATT20C504_RAMDAC;
  76. break;
  77. case 0xD0:
  78. BTramdac_ID = ATT20C505_RAMDAC;
  79. break;
  80. default:
  81. xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
  82. "Unknown BT RAMDAC type (0x%x), assuming BT485\n", status);
  83. case 0x80:
  84. case 0x90:
  85. case 0xA0:
  86. case 0xB0:
  87. case 0x28: /* This is for the DEC TGA - Questionable ? */
  88. BTramdac_ID = BT485_RAMDAC;
  89. break;
  90. }
  91. /* Restore COMMAND Register 0 */
  92. (*ramdacPtr->WriteDAC) (pScrn, BT_COMMAND_REG_0, 0x00, cmd0);
  93. if (BTramdac_ID == -1) {
  94. xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
  95. "Cannot determine BT RAMDAC type, aborting\n");
  96. return NULL;
  97. }
  98. else {
  99. xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
  100. "Attached RAMDAC is %s\n",
  101. BTramdacDeviceInfo[BTramdac_ID & 0xFFFF].DeviceName);
  102. }
  103. for (i = 0; ramdacs[i].token != -1; i++) {
  104. if (ramdacs[i].token == BTramdac_ID)
  105. RamDacIsSupported = TRUE;
  106. }
  107. if (!RamDacIsSupported) {
  108. xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
  109. "This BT RAMDAC is NOT supported by this driver, aborting\n");
  110. return NULL;
  111. }
  112. ramdacHelperPtr = RamDacHelperCreateInfoRec();
  113. switch (BTramdac_ID) {
  114. case BT485_RAMDAC:
  115. ramdacHelperPtr->SetBpp = BTramdacSetBpp;
  116. break;
  117. }
  118. ramdacPtr->RamDacType = BTramdac_ID;
  119. ramdacHelperPtr->RamDacType = BTramdac_ID;
  120. ramdacHelperPtr->Save = BTramdacSave;
  121. ramdacHelperPtr->Restore = BTramdacRestore;
  122. return ramdacHelperPtr;
  123. }
  124. void
  125. BTramdacSetBpp(ScrnInfoPtr pScrn, RamDacRegRecPtr ramdacReg)
  126. {
  127. /* We need to deal with Direct Colour visuals for 8bpp and other
  128. * good stuff for colours */
  129. switch (pScrn->bitsPerPixel) {
  130. case 32:
  131. ramdacReg->DacRegs[BT_COMMAND_REG_1] = 0x10;
  132. break;
  133. case 24:
  134. ramdacReg->DacRegs[BT_COMMAND_REG_1] = 0x10;
  135. break;
  136. case 16:
  137. ramdacReg->DacRegs[BT_COMMAND_REG_1] = 0x38;
  138. break;
  139. case 15:
  140. ramdacReg->DacRegs[BT_COMMAND_REG_1] = 0x30;
  141. break;
  142. case 8:
  143. ramdacReg->DacRegs[BT_COMMAND_REG_1] = 0x40;
  144. break;
  145. case 4:
  146. ramdacReg->DacRegs[BT_COMMAND_REG_1] = 0x60;
  147. break;
  148. }
  149. }