1 //==========================================================================
5 // Author(s): Michael Kelly - Cogent Computer Systems, Inc.
7 // Description: Init Code for SED135x Display Controller
9 //==========================================================================
10 // Copyright (C) 2003 Gary Thomas
12 #include <pkgconf/hal.h>
13 #include <cyg/infra/cyg_type.h>
14 #include <cyg/hal/lcd_support.h>
15 #include <cyg/hal/hal_io.h>
17 typedef unsigned char uchar;
18 typedef unsigned short ushort;
19 typedef volatile unsigned short vushort;
20 typedef unsigned long ulong;
21 typedef volatile unsigned long vulong;
23 // board specific defines needed by sed135x
24 #define SED_REG_BASE 0x78000000 // *RCE3
25 #define SED_MEM_BASE 0x78400000
26 #define SED_STEP 2 // 16-bit port on 32-bit boundary
28 // Control/Status Registers, 16-bit mode
29 #define SED_REG16(_x_) *(vushort *)((ulong)SED_REG_BASE + (((ulong)_x_ * SED_STEP) ^ 2))
30 #define H2SED(_x_) _le16(_x_)
31 #define SED_GET_PHYS_ADD(_reg_) (SED_MEM_BASE + ((_reg_ * SED_STEP) ^ 2))
32 #define RD_FB16(_reg_,_val_) ((_val_) = *(vushort *)SED_GET_PHYS_ADD(_reg_))
33 #define WR_FB16(_reg_,_val_) (*(vushort *)SED_GET_PHYS_ADD(_reg_) = (_val_))
35 #define SED_DISP_MODE_CRT 1
36 #define SED_DISP_MODE_LCD 0
38 #include "sed1356_16bit.h"
40 //------------------------------------------------------------------------
41 // Color Lookup Table Values
44 static ushort sed_lut_16bit[256][3] = {
45 // RED, GREEN, BLUE // Entry
46 { 0x0000, 0x0000, 0x0000, }, // 00
47 { 0x0000, 0x0000, 0x00A0, }, // 01
48 { 0x0000, 0x00A0, 0x0000, }, // 02
49 { 0x0000, 0x00A0, 0x00A0, }, // 03
50 { 0x00A0, 0x0000, 0x0000, }, // 04
51 { 0x00A0, 0x0000, 0x00A0, }, // 05
52 { 0x00A0, 0x00A0, 0x0000, }, // 06
53 { 0x00A0, 0x00A0, 0x00A0, }, // 07
54 { 0x0050, 0x0050, 0x0050, }, // 08
55 { 0x0050, 0x0050, 0x00F0, }, // 09
56 { 0x0050, 0x00F0, 0x0050, }, // 0A
57 { 0x0050, 0x00F0, 0x00F0, }, // 0B
58 { 0x00F0, 0x0050, 0x0050, }, // 0C
59 { 0x00F0, 0x0050, 0x00F0, }, // 0D
60 { 0x00F0, 0x00F0, 0x0050, }, // 0E
61 { 0x00F0, 0x00F0, 0x00F0, }, // 0F
62 { 0x0000, 0x0000, 0x0000, }, // 10
63 { 0x0010, 0x0010, 0x0010, }, // 11
64 { 0x0020, 0x0020, 0x0020, }, // 12
65 { 0x0020, 0x0020, 0x0020, }, // 13
66 { 0x0030, 0x0030, 0x0030, }, // 14
67 { 0x0040, 0x0040, 0x0040, }, // 15
68 { 0x0050, 0x0050, 0x0050, }, // 16
69 { 0x0060, 0x0060, 0x0060, }, // 17
70 { 0x0070, 0x0070, 0x0070, }, // 18
71 { 0x0080, 0x0080, 0x0080, }, // 19
72 { 0x0090, 0x0090, 0x0090, }, // 1A
73 { 0x00A0, 0x00A0, 0x00A0, }, // 1B
74 { 0x00B0, 0x00B0, 0x00B0, }, // 1C
75 { 0x00C0, 0x00C0, 0x00C0, }, // 1D
76 { 0x00E0, 0x00E0, 0x00E0, }, // 1E
77 { 0x00F0, 0x00F0, 0x00F0, }, // 1F
78 { 0x0000, 0x0000, 0x00F0, }, // 20
79 { 0x0040, 0x0000, 0x00F0, }, // 21
80 { 0x0070, 0x0000, 0x00F0, }, // 22
81 { 0x00B0, 0x0000, 0x00F0, }, // 23
82 { 0x00F0, 0x0000, 0x00F0, }, // 24
83 { 0x00F0, 0x0000, 0x00B0, }, // 25
84 { 0x00F0, 0x0000, 0x0070, }, // 26
85 { 0x00F0, 0x0000, 0x0040, }, // 27
86 { 0x00F0, 0x0000, 0x0000, }, // 28
87 { 0x00F0, 0x0040, 0x0000, }, // 29
88 { 0x00F0, 0x0070, 0x0000, }, // 2A
89 { 0x00F0, 0x00B0, 0x0000, }, // 2B
90 { 0x00F0, 0x00F0, 0x0000, }, // 2C
91 { 0x00B0, 0x00F0, 0x0000, }, // 2D
92 { 0x0070, 0x00F0, 0x0000, }, // 2E
93 { 0x0040, 0x00F0, 0x0000, }, // 2F
94 { 0x0000, 0x00F0, 0x0000, }, // 30
95 { 0x0000, 0x00F0, 0x0040, }, // 31
96 { 0x0000, 0x00F0, 0x0070, }, // 32
97 { 0x0000, 0x00F0, 0x00B0, }, // 33
98 { 0x0000, 0x00F0, 0x00F0, }, // 34
99 { 0x0000, 0x00B0, 0x00F0, }, // 35
100 { 0x0000, 0x0070, 0x00F0, }, // 36
101 { 0x0000, 0x0040, 0x00F0, }, // 37
102 { 0x0070, 0x0070, 0x00F0, }, // 38
103 { 0x0090, 0x0070, 0x00F0, }, // 39
104 { 0x00B0, 0x0070, 0x00F0, }, // 3A
105 { 0x00D0, 0x0070, 0x00F0, }, // 3B
106 { 0x00F0, 0x0070, 0x00F0, }, // 3C
107 { 0x00F0, 0x0070, 0x00D0, }, // 3D
108 { 0x00F0, 0x0070, 0x00B0, }, // 3E
109 { 0x00F0, 0x0070, 0x0090, }, // 3F
110 { 0x00F0, 0x0070, 0x0070, }, // 40
111 { 0x00F0, 0x0090, 0x0070, }, // 41
112 { 0x00F0, 0x00B0, 0x0070, }, // 42
113 { 0x00F0, 0x00D0, 0x0070, }, // 43
114 { 0x00F0, 0x00F0, 0x0070, }, // 44
115 { 0x00D0, 0x00F0, 0x0070, }, // 45
116 { 0x00B0, 0x00F0, 0x0070, }, // 46
117 { 0x0090, 0x00F0, 0x0070, }, // 47
118 { 0x0070, 0x00F0, 0x0070, }, // 48
119 { 0x0070, 0x00F0, 0x0090, }, // 49
120 { 0x0070, 0x00F0, 0x00B0, }, // 4A
121 { 0x0070, 0x00F0, 0x00D0, }, // 4B
122 { 0x0070, 0x00F0, 0x00F0, }, // 4C
123 { 0x0070, 0x00D0, 0x00F0, }, // 4D
124 { 0x0070, 0x00B0, 0x00F0, }, // 4E
125 { 0x0070, 0x0090, 0x00F0, }, // 4F
126 { 0x00B0, 0x00B0, 0x00F0, }, // 50
127 { 0x00C0, 0x00B0, 0x00F0, }, // 51
128 { 0x00D0, 0x00B0, 0x00F0, }, // 52
129 { 0x00E0, 0x00B0, 0x00F0, }, // 53
130 { 0x00F0, 0x00B0, 0x00F0, }, // 54
131 { 0x00F0, 0x00B0, 0x00E0, }, // 55
132 { 0x00F0, 0x00B0, 0x00D0, }, // 56
133 { 0x00F0, 0x00B0, 0x00C0, }, // 57
134 { 0x00F0, 0x00B0, 0x00B0, }, // 58
135 { 0x00F0, 0x00C0, 0x00B0, }, // 59
136 { 0x00F0, 0x00D0, 0x00B0, }, // 5A
137 { 0x00F0, 0x00E0, 0x00B0, }, // 5B
138 { 0x00F0, 0x00F0, 0x00B0, }, // 5C
139 { 0x00E0, 0x00F0, 0x00B0, }, // 5D
140 { 0x00D0, 0x00F0, 0x00B0, }, // 5E
141 { 0x00C0, 0x00F0, 0x00B0, }, // 5F
142 { 0x00B0, 0x00F0, 0x00B0, }, // 60
143 { 0x00B0, 0x00F0, 0x00C0, }, // 61
144 { 0x00B0, 0x00F0, 0x00D0, }, // 62
145 { 0x00B0, 0x00F0, 0x00E0, }, // 63
146 { 0x00B0, 0x00F0, 0x00F0, }, // 64
147 { 0x00B0, 0x00E0, 0x00F0, }, // 65
148 { 0x00B0, 0x00D0, 0x00F0, }, // 66
149 { 0x00B0, 0x00C0, 0x00F0, }, // 67
150 { 0x0000, 0x0000, 0x0070, }, // 68
151 { 0x0010, 0x0000, 0x0070, }, // 69
152 { 0x0030, 0x0000, 0x0070, }, // 6A
153 { 0x0050, 0x0000, 0x0070, }, // 6B
154 { 0x0070, 0x0000, 0x0070, }, // 6C
155 { 0x0070, 0x0000, 0x0050, }, // 6D
156 { 0x0070, 0x0000, 0x0030, }, // 6E
157 { 0x0070, 0x0000, 0x0010, }, // 6F
158 { 0x0070, 0x0000, 0x0000, }, // 70
159 { 0x0070, 0x0010, 0x0000, }, // 71
160 { 0x0070, 0x0030, 0x0000, }, // 72
161 { 0x0070, 0x0050, 0x0000, }, // 73
162 { 0x0070, 0x0070, 0x0000, }, // 74
163 { 0x0050, 0x0070, 0x0000, }, // 75
164 { 0x0030, 0x0070, 0x0000, }, // 76
165 { 0x0010, 0x0070, 0x0000, }, // 77
166 { 0x0000, 0x0070, 0x0000, }, // 78
167 { 0x0000, 0x0070, 0x0010, }, // 79
168 { 0x0000, 0x0070, 0x0030, }, // 7A
169 { 0x0000, 0x0070, 0x0050, }, // 7B
170 { 0x0000, 0x0070, 0x0070, }, // 7C
171 { 0x0000, 0x0050, 0x0070, }, // 7D
172 { 0x0000, 0x0030, 0x0070, }, // 7E
173 { 0x0000, 0x0010, 0x0070, }, // 7F
174 { 0x0030, 0x0030, 0x0070, }, // 80
175 { 0x0040, 0x0030, 0x0070, }, // 81
176 { 0x0050, 0x0030, 0x0070, }, // 82
177 { 0x0060, 0x0030, 0x0070, }, // 83
178 { 0x0070, 0x0030, 0x0070, }, // 84
179 { 0x0070, 0x0030, 0x0060, }, // 85
180 { 0x0070, 0x0030, 0x0050, }, // 86
181 { 0x0070, 0x0030, 0x0040, }, // 87
182 { 0x0070, 0x0030, 0x0030, }, // 88
183 { 0x0070, 0x0040, 0x0030, }, // 89
184 { 0x0070, 0x0050, 0x0030, }, // 8A
185 { 0x0070, 0x0060, 0x0030, }, // 8B
186 { 0x0070, 0x0070, 0x0030, }, // 8C
187 { 0x0060, 0x0070, 0x0030, }, // 8D
188 { 0x0050, 0x0070, 0x0030, }, // 8E
189 { 0x0040, 0x0070, 0x0030, }, // 8F
190 { 0x0030, 0x0070, 0x0030, }, // 90
191 { 0x0030, 0x0070, 0x0040, }, // 91
192 { 0x0030, 0x0070, 0x0050, }, // 92
193 { 0x0030, 0x0070, 0x0060, }, // 93
194 { 0x0030, 0x0070, 0x0070, }, // 94
195 { 0x0030, 0x0060, 0x0070, }, // 95
196 { 0x0030, 0x0050, 0x0070, }, // 96
197 { 0x0030, 0x0040, 0x0070, }, // 97
198 { 0x0050, 0x0050, 0x0070, }, // 98
199 { 0x0050, 0x0050, 0x0070, }, // 99
200 { 0x0060, 0x0050, 0x0070, }, // 9A
201 { 0x0060, 0x0050, 0x0070, }, // 9B
202 { 0x0070, 0x0050, 0x0070, }, // 9C
203 { 0x0070, 0x0050, 0x0060, }, // 9D
204 { 0x0070, 0x0050, 0x0060, }, // 9E
205 { 0x0070, 0x0050, 0x0050, }, // 9F
206 { 0x0070, 0x0050, 0x0050, }, // A0
207 { 0x0070, 0x0050, 0x0050, }, // A1
208 { 0x0070, 0x0060, 0x0050, }, // A2
209 { 0x0070, 0x0060, 0x0050, }, // A3
210 { 0x0070, 0x0070, 0x0050, }, // A4
211 { 0x0060, 0x0070, 0x0050, }, // A5
212 { 0x0060, 0x0070, 0x0050, }, // A6
213 { 0x0050, 0x0070, 0x0050, }, // A7
214 { 0x0050, 0x0070, 0x0050, }, // A8
215 { 0x0050, 0x0070, 0x0050, }, // A9
216 { 0x0050, 0x0070, 0x0060, }, // AA
217 { 0x0050, 0x0070, 0x0060, }, // AB
218 { 0x0050, 0x0070, 0x0070, }, // AC
219 { 0x0050, 0x0060, 0x0070, }, // AD
220 { 0x0050, 0x0060, 0x0070, }, // AE
221 { 0x0050, 0x0050, 0x0070, }, // AF
222 { 0x0000, 0x0000, 0x0040, }, // B0
223 { 0x0010, 0x0000, 0x0040, }, // B1
224 { 0x0020, 0x0000, 0x0040, }, // B2
225 { 0x0030, 0x0000, 0x0040, }, // B3
226 { 0x0040, 0x0000, 0x0040, }, // B4
227 { 0x0040, 0x0000, 0x0030, }, // B5
228 { 0x0040, 0x0000, 0x0020, }, // B6
229 { 0x0040, 0x0000, 0x0010, }, // B7
230 { 0x0040, 0x0000, 0x0000, }, // B8
231 { 0x0040, 0x0010, 0x0000, }, // B9
232 { 0x0040, 0x0020, 0x0000, }, // BA
233 { 0x0040, 0x0030, 0x0000, }, // BB
234 { 0x0040, 0x0040, 0x0000, }, // BC
235 { 0x0030, 0x0040, 0x0000, }, // BD
236 { 0x0020, 0x0040, 0x0000, }, // BE
237 { 0x0010, 0x0040, 0x0000, }, // BF
238 { 0x0000, 0x0040, 0x0000, }, // C0
239 { 0x0000, 0x0040, 0x0010, }, // C1
240 { 0x0000, 0x0040, 0x0020, }, // C2
241 { 0x0000, 0x0040, 0x0030, }, // C3
242 { 0x0000, 0x0040, 0x0040, }, // C4
243 { 0x0000, 0x0030, 0x0040, }, // C5
244 { 0x0000, 0x0020, 0x0040, }, // C6
245 { 0x0000, 0x0010, 0x0040, }, // C7
246 { 0x0020, 0x0020, 0x0040, }, // C8
247 { 0x0020, 0x0020, 0x0040, }, // C9
248 { 0x0030, 0x0020, 0x0040, }, // CA
249 { 0x0030, 0x0020, 0x0040, }, // CB
250 { 0x0040, 0x0020, 0x0040, }, // CC
251 { 0x0040, 0x0020, 0x0030, }, // CD
252 { 0x0040, 0x0020, 0x0030, }, // CE
253 { 0x0040, 0x0020, 0x0020, }, // CF
254 { 0x0040, 0x0020, 0x0020, }, // D0
255 { 0x0040, 0x0020, 0x0020, }, // D1
256 { 0x0040, 0x0030, 0x0020, }, // D2
257 { 0x0040, 0x0030, 0x0020, }, // D3
258 { 0x0040, 0x0040, 0x0020, }, // D4
259 { 0x0030, 0x0040, 0x0020, }, // D5
260 { 0x0030, 0x0040, 0x0020, }, // D6
261 { 0x0020, 0x0040, 0x0020, }, // D7
262 { 0x0020, 0x0040, 0x0020, }, // D8
263 { 0x0020, 0x0040, 0x0020, }, // D9
264 { 0x0020, 0x0040, 0x0030, }, // DA
265 { 0x0020, 0x0040, 0x0030, }, // DB
266 { 0x0020, 0x0040, 0x0040, }, // DC
267 { 0x0020, 0x0030, 0x0040, }, // DD
268 { 0x0020, 0x0030, 0x0040, }, // DE
269 { 0x0020, 0x0020, 0x0040, }, // DF
270 { 0x0020, 0x0020, 0x0040, }, // E0
271 { 0x0030, 0x0020, 0x0040, }, // E1
272 { 0x0030, 0x0020, 0x0040, }, // E2
273 { 0x0030, 0x0020, 0x0040, }, // E3
274 { 0x0040, 0x0020, 0x0040, }, // E4
275 { 0x0040, 0x0020, 0x0030, }, // E5
276 { 0x0040, 0x0020, 0x0030, }, // E6
277 { 0x0040, 0x0020, 0x0030, }, // E7
278 { 0x0040, 0x0020, 0x0020, }, // E8
279 { 0x0040, 0x0030, 0x0020, }, // E9
280 { 0x0040, 0x0030, 0x0020, }, // EA
281 { 0x0040, 0x0030, 0x0020, }, // EB
282 { 0x0040, 0x0040, 0x0020, }, // EC
283 { 0x0030, 0x0040, 0x0020, }, // ED
284 { 0x0030, 0x0040, 0x0020, }, // EE
285 { 0x0030, 0x0040, 0x0020, }, // EF
286 { 0x0020, 0x0040, 0x0020, }, // F0
287 { 0x0020, 0x0040, 0x0030, }, // F1
288 { 0x0020, 0x0040, 0x0030, }, // F2
289 { 0x0020, 0x0040, 0x0030, }, // F3
290 { 0x0020, 0x0040, 0x0040, }, // F4
291 { 0x0020, 0x0030, 0x0040, }, // F5
292 { 0x0020, 0x0030, 0x0040, }, // F6
293 { 0x0020, 0x0030, 0x0040, }, // F7
294 { 0x0000, 0x0000, 0x0000, }, // F8
295 { 0x0000, 0x0000, 0x0000, }, // F9
296 { 0x0000, 0x0000, 0x0000, }, // FA
297 { 0x0000, 0x0000, 0x0000, }, // FB
298 { 0x0000, 0x0000, 0x0000, }, // FC
299 { 0x0000, 0x0000, 0x0000, }, // FD
300 { 0x0000, 0x0000, 0x0000, }, // FE
301 { 0x0000, 0x0000, 0x0000, }, // FF
304 //--------------------------------------------------------------------------
305 // function prototypes
307 int sed135x_init(int depth, struct lcd_info *lcd);
308 static void sed135x_on(void);
309 static void sed135x_off(void);
310 static void sed_lcd_bkl(uchar bright);
312 extern void fs6377_init(int);
313 // Why doesn't the real mode work?
314 #define fs6377_init(mode) _csb281_fs6377_init(0)
316 // global flags to determine what, if anything, was found
317 static int sed135x_ok;
318 static int sed_disp_mode_crt;
320 // GPIO1 is used to control the LCD backlight on many CSB's
321 #define SED1356_BKL_ON SED1356_REG_GPIO_CTL |= H2SED(SED1356_GPIO_GPIO1) // GPIO1 = 1
322 #define SED1356_BKL_OFF SED1356_REG_GPIO_CTL &= H2SED(~SED1356_GPIO_GPIO1) // GPIO1 = 0
324 // GPIO2 is used to sense the presence of a monitor. 0 = monitor connected, 1 = no monitor
325 // we invert the sense to make it easier to test and more logical.
326 #define SED1356_CRT SED1356_REG_GPIO_CTL & H2SED(SED1356_GPIO_GPIO2)
328 #define SED_ROW_SIZE(_depth_) ((PIXELS_PER_ROW * _depth_) / 8)
330 //--------------------------------------------------------------------------
333 // This function turns on the SED1355 or SED1356 LCD and/or CRT
343 // Turn on the LCD and/or CRT
344 // The SED1356 supports seperate LCD and CRT timing registers
345 // that have already been setup. We just blank the side we
346 // aren't using and enable the other.
347 if (sed_disp_mode_crt) { // 1 = CRT Mode
348 // Blank the LCD and CRT
349 SED1356_REG_LCD_DISP_MODE_and_MISC |= H2SED(SED1356_LCD_DISP_BLANK);
350 SED1356_REG_CRT_DISP_MODE |= H2SED(SED1356_CRT_DISP_BLANK);
352 // turn the LCD backlight off
355 // Set the SED1356 to CRT Mode
356 SED1356_REG_DISP_MODE = H2SED(SED1356_DISP_SWIV_NORM |
357 SED1356_DISP_MODE_CRT);
360 SED1356_REG_CRT_DISP_MODE &= ~H2SED(SED1356_CRT_DISP_BLANK);
362 else { // 0 = LCD Mode
363 // Blank the LCD and CRT
364 SED1356_REG_LCD_DISP_MODE_and_MISC |= H2SED(SED1356_LCD_DISP_BLANK);
365 SED1356_REG_CRT_DISP_MODE |= H2SED(SED1356_CRT_DISP_BLANK);
367 // Set the SED1356 to LCD Mode
368 SED1356_REG_DISP_MODE = H2SED(SED1356_DISP_SWIV_NORM |
369 SED1356_DISP_MODE_LCD);
372 SED1356_REG_LCD_DISP_MODE_and_MISC &= ~H2SED(SED1356_LCD_DISP_BLANK);
373 sed_lcd_bkl(0xff); // turn the LCD backlight on/full brightness
377 //--------------------------------------------------------------------------
380 // This function turns on the LCD backlight connected to GPIO1. This is
381 // not used if the board has a different method of controlling the
382 // backlight. Since the Sed has only a single GPIO bit and no way
383 // to modulate it, we use any non-zero value of bright to turn it on.
386 sed_lcd_bkl(uchar bright)
388 // Any non-zero value for bright means on
396 //--------------------------------------------------------------------------
399 // This function turns off the SED1356 LCD and/or CRT and the display
400 // fifo. It can also turn off the clocks if mode is true, thus allowing
401 // the programmable clock generator to be changed.
406 SED1356_REG_DISP_MODE = H2SED(SED1356_DISP_SWIV_NORM |
407 SED1356_DISP_MODE_OFF);
408 sed_lcd_bkl(0); // turn the LCD backlight off
411 //--------------------------------------------------------------------------
414 // This function sets up the sed1355 or sed1356 whichever is found
417 sed135x_init(int depth, struct lcd_info *lcd)
423 sed_disp_mode_crt = 0; // assume LCD
425 if ((depth != 4) && (depth != 8) && (depth != 16)) {
426 diag_printf("Invalid depth: %d\n", depth);
430 // enable host access
431 SED1356_REG_REV_and_MISC = 0x0000;
433 // Check the ID to make sure we even have a SED1356 installed
434 temp16 = SED1356_REG_REV_and_MISC & H2SED(SED1356_REV_ID_MASK);
436 if (temp16 != H2SED(SED1356_REV_ID_1356)){
437 diag_printf("SED1356 Not Found! SED_REG_REV = %04x.\n", temp16);
441 // Disable the display
442 SED1356_REG_DISP_MODE = H2SED(SED1356_DISP_SWIV_NORM |
443 SED1356_DISP_MODE_OFF);
445 // Test for the presence of a CRT
446 SED1356_REG_GPIO_CTL = 0x0000; // Disable Backlight
447 SED1356_REG_GPIO_CFG = H2SED(SED1356_GPIO_GPIO1); // GPIO1 Out, GPIO2 In
448 if (SED1356_CRT) sed_disp_mode_crt = 0;
449 else sed_disp_mode_crt = 1;
451 // Enable Power Save Mode before we mess with the clocks
452 SED1356_REG_MEM_CFG_and_REF_RATE = H2SED(SED1356_REF_TYPE_SELF); // set dram to self refresh first
454 SED1356_REG_PWR_CFG_and_STAT = H2SED(SED1356_PWR_MCLK);
456 // Wait until power is down - when MCLK bit goes true
457 while ((SED1356_REG_PWR_CFG_and_STAT & H2SED(SED1356_PWR_MCLK)) == 0){}
459 // Change the programmable clock generator to the desired timing
460 if (sed_disp_mode_crt) fs6377_init(SED_DISP_MODE_CRT);
461 else fs6377_init(SED_DISP_MODE_LCD);
464 SED1356_REG_PWR_CFG_and_STAT = 0x0000;
466 // Common Control Registers
467 SED1356_REG_MCLK_CFG = H2SED(SED1356_MCLK_SRC_BCLK);
468 SED1356_REG_LCD_PCLK_CFG = H2SED(SED1356_PCLK_SRC_CLKI);
469 SED1356_REG_CRT_PCLK_CFG = H2SED(SED1356_PCLK_SRC_CLKI);
470 SED1356_REG_MEDIA_PCLK_CFG = 0x0000;
471 SED1356_REG_WAIT_STATE = H2SED(0x0001);
472 SED1356_REG_MEM_CFG_and_REF_RATE = H2SED(SED1356_MEM_CFG_2CAS_EDO |
473 SED1356_REF_RATE_2048);
474 SED1356_REG_MEM_TMG0_and_1 = H2SED(SED1356_MEM_TMG0_EDO50_MCLK33 |
475 SED1356_MEM_TMG1_EDO50_MCLK33);
476 SED1356_REG_PANEL_TYPE_and_MOD_RATE = H2SED(SED1356_PANEL_TYPE_16 |
477 SED1356_PANEL_TYPE_CLR |
478 SED1356_PANEL_TYPE_TFT);
480 // LCD Specific Registers
481 SED1356_REG_LCD_HOR_DISP = H2SED((PIXELS_PER_ROW/8) - 1);
482 SED1356_REG_LCD_HOR_NONDISP_and_START = H2SED(SED_HOR_NONDISP_LCD |
483 (SED_HOR_PULSE_START_LCD << 8));
484 SED1356_REG_LCD_HOR_PULSE = H2SED(SED1356_PULSE_WID(SED_HOR_PULSE_WIDTH_LCD) |
485 SED1356_PULSE_POL_LOW);
486 SED1356_REG_LCD_VER_DISP_HT_LO_and_HI = H2SED((PIXELS_PER_COL - 1) & 0x3ff);
487 SED1356_REG_LCD_VER_NONDISP_and_START = H2SED(SED_VER_NONDISP_LCD |
488 (SED_VER_PULSE_START_LCD << 8));
489 SED1356_REG_LCD_VER_PULSE = H2SED(SED1356_PULSE_WID(SED_VER_PULSE_WIDTH_LCD) |
490 SED1356_PULSE_POL_LOW);
492 case 4: SED1356_REG_LCD_DISP_MODE_and_MISC = H2SED(SED1356_LCD_DISP_BLANK |
493 SED1356_LCD_DISP_SWIV_NORM |
494 SED1356_LCD_DISP_4BPP);
496 case 8: SED1356_REG_LCD_DISP_MODE_and_MISC = H2SED(SED1356_LCD_DISP_BLANK |
497 SED1356_LCD_DISP_SWIV_NORM |
498 SED1356_LCD_DISP_8BPP);
500 default: SED1356_REG_LCD_DISP_MODE_and_MISC = H2SED(SED1356_LCD_DISP_BLANK |
501 SED1356_LCD_DISP_SWIV_NORM |
502 SED1356_LCD_DISP_16BPP); break;
505 SED1356_REG_LCD_DISP_START_LO_and_MID = 0x0000;
506 SED1356_REG_LCD_DISP_START_HI = 0x0000;
507 SED1356_REG_LCD_ADD_OFFSET_LO_and_HI = H2SED((SED_ROW_SIZE(depth) / 2) & 0x7ff);
508 SED1356_REG_LCD_PIXEL_PAN = 0x0000;
509 SED1356_REG_LCD_FIFO_THRESH_LO_and_HI = 0x0000; // auto mode
511 // LCD Specific Registers
512 SED1356_REG_CRT_HOR_DISP = H2SED((PIXELS_PER_ROW/8) - 1);
513 SED1356_REG_CRT_HOR_NONDISP_and_START = H2SED(SED_HOR_NONDISP_CRT |
514 (SED_HOR_PULSE_START_CRT << 8));
515 SED1356_REG_CRT_HOR_PULSE = H2SED(SED1356_PULSE_WID(SED_HOR_PULSE_WIDTH_CRT) |
516 SED1356_PULSE_POL_LOW);
517 SED1356_REG_CRT_VER_DISP_HT_LO_and_HI = H2SED((PIXELS_PER_COL - 1) & 0x3ff);
518 SED1356_REG_CRT_VER_NONDISP_and_START = H2SED(SED_VER_NONDISP_CRT |
519 (SED_VER_PULSE_START_CRT << 8));
520 SED1356_REG_CRT_VER_PULSE_and_OUT_CTL = H2SED(SED1356_PULSE_WID(SED_VER_PULSE_WIDTH_CRT) |
521 SED1356_PULSE_POL_LOW | SED1356_CRT_OUT_DAC_LVL);
523 case 4: SED1356_REG_CRT_DISP_MODE = H2SED(SED1356_CRT_DISP_BLANK |
524 SED1356_CRT_DISP_4BPP);
526 case 8: SED1356_REG_CRT_DISP_MODE = H2SED(SED1356_CRT_DISP_BLANK |
527 SED1356_CRT_DISP_8BPP);
529 default: SED1356_REG_CRT_DISP_MODE = H2SED(SED1356_CRT_DISP_BLANK |
530 SED1356_CRT_DISP_16BPP);
535 SED1356_REG_CRT_DISP_START_LO_and_MID = 0x0000;
536 SED1356_REG_CRT_DISP_START_HI = 0x0000;
537 SED1356_REG_CRT_ADD_OFFSET_LO_and_HI = H2SED((SED_ROW_SIZE(depth) / 2) & 0x7ff);
538 SED1356_REG_CRT_PIXEL_PAN = 0x0000;
539 SED1356_REG_CRT_FIFO_THRESH_LO_and_HI = 0x0000; // auto mode
542 SED1356_REG_LCD_CURSOR_CTL_and_START_ADD = 0x0000;
543 SED1356_REG_CRT_CURSOR_CTL_and_START_ADD = 0x0000;
546 SED1356_REG_BLT_CTL_0_and_1 = 0x0000;
547 SED1356_REG_BLT_ROP_CODE_and_BLT_OP = 0x0000;
548 SED1356_REG_BLT_SRC_START_LO_and_MID = 0x0000;
549 SED1356_REG_BLT_SRC_START_HI = 0x0000;
550 SED1356_REG_BLT_DEST_START_LO_and_MID = 0x0000;
551 SED1356_REG_BLT_DEST_START_HI = 0x0000;
552 SED1356_REG_BLT_ADD_OFFSET_LO_and_HI = 0x0000;
553 SED1356_REG_BLT_WID_LO_and_HI = 0x0000;
554 SED1356_REG_BLT_HGT_LO_and_HI = 0x0000;
555 SED1356_REG_BLT_BG_CLR_LO_and_HI = 0x0000;
556 SED1356_REG_BLT_FG_CLR_LO_and_HI = 0x0000;
558 // Fill the LUT, write to both LCD and CRT luts simultaneously
559 SED1356_REG_LUT_MODE = 0x0000;
560 for (i = 0; i < 256; i++){
562 SED1356_REG_LUT_ADD = H2SED(i);
563 SED1356_REG_LUT_DATA = H2SED(sed_lut_16bit[i][0]); // red
564 SED1356_REG_LUT_DATA = H2SED(sed_lut_16bit[i][1]); // green
565 SED1356_REG_LUT_DATA = H2SED(sed_lut_16bit[i][2]); // blue
568 // Disable Power Save Mode
569 SED1356_REG_PWR_CFG_and_STAT = 0x0000;
572 // SED1356_REG_WATCHDOG_CTL = 0x0000;
574 // Device found & initialized
577 // turn on the display
580 // Fill in the info structure
581 lcd->height = 480; // FIXME
582 lcd->width = 640; // FIXME
584 lcd->type = FB_TRUE_RGB565;
585 lcd->rlen = (640*2*2); // FIXME
586 lcd->access_size = 2; // Framebuffer fixed at 16 bit access
587 lcd->stride = 4; // Only on "odd" 16 byte chunks
588 lcd->fb = SED_GET_PHYS_ADD(0);
589 lcd->on = sed135x_on;
590 lcd->off = sed135x_off;
595 //--------------------------------------------------------------------------
601 // Enable Host Access
602 SED1356_REG_REV_and_MISC = 0x0000;
604 // Disable the display
605 SED1356_REG_DISP_MODE = H2SED(SED1356_DISP_MODE_OFF);
607 // Enable Power Save Mode
608 // set dram to self refresh first
609 SED1356_REG_MEM_CFG_and_REF_RATE = H2SED(SED1356_REF_TYPE_SELF);
612 SED1356_REG_PWR_CFG_and_STAT = H2SED(SED1356_PWR_MCLK);
614 // Wait until power is down - when MCLK bit goes true
615 while ((SED1356_REG_PWR_CFG_and_STAT & H2SED(SED1356_PWR_MCLK)) == 0){}