summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/csb337/console/sed1356_16bit.h
blob: 87eebbcfe7fcaddeba35882a78ae1adc07e15862 (plain) (blame)
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
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
/*
 * sed1356.h: SED1356 LCD/CRT Controllers for KIT637_V6 (CSB637)
 *            16-Bit access mode
 *
 *  Based upon code from MicroMonitor 1.17 from http://www.umonfw.com/
 *  which includes this notice:
 *
 **************************************************************************
 *  General notice:
 *  This code is part of a boot-monitor package developed as a generic base
 *  platform for embedded system designs.  As such, it is likely to be
 *  distributed to various projects beyond the control of the original
 *  author.  Please notify the author of any enhancements made or bugs found
 *  so that all may benefit from the changes.  In addition, notification back
 *  to the author will allow the new user to pick up changes that may have
 *  been made by other users after this version of the code was distributed.
 *
 *  Note1: the majority of this code was edited with 4-space tabs.
 *  Note2: as more and more contributions are accepted, the term "author"
 *         is becoming a mis-representation of credit.
 *
 *  Original author:    Ed Sutter
 *  Email:              esutter@alcatel-lucent.com
 *  Phone:              908-582-2351
 **************************************************************************
 *
 *  Ed Sutter has been informed that this code is being used in RTEMS.
 *
 *  The code has been reformatted by Joel Sherrill from OAR Corporation and 
 *  Fernando Nicodemos <fgnicodemos@terra.com.br> from NCB - Sistemas
 *  Embarcados Ltda. (Brazil) to be more compliant with RTEMS coding standards 
 *  and to eliminate C++ style comments.
 */

#ifndef __sed1356_16bit_h
#define __sed1356_16bit_h

#include "bits.h"
/*------------------------------------------------------------------------
 * cpu specific code must define the following board specific macros.
 * in cpuio.h.  These examples assume the SED135x has been placed in
 * the correct endian mode via hardware.
 * #define SED_MEM_BASE   0xf0600000 <-- just example addresses,
 * #define SED_REG_BASE    0xf0400000 <-- define for each board
 * #define SED_STEP      1 <-- 1 = device is on 16-bit boundry, 2 = 32-bit boundry, 4 = 64-bit boundry
 * #define SED_REG16(_x_)    *(vushortr *)(SED_REG_BASE + (_x_ * SED_STEP))  // Control/Status Registers
 * #define RD_FB16(_reg_,_val_) ((_val_) = *((vushort *)((SED_MEM_BASE + (_reg_ * SED_STEP)))))
 * #define WR_FB16(_reg_,_val_) (*((vushort *)((SED_MEM_BASE + (_reg_ * 2)))) = (_val_))
 * Big endian processors
 * #define H2SED(_x_)  ((((x) & 0xff00U) >> 8) | (((x) & 0x00ffU) << 8))
 * Little endian
 * #define H2SED(_x_)  (_x_)
 *
 */

/*
 * SED1356 registers - 16-Bit Access Mode.  The first register
 * referenced is the even addressed register.  The byte offsets
 * of the odd registers are shown in the comments
 */
