1 /* vgahico.c - used by ET4000 driver. */
2 /* Set Hicolor RAMDAC mode.
3
4 * HH: Added support for 24-bit Sierra RAMDAC (15025/6) (untested).
5 */
6
7
8 #include "vga.h"
9 #include "libvga.h"
10 #include "driver.h"
11 #include "ramdac/ramdac.h"
12
__svgalib_hicolor(int dac_type,int mode)13 int __svgalib_hicolor(int dac_type, int mode)
14 /* Enters hicolor mode - 0 for no hi, 1 for 15 bit, 2 for 16, 3 for 24 */
15 /* For any modes it doesn't know about, etc, it attempts to turn hicolor off. */
16 {
17 int x;
18
19 _ramdac_dactocomm();
20 x = port_in(PEL_MSK);
21 _ramdac_dactocomm();
22 switch (dac_type & ~1) {
23 case 0: /* Sierra SC11486 */
24 if (mode == HI15_DAC)
25 port_out(x | 0x80, PEL_MSK);
26 else
27 port_out(x & ~0x80, PEL_MSK);
28 break;
29 case 2: /* Sierra Mark2/Mark3 */
30 switch (mode) {
31 case HI15_DAC:
32 /* port_out( (x | 0x80) & ~0x40, PEL_MSK); */
33 port_out((x & 0x1f) | 0xa0, PEL_MSK);
34 break;
35 case HI16_DAC:
36 /* port_out( x | 0xC0, PEL_MSK); */
37 port_out((x & 0x1f) | 0xe0, PEL_MSK);
38 break;
39 default:
40 port_out(x & ~0xC0, PEL_MSK);
41 break;
42 }
43 break;
44 case 4: /* Diamond SS2410 */
45 if (mode == HI15_DAC)
46 port_out(x | 0x80, PEL_MSK);
47 else
48 port_out(x & ~0x80, PEL_MSK);
49 break;
50 case 8: /* AT&T 20c491/2 */
51 switch (mode) {
52 case HI15_DAC:
53 port_out((x & 0x1f) | 0xA0, PEL_MSK);
54 break;
55 case HI16_DAC:
56 port_out((x & 0x1f) | 0xC0, PEL_MSK);
57 break;
58 case TC24_DAC:
59 port_out((x & 0x1f) | 0xE0, PEL_MSK);
60 break;
61 default:
62 port_out(x & 0x1F, PEL_MSK);
63 break;
64 }
65 break;
66 case 16: /* AcuMos ADAC1 */
67 switch (mode) {
68 case HI15_DAC:
69 port_out(0xF0, PEL_MSK);
70 break;
71 case HI16_DAC:
72 port_out(0xE1, PEL_MSK);
73 break;
74 case TC24_DAC:
75 port_out(0xE5, PEL_MSK);
76 break;
77 default:
78 port_out(0, PEL_MSK);
79 break;
80 }
81 break;
82 case 32: /* Sierra 15025/6 24-bit DAC */
83 switch (mode) {
84 case HI15_DAC:
85 port_out((x & 0x1f) | 0xa0, PEL_MSK);
86 /* 0xa0 is also a 15-bit mode. */
87 break;
88 case HI16_DAC:
89 port_out((x & 0x1f) | 0xe0, PEL_MSK);
90 /* 0xc0 is also a 16-bit mode. */
91 /* 0xc0 doesn't seem to work, so use 0xe0. */
92 break;
93 case TC24_DAC:
94 port_out((x & 0x1f) | 0x60, PEL_MSK);
95 break;
96 default:
97 port_out(x & 0x1f, PEL_MSK);
98 break;
99 }
100 break;
101 default:
102 /* Normal VGA mode. */
103 port_out(x & 0x1F, PEL_MSK);
104 break;
105 }
106 _ramdac_dactopel();
107
108 return 0;
109 }
110