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
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
|
/*
* Register access macros and register definitions
*
* Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1) Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2) Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3) The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef _SIS_REGS_H_
#define _SIS_REGS_H_
/*
#define SIS_NEED_inSISREG
#define SIS_NEED_inSISREGW
#define SIS_NEED_inSISREGL
#define SIS_NEED_outSISREG
#define SIS_NEED_outSISREGW
#define SIS_NEED_outSISREGL
#define SIS_NEED_orSISREG
#define SIS_NEED_andSISREG
#define SIS_NEED_inSISIDXREG
#define SIS_NEED_outSISIDXREG
#define SIS_NEED_orSISIDXREG
#define SIS_NEED_andSISIDXREG
#define SIS_NEED_setSISIDXREG
#define SIS_NEED_setSISIDXREGmask
*/
/* Video RAM access macros */
/* (Currently, these are use on all platforms; USB2VGA is handled
* entirely different in a dedicated driver)
*/
/* dest is video RAM, src is system RAM */
#define sisfbwritel(dest, data) *(dest) = (data)
#define sisfbwritelinc(dest, data) *((dest)++) = (data)
#define sisfbwritelp(dest, dataptr) *(dest) = *(dataptr)
#define sisfbwritelpinc(dest, dataptr) *((dest)++) = *((dataptr)++)
#define sisfbwritew(dest, data) *(dest) = (data)
#define sisfbwritewinc(dest, data) *((dest)++) = (data)
#define sisfbwritewp(dest, dataptr) *(dest) = *(dataptr)
#define sisfbwritewpinc(dest, dataptr) *((dest)++) = *((dataptr)++)
#define sisfbwriteb(dest, data) *(dest) = (data)
#define sisfbwritebinc(dest, data) *((dest)++) = (data)
#define sisfbwritebp(dest, dataptr) *(dest) = *(dataptr)
#define sisfbwritebpinc(dest, dataptr) *((dest)++) = *((dataptr)++)
/* Source is video RAM */
#define sisfbreadl(src) *(src)
#define sisfbreadlinc(src) *((src)++)
#define sisfbreadw(src) *(src)
#define sisfbreadwinc(src) *((src)++)
#define sisfbreadb(src) *(src)
#define sisfbreadbinc(src) *((src)++)
/* Register access macros --------------- */
#ifndef SISUSEDEVPORT
#define inSISREG(base) inb(base)
#define inSISREGW(base) inw(base)
#define inSISREGL(base) inl(base)
#define outSISREG(base,val) outb(base,val)
#define outSISREGW(base,val) outw(base,val)
#define outSISREGL(base,val) outl(base,val)
#define orSISREG(base,val) \
do { \
UChar __Temp = inSISREG(base); \
outSISREG(base, __Temp | (val)); \
} while (0)
#define andSISREG(base,val) \
do { \
UChar __Temp = inSISREG(base); \
outSISREG(base, __Temp & (val)); \
} while (0)
#define inSISIDXREG(base,idx,var) \
do { \
outSISREG(base, idx); \
var = inSISREG((base)+1); \
} while (0)
#define outSISIDXREG(base,idx,val) \
do { \
outSISREG(base, idx); \
outSISREG((base)+1, val); \
} while (0)
#define orSISIDXREG(base,idx,val) \
do { \
UChar __Temp; \
outSISREG(base, idx); \
__Temp = inSISREG((base)+1) | (val); \
outSISREG((base)+1, __Temp); \
} while (0)
#define andSISIDXREG(base,idx,and) \
do { \
UChar __Temp; \
outSISREG(base, idx); \
__Temp = inSISREG((base)+1) & (and); \
outSISREG((base)+1, __Temp); \
} while (0)
#define setSISIDXREG(base,idx,and,or) \
do { \
UChar __Temp; \
outSISREG(base, idx); \
__Temp = (inSISREG((base)+1) & (and)) | (or); \
outSISREG((base)+1, __Temp); \
} while (0)
#define setSISIDXREGmask(base,idx,data,mask) \
do { \
UChar __Temp; \
outSISREG(base, idx); \
__Temp = (inSISREG((base)+1)) & (~(mask));\
__Temp |= ((data) & (mask)); \
outSISREG((base)+1, __Temp); \
} while(0)
#else /* USEDEVPORT */
extern int sisdevport;
/* Note to self: SEEK_SET is faster than SEEK_CUR */
#ifdef SIS_NEED_inSISREG
static UChar inSISREG(ULong base)
{
UChar tmp;
lseek(sisdevport, base, SEEK_SET);
read(sisdevport, &tmp, 1);
return tmp;
}
#endif
#ifdef SIS_NEED_inSISREGW
static __inline UShort inSISREGW(ULong base)
{
UShort tmp;
lseek(sisdevport, base, SEEK_SET);
read(sisdevport, &tmp, 2);
return tmp;
}
#endif
#ifdef SIS_NEED_inSISREGL
static __inline unsigned int inSISREGL(ULong base)
{
ULong tmp;
lseek(sisdevport, base, SEEK_SET);
read(sisdevport, &tmp, 4);
return tmp;
}
#endif
#ifdef SIS_NEED_outSISREG
static void outSISREG(ULong base, UChar val)
{
lseek(sisdevport, base, SEEK_SET);
write(sisdevport, &val, 1);
}
#endif
#ifdef SIS_NEED_outSISREGW
static __inline void outSISREGW(ULong base, UShort val)
{
lseek(sisdevport, base, SEEK_SET);
write(sisdevport, &val, 2);
}
#endif
#ifdef SIS_NEED_outSISREGL
static __inline void outSISREGL(ULong base, unsigned int val)
{
lseek(sisdevport, base, SEEK_SET);
write(sisdevport, &val, 4);
}
#endif
#ifdef SIS_NEED_orSISREG
static void orSISREG(ULong base, UChar val)
{
UChar tmp;
lseek(sisdevport, base, SEEK_SET);
read(sisdevport, &tmp, 1);
tmp |= val;
lseek(sisdevport, base, SEEK_SET);
write(sisdevport, &tmp, 1);
}
#endif
#ifdef SIS_NEED_andSISREG
static void andSISREG(ULong base, UChar val)
{
UChar tmp;
lseek(sisdevport, base, SEEK_SET);
read(sisdevport, &tmp, 1);
tmp &= val;
lseek(sisdevport, base, SEEK_SET);
write(sisdevport, &tmp, 1);
}
#endif
#ifdef SIS_NEED_outSISIDXREG
static void outSISIDXREG(ULong base, UChar idx, UChar val)
{
UChar value[2];
value[0] = idx; /* sic! reads/writes bytewise! */
value[1] = val;
lseek(sisdevport, base, SEEK_SET);
write(sisdevport, &value[0], 2);
}
#endif
#ifdef SIS_NEED_inSISIDXREG
static UChar __inSISIDXREG(ULong base, UChar idx)
{
UChar tmp;
lseek(sisdevport, base, SEEK_SET);
write(sisdevport, &idx, 1);
read(sisdevport, &tmp, 1);
return tmp;
}
#define inSISIDXREG(base,idx,var) var = __inSISIDXREG(base, idx);
#endif
#ifdef SIS_NEED_orSISIDXREG
static void orSISIDXREG(ULong base, UChar idx, UChar val)
{
UChar tmp;
lseek(sisdevport, base, SEEK_SET);
write(sisdevport, &idx, 1);
read(sisdevport, &tmp, 1);
tmp |= val;
lseek(sisdevport, base + 1, SEEK_SET);
write(sisdevport, &tmp, 1);
}
#endif
#ifdef SIS_NEED_andSISIDXREG
static void andSISIDXREG(ULong base, UChar idx, UChar val)
{
UChar tmp;
lseek(sisdevport, base, SEEK_SET);
write(sisdevport, &idx, 1);
read(sisdevport, &tmp, 1);
tmp &= val;
lseek(sisdevport, base + 1, SEEK_SET);
write(sisdevport, &tmp, 1);
}
#endif
#ifdef SIS_NEED_setSISIDXREG
static void setSISIDXREG(ULong base, UChar idx,
UChar myand, UChar myor)
{
UChar tmp;
lseek(sisdevport, base, SEEK_SET);
write(sisdevport, &idx, 1);
read(sisdevport, &tmp, 1);
tmp &= myand;
tmp |= myor;
lseek(sisdevport, base + 1, SEEK_SET);
write(sisdevport, &tmp, 1);
}
#endif
#ifdef SIS_NEED_setSISIDXREGmask
static void setSISIDXREGmask(ULong base, UChar idx,
UChar data, UChar mask)
{
UChar tmp;
lseek(sisdevport, base, SEEK_SET);
write(sisdevport, &idx, 1);
read(sisdevport, &tmp, 1);
tmp &= ~(mask);
tmp |= (data & mask);
lseek(sisdevport, base + 1, SEEK_SET);
write(sisdevport, &tmp, 1);
}
#endif
#endif /* SISUSEDEVPORT */
/* Video RAM and MMIO access macros ----- */
#define sisclearvram(where, howmuch) bzero(where, howmuch)
/* MMIO */
#define SIS_MMIO_OUT8 MMIO_OUT8
#define SIS_MMIO_OUT16 MMIO_OUT16
#define SIS_MMIO_OUT32 MMIO_OUT32
#define SIS_MMIO_IN8 MMIO_IN8
#define SIS_MMIO_IN16 MMIO_IN16
#define SIS_MMIO_IN32 MMIO_IN32
/* VRAM queue acceleration */
#define SiSWriteQueue(tt)
#define SIS_WQINDEX(i) ((CARD32 *)(tt))[(i)]
#define SIS_RQINDEX(i) ((volatile CARD32 *)(tt))[(i)]
/* Port offsets --------------- */
#define AROFFSET 0x40
#define ARROFFSET 0x41
#define GROFFSET 0x4e
#define SROFFSET 0x44
#define CROFFSET 0x54
#define MISCROFFSET 0x4c
#define MISCWOFFSET 0x42
#define INPUTSTATOFFSET 0x5A
#define PART1OFFSET 0x04
#define PART2OFFSET 0x10
#define PART3OFFSET 0x12
#define PART4OFFSET 0x14
#define PART5OFFSET 0x16
#define CAPTUREOFFSET 0x00
#define VIDEOOFFSET 0x02
#define COLREGOFFSET 0x48
#define PELMASKOFFSET 0x46
#define SISAR pSiS->RelIO + AROFFSET
#define SISARR pSiS->RelIO + ARROFFSET
#define SISGR pSiS->RelIO + GROFFSET
#define SISSR pSiS->RelIO + SROFFSET
#define SISCR pSiS->RelIO + CROFFSET
#define SISMISCR pSiS->RelIO + MISCROFFSET
#define SISMISCW pSiS->RelIO + MISCWOFFSET
#define SISINPSTAT pSiS->RelIO + INPUTSTATOFFSET
#define SISPART1 pSiS->RelIO + PART1OFFSET
#define SISPART2 pSiS->RelIO + PART2OFFSET
#define SISPART3 pSiS->RelIO + PART3OFFSET
#define SISPART4 pSiS->RelIO + PART4OFFSET
#define SISPART5 pSiS->RelIO + PART5OFFSET
#define SISCAP pSiS->RelIO + CAPTUREOFFSET
#define SISVID pSiS->RelIO + VIDEOOFFSET
#define SISCOLIDXR pSiS->RelIO + COLREGOFFSET - 1
#define SISCOLIDX pSiS->RelIO + COLREGOFFSET
#define SISCOLDATA pSiS->RelIO + COLREGOFFSET + 1
#define SISCOL2IDX SISPART5
#define SISCOL2DATA SISPART5 + 1
#define SISPEL pSiS->RelIO + PELMASKOFFSET
/* Video registers (300/315/330/340 series only) --------------- */
#define Index_VI_Passwd 0x00
/* Video overlay horizontal start/end, unit=screen pixels */
#define Index_VI_Win_Hor_Disp_Start_Low 0x01
#define Index_VI_Win_Hor_Disp_End_Low 0x02
#define Index_VI_Win_Hor_Over 0x03 /* Overflow */
/* Video overlay vertical start/end, unit=screen pixels */
#define Index_VI_Win_Ver_Disp_Start_Low 0x04
#define Index_VI_Win_Ver_Disp_End_Low 0x05
#define Index_VI_Win_Ver_Over 0x06 /* Overflow */
/* Y Plane (4:2:0) or YUV (4:2:2) buffer start address, unit=word */
#define Index_VI_Disp_Y_Buf_Start_Low 0x07
#define Index_VI_Disp_Y_Buf_Start_Middle 0x08
#define Index_VI_Disp_Y_Buf_Start_High 0x09
/* U Plane (4:2:0) buffer start address, unit=word */
#define Index_VI_U_Buf_Start_Low 0x0A
#define Index_VI_U_Buf_Start_Middle 0x0B
#define Index_VI_U_Buf_Start_High 0x0C
/* V Plane (4:2:0) buffer start address, unit=word */
#define Index_VI_V_Buf_Start_Low 0x0D
#define Index_VI_V_Buf_Start_Middle 0x0E
#define Index_VI_V_Buf_Start_High 0x0F
/* Pitch for Y, UV Planes, unit=word */
#define Index_VI_Disp_Y_Buf_Pitch_Low 0x10
#define Index_VI_Disp_UV_Buf_Pitch_Low 0x11
#define Index_VI_Disp_Y_UV_Buf_Pitch_Middle 0x12
/* What is this ? */
#define Index_VI_Disp_Y_Buf_Preset_Low 0x13
#define Index_VI_Disp_Y_Buf_Preset_Middle 0x14
#define Index_VI_UV_Buf_Preset_Low 0x15
#define Index_VI_UV_Buf_Preset_Middle 0x16
#define Index_VI_Disp_Y_UV_Buf_Preset_High 0x17
/* Scaling control registers */
#define Index_VI_Hor_Post_Up_Scale_Low 0x18
#define Index_VI_Hor_Post_Up_Scale_High 0x19
#define Index_VI_Ver_Up_Scale_Low 0x1A
#define Index_VI_Ver_Up_Scale_High 0x1B
#define Index_VI_Scale_Control 0x1C
/* Playback line buffer control */
#define Index_VI_Play_Threshold_Low 0x1D
#define Index_VI_Play_Threshold_High 0x1E
#define Index_VI_Line_Buffer_Size 0x1F
/* Destination color key */
#define Index_VI_Overlay_ColorKey_Red_Min 0x20
#define Index_VI_Overlay_ColorKey_Green_Min 0x21
#define Index_VI_Overlay_ColorKey_Blue_Min 0x22
#define Index_VI_Overlay_ColorKey_Red_Max 0x23
#define Index_VI_Overlay_ColorKey_Green_Max 0x24
#define Index_VI_Overlay_ColorKey_Blue_Max 0x25
/* Source color key, YUV color space */
#define Index_VI_Overlay_ChromaKey_Red_Y_Min 0x26
#define Index_VI_Overlay_ChromaKey_Green_U_Min 0x27
#define Index_VI_Overlay_ChromaKey_Blue_V_Min 0x28
#define Index_VI_Overlay_ChromaKey_Red_Y_Max 0x29
#define Index_VI_Overlay_ChromaKey_Green_U_Max 0x2A
#define Index_VI_Overlay_ChromaKey_Blue_V_Max 0x2B
/* Contrast enhancement and brightness control */
#define Index_VI_Contrast_Factor 0x2C /* obviously unused/undefined */
#define Index_VI_Brightness 0x2D
#define Index_VI_Contrast_Enh_Ctrl 0x2E
#define Index_VI_Key_Overlay_OP 0x2F
#define Index_VI_Control_Misc0 0x30
#define Index_VI_Control_Misc1 0x31
#define Index_VI_Control_Misc2 0x32
/* Subpicture registers */
#define Index_VI_SubPict_Buf_Start_Low 0x33
#define Index_VI_SubPict_Buf_Start_Middle 0x34
#define Index_VI_SubPict_Buf_Start_High 0x35
/* What is this ? */
#define Index_VI_SubPict_Buf_Preset_Low 0x36
#define Index_VI_SubPict_Buf_Preset_Middle 0x37
/* Subpicture pitch, unit=16 bytes */
#define Index_VI_SubPict_Buf_Pitch 0x38
/* Subpicture scaling control */
#define Index_VI_SubPict_Hor_Scale_Low 0x39
#define Index_VI_SubPict_Hor_Scale_High 0x3A
#define Index_VI_SubPict_Vert_Scale_Low 0x3B
#define Index_VI_SubPict_Vert_Scale_High 0x3C
#define Index_VI_SubPict_Scale_Control 0x3D
/* (0x40 = enable/disable subpicture) */
/* Subpicture line buffer control */
#define Index_VI_SubPict_Threshold 0x3E
/* What is this? */
#define Index_VI_FIFO_Max 0x3F
/* Subpicture palette; 16 colors, total 32 bytes address space */
#define Index_VI_SubPict_Pal_Base_Low 0x40
#define Index_VI_SubPict_Pal_Base_High 0x41
/* I wish I knew how to use these ... */
#define Index_MPEG_Read_Ctrl0 0x60 /* MPEG auto flip */
#define Index_MPEG_Read_Ctrl1 0x61 /* MPEG auto flip */
#define Index_MPEG_Read_Ctrl2 0x62 /* MPEG auto flip */
#define Index_MPEG_Read_Ctrl3 0x63 /* MPEG auto flip */
/* MPEG AutoFlip scale */
#define Index_MPEG_Ver_Up_Scale_Low 0x64
#define Index_MPEG_Ver_Up_Scale_High 0x65
#define Index_MPEG_Y_Buf_Preset_Low 0x66
#define Index_MPEG_Y_Buf_Preset_Middle 0x67
#define Index_MPEG_UV_Buf_Preset_Low 0x68
#define Index_MPEG_UV_Buf_Preset_Middle 0x69
#define Index_MPEG_Y_UV_Buf_Preset_High 0x6A
/* The following registers only exist on the 315/330/340 series */
/* Bit 16:24 of Y_U_V buf start address */
#define Index_VI_Y_Buf_Start_Over 0x6B
#define Index_VI_U_Buf_Start_Over 0x6C
#define Index_VI_V_Buf_Start_Over 0x6D
#define Index_VI_Disp_Y_Buf_Pitch_High 0x6E
#define Index_VI_Disp_UV_Buf_Pitch_High 0x6F
/* Hue and saturation */
#define Index_VI_Hue 0x70
#define Index_VI_Saturation 0x71
#define Index_VI_SubPict_Start_Over 0x72
#define Index_VI_SubPict_Buf_Pitch_High 0x73
#define Index_VI_Control_Misc3 0x74
/* 340 and later: */
/* DDA registers 0x75 - 0xb4 */
/* threshold high 0xb5, 0xb6 */
#define Index_VI_Line_Buffer_Size_High 0xb7
/* Bits in Scale control (0x1c) */
#define VI_Scale_Ctrl_Horiz_DDA 0x20
#define VI_Scale_Ctrl_Vert_DDA 0x40
/* Bits (and helpers) for Index_VI_Control_Misc0 */
#define VI_Misc0_Enable_Capture_AutoFlip 0x01 /* 340 only? */
#define VI_Misc0_Enable_Overlay 0x02
#define VI_Misc0_420_Plane_Enable 0x04 /* Select Plane or Packed mode */
#define VI_Misc0_422_Enable 0x20 /* Select 422 or 411 mode */
#define VI_Misc0_Fmt_YVU420P 0x0C /* YUV420 Planar (I420, YV12) */
#define VI_Misc0_Fmt_YUYV 0x28 /* YUYV Packed (=YUY2) */
#define VI_Misc0_Fmt_UYVY 0x08 /* (UYVY) */
#define VI_Misc0_Fmt_YVYU 0x38 /* (YVYU) (315 series only?) */
#define VI_Misc0_Fmt_NV21 0x5c /* (330 series only?) */
#define VI_Misc0_Fmt_NV12 0x4c /* (330 series only?) */
#define VI_Misc0_ChromaKeyRGBYUV 0x40 /* 300 series only: 0 = RGB, 1 = YUV */
/* Bits for Index_VI_Control_Misc1 */
#define VI_Misc1_DisableGraphicsAtOverlay 0x01 /* Disables graphics display in overlay area */
#define VI_Misc1_BOB_Enable 0x02 /* Enable BOB de-interlacer */
#define VI_Misc1_Line_Merge 0x04
#define VI_Misc1_Field_Mode 0x08 /* ? Assume even/odd fields interleaved in memory ? */
#define VI_Misc1_Non_Interleave 0x10 /* ? Odd and Even fields are not interleaved ? */
#define VI_Misc1_Buf_Addr_Lock 0x20 /* 315 series only? */
/* #define VI_Misc1_? 0x40 */
/* #define VI_Misc1_? 0x80 */
/* Bits for Index_VI_Control_Misc2 */
#define VI_Misc2_Select_Video2 0x01
#define VI_Misc2_Video2_On_Top 0x02
#define VI_Misc2_DisableGraphics 0x04 /* Disable graphics display entirely (<= 650 only, not >= M650, 651) */
#define VI_Misc2_Vertical_Interpol 0x08
#define VI_Misc2_Dual_Line_Merge 0x10 /* dual-overlay chips only; "dual video windows relative line buffer merge" */
#define VI_Misc2_All_Line_Merge 0x20 /* > 315 only */
#define VI_Misc2_Auto_Flip_Enable 0x40
#define VI_Misc2_Video_Reg_Write_Enable 0x80 /* 315 series only? */
/* Bits for Index_VI_Control_Misc3 */
#define VI_Misc3_Submit_Video_1 0x01 /* AKA "address ready" */
#define VI_Misc3_Submit_Video_2 0x02 /* AKA "address ready" */
#define VI_Misc3_Submit_SubPict 0x04 /* AKA "address ready" */
/* Values for Index_VI_Key_Overlay_OP (0x2F) */
#define VI_ROP_Never 0x00
#define VI_ROP_DestKey 0x03
#define VI_ROP_ChromaKey 0x05
#define VI_ROP_NotChromaKey 0x0A
#define VI_ROP_Always 0x0F
/* Video registers (559x, 6326 and 530/620) --------------- */
#define Index_VI6326_Passwd 0x80
/* Video overlay horizontal start/end, unit=screen pixels */
#define Index_VI6326_Win_Hor_Disp_Start_Low 0x81
#define Index_VI6326_Win_Hor_Disp_End_Low 0x82
#define Index_VI6326_Win_Hor_Over 0x83 /* Overflow */
/* Video overlay vertical start/end, unit=screen pixels */
#define Index_VI6326_Win_Ver_Disp_Start_Low 0x84
#define Index_VI6326_Win_Ver_Disp_End_Low 0x85
#define Index_VI6326_Win_Ver_Over 0x86 /* Overflow */
/* Y Plane (4:2:0) or YUV (4:2:2) buffer start address, unit=dword */
#define Index_VI6326_Disp_Y_Buf_Start_Low 0x8A
#define Index_VI6326_Disp_Y_Buf_Start_Middle 0x8B
#define Index_VI6326_Disp_Capt_Y_Buf_Start_High 0x89 /* 6326: 7:4 display, 3:0 capture */
/* 530/620: 7:3 display. 2:0 reserved */
/* End address of Y plane (in 16k unit) - 6326 ONLY */
#define Index_VI6326_Disp_Y_End 0x8D
/* U Plane (4:2:0) buffer start address, unit=dword */
#define Index_VI6326_U_Buf_Start_Low 0xB7
#define Index_VI6326_U_Buf_Start_Middle 0xB8
/* V Plane (4:2:0) buffer start address, unit=dword */
#define Index_VI6326_V_Buf_Start_Low 0xBA
#define Index_VI6326_V_Buf_Start_Middle 0xBB
/* U/V plane start address overflow bits 19:16 */
#define Index_VI6326_UV_Buf_Start_High 0xB9
/* Pitch for Y, UV Planes, unit=dword(6326 & 530/620) */
#define Index_VI6326_Disp_Y_Buf_Pitch_Low 0x8C /* 7:0 */
#define Index_VI6326_Disp_Y_Buf_Pitch_High 0x8E /* 11:8 (3:0 here) */
#define Index_VI6326_Disp_UV_Buf_Pitch_Low 0xBC /* 7:0 */
#define Index_VI6326_Disp_UV_Buf_Pitch_High 0xBD /* 11:8 (3:0 here) */
/* Scaling control registers */
#define Index_VI6326_Hor_Scale 0x92
#define Index_VI6326_Hor_Scale_Integer 0x94
#define Index_VI6326_Ver_Scale 0x93
/* Playback line buffer control */
#define Index_VI6326_Play_Threshold_Low 0x9E
#define Index_VI6326_Play_Threshold_High 0x9F
#define Index_VI6326_Line_Buffer_Size 0xA0 /* 530 & 6326: quad-word */
/* Destination color key */
#define Index_VI6326_Overlay_ColorKey_Red_Min 0x97
#define Index_VI6326_Overlay_ColorKey_Green_Min 0x96
#define Index_VI6326_Overlay_ColorKey_Blue_Min 0x95
#define Index_VI6326_Overlay_ColorKey_Red_Max 0xA3
#define Index_VI6326_Overlay_ColorKey_Green_Max 0xA2
#define Index_VI6326_Overlay_ColorKey_Blue_Max 0xA1
/* Source color key */
#define Index_VI6326_Overlay_ChromaKey_Red_Y_Min 0x9C
#define Index_VI6326_Overlay_ChromaKey_Green_U_Min 0x9B
#define Index_VI6326_Overlay_ChromaKey_Blue_V_Min 0x9A
#define Index_VI6326_Overlay_ChromaKey_Red_Y_Max 0xA6
#define Index_VI6326_Overlay_ChromaKey_Green_U_Max 0xA5
#define Index_VI6326_Overlay_ChromaKey_Blue_V_Max 0xA4
/* Contrast enhancement and brightness control */
#define Index_VI6326_Contrast_Factor 0xB3
#define Index_VI6326_Brightness 0xB4
#define Index_VI6326_Contrast_Enh_Ctrl 0xB5
/* Alpha */
#define Index_VI6326_AlphaGraph 0xA7
#define Index_VI6326_AlphaVideo 0xA8
#define Index_VI6326_Key_Overlay_OP 0xA9
#define Index_VI6326_Control_Misc0 0x98
#define Index_VI6326_Control_Misc1 0x99 /* (Datasheet: 6326 ONLY - not correct?) */
#define Index_VI6326_Control_Misc3 0x9D
#define Index_VI6326_Control_Misc4 0xB6
#define Index_VI6326_VideoFormatSelect Index_VI6326_Ver_Scale
#define Index_VI6326_Control_Misc5 0xBE /* (Datasheet: 530/620 ONLY - not correct) */
#define Index_VI6326_Control_Misc6 0xB2 /* 5597 and 6326 only! */
/* What is this? not a register, obviously */
#define Index_VI6326_FIFO_Max 0x3F
/* Bits (and helpers) for Index_VI6326_Control_Misc0 */
#define VI6326_Misc0_EnableCapture 0x01 /* 1 = on, 0 = off (6326 only) */
#define VI6326_Misc0_EnableOverlay 0x02 /* 1 = on, 0 = off */
#define VI6326_Misc0_VideoOnly 0x10 /* 1 = video only, 0 = gfx + video */
#define VI6326_Misc0_CaptureInterlace 0x20 /* 1 = capture data is interlace, 0 = not (6326 only) */
#define VI6326_Misc0_VideoFormat 0x40 /* 1 = YUV, 0 = RGB */
#define VI6326_Misc0_FieldPolarity 0x80 /* 1 = *Odd / Even, 0 = Odd / *Even (6326 only) */
/* Bits for Index_VI6326_Control_Misc1 (ALL 6326 ONLY) */
#define VI6326_Misc1_EnableYUVCapture 0x01 /* 0 = RGB, 1 = YUV */
#define VI6326_Misc1_EnableCaptureDithering 0x02 /* 0 = disable, 1 = enable */
#define VI6326_Misc1_CaptureFormat555 0x04 /* 1 = 555, 0 = 565 */
#define VI6326_Misc1_FilterModeMask 0x38
#define VI6326_Misc1_FilterMode0 0x00 /* 1 */
#define VI6326_Misc1_FilterMode1 0x08 /* 1/8(1+3z^-1+3z^-2+z^-3)*/
#define VI6326_Misc1_FilterMode2 0x10 /* 1/4(1+2z^-1+z^-2) */
#define VI6326_Misc1_FilterMode3 0x18 /* 1/2(1+z^-1) */
#define VI6326_Misc1_FilterMode4 0x20 /* 1/8(1+2z^-1+2z^-2+2z^-3+z^-4) */
#define VI6326_Misc1_EnableVBSyncIRQ 0x40 /* 1 = Enable IRQ on vertical blank */
#define VI6326_Misc1_ClearVBSyncIRQ 0x80 /* Clear pending irq */
/* Bits for Index_VI6326_Control_Misc3 */
#define VI6326_Misc3_UVCaptureFormat 0x01 /* 1 = 2's complement, 0 = CCIR 601 (6326 only) */
#define VI6326_Misc3_UVOverlayFormat 0x02 /* 1 = 2's complement, 0 = CCIR 601 */
#define VI6326_Misc3_ChromaKeyFormat 0x04 /* 1 = YUV, 0 = RGB */
#define VI6326_Misc3_VMIAccess 0x08 /* 1 = enable, 0 = disable (6326 only) */
#define VI6326_Misc3_VMIEnable 0x10 /* 1 = enable, 0 = disable (6326 only) */
#define VI6326_Misc3_VMIIRQ 0x20 /* 1 = enable, 0 = disable (6326 only) */
#define VI6326_Misc3_BT819A 0x40 /* 1 = enable, 0 = disable (6326 only) */
#define VI6326_Misc3_SystemMemFB 0x80 /* 1 = enable, 0 = disable (6326 only) */
/* Bits for Index_VI6326_Control_Misc4 */
#define VI6326_Misc4_CPUVideoFormatMask 0x03
#define VI6326_Misc4_CPUVideoFormatRGB555 0x00
#define VI6326_Misc4_CPUVideoFormatYUV422 0x01
#define VI6326_Misc4_CPUVideoFormatRGB565 0x02
#define VI6326_Misc4_EnableYUV420 0x04 /* 1 = enable, 0 = disable */
/* #define WHATISTHIS 0x40 */
/* Bits for Index_VI6326_Control_Misc5 (all 530/620 only) */
#define VI6326_Misc5_LineBufferMerge 0x10 /* 0 = disable, 1=enable */
#define VI6326_Misc5_VPlaneBit20 0x04
#define VI6326_Misc5_UPlaneBit20 0x02
/* Bits for Index_VI6326_Control_Misc6 (5597 and 6326 only) */
#define VI6326_Misc6_Decimation 0x80 /* 0=disable 1=enable video decimation */
/* Video format selection */
#define VI_6326_VideoUYVY422 0x00
#define VI_6326_VideoVYUY422 0x40
#define VI_6326_VideoYUYV422 0x80
#define VI_6326_VideoYVYU422 0xC0
#define VI_6326_VideoRGB555 0x00
#define VI_6326_VideoRGB565 0x40
/* Values for Index_VI6326_Key_Overlay_OP */
#define VI6326_ROP_Never 0x00
#define VI6326_ROP_DestKey 0x03
#define VI6326_ROP_Always 0x0F
/* --- end of 6326 video registers ---------------------------------- */
/* TV register base (6326 only) */
#define Index_TV6326_TVOutIndex 0xE0
#define Index_TV6326_TVOutData 0xE1
/* mmio registers for video */
#define REG_PRIM_CRT_COUNTER 0x8514
/* MPEG MMIO registers (630 and later) ----------------------------------------- */
/* Not public (yet?) */
#endif /* SIS_REGS_H_ */
|