#define SED1356_REG_REV_and_MISC                 SED_REG16(0x00)
#define SED1356_REG_GPIO_CFG                  SED_REG16(0x04)
#define SED1356_REG_GPIO_CTL                    SED_REG16(0x08)
#define SED1356_REG_MD_CFG_RD_LO_and_HI          SED_REG16(0x0c)
#define SED1356_REG_MCLK_CFG                     SED_REG16(0x10)
#define SED1356_REG_LCD_PCLK_CFG                 SED_REG16(0x14)
#define SED1356_REG_CRT_PCLK_CFG                 SED_REG16(0x18)
#define SED1356_REG_MEDIA_PCLK_CFG               SED_REG16(0x1c)
#define SED1356_REG_WAIT_STATE                   SED_REG16(0x1e)
#define SED1356_REG_MEM_CFG_and_REF_RATE           SED_REG16(0x20)
#define SED1356_REG_MEM_TMG0_and_1               SED_REG16(0x2a)
#define SED1356_REG_PANEL_TYPE_and_MOD_RATE       SED_REG16(0x30)
/* LCD Control registers */
#define SED1356_REG_LCD_HOR_DISP                 SED_REG16(0x32)
#define SED1356_REG_LCD_HOR_NONDISP_and_START    SED_REG16(0x34)
#define SED1356_REG_LCD_HOR_PULSE               SED_REG16(0x36)
#define SED1356_REG_LCD_VER_DISP_HT_LO_and_HI      SED_REG16(0x38)
#define SED1356_REG_LCD_VER_NONDISP_and_START      SED_REG16(0x3a)
#define SED1356_REG_LCD_VER_PULSE                SED_REG16(0x3c)
#define SED1356_REG_LCD_DISP_MODE_and_MISC      SED_REG16(0x40)
#define SED1356_REG_LCD_DISP_START_LO_and_MID    SED_REG16(0x42)
#define SED1356_REG_LCD_DISP_START_HI           SED_REG16(0x44)
#define SED1356_REG_LCD_ADD_OFFSET_LO_and_HI    SED_REG16(0x46)
#define SED1356_REG_LCD_PIXEL_PAN             SED_REG16(0x48)
#define SED1356_REG_LCD_FIFO_THRESH_LO_and_HI    SED_REG16(0x4a)
/* CRT/TV Control registers */
#define SED1356_REG_CRT_HOR_DISP                 SED_REG16(0x50)
#define SED1356_REG_CRT_HOR_NONDISP_and_START    SED_REG16(0x52)
#define SED1356_REG_CRT_HOR_PULSE               SED_REG16(0x54)
#define SED1356_REG_CRT_VER_DISP_HT_LO_and_HI      SED_REG16(0x56)
#define SED1356_REG_CRT_VER_NONDISP_and_START    SED_REG16(0x58)
#define SED1356_REG_CRT_VER_PULSE_and_OUT_CTL    SED_REG16(0x5a)
#define SED1356_REG_CRT_DISP_MODE          SED_REG16(0x60)
#define SED1356_REG_CRT_DISP_START_LO_and_MID       SED_REG16(0x62)
#define SED1356_REG_CRT_DISP_START_HI           SED_REG16(0x64)
#define SED1356_REG_CRT_ADD_OFFSET_LO_and_HI       SED_REG16(0x66)
#define SED1356_REG_CRT_PIXEL_PAN             SED_REG16(0x68)
#define SED1356_REG_CRT_FIFO_THRESH_LO_and_HI      SED_REG16(0x6a)
/* LCD Cursor Control Registers */
#define SED1356_REG_LCD_CURSOR_CTL_and_START_ADD  SED_REG16(0x70)
#define SED1356_REG_LCD_CURSOR_X_POS_LO_and_HI     SED_REG16(0x72)
#define SED1356_REG_LCD_CURSOR_Y_POS_LO_and_HI    SED_REG16(0x74)
#define SED1356_REG_LCD_CURSOR_BLUE_and_GREEN_CLR_0  SED_REG16(0x76)
#define SED1356_REG_LCD_CURSOR_RED_CLR_0      SED_REG16(0x78)
#define SED1356_REG_LCD_CURSOR_BLUE_and_GREEN_CLR_1  SED_REG16(0x7a)
#define SED1356_REG_LCD_CURSOR_RED_CLR_1      SED_REG16(0x7c)
#define SED1356_REG_LCD_CURSOR_FIFO_THRESH      SED_REG16(0x7e)
/* CRT Cursor Control Registers */
#define SED1356_REG_CRT_CURSOR_CTL_and_START_ADD  SED_REG16(0x80)
#define SED1356_REG_CRT_CURSOR_X_POS_LO_and_HI     SED_REG16(0x82)
#define SED1356_REG_CRT_CURSOR_Y_POS_LO_and_HI    SED_REG16(0x84)
#define SED1356_REG_CRT_CURSOR_BLUE_and_GREEN_CLR_0  SED_REG16(0x86)
#define SED1356_REG_CRT_CURSOR_RED_CLR_0      SED_REG16(0x88)
#define SED1356_REG_CRT_CURSOR_BLUE_and_GREEN_CLR_1  SED_REG16(0x8a)
#define SED1356_REG_CRT_CURSOR_RED_CLR_1      SED_REG16(0x8c)
#define SED1356_REG_CRT_CURSOR_FIFO_THRESH      SED_REG16(0x8e)
/* BitBlt Control Registers */
#define SED1356_REG_BLT_CTL_0_and_1          SED_REG16(0x100)
#define SED1356_REG_BLT_ROP_CODE_and_BLT_OP      SED_REG16(0x102)
#define SED1356_REG_BLT_SRC_START_LO_and_MID    SED_REG16(0x104)
#define SED1356_REG_BLT_SRC_START_HI        SED_REG16(0x106)
#define SED1356_REG_BLT_DEST_START_LO_and_MID    SED_REG16(0x108)
#define SED1356_REG_BLT_DEST_START_HI        SED_REG16(0x10a)
#define SED1356_REG_BLT_ADD_OFFSET_LO_and_HI    SED_REG16(0x10c)
#define SED1356_REG_BLT_WID_LO_and_HI        SED_REG16(0x110)
#define SED1356_REG_BLT_HGT_LO_and_HI        SED_REG16(0x112)
#define SED1356_REG_BLT_BG_CLR_LO_and_HI      SED_REG16(0x114)
#define SED1356_REG_BLT_FG_CLR_LO_and_HI      SED_REG16(0x118)
/* Look-Up Table Control Registers */
#define SED1356_REG_LUT_MODE            SED_REG16(0x1e0)
#define SED1356_REG_LUT_ADD              SED_REG16(0x1e2)
#define SED1356_REG_LUT_DATA            SED_REG16(0x1e4)
/* Power and Miscellaneous Control Registers */
#define SED1356_REG_PWR_CFG_and_STAT        SED_REG16(0x1f0)
#define SED1356_REG_WATCHDOG_CTL          SED_REG16(0x1f4)
#define SED1356_REG_DISP_MODE            SED_REG16(0x1fc)

