Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 | /*
* controlfb_hw.h: Constants of all sorts for controlfb
*
* Copyright (C) 1998 Daniel Jacobowitz <dan@debian.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Based on an awful lot of code, including:
*
* control.c: Console support for PowerMac "control" display adaptor.
* Copyright (C) 1996 Paul Mackerras.
*
* The so far unpublished platinumfb.c
* Copyright (C) 1998 Jon Howell
*/
/*
* Structure of the registers for the RADACAL colormap device.
*/
struct cmap_regs {
unsigned char addr;
char pad1[15];
unsigned char d1;
char pad2[15];
unsigned char d2;
char pad3[15];
unsigned char lut;
char pad4[15];
};
/*
* Structure of the registers for the "control" display adaptor.
*/
#define PAD(x) char x[12]
struct preg { /* padded register */
unsigned r;
char pad[12];
};
struct control_regs {
struct preg vcount; /* vertical counter */
/* Vertical parameters are in units of 1/2 scan line */
struct preg vswin; /* between vsblank and vssync */
struct preg vsblank; /* vert start blank */
struct preg veblank; /* vert end blank (display start) */
struct preg vewin; /* between vesync and veblank */
struct preg vesync; /* vert end sync */
struct preg vssync; /* vert start sync */
struct preg vperiod; /* vert period */
struct preg reg8;
/* Horizontal params are in units of 2 pixels */
struct preg hperiod; /* horiz period - 2 */
struct preg hsblank; /* horiz start blank */
struct preg heblank; /* horiz end blank */
struct preg hesync; /* horiz end sync */
struct preg hssync; /* horiz start sync */
struct preg rege;
struct preg regf;
struct preg reg10;
struct preg reg11;
struct preg ctrl; /* display control */
struct preg start_addr; /* start address: 5 lsbs zero */
struct preg pitch; /* addrs diff between scan lines */
struct preg mon_sense; /* monitor sense bits */
struct preg flags;
struct preg mode;
struct preg reg18;
struct preg reg19;
struct preg res[6];
};
struct control_regints {
/* Vertical parameters are in units of 1/2 scan line */
unsigned vswin; /* between vsblank and vssync */
unsigned vsblank; /* vert start blank */
unsigned veblank; /* vert end blank (display start) */
unsigned vewin; /* between vesync and veblank */
unsigned vesync; /* vert end sync */
unsigned vssync; /* vert start sync */
unsigned vperiod; /* vert period */
unsigned reg8;
/* Horizontal params are in units of 2 pixels */
/* Except, apparently, for hres > 1024 (or == 1280?) */
unsigned hperiod; /* horiz period - 2 */
unsigned hsblank; /* horiz start blank */
unsigned heblank; /* horiz end blank */
unsigned hesync; /* horiz end sync */
unsigned hssync; /* horiz start sync */
unsigned rege;
unsigned regf;
unsigned reg10;
};
/*
* Register initialization tables for the control display.
*
* Dot clock rate is
* 3.9064MHz * 2**clock_params[2] * clock_params[1] / clock_params[0].
*
* The values for vertical frequency (V) in the comments below
* are the values measured using the modes under MacOS.
*
* Pitch is always the same as bytes per line (for these video modes at least).
*/
struct control_regvals {
int offset[3]; /* first pixel address */
unsigned regs[16]; /* for vswin .. reg10 */
unsigned char mode[3]; /* indexed by color_mode */
unsigned char radacal_ctrl[3];
unsigned char clock_params[3];
int hres;
int vres;
};
/* Register values for 1280x1024, 75Hz mode (20) */
static struct control_regvals control_reg_init_20 = {
{ 0x10, 0x20, 0 },
{ 2129, 2128, 80, 42, 4, 2130, 2132, 88,
420, 411, 91, 35, 421, 18, 211, 386, },
{ 1, 1, 1},
{ 0x50, 0x64, 0x64 },
{ 13, 56, 3 }, /* pixel clock = 134.61MHz for V=74.81Hz */
1280, 1024
};
/* Register values for 1280x960, 75Hz mode (19) */
static struct control_regvals control_reg_init_19 = {
{ 0x10, 0x20, 0 },
{ 1997, 1996, 76, 40, 4, 1998, 2000, 86,
418, 409, 89, 35, 419, 18, 210, 384, },
{ 1, 1, 1 },
{ 0x50, 0x64, 0x64 },
{ 31, 125, 3 }, /* pixel clock = 126.01MHz for V=75.01 Hz */
1280, 960
};
/* Register values for 1152x870, 75Hz mode (18) */
static struct control_regvals control_reg_init_18 = {
{ 0x10, 0x28, 0x50 },
{ 1825, 1822, 82, 43, 4, 1828, 1830, 120,
726, 705, 129, 63, 727, 32, 364, 664 },
{ 2, 1, 1 },
{ 0x10, 0x14, 0x28 },
{ 19, 61, 3 }, /* pixel clock = 100.33MHz for V=75.31Hz */
1152, 870
};
/* Register values for 1024x768, 75Hz mode (17) */
static struct control_regvals control_reg_init_17 = {
{ 0x10, 0x28, 0x50 },
{ 1603, 1600, 64, 34, 4, 1606, 1608, 120,
662, 641, 129, 47, 663, 24, 332, 616 },
{ 2, 1, 1 },
{ 0x10, 0x14, 0x28 },
{ 11, 28, 3 }, /* pixel clock = 79.55MHz for V=74.50Hz */
1024, 768
};
/* Register values for 1024x768, 72Hz mode 16 (15?) */
static struct control_regvals control_reg_init_15 = {
{ 0x10, 0x28, 0x50 },
{ 1607, 1604, 68, 39, 10, 1610, 1612, 132,
670, 653, 141, 67, 671, 34, 336, 604, },
{ 2, 1, 1 },
{ 0x10, 0x14, 0x28 },
{ 12, 30, 3 }, /* pixel clock = 78.12MHz for V=72.12Hz */
1024, 768
};
/* Register values for 1024x768, 60Hz mode (14) */
static struct control_regvals control_reg_init_14 = {
{ 0x10, 0x28, 0x50 },
{ 1607, 1604, 68, 39, 10, 1610, 1612, 132,
670, 653, 141, 67, 671, 34, 336, 604, },
{ 2, 1, 1 },
{ 0x10, 0x14, 0x28 },
{ 15, 31, 3 }, /* pixel clock = 64.58MHz for V=59.62Hz */
1024, 768
};
/* Register values for 832x624, 75Hz mode (13) */
static struct control_regvals control_reg_init_13 = {
{ 0x10, 0x28, 0x50 },
{ 1331, 1330, 82, 43, 4, 1332, 1334, 128,
574, 553, 137, 31, 575, 16, 288, 544 },
{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
{ 23, 42, 3 }, /* pixel clock = 57.07MHz for V=74.27Hz */
832, 624
};
/* Register values for 800x600, 75Hz mode (12) */
static struct control_regvals control_reg_init_12 = {
{ 0x10, 0x28, 0x50 },
{ 1247, 1246, 46, 25, 4, 1248, 1250, 104,
526, 513, 113, 39, 527, 20, 264, 488, },
{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
{ 7, 11, 3 }, /* pixel clock = 49.11MHz for V=74.40Hz */
800, 600
};
/* Register values for 800x600, 72Hz mode (11) */
static struct control_regvals control_reg_init_11 = {
{ 0x10, 0x28, 0x50 },
{ 1293, 1256, 56, 33, 10, 1330, 1332, 76,
518, 485, 85, 59, 519, 30, 260, 460, },
{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
{ 17, 27, 3 }, /* pixel clock = 49.63MHz for V=71.66Hz */
800, 600
};
/* Register values for 800x600, 60Hz mode (10) */
static struct control_regvals control_reg_init_10 = {
{ 0x10, 0x28, 0x50 },
{ 1293, 1256, 56, 33, 10, 1330, 1332, 76,
518, 485, 85, 59, 519, 30, 260, 460, },
{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
{ 20, 53, 2 }, /* pixel clock = 41.41MHz for V=59.78Hz */
800, 600
};
/* Register values for 640x870, 75Hz Full Page Display (7) */
static struct control_regvals control_reg_init_7 = {
{ 0x10, 0x30, 0x68 },
{ 0x727, 0x724, 0x58, 0x2e, 0x4, 0x72a, 0x72c, 0x40,
0x19e, 0x18c, 0x4c, 0x27, 0x19f, 0x14, 0xd0, 0x178 },
{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
{ 9, 33, 2 }, /* pixel clock = 57.29MHz for V=75.01Hz */
640, 870
};
/* Register values for 640x480, 67Hz mode (6) */
static struct control_regvals control_reg_init_6 = {
{ 0, 8, 0x10 },
{ 1045, 1042, 82, 43, 4, 1048, 1050, 72,
430, 393, 73, 31, 431, 16, 216, 400 },
{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
{ 14, 27, 2 }, /* pixel clock = 30.13MHz for V=66.43Hz */
640, 480
};
/* Register values for 640x480, 60Hz mode (5) */
static struct control_regvals control_reg_init_5 = {
{ 0x10, 0x28, 0x50 },
{ 1037, 1026, 66, 34, 2, 1048, 1050, 56,
398, 385, 65, 47, 399, 24, 200, 352, },
{ 2, 1, 0 }, { 0x10, 0x14, 0x18 },
{ 23, 37, 2 }, /* pixel clock = 25.14MHz for V=59.85Hz */
640, 480
};
static struct control_regvals *control_reg_init[VMODE_MAX] = {
NULL, NULL, NULL, NULL,
&control_reg_init_5,
&control_reg_init_6,
&control_reg_init_7,
NULL, NULL,
&control_reg_init_10,
&control_reg_init_11,
&control_reg_init_12,
&control_reg_init_13,
&control_reg_init_14,
&control_reg_init_15,
&control_reg_init_15,
&control_reg_init_17,
&control_reg_init_18,
&control_reg_init_19,
&control_reg_init_20
};
|