/*
 * Bit Assignments - Little Endian, Use H2SED() macro to access
 *
 * SED1356_REG_REV_and_MISC - even
 */
#define SED1356_REV_ID_MASK          0xfc /* ID bits - masks off the rev bits */
#define SED1356_REV_ID_1356          BIT4
#define SED1356_REV_ID_1355          BIT3

/* SED1356_REG_REV_and_MISC - odd */
#define SED1356_MISC_HOST_DIS        BIT7 << 8  /* 0 = enable host access, 1 = disable */

/* SED1356_REG_GPIO_CFG and SED1356_REG_GPIO_STAT */
#define SED1356_GPIO_GPIO3           BIT3    /* 0 = input, 1 = output, if configured as GPIO */
#define SED1356_GPIO_GPIO2           BIT2
#define SED1356_GPIO_GPIO1           BIT1

/* SED1356_REG_MCLK_CFG */
#define SED1356_MCLK_DIV2          BIT4
#define SED1356_MCLK_SRC_BCLK        BIT0
#define SED1356_MCLK_SRC_CLKI        0x00

/* SED1356_REG_LCD_PCLK_CFG, SED1356_REG_CRT_PCLK_CFG
 * and SED1356_REG_MEDIA_PCLK_CFG
 */
#define SED1356_PCLK_X2            BIT7    /* SED1356_REG_CRT_PCLK_CFG only */
#define SED1356_PCLK_DIV1          0x00 << 4
#define SED1356_PCLK_DIV2          0x01 << 4
#define SED1356_PCLK_DIV3          0x02 << 4
#define SED1356_PCLK_DIV4          0x03 << 4
#define SED1356_PCLK_SRC_CLKI        0x00
#define SED1356_PCLK_SRC_BCLK        0x01
#define SED1356_PCLK_SRC_CLKI2        0x02
#define SED1356_PCLK_SRC_MCLK        0x03

/* SED1356_REG_MEM_CFG_and_REF_RATE - even */
#define SED1356_MEM_CFG_2CAS_EDO      0x00
#define SED1356_MEM_CFG_2CAS_FPM      0x01
#define SED1356_MEM_CFG_2WE_EDO        0x02
#define SED1356_MEM_CFG_2WE_FPM        0x03
#define SED1356_MEM_CFG_MASK        0x03

/* SED1356_REG_MEM_CFG_and_REF_RATE - odd */
#define SED1356_REF_TYPE_CBR        0x00 << 6 << 8
#define SED1356_REF_TYPE_SELF        0x01 << 6 << 8
#define SED1356_REF_TYPE_NONE        0x02 << 6 << 8
#define SED1356_REF_TYPE_MASK        0x03 << 6 << 8
#define SED1356_REF_RATE_64          0x00 << 0 << 8  /* MCLK / 64 */
#define SED1356_REF_RATE_128        0x01 << 0 << 8  /* MCLK / 128 */
#define SED1356_REF_RATE_256        0x02 << 0 << 8  /* MCLK / 256 */
#define SED1356_REF_RATE_512        0x03 << 0 << 8  /* MCLK / 512 */
#define SED1356_REF_RATE_1024        0x04 << 0 << 8  /* MCLK / 1024 */
#define SED1356_REF_RATE_2048        0x05 << 0 << 8  /* MCLK / 2048 */
#define SED1356_REF_RATE_4096        0x06 << 0 << 8  /* MCLK / 4096 */
#define SED1356_REF_RATE_8192        0x07 << 0 << 8  /* MCLK / 8192 */
#define SED1356_REF_RATE_MASK        0x07 << 0 << 8  /* MCLK / 8192 */

/* SED1356_REG_MEM_TMG0_and_1 - even */
#define SED1356_MEM_TMG0_EDO50_MCLK40    0x01
#define SED1356_MEM_TMG0_EDO50_MCLK33    0x01
#define SED1356_MEM_TMG0_EDO60_MCLK33    0x01
#define SED1356_MEM_TMG0_EDO50_MCLK30    0x12
#define SED1356_MEM_TMG0_EDO60_MCLK30    0x01
#define SED1356_MEM_TMG0_EDO70_MCLK30    0x00
#define SED1356_MEM_TMG0_EDO50_MCLK25    0x12
#define SED1356_MEM_TMG0_EDO60_MCLK25    0x12
#define SED1356_MEM_TMG0_EDO70_MCLK25    0x01
#define SED1356_MEM_TMG0_EDO80_MCLK25    0x00
#define SED1356_MEM_TMG0_EDO50_MCLK20    0x12
#define SED1356_MEM_TMG0_EDO60_MCLK20    0x12
#define SED1356_MEM_TMG0_EDO70_MCLK20    0x12
#define SED1356_MEM_TMG0_EDO80_MCLK20    0x01
#define SED1356_MEM_TMG0_FPM50_MCLK25    0x12
#define SED1356_MEM_TMG0_FPM60_MCLK25    0x01
#define SED1356_MEM_TMG0_FPM50_MCLK20    0x12
#define SED1356_MEM_TMG0_FPM60_MCLK20    0x12
#define SED1356_MEM_TMG0_FPM70_MCLK20    0x11
#define SED1356_MEM_TMG0_FPM80_MCLK20    0x01

/* SED1356_REG_MEM_TMG0_and_1 - odd */
#define SED1356_MEM_TMG1_EDO50_MCLK40    0x01 << 8
#define SED1356_MEM_TMG1_EDO50_MCLK33    0x01 << 8
#define SED1356_MEM_TMG1_EDO60_MCLK33    0x01 << 8
#define SED1356_MEM_TMG1_EDO50_MCLK30    0x02 << 8
#define SED1356_MEM_TMG1_EDO60_MCLK30    0x01 << 8
#define SED1356_MEM_TMG1_EDO70_MCLK30    0x00 << 8
#define SED1356_MEM_TMG1_EDO50_MCLK25    0x02 << 8
#define SED1356_MEM_TMG1_EDO60_MCLK25    0x02 << 8
#define SED1356_MEM_TMG1_EDO70_MCLK25    0x01 << 8
#define SED1356_MEM_TMG1_EDO80_MCLK25    0x01 << 8
#define SED1356_MEM_TMG1_EDO50_MCLK20    0x02 << 8
#define SED1356_MEM_TMG1_EDO60_MCLK20    0x02 << 8
#define SED1356_MEM_TMG1_EDO70_MCLK20    0x02 << 8
#define SED1356_MEM_TMG1_EDO80_MCLK20    0x01 << 8
#define SED1356_MEM_TMG1_FPM50_MCLK25    0x02 << 8
#define SED1356_MEM_TMG1_FPM60_MCLK25    0x01 << 8
#define SED1356_MEM_TMG1_FPM50_MCLK20    0x02 << 8
#define SED1356_MEM_TMG1_FPM60_MCLK20    0x02 << 8
#define SED1356_MEM_TMG1_FPM70_MCLK20    0x02 << 8
#define SED1356_MEM_TMG1_FPM80_MCLK20    0x01 << 8


/* Bit definitions
 *
 * SED1356_REG_PANEL_TYPE_AND_MOD_RATE - even
 */
#define SED1356_PANEL_TYPE_EL      BIT7
#define SED1356_PANEL_TYPE_4_9      (0x00 << 4)    /* Passive 4-Bit, TFT 9-Bit */
#define SED1356_PANEL_TYPE_8_12      (0x01 << 4)    /* Passive 8-Bit, TFT 12-Bit */
#define SED1356_PANEL_TYPE_16      (0x02 << 4)    /* Passive 16-Bit, or TFT 18-Bit */
#define SED1356_PANEL_TYPE_MASK      (0x03 << 4)
#define SED1356_PANEL_TYPE_FMT      BIT3      /* 0 = Passive Format 1, 1 = Passive Format 2 */
#define SED1356_PANEL_TYPE_CLR      BIT2      /* 0 = Passive Mono, 1 = Passive Color */
#define SED1356_PANEL_TYPE_DUAL      BIT1      /* 0 = Passive Single, 1 = Passive Dual */
#define SED1356_PANEL_TYPE_TFT      BIT0      /* 0 = Passive, 1 = TFT (DUAL, FMT & CLR are don't cares) */

/* SED1356_REG_CRT_HOR_PULSE, SED1356_REG_CRT_VER_PULSE,
 * SED1356_REG_LCD_HOR_PULSE and SED1356_REG_LCD_VER_PULSE
 */
#define SED1356_PULSE_POL_HIGH      BIT7      /* 0 = CRT/TFT Pulse is Low, Passive is High, 1 = CRT/TFT Pulse is High, Passive is Low */
#define SED1356_PULSE_POL_LOW      0x00      /* 0 = CRT/TFT Pulse is Low, Passive is High, 1 = CRT/TFT Pulse is High, Passive is Low */
#define SED1356_PULSE_WID(_x_)      (_x_ & 0x0f)  /* Pulse Width in Pixels */

/* SED1356_LCD_DISP_MODE_and_MISC - even         */
#define SED1356_LCD_DISP_BLANK      BIT7      /* 1 = Blank LCD Display */
#define SED1356_LCD_DISP_SWIV_NORM    (0x00 << 4)    /* Used with SED1356_REG_DISP_MODE Bit 6 */
#define SED1356_LCD_DISP_SWIV_90    (0x00 << 4)
#define SED1356_LCD_DISP_SWIV_180    (0x01 << 4)
#define SED1356_LCD_DISP_SWIV_270    (0x01 << 4)
#define SED1356_LCD_DISP_SWIV_MASK    (0x01 << 4)
#define SED1356_LCD_DISP_16BPP      0x05      /* Bit Per Pixel Selection */
#define SED1356_LCD_DISP_15BPP      0x04
#define SED1356_LCD_DISP_8BPP      0x03
#define SED1356_LCD_DISP_4BPP      0x02
#define SED1356_LCD_DISP_BPP_MASK    0x07

/* SED1356_LCD_DISP_MODE_and_MISC - odd */
#define SED1356_LCD_MISC_DITH      BIT1 << 8    /* 1 = Dither Disable, Passive Panel Only */
#define SED1356_LCD_MISC_DUAL      BIT0 << 8    /* 1 = Dual Panel Disable, Passive Panel Only */

/* SED1356_REG_CRT_VER_PULSE_and_OUT_CTL - odd */
#define SED1356_CRT_OUT_CHROM      BIT5 << 8    /* 1 = TV Chrominance Filter Enable */
#define SED1356_CRT_OUT_LUM        BIT4 << 8    /* 1 = TV Luminance Filter Enable */
#define SED1356_CRT_OUT_DAC_LVL      BIT3 << 8    /* 1 = 4.6ma IREF, 0 = 9.2 IREF */
#define SED1356_CRT_OUT_SVIDEO      BIT1 << 8    /* 1 = S-Video Output, 0 = Composite Video Output */
#define SED1356_CRT_OUT_PAL        BIT0 << 8    /* 1 = PAL Format Output, 0 = NTSC Format Output */

/* SED1356_REG_CRT_DISP_MODE */
#define SED1356_CRT_DISP_BLANK      BIT7      /* 1 = Blank CRT Display */
#define SED1356_CRT_DISP_16BPP      0x05      /* Bit Per Pixel Selection */
#define SED1356_CRT_DISP_15BPP      0x04
#define SED1356_CRT_DISP_8BPP      0x03
#define SED1356_CRT_DISP_4BPP      0x02
#define SED1356_CRT_DISP_BPP_MASK    0x07

/* SED1356_DISP_MODE         */
#define SED1356_DISP_SWIV_NORM      (0x00 << 6)    /* Used with SED1356_LCD_DISP_MODE Bit 4 */
#define SED1356_DISP_SWIV_90      (0x01 << 6)
#define SED1356_DISP_SWIV_180      (0x00 << 6)
#define SED1356_DISP_SWIV_270      (0x01 << 6)
#define SED1356_DISP_MODE_OFF      0x00      /* All Displays Off */
#define SED1356_DISP_MODE_LCD      0x01      /* LCD Only */
#define SED1356_DISP_MODE_CRT      0x02      /* CRT Only */
#define SED1356_DISP_MODE_LCD_CRT    0x03      /* Simultaneous LCD and CRT */
#define SED1356_DISP_MODE_TV      0x04      /* TV Only, Flicker Filter Off */
#define SED1356_DISP_MODE_TV_LCD    0x05      /* Simultaneous LCD and TV, Flicker Filter Off */
#define SED1356_DISP_MODE_TV_FLICK    0x06      /* TV Only, Flicker Filter On */
#define SED1356_DISP_MODE_TV_LCD_FLICK  0x07      /* Simultaneous LCD and TV, Flicker Filter On */

/* SED1356_REG_PWR_CFG and SED1356_REG_PWR_STAT */
#define SED1356_PWR_PCLK        BIT1      /* SED1356_REG_PWR_STAT only */
#define SED1356_PWR_MCLK        BIT0

/* SED1356_REG_VER_NONDISP */
#define SED1356_VER_NONDISP        BIT7      /* vertical retrace status 1 = in retrace */

/* Display size defines */
extern long PIXELS_PER_ROW;
extern long PIXELS_PER_COL;
#define BYTES_PER_PIXEL    2
extern long COLS_PER_SCREEN;
extern long ROWS_PER_SCREEN;

/* 16-bit pixels are RGB 565 - LSB of RED and BLUE are tied low at the  */
/* LCD Interface, while the LSB of GREEN is loaded as 0 */
#define RED_SUBPIXEL(n)    ((n & 0x1f) << 11)
#define GREEN_SUBPIXEL(n)  ((n & 0x1f) << 5)
#define BLUE_SUBPIXEL(n)  ((n & 0x1f) << 0)

/* define a simple VGA style 16-color pallette */
#if 0
#define  LU_BLACK    (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x00))
#define  LU_BLUE      (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x0f))
#define  LU_GREEN    (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x0f) | BLUE_SUBPIXEL(0x00))
#define  LU_CYAN      (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x0f) | BLUE_SUBPIXEL(0x0f))
#define  LU_RED      (RED_SUBPIXEL(0x0f) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x00))
#define  LU_VIOLET    (RED_SUBPIXEL(0x0f) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x0f))
#define  LU_YELLOW    (RED_SUBPIXEL(0x0f) | GREEN_SUBPIXEL(0x0f) | BLUE_SUBPIXEL(0x00))
#define  LU_GREY      (RED_SUBPIXEL(0x0f) | GREEN_SUBPIXEL(0x0f) | BLUE_SUBPIXEL(0x0f))
#define  LU_WHITE    (RED_SUBPIXEL(0x17) | GREEN_SUBPIXEL(0x17) | BLUE_SUBPIXEL(0x17))
#define  LU_BRT_BLUE    (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x1f))
#define  LU_BRT_GREEN  (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x1f) | BLUE_SUBPIXEL(0x00))
#define  LU_BRT_CYAN    (RED_SUBPIXEL(0x00) | GREEN_SUBPIXEL(0x1f) | BLUE_SUBPIXEL(0x1f))
#define  LU_BRT_RED    (RED_SUBPIXEL(0x1f) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x00))
#define  LU_BRT_VIOLET  (RED_SUBPIXEL(0x1f) | GREEN_SUBPIXEL(0x00) | BLUE_SUBPIXEL(0x1f))
#define  LU_BRT_YELLOW  (RED_SUBPIXEL(0x1f) | GREEN_SUBPIXEL(0x1f) | BLUE_SUBPIXEL(0x00))
#define  LU_BRT_WHITE  (RED_SUBPIXEL(0x1f) | GREEN_SUBPIXEL(0x1f) | BLUE_SUBPIXEL(0x1f))
/*    RED,  GREEN, BLUE    Entry */
  { 0x00,  0x00, 0x00, },  /* LU_BLACK     */
  { 0x00,  0x00, 0xA0, },  /* LU_BLUE       */
  { 0x00,  0xA0, 0x00, },  /* LU_GREEN     */
  { 0x00,  0xA0, 0xA0, },  /* LU_CYAN       */
  { 0xA0,  0x00, 0x00, },  /* LU_RED       */
  { 0xA0,  0x00, 0xA0, },  /* LU_VIOLET     */
  { 0xA0,  0xA0, 0x00, },  /* LU_YELLOW     */
  { 0xA0,  0xA0, 0xA0, },  /* LU_WHITE     */
  { 0x50,  0x50, 0x50, },  /* LU_GREY       */
  { 0x50,  0x50, 0xF0, },  /* LU_BRT_BLUE     */
  { 0x50,  0xF0, 0x50, },  /* LU_BRT_GREEN   */
  { 0x50,  0xF0, 0xF0, },  /* LU_BRT_CYAN     */
  { 0xF0,  0x50, 0x50, },  /* LU_BRT_RED     */
  { 0xF0,  0x50, 0xF0, },  /* LU_BRT_VIOLET   */
  { 0xF0,  0xF0, 0x50, },  /* LU_BRT_YELLOW   */
  { 0xF0,  0xF0, 0xF0, },  /* LU_BRT_WHITE   */
#endif

#define BLUE      (0x14 << 0)
#define GREEN      (0x14 << 6)
#define RED        (0x14 << 11)

#define HALF_BLUE    (0x0a << 0)
#define HALF_GREEN    (0x0a << 6)
#define HALF_RED    (0x0a << 11)


#define BRT_BLUE     (0x1e << 0)
#define BRT_GREEN    (0x1e << 6)
#define BRT_RED      (0x1e << 11)

#define  LU_BLACK    0
#define  LU_BLUE      (BLUE)
#define  LU_GREEN    (GREEN)
#define  LU_CYAN      (GREEN | BLUE)
#define  LU_RED      (RED)
#define  LU_VIOLET    (RED | BLUE)
#define  LU_YELLOW    (RED | GREEN)
#define  LU_WHITE    (RED | GREEN | BLUE)
#define  LU_GREY      (HALF_RED | HALF_GREEN | HALF_BLUE)
#define  LU_BRT_BLUE    (HALF_RED | HALF_GREEN | BRT_BLUE)
#define  LU_BRT_GREEN  (HALF_RED | BRT_GREEN | HALF_BLUE)
#define  LU_BRT_CYAN    (HALF_RED | BRT_GREEN | BRT_BLUE)
#define  LU_BRT_RED    (BRT_RED | HALF_GREEN | HALF_BLUE)
#define  LU_BRT_VIOLET  (BRT_RED | HALF_GREEN | BRT_BLUE)
#define  LU_BRT_YELLOW  (BRT_RED | BRT_GREEN | HALF_BLUE)
#define  LU_BRT_WHITE  (BRT_RED | BRT_GREEN | BRT_BLUE)

const ushort vga_lookup[] = {
LU_BLACK,        /* 0 */
LU_BLUE,        /* 1 */
LU_GREEN,        /* 2 */
LU_CYAN,        /* 3 */
LU_RED,          /* 4 */
LU_VIOLET,        /* 5 */
LU_YELLOW,        /* 6 */
LU_WHITE,        /* 7 */
LU_GREY,        /* 8 */
LU_BRT_BLUE,      /* 9 */
LU_BRT_GREEN,      /* 10 */
LU_BRT_CYAN,      /* 11 */
LU_BRT_RED,        /* 12 */
LU_BRT_VIOLET,      /* 13 */
LU_BRT_YELLOW,      /* 14 */
LU_BRT_WHITE      /* 15 */
};

/* default foreground and background colors */
#define SED_BG_DEF      1
#define SED_FG_DEF      14

/*   Draw defines */
#define TOP            0
#define BOTTOM          (PIXELS_PER_COL-1)
#define LEFT          0
#define RIGHT          (PIXELS_PER_ROW-1)
#define CENTER_X        (PIXELS_PER_ROW/2)
#define CENTER_Y        (PIXELS_PER_COL/2)


/* Vertical and Horizontal Pulse, Start and Non-Display values vary depending
 * upon the mode.  The following section gives some insight into how the
 * values are arrived at.
 * ms = milliseconds, us = microseconds, ns = nanoseconds
 * Mhz = Megaherz, Khz = Kiloherz, Hz = Herz
 *
 * ***************************************************************************************************
 * CRT Mode is 640x480 @ 72Hz VESA compatible timing.  PCLK = 31.5Mhz (31.75ns)
 * ***************************************************************************************************
 *
 *                               CRT MODE HORIZONTAL TIMING PARAMETERS
 *
 *                                       |<-------Tha------->|
 *                                       |___________________|                     ______
 * Display Enable   _____________________|                   |____________________|
 *                                       |                   |
 * Horizontal Pulse __           ________|___________________|________          __________
 *                    |_________|        |                   |        |________|
 *                    |<- Thp ->|        |                   |        |
 *                    |         |<-Thbp->|                   |        |
 *                    |                                      |<-Thfp->|
 *                    |<----------------------Tht-------------------->|
 *
 * Tha  - Active Display Time                      = 640 pixels
 * Thp  - Horizontal Pulse       = 1.27us/31.75ns  =  40 pixels
 * Thbp - Horizontal Front Porch = 1.016us/31.75ns =  32 pixels
 * Thfp - Horizontal Back Porch  = 3.8us/31.75ns   = 120 pixels
 * Tht  - Total Horizontal Time                    = 832 pixels x 32.75ns/pixel = 26.416us or 38.785Khz
 *
 * Correlation between horizontal timing parameters and SED registers
 */
#define SED_HOR_PULSE_WIDTH_CRT 0x07 /* Horizontal Pulse Width Register           = (Thp/8) - 1 */
#define SED_HOR_PULSE_START_CRT  0x02 /* Horizontal Pulse Start Position Register    = ((Thfp + 2)/8) - 1 */
#define SED_HOR_NONDISP_CRT    0x17 /* Horizontal Non-Display Period Register     = ((Thp + Thfp + Thbp)/8) - 1 */
/*
 *                                CRT MODE VERTICAL TIMING PARAMTERS
 *
 *                                       |<-------Tva------->|
 *                                       |___________________|                     ______
 * Display Enable   _____________________|                   |_____________________|
 *                                       |                   |
 * Vertical Pulse   __           ________|___________________|________          __________
 *                    |_________|        |                   |        |________|
 *                    |<- Tvp ->|        |                   |        |
 *                    |         |<-Tvbp->|                   |        |
 *                    |                                      |<-Tvfp->|
 *                    |<----------------------Tvt-------------------->|
 *
 * Tva  - Active Display Time   = 480 lines
 * Tvp  - Vertical Pulse        =  3 lines
 * Tvfp - Vertical Front Porch  =   9 lines
 * Tvbp - Vertical Back Porch   =  28 lines
 * Tvt  - Total Horizontal Time = 520 lines x 26.416us/line = 13.73632ms or 72.8Hz
 *
 * Correlation between vertical timing parameters and SED registers
 */
#define SED_VER_PULSE_WIDTH_CRT 0x02 // VRTC/FPFRAME Pulse Width Register    = Tvp - 1
#define SED_VER_PULSE_START_CRT 0x08 // VRTC/FPFRAME Start Position Register = Tvfp - 1
#define SED_VER_NONDISP_CRT    0x27 // Vertical Non-Display Period Register = (Tvp + Tvfp + Tvbp) - 1
/*
 *****************************************************************************************************
 * DUAL LCD Mode is 640x480 @ 60Hz VGA compatible timing.   PCLK = 25.175Mhz (39.722ns)
 *****************************************************************************************************
 *
 *                              LCD MODE HORIZONTAL TIMING PARAMTERS
 *
 *                                       |<-------Tha------->|
 *                                       |___________________|                     ______
 * Display Enable   _____________________|                   |____________________|
 *                                       |                   |
 * Horizontal Pulse __           ________|___________________|________          __________
 *                    |_________|        |                   |        |________|
 *                    |<- Thp ->|        |                   |        |
 *                    |         |<-Thbp->|                   |        |
 *                    |                                      |<-Thfp->|
 *                    |<----------------------Tht-------------------->|
 *
 * Tha  - Active Display Time                     = 640 pixels
 * Thp  - Horizontal Pulse       = 3.8us/39.72ns  =  96 pixels
 * Thfp - Horizontal Front Porch = .595us/39.72ns =  16 pixels
 * Thbp - Horizontal Backporch   = 1.9us/39.72ns  =  48 pixels
 * Tht  - Total Horizontal Time  =                = 800 pixels @ 39.72ns/pixel = 31.776us or 31.47Khz
 *
 * Correlation between horizontal timing parameters and SED registers
 *#define SED_HOR_PULSE_WIDTH_LCD 0x0b // HRTC/FPLINE Pulse Width Register       = (Thp/8) - 1
 *#define SED_HOR_PULSE_START_LCD  0x02 // HRTC/FPLINE Start Position Register    = (Thfp/8) - 2
 *#define SED_HOR_NONDISP_LCD   0x13 // Horizontal Non-Display Period Register = ((Thp + Thfp + Thbp)/8) - 1
 */
extern long SED_HOR_PULSE_WIDTH_LCD;
extern long SED_HOR_PULSE_START_LCD;
extern long SED_HOR_NONDISP_LCD;

/*
 *
 *                              LCD MODE VERTICAL TIMING PARAMTERS
 *
 *                                       |<-------Tva------->|
 *                                       |___________________|                     ______
 * Display Enable   _____________________|                   |_____________________|
 *                                       |                   |
 * Vertical Pulse   __           ________|___________________|________          __________
 *                    |_________|        |                   |        |________|
 *                    |<- Tvp ->|        |                   |        |
 *                    |         |<-Tvbp->|                   |        |
 *                    |                                      |<-Tvfp->|
 *                    |<----------------------Tvt-------------------->|
 *
 * Tva  - Active Display Time   = 480 lines
 * Tvp  - Vertical Pulse        = 2 lines
 * Tvfp - Vertical Front Porch  = 10 lines
 * Tvbp - Vertical Backporch    = 33 lines
 * Tvt  - Total Horizontal Time = 525 lines @ 31.776us/line = 16.682ms or 60Hz
 *
 * Correlation between vertical timing parameters and SED registers
 *#define SED_VER_PULSE_WIDTH_LCD 0x01 // VRTC/FPFRAME Pulse Width Register    = Tvp - 1
 *#define SED_VER_PULSE_START_LCD 0x09 // VRTC/FPFRAME Start Position Register = Tvfp - 1
 *#define SED_VER_NONDISP_LCD   0x2c // Vertical Non-Display Period Register = (Tvp + Tvfp + Tvbp) - 1
 */
extern long SED_VER_PULSE_WIDTH_LCD;
extern long SED_VER_PULSE_START_LCD;
extern long SED_VER_NONDISP_LCD;

#